diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..93c4b27b4 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,2 @@ +github: processing +custom: https://processingfoundation.org/ diff --git a/.gitignore b/.gitignore index b006f9e2d..27c953a9e 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,5 @@ exhibition/ about/ contrib_generate/contribs.txt # File now built on the server side; don't need to track here contrib_generate/contributions.txt # File now built on the server side; don't need to track here +*~ +/bin/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..9f20dd7ba --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,15 @@ +## Contributing to Processing + +Wow, thank you for helping us out! + +## Reporting Issues + +**[Here's how to report a bug with Processing.](https://github.com/processing/processing/wiki/Report-Bugs)** + +Before logging a new issue, please please please review [that document](https://github.com/processing/processing/wiki/Report-Bugs) closely. Processing is a complex project housed across several repositories. A quick read on your part now will save us all a lot of hassle later. + +## Other Contributions + +See the [Processing wiki](https://github.com/processing/processing/wiki#contribute) for how to contribute in other ways. + +Thank you! diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md new file mode 100644 index 000000000..71ae8ba7c --- /dev/null +++ b/ISSUE_TEMPLATE.md @@ -0,0 +1,10 @@ +### Issue description + + + +### URL(s) of affected page(s) + + + +### Proposed fix + diff --git a/README.md b/README.md index c0183179c..60a674da3 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,14 @@ +> ⚠️ This repository is now deprecated and will be archived soon. If you have any issues or want to submit a pull request, please direct them to the [processing-website](https://github.com/processing/processing-website) repo. Make sure to check the [README](https://github.com/processing/processing-website/blob/main/README.md) for information on how to contribute to the documentation. + + + Processing Documentation ========== -This is the official source code for the Processing reference, examples, tutorials, and [processing.org](http://processing.org) web site. +~~This is the official source code for the Processing reference, examples, tutorials, and [processing.org](http://processing.org) web site.~~ -If you have found an error in the Processing reference, examples, tutorials, or website you can file it here under the ["issues" tab](https://github.com/processing/processing-docs/issues). +~~If you have found an error in the Processing reference, examples, tutorials, or website you can file it here under the ["issues" tab](https://github.com/processing/processing-docs/issues).~~ -The [processing](https://github.com/processing/processing) repository contains the source code for Processing itself. (Please use that link to file issues regarding the Processing software.) +~~The [processing](https://github.com/processing/processing) repository contains the source code for Processing itself. (Please use that link to file issues regarding the Processing software.)~~ diff --git a/config-f.php b/config-f.php deleted file mode 100644 index 500644b22..000000000 --- a/config-f.php +++ /dev/null @@ -1,47 +0,0 @@ - array('English', 'utf-8', true, $domain) //, - //'zh' => array('Chinese Traditional', 'big5', false, $domain."zh/"), - //'zh-cn' => array('Chinese Simplified', 'GB2312', false, $domain."zh-cn/"), - //'fr' => array('French', 'utf-8', true, $domain."fr/"), - //'id' => array('Indonesian', 'utf-8', false, $domain."id/"), - //'it' => array('Italian', 'utf-8', true, $domain."it/"), - //'jp' => array('Japanese', 'Shift_JIS', false, 'http://stage.itp.tsoa.nyu.edu/~tk403/proce55ing_reference_jp/'), - //'kn' => array('Korean', 'utf-8', false, 'http://www.nabi.or.kr/processing/'), - //'es' => array('Spanish', 'utf-8', true, $domain."es/"), - //'tr' => array('Turkish', 'ISO-8859-9', true, $domain."tr/"), - //'he' => array('Hebrew', 'Windows-1255', false, ''), - //'ru' => array('Russian', 'ISO-8859-5', false, ''), - //'pl' => array('Polish', 'ISO-8859-2', false, '') - ); -// Langauges with finished references available to the public -$FINISHED = array('en'); - -// for reference index formatting -$break_before = array('Shape', 'Color'); - -?> \ No newline at end of file diff --git a/content/api_en/HALF_PI.xml b/content/api_en/HALF_PI.xml index 3d83e4c53..723fb55e1 100755 --- a/content/api_en/HALF_PI.xml +++ b/content/api_en/HALF_PI.xml @@ -22,7 +22,7 @@ arc(x, y, d-60, d-60, 0, TWO_PI); sin() and cos(). +HALF_PI is a mathematical constant with the value 1.5707964. It is half the ratio of the circumference of a circle to its diameter. It is useful in combination with the trigonometric functions sin() and cos(). ]]> diff --git a/content/api_en/IntDict.xml b/content/api_en/IntDict.xml index 5e4942895..6754d239c 100644 --- a/content/api_en/IntDict.xml +++ b/content/api_en/IntDict.xml @@ -17,9 +17,9 @@ IntDict inventory; void setup() { size(200, 200); inventory = new IntDict(); - inventory.set("cd",84); - inventory.set("tapes",15); - inventory.set("records",102); + inventory.set("cd", 84); + inventory.set("tapes", 15); + inventory.set("records", 102); println(inventory); noLoop(); fill(0); diff --git a/content/api_en/IntDict_add.xml b/content/api_en/IntDict_add.xml index ed55603fc..957008dc4 100755 --- a/content/api_en/IntDict_add.xml +++ b/content/api_en/IntDict_add.xml @@ -17,11 +17,11 @@ IntDict inventory; void setup() { size(200, 200); inventory = new IntDict(); - inventory.set("cd",84); - inventory.set("tapes",15); - inventory.set("records",102); + inventory.set("cd", 84); + inventory.set("tapes", 15); + inventory.set("records", 102); println(inventory); // There are 84 cds - inventory.add("cds", 20); + inventory.add("cd", 20); println(inventory); // There are 104 cds } diff --git a/content/api_en/IntDict_clear.xml b/content/api_en/IntDict_clear.xml index a1bb4ffbf..64bab3194 100755 --- a/content/api_en/IntDict_clear.xml +++ b/content/api_en/IntDict_clear.xml @@ -17,9 +17,9 @@ IntDict inventory; void setup() { size(200, 200); inventory = new IntDict(); - inventory.set("cd",84); - inventory.set("tapes",15); - inventory.set("records",102); + inventory.set("cd", 84); + inventory.set("tapes", 15); + inventory.set("records", 102); println(inventory); inventory.clear(); println(inventory); diff --git a/content/api_en/IntDict_div.xml b/content/api_en/IntDict_div.xml index d9512a15d..6547e706d 100755 --- a/content/api_en/IntDict_div.xml +++ b/content/api_en/IntDict_div.xml @@ -17,11 +17,11 @@ IntDict inventory; void setup() { size(200, 200); inventory = new IntDict(); - inventory.set("cd",84); - inventory.set("tapes",15); - inventory.set("records",102); + inventory.set("cd", 84); + inventory.set("tapes", 15); + inventory.set("records", 102); println(inventory); // There are 84 cds - inventory.div("cds", 2); + inventory.div("cd", 2); println(inventory); // There are 42 cds } diff --git a/content/api_en/IntDict_get.xml b/content/api_en/IntDict_get.xml index 83690ac3a..0f8219442 100755 --- a/content/api_en/IntDict_get.xml +++ b/content/api_en/IntDict_get.xml @@ -17,9 +17,9 @@ IntDict inventory; void setup() { size(200, 200); inventory = new IntDict(); - inventory.set("cd",84); - inventory.set("tapes",15); - inventory.set("records",102); + inventory.set("cd", 84); + inventory.set("tapes", 15); + inventory.set("records", 102); println(inventory); noLoop(); fill(0); diff --git a/content/api_en/IntDict_hasKey.xml b/content/api_en/IntDict_hasKey.xml index 08f3e5a23..baa643c45 100755 --- a/content/api_en/IntDict_hasKey.xml +++ b/content/api_en/IntDict_hasKey.xml @@ -17,9 +17,9 @@ IntDict inventory; void setup() { size(200, 200); inventory = new IntDict(); - inventory.set("cd",84); - inventory.set("tapes",15); - inventory.set("records",102); + inventory.set("cd", 84); + inventory.set("tapes", 15); + inventory.set("records", 102); println(inventory); if (inventory.hasKey("records") == true) { println("Yes, we have records."); diff --git a/content/api_en/IntDict_increment.xml b/content/api_en/IntDict_increment.xml index 73281b1e5..037d777fa 100755 --- a/content/api_en/IntDict_increment.xml +++ b/content/api_en/IntDict_increment.xml @@ -17,9 +17,9 @@ IntDict inventory; void setup() { size(200, 200); inventory = new IntDict(); - inventory.set("cd",84); - inventory.set("tapes",15); - inventory.set("records",102); + inventory.set("cd", 84); + inventory.set("tapes", 15); + inventory.set("records", 102); println(inventory); // There are 15 tapes inventory.increment("tapes"); println(inventory); // There are now 16 tapes diff --git a/content/api_en/IntDict_keyArray.xml b/content/api_en/IntDict_keyArray.xml index cbb2b40a1..c873798a2 100755 --- a/content/api_en/IntDict_keyArray.xml +++ b/content/api_en/IntDict_keyArray.xml @@ -17,9 +17,9 @@ IntDict inventory; void setup() { size(200, 200); inventory = new IntDict(); - inventory.set("cd",84); - inventory.set("tapes",15); - inventory.set("records",102); + inventory.set("cd", 84); + inventory.set("tapes", 15); + inventory.set("records", 102); println(inventory); String[] theKeys = inventory.keyArray(); println(theKeys); diff --git a/content/api_en/IntDict_keys.xml b/content/api_en/IntDict_keys.xml index 276530151..4289fd36d 100755 --- a/content/api_en/IntDict_keys.xml +++ b/content/api_en/IntDict_keys.xml @@ -17,9 +17,9 @@ IntDict inventory; void setup() { size(200, 200); inventory = new IntDict(); - inventory.set("cd",84); - inventory.set("tapes",15); - inventory.set("records",102); + inventory.set("cd", 84); + inventory.set("tapes", 15); + inventory.set("records", 102); println(inventory); for (String k : inventory.keys()) { println(k); diff --git a/content/api_en/IntDict_mult.xml b/content/api_en/IntDict_mult.xml index dbef3f741..8958e2c7a 100755 --- a/content/api_en/IntDict_mult.xml +++ b/content/api_en/IntDict_mult.xml @@ -17,11 +17,11 @@ IntDict inventory; void setup() { size(200, 200); inventory = new IntDict(); - inventory.set("cd",84); - inventory.set("tapes",15); - inventory.set("records",102); + inventory.set("cd", 84); + inventory.set("tapes", 15); + inventory.set("records", 102); println(inventory); // There are 84 cds - inventory.mult("cds", 2); + inventory.mult("cd", 2); println(inventory); // There are 168 cds } diff --git a/content/api_en/IntDict_remove.xml b/content/api_en/IntDict_remove.xml index 28797c083..11aba2cad 100755 --- a/content/api_en/IntDict_remove.xml +++ b/content/api_en/IntDict_remove.xml @@ -17,9 +17,9 @@ IntDict inventory; void setup() { size(200, 200); inventory = new IntDict(); - inventory.set("cd",84); - inventory.set("tapes",15); - inventory.set("records",102); + inventory.set("cd", 84); + inventory.set("tapes", 15); + inventory.set("records", 102); println(inventory); // Full inventory inventory.remove("tapes"); println(inventory); // Tapes are removed from list diff --git a/content/api_en/IntDict_set.xml b/content/api_en/IntDict_set.xml index 5fb16c82d..f35de32f4 100755 --- a/content/api_en/IntDict_set.xml +++ b/content/api_en/IntDict_set.xml @@ -17,9 +17,9 @@ IntDict inventory; void setup() { size(200, 200); inventory = new IntDict(); - inventory.set("cd",84); - inventory.set("tapes",15); - inventory.set("records",102); + inventory.set("cd", 84); + inventory.set("tapes", 15); + inventory.set("records", 102); println(inventory); inventory.set("records", 90); // Fewer records inventory.set("mp3s", 2054); // Add MP3s diff --git a/content/api_en/IntDict_size.xml b/content/api_en/IntDict_size.xml index 737f73f62..aae149256 100755 --- a/content/api_en/IntDict_size.xml +++ b/content/api_en/IntDict_size.xml @@ -17,9 +17,9 @@ IntDict inventory; void setup() { size(200, 200); inventory = new IntDict(); - inventory.set("cd",84); - inventory.set("tapes",15); - inventory.set("records",102); + inventory.set("cd", 84); + inventory.set("tapes", 15); + inventory.set("records", 102); println(inventory); int s = inventory.size(); println(s); diff --git a/content/api_en/IntDict_sortKeys.xml b/content/api_en/IntDict_sortKeys.xml index 55bd28e1b..1401ed584 100755 --- a/content/api_en/IntDict_sortKeys.xml +++ b/content/api_en/IntDict_sortKeys.xml @@ -17,9 +17,9 @@ IntDict inventory; void setup() { size(200, 200); inventory = new IntDict(); - inventory.set("cd",84); - inventory.set("tapes",15); - inventory.set("records",102); + inventory.set("cd", 84); + inventory.set("tapes", 15); + inventory.set("records", 102); println(inventory); inventory.sortKeys(); println(inventory); diff --git a/content/api_en/IntDict_sortKeysReverse.xml b/content/api_en/IntDict_sortKeysReverse.xml index e3bdd6c67..7f0a4236f 100755 --- a/content/api_en/IntDict_sortKeysReverse.xml +++ b/content/api_en/IntDict_sortKeysReverse.xml @@ -17,9 +17,9 @@ IntDict inventory; void setup() { size(200, 200); inventory = new IntDict(); - inventory.set("cd",84); - inventory.set("tapes",15); - inventory.set("records",102); + inventory.set("cd", 84); + inventory.set("tapes", 15); + inventory.set("records", 102); println(inventory); inventory.sortKeysReverse(); println(inventory); diff --git a/content/api_en/IntDict_sortValues.xml b/content/api_en/IntDict_sortValues.xml index 1c692684a..ce792724a 100755 --- a/content/api_en/IntDict_sortValues.xml +++ b/content/api_en/IntDict_sortValues.xml @@ -17,9 +17,9 @@ IntDict inventory; void setup() { size(200, 200); inventory = new IntDict(); - inventory.set("cd",84); - inventory.set("tapes",15); - inventory.set("records",102); + inventory.set("cd", 84); + inventory.set("tapes", 15); + inventory.set("records", 102); println(inventory); inventory.sortValues(); println(inventory); diff --git a/content/api_en/IntDict_sortValuesReverse.xml b/content/api_en/IntDict_sortValuesReverse.xml index baafe091c..1e22ebaf7 100755 --- a/content/api_en/IntDict_sortValuesReverse.xml +++ b/content/api_en/IntDict_sortValuesReverse.xml @@ -17,9 +17,9 @@ IntDict inventory; void setup() { size(200, 200); inventory = new IntDict(); - inventory.set("cd",84); - inventory.set("tapes",15); - inventory.set("records",102); + inventory.set("cd", 84); + inventory.set("tapes", 15); + inventory.set("records", 102); println(inventory); inventory.sortValuesReverse(); println(inventory); diff --git a/content/api_en/IntDict_sub.xml b/content/api_en/IntDict_sub.xml index e1ecd80c2..231c78678 100755 --- a/content/api_en/IntDict_sub.xml +++ b/content/api_en/IntDict_sub.xml @@ -17,11 +17,11 @@ IntDict inventory; void setup() { size(200, 200); inventory = new IntDict(); - inventory.set("cd",84); - inventory.set("tapes",15); - inventory.set("records",102); + inventory.set("cd", 84); + inventory.set("tapes", 15); + inventory.set("records", 102); println(inventory); // There are 84 cds - inventory.sub("cds", 20); + inventory.sub("cd", 20); println(inventory); // There are 64 cds } diff --git a/content/api_en/IntDict_valueArray.xml b/content/api_en/IntDict_valueArray.xml index 0d93df3c8..1a1502dd0 100755 --- a/content/api_en/IntDict_valueArray.xml +++ b/content/api_en/IntDict_valueArray.xml @@ -17,9 +17,9 @@ IntDict inventory; void setup() { size(200, 200); inventory = new IntDict(); - inventory.set("cd",84); - inventory.set("tapes",15); - inventory.set("records",102); + inventory.set("cd", 84); + inventory.set("tapes", 15); + inventory.set("records", 102); println(inventory); int[] amounts = inventory.valueArray(); println(amounts); diff --git a/content/api_en/IntDict_values.xml b/content/api_en/IntDict_values.xml index 74af5c944..0a94d1e3f 100755 --- a/content/api_en/IntDict_values.xml +++ b/content/api_en/IntDict_values.xml @@ -17,9 +17,9 @@ IntDict inventory; void setup() { size(200, 200); inventory = new IntDict(); - inventory.set("cd",84); - inventory.set("tapes",15); - inventory.set("records",102); + inventory.set("cd", 84); + inventory.set("tapes", 15); + inventory.set("records", 102); println(inventory); for (int i : inventory.values()) { println(i); diff --git a/content/api_en/JSONArray_isNull.xml b/content/api_en/JSONArray_isNull.xml new file mode 100755 index 000000000..6c095a7ea --- /dev/null +++ b/content/api_en/JSONArray_isNull.xml @@ -0,0 +1,37 @@ + + + +isNull() + +JSONArray + +Method + +method + + + + + + +null, that is has no defined value (false) or if it has a value (true). +]]> + + diff --git a/content/api_en/JSONObject_isNull.xml b/content/api_en/JSONObject_isNull.xml new file mode 100755 index 000000000..3b474e936 --- /dev/null +++ b/content/api_en/JSONObject_isNull.xml @@ -0,0 +1,36 @@ + + + +isNull() + +JSONObject + +Method + +method + + + + + + +null, that is has no defined value (false) or if it has a value (true). +]]> + + diff --git a/content/api_en/LIB_io/GPIO.xml b/content/api_en/LIB_io/GPIO.xml new file mode 100755 index 000000000..035c8b7bd --- /dev/null +++ b/content/api_en/LIB_io/GPIO.xml @@ -0,0 +1,23 @@ + + + +GPIO + +I/O + + + +Application + + + + + + + + + diff --git a/content/api_en/LIB_io/GPIO_attachInterrupt.xml b/content/api_en/LIB_io/GPIO_attachInterrupt.xml new file mode 100644 index 000000000..6f76f82e2 --- /dev/null +++ b/content/api_en/LIB_io/GPIO_attachInterrupt.xml @@ -0,0 +1,70 @@ + + + +attachInterrupt() + +I/O + + + +Web & Application + + + + + + + +
+The sketch method provided must accept a single integer (int) parameter, which is the +number of the GPIO pin that the interrupt occured on. As this method might be called +at any time, including when drawing to the display window isn't permitted, it is best +to only set simple variables that are being responded to in the next draw() call, as +shown above. Calling functions of the Hardware I/O library at this point is certainly +possible.
+
+The mode parameter determines when the function will be called: GPIO.FALLING occurs when the level changes from high to low, GPIO.RISING when the level changes from low +to high, and GPIO.CHANGE when either occurs. +]]>
+ + +GPIO.attachInterrupt() + + + + + + + + +1.0 + +Method + +Library + +
diff --git a/content/api_en/LIB_io/GPIO_digitalRead.xml b/content/api_en/LIB_io/GPIO_digitalRead.xml new file mode 100755 index 000000000..4a8c8d36d --- /dev/null +++ b/content/api_en/LIB_io/GPIO_digitalRead.xml @@ -0,0 +1,63 @@ + + + +digitalRead() + +I/O + + + +Web & Application + + + + + + + +
+You need to set the pin to input by calling pinMode() before calling this function. +]]>
+ + +GPIO.digitalRead() + + + + + + + + +1.0 + +Method + +Library + +
diff --git a/content/api_en/LIB_io/GPIO_digitalWrite.xml b/content/api_en/LIB_io/GPIO_digitalWrite.xml new file mode 100755 index 000000000..801fcb69d --- /dev/null +++ b/content/api_en/LIB_io/GPIO_digitalWrite.xml @@ -0,0 +1,65 @@ + + + +digitalWrite() + +I/O + + + +Web & Application + + + + + + + +
+You need to set the pin to output by calling pinMode() before calling this function. Unlike on Arduino, it is not possible to set a input pin's internal pull-up resistor using this function. +]]>
+ + +GPIO.digitalWrite() + + + + + + + + +1.0 + +Method + +Library + +
diff --git a/content/api_en/LIB_io/GPIO_disableInterrupt.xml b/content/api_en/LIB_io/GPIO_disableInterrupt.xml new file mode 100755 index 000000000..5764a95d7 --- /dev/null +++ b/content/api_en/LIB_io/GPIO_disableInterrupt.xml @@ -0,0 +1,41 @@ + + + +disableInterrupt() + +I/O + + + +Web & Application + + + + + + + +
+Use this function only in combination with enableInterrupt() and waitForInterrupt(). This should not be called when attachInterrupt() is being used. +]]>
+ + +GPIO.disableInterrupt() + + + + + + + + +1.0 + +Method + +Library + +
diff --git a/content/api_en/LIB_io/GPIO_enableInterrupt.xml b/content/api_en/LIB_io/GPIO_enableInterrupt.xml new file mode 100755 index 000000000..24d6c8ad5 --- /dev/null +++ b/content/api_en/LIB_io/GPIO_enableInterrupt.xml @@ -0,0 +1,41 @@ + + + +enableInterrupt() + +I/O + + + +Web & Application + + + + + + + +
+Use this function only when calling waitForInterrupt(). This should not be called when attachInterrupt() is being used. +]]>
+ + +GPIO.enableInterrupt() + + + + + + + + +1.0 + +Method + +Library + +
diff --git a/content/api_en/LIB_io/GPIO_interrupts.xml b/content/api_en/LIB_io/GPIO_interrupts.xml new file mode 100755 index 000000000..0c7f562e7 --- /dev/null +++ b/content/api_en/LIB_io/GPIO_interrupts.xml @@ -0,0 +1,66 @@ + + + +interrupts() + +I/O + + + +Web & Application + + + + + + + +
+You can use noInterrupts() and interrupts() in tandem to make sure no interrupts are occuring while your sketch is doing a particular task. By default, interrupts are enabled. +]]>
+ + +GPIO.interrupts() + + + + + + + + +1.0 + +Method + +Library + +
diff --git a/content/api_en/LIB_io/GPIO_noInterrupts.xml b/content/api_en/LIB_io/GPIO_noInterrupts.xml new file mode 100755 index 000000000..236c38b9a --- /dev/null +++ b/content/api_en/LIB_io/GPIO_noInterrupts.xml @@ -0,0 +1,68 @@ + + + +noInterrupts() + +I/O + + + +Web & Application + + + + + + + +
+You can use noInterrupts() and interrupts() in tandem to make sure no interrupts are occuring while your sketch is doing a particular task.
+
+While a method associated with a pin's interrupt is being executed, interrupts from the same pin are automatically prevented from occurring. Interrupts from other pins can still happen, however. If you also want to prevent those, put noInterrupts() at the beginning of your callback function and interrupts() at its end. +]]>
+ + +GPIO.noInterrupts() + + + + + + + + +1.0 + +Method + +Library + +
diff --git a/content/api_en/LIB_io/GPIO_pinMode.xml b/content/api_en/LIB_io/GPIO_pinMode.xml new file mode 100755 index 000000000..be923c726 --- /dev/null +++ b/content/api_en/LIB_io/GPIO_pinMode.xml @@ -0,0 +1,68 @@ + + + +pinMode() + +I/O + + + +Web & Application + + + + + + +INPUT), or input with internal pull-up resistor (INPUT_PULLUP), or input with internal pull-down resistor (INPUT_PULLDOWN) or output (OUTPUT)
+
+Unlike on Arduino, where pins are implicitly set to inputs by default, it is necessary +to call this function for any pin you want to access, including input pins.
+
+Pull-up and pull-down resistors are very useful when connecting buttons and switches, since they will force the value of the pin in a specified electrical state when no electrical connection is made, and the pin would otherwise be left "floating".
+
+The ability to set (and clear) pull-up and pull-down resistors is currently limited to the Raspberry Pi running the Raspbian distribution. On other systems, a warning will be shown. +]]>
+ + +GPIO.pinMode() + + + + + + + + +1.0 + +Method + +Library + +
diff --git a/content/api_en/LIB_io/GPIO_releaseInterrupt.xml b/content/api_en/LIB_io/GPIO_releaseInterrupt.xml new file mode 100755 index 000000000..7a616e485 --- /dev/null +++ b/content/api_en/LIB_io/GPIO_releaseInterrupt.xml @@ -0,0 +1,57 @@ + + + +releaseInterrupt() + +I/O + + + +Web & Application + + + + + + + + + +GPIO.releaseInterrupt() + + + + + + + + +1.0 + +Method + +Library + + diff --git a/content/api_en/LIB_io/GPIO_releasePin.xml b/content/api_en/LIB_io/GPIO_releasePin.xml new file mode 100755 index 000000000..0c25bd518 --- /dev/null +++ b/content/api_en/LIB_io/GPIO_releasePin.xml @@ -0,0 +1,67 @@ + + + +releasePin() + +I/O + + + +Web & Application + + + + + + + +
+Without calling this function, the pin will remain in the current state even after the sketch has been closed. +]]>
+ + +GPIO.releasePin() + + + + + + + + +1.0 + +Method + +Library + +
diff --git a/content/api_en/LIB_io/GPIO_waitFor.xml b/content/api_en/LIB_io/GPIO_waitFor.xml new file mode 100755 index 000000000..d94c87a64 --- /dev/null +++ b/content/api_en/LIB_io/GPIO_waitFor.xml @@ -0,0 +1,62 @@ + + + +waitFor() + +I/O + + + +Web & Application + + + + + + + +
+The mode parameter determines when the function will return: GPIO.FALLING occurs when the level changes from high to low, GPIO.RISING when the level changes from low to high, and GPIO.CHANGE when either occurs.
+
+The optional timeout parameter determines how many milliseconds the function will wait at the most. If the value of the input pin hasn't changed at this point, an exception is raised for this line. Without a timeout parameter the function will wait indefinitely until the input pin has changed to the desired state. +]]>
+ + +GPIO.waitFor() + + + + + + + + +1.0 + +Method + +Library + +
diff --git a/content/api_en/LIB_io/I2C.xml b/content/api_en/LIB_io/I2C.xml new file mode 100755 index 000000000..eb47492b5 --- /dev/null +++ b/content/api_en/LIB_io/I2C.xml @@ -0,0 +1,60 @@ + + + +I2C + +I/O + + + +Application + + + +> 8); + i2c.write(val & 255); + i2c.endTransmission(); +} + +]]> + + + +
+I2C is a serial bus, commonly used to attach peripheral ICs (Integrated Circuits) +to processors and microcontrollers. It uses two pins, SDA (for data) and SDL (for +the clock signal). Multiple "slave" devices can be connected to the same bus, as +long as they are responding to different addresses (see below).
+
+The I2C "master" device initiates a transmission, which includes sending the +address of the desired "slave" device. I2C addresses consist of 7 bits plus one +bit that indicates whether the device is being read from or written to. Some +datasheets list the address in an 8 bit form (7 address bits + R/W bit), while +others provide the address in a 7 bit form, with the address in the lower 7 bits.
+
+This library expects addresses in their 7 bit form, similar to Arduino's Wire +library, and what is being output by the i2cdetect utility on Linux. If the +address provided in a datasheet is greater than 127 (hex 0x7f) or there are +separate addresses for read and write operations listed, which vary exactly by +one, then you want to shift the this number by one bit to the right before passing +it as an argument to beginTransmission(). +]]>
+ +
diff --git a/content/api_en/LIB_io/I2C_beginTransmission.xml b/content/api_en/LIB_io/I2C_beginTransmission.xml new file mode 100755 index 000000000..582fb97ff --- /dev/null +++ b/content/api_en/LIB_io/I2C_beginTransmission.xml @@ -0,0 +1,60 @@ + + + +beginTransmission() + +I/O + + + +Web & Application + + + +> 8); + dac.write(val & 255); + dac.endTransmission(); +} + +]]> + + + +
+This function expects the address in the lower 7 bits, the same way as in Arduino's Wire library, and as shown in the output of the i2cdetect tool. If the address provided in a datasheet is greater than 127 (hex 0x7f) or there are separate addresses for read and write operations listed, which vary exactly by one, then you want to shift the this number by one bit to the right before passing it as an argument to this function. +]]>
+ + +i2c.beginTransmission() + + + + + + + + +1.0 + +Method + +Library + +
diff --git a/content/api_en/LIB_io/I2C_close.xml b/content/api_en/LIB_io/I2C_close.xml new file mode 100755 index 000000000..b3754a327 --- /dev/null +++ b/content/api_en/LIB_io/I2C_close.xml @@ -0,0 +1,61 @@ + + + +close() + +I/O + + + +Web & Application + + + +> 8); + i2c.write(val & 255); + i2c.endTransmission(); + // and close interface again + i2c.close(); +} + +]]> + + + +
+It is normally not necessary to explicitly close I2C interfaces, as they +are closed automatically by the operating system when the sketch exits.
+
+Note: It is possible to have two or more object using the same interface at +a time. +]]>
+ + +i2c.close() + + + + + + + + +1.0 + +Method + +Library + +
diff --git a/content/api_en/LIB_io/I2C_endTransmission.xml b/content/api_en/LIB_io/I2C_endTransmission.xml new file mode 100755 index 000000000..f5f909324 --- /dev/null +++ b/content/api_en/LIB_io/I2C_endTransmission.xml @@ -0,0 +1,62 @@ + + + +endTransmission() + +I/O + + + +Web & Application + + + +> 8); + dac.write(val & 255); + dac.endTransmission(); +} + +]]> + + + +
+This executes any queued writes. Read() +implicitly ends the current transmission as well, hence calling +endTransmission() afterwards is not necessary. +]]>
+ + +i2c.endTransmission() + + + + + + + + +1.0 + +Method + +Library + +
diff --git a/content/api_en/LIB_io/I2C_list.xml b/content/api_en/LIB_io/I2C_list.xml new file mode 100755 index 000000000..89a1f03f5 --- /dev/null +++ b/content/api_en/LIB_io/I2C_list.xml @@ -0,0 +1,45 @@ + + + +list() + +I/O + + + +Web & Application + + + + + + + + + +I2C.list() + + + + + + + + +1.0 + +Method + +Library + + diff --git a/content/api_en/LIB_io/I2C_read.xml b/content/api_en/LIB_io/I2C_read.xml new file mode 100755 index 000000000..db2332f3e --- /dev/null +++ b/content/api_en/LIB_io/I2C_read.xml @@ -0,0 +1,66 @@ + + + +read() + +I/O + + + +Web & Application + + + + + + + +
+You must call beginTransmission() before calling this function. +This function also ends the current transmission and sends any data +that was queued using write() before. It is not necessary to call +endTransmission() after read(). +]]>
+ + +i2c.read() + + + + + + + + +1.0 + +Method + +Library + +
diff --git a/content/api_en/LIB_io/I2C_write.xml b/content/api_en/LIB_io/I2C_write.xml new file mode 100755 index 000000000..7e4557a35 --- /dev/null +++ b/content/api_en/LIB_io/I2C_write.xml @@ -0,0 +1,60 @@ + + + +write() + +I/O + + + +Web & Application + + + +> 8); + dac.write(val & 255); + dac.endTransmission(); +} + +]]> + + + +
+You must call beginTransmission() before calling this function. The actual writing takes part when read() or endTransmission() is being called. +]]>
+ + +i2c.write() + + + + + + + + +1.0 + +Method + +Library + +
diff --git a/content/api_en/LIB_io/LED.xml b/content/api_en/LIB_io/LED.xml new file mode 100755 index 000000000..12f9fa0f7 --- /dev/null +++ b/content/api_en/LIB_io/LED.xml @@ -0,0 +1,53 @@ + + + +LED + +I/O + + + +Application + + + + + + + +
+This class can control your computer's build-in LEDs, such as the ones +commonly used to indicate the power status and disk activity.
+
+Your operating system might not be set up to allow regular users to do +this kind of modification. If this is the case you should install a +so-called udev rule that relaxes the permissions for the files +in /sys/class/leds. You can also try running Processing as root user +using "sudo", but this is generally not recommended. +]]>
+ +
diff --git a/content/api_en/LIB_io/LED_brightness.xml b/content/api_en/LIB_io/LED_brightness.xml new file mode 100755 index 000000000..3696d5f7f --- /dev/null +++ b/content/api_en/LIB_io/LED_brightness.xml @@ -0,0 +1,57 @@ + + + +brightness() + +I/O + + + +Web & Application + + + + + + + + + +led.brightness() + + + + + + + + +1.0 + +Method + +Library + + diff --git a/content/api_en/LIB_io/LED_close.xml b/content/api_en/LIB_io/LED_close.xml new file mode 100755 index 000000000..a49e9d1cf --- /dev/null +++ b/content/api_en/LIB_io/LED_close.xml @@ -0,0 +1,65 @@ + + + +close() + +I/O + + + +Web & Application + + + + + + + +
+Without calling this function the LED will remain in the current state even after the sketch has been closed. +]]>
+ + +led.close() + + + + + + + + +1.0 + +Method + +Library + +
diff --git a/content/api_en/LIB_io/LED_list.xml b/content/api_en/LIB_io/LED_list.xml new file mode 100755 index 000000000..ff97fdd79 --- /dev/null +++ b/content/api_en/LIB_io/LED_list.xml @@ -0,0 +1,45 @@ + + + +list() + +I/O + + + +Web & Application + + + + + + + + + +LED.list() + + + + + + + + +1.0 + +Method + +Library + + diff --git a/content/api_en/LIB_io/PWM.xml b/content/api_en/LIB_io/PWM.xml new file mode 100755 index 000000000..d072a8cf0 --- /dev/null +++ b/content/api_en/LIB_io/PWM.xml @@ -0,0 +1,23 @@ + + + +PWM + +I/O + + + +Application + + + + + + + + + diff --git a/content/api_en/LIB_io/PWM_clear.xml b/content/api_en/LIB_io/PWM_clear.xml new file mode 100755 index 000000000..84eb4dd01 --- /dev/null +++ b/content/api_en/LIB_io/PWM_clear.xml @@ -0,0 +1,39 @@ + + + +clear() + +I/O + + + +Web & Application + + + + + + + + + +pwm.clear() + + + + + + + + +1.0 + +Method + +Library + + diff --git a/content/api_en/LIB_io/PWM_close.xml b/content/api_en/LIB_io/PWM_close.xml new file mode 100755 index 000000000..42f021b80 --- /dev/null +++ b/content/api_en/LIB_io/PWM_close.xml @@ -0,0 +1,41 @@ + + + +close() + +I/O + + + +Web & Application + + + + + + + +
+Without calling this function the channel will remain in the current state even after the sketch has been closed. +]]>
+ + +pwm.close() + + + + + + + + +1.0 + +Method + +Library + +
diff --git a/content/api_en/LIB_io/PWM_list.xml b/content/api_en/LIB_io/PWM_list.xml new file mode 100755 index 000000000..7e8fd2ce0 --- /dev/null +++ b/content/api_en/LIB_io/PWM_list.xml @@ -0,0 +1,45 @@ + + + +list() + +I/O + + + +Web & Application + + + + + + + + + +PWM.list() + + + + + + + + +1.0 + +Method + +Library + + diff --git a/content/api_en/LIB_io/PWM_set.xml b/content/api_en/LIB_io/PWM_set.xml new file mode 100755 index 000000000..f21b3bfba --- /dev/null +++ b/content/api_en/LIB_io/PWM_set.xml @@ -0,0 +1,41 @@ + + + +set() + +I/O + + + +Web & Application + + + + + + + +
+When no period is specified, a default 1 kHz (1000 Hz) is used. +]]>
+ + +pwm.set() + + + + + + + + +1.0 + +Method + +Library + +
diff --git a/content/api_en/LIB_io/SPI.xml b/content/api_en/LIB_io/SPI.xml new file mode 100755 index 000000000..31c93b8e0 --- /dev/null +++ b/content/api_en/LIB_io/SPI.xml @@ -0,0 +1,62 @@ + + + +SPI + +I/O + + + +Application + + + +> 3); + // val is between 0 and 1023 + println(val); +} + +]]> + + + +
+Serial Peripheral Interface (SPI) is a serial bus, commonly used to communicate +with sensors and memory devices. It uses four pins: MOSI (Master Out Slave In), +MISO (Master In Slave Out), and SCLK (clock signal) - those three are shared +among all devices on the bus - as well as one or more SS (Slave Select) pins, +that are used for the master to signal to the slave device that it is the +desired respondent for the transmission.
+
+The "master" device initiates a transfer by pulling the SS pin of the "slave" +low, and begins outputting a clock signal. In SPI, both the "master" as well as +the "slave" device output data at the same time. It is hence not possible to +read data without writing some (even if it means outputting zeros or other +dummy data).
+
+There are multiple possible configuration settings for SPI, see +settings() for details.
+
+This library supports multiple SPI objects making use of the same SPI +interface. +]]>
+ +
diff --git a/content/api_en/LIB_io/SPI_close.xml b/content/api_en/LIB_io/SPI_close.xml new file mode 100755 index 000000000..2e9d7f4a1 --- /dev/null +++ b/content/api_en/LIB_io/SPI_close.xml @@ -0,0 +1,64 @@ + + + +close() + +I/O + + + +Web & Application + + + +> 3); + // val is between 0 and 1023 + println(val); + // and close interface again + adc.close(); +} + +]]> + + + +
+It is normally not necessary to explicitly close SPI interfaces, as they +are closed automatically by the operating system when the sketch exits.
+
+Note: It is possible to have two or more objects using the same interface at +a time. +]]>
+ + +spi.close() + + + + + + + + +1.0 + +Method + +Library + +
diff --git a/content/api_en/LIB_io/SPI_list.xml b/content/api_en/LIB_io/SPI_list.xml new file mode 100755 index 000000000..e6acf17f0 --- /dev/null +++ b/content/api_en/LIB_io/SPI_list.xml @@ -0,0 +1,45 @@ + + + +list() + +I/O + + + +Web & Application + + + + + + + + + +SPI.list() + + + + + + + + +1.0 + +Method + +Library + + diff --git a/content/api_en/LIB_io/SPI_settings.xml b/content/api_en/LIB_io/SPI_settings.xml new file mode 100755 index 000000000..7b434a094 --- /dev/null +++ b/content/api_en/LIB_io/SPI_settings.xml @@ -0,0 +1,61 @@ + + + +settings() + +I/O + + + +Web & Application + + + +> 3); + // val is between 0 and 1023 + println(val); +} + +]]> + + + +
+The default setting is: 500000, SPI.MSBFIRST, SPI.MODE0 +]]>
+ + +spi.settings() + + + + + + + + +1.0 + +Method + +Library + +
diff --git a/content/api_en/LIB_io/SPI_transfer.xml b/content/api_en/LIB_io/SPI_transfer.xml new file mode 100755 index 000000000..7ffe20daf --- /dev/null +++ b/content/api_en/LIB_io/SPI_transfer.xml @@ -0,0 +1,61 @@ + + + +transfer() + +I/O + + + +Web & Application + + + +> 3); + // val is between 0 and 1023 + println(val); +} + +]]> + + + +
+With SPI, data is simultaneously being exchanged between the master device and the slave device. For every byte that is being sent out, there's also one byte being read in. +]]>
+ + +spi.transfer() + + + + + + + + +1.0 + +Method + +Library + +
diff --git a/content/api_en/LIB_io/SoftwareServo.xml b/content/api_en/LIB_io/SoftwareServo.xml new file mode 100644 index 000000000..1e5617ec2 --- /dev/null +++ b/content/api_en/LIB_io/SoftwareServo.xml @@ -0,0 +1,47 @@ + + + +SoftwareServo + +I/O + + + +Application + + + + + + + +
+This library uses timers to control RC servo motors by means of pulse width +modulation (PWM). While not as accurate as dedicated PWM hardware, it has +shown to be sufficient for many applications.
+
+Connect the signal wire (typically colored yellow) to any available GPIO pin +and control the servo's angle as shown in the example sketch. +]]>
+ +
diff --git a/content/api_en/LIB_io/SoftwareServo_attach.xml b/content/api_en/LIB_io/SoftwareServo_attach.xml new file mode 100644 index 000000000..cb889b7ad --- /dev/null +++ b/content/api_en/LIB_io/SoftwareServo_attach.xml @@ -0,0 +1,65 @@ + + + +attach() + +I/O + + + +Web & Application + + + + + + + +
+You must call this function before calling write(). Note that the +servo motor will only be instructed to move after the first time +write() is called.
+
+The optional parameters minPulse and maxPulse control the minimum +and maximum pulse width durations. The default values, identical to +those of Arduino's Servo class, should be compatible with most servo +motors. +]]>
+ + +softwareservo.attach() + + + + + + + + +1.0 + +Method + +Library + +
diff --git a/content/api_en/LIB_io/SoftwareServo_attached.xml b/content/api_en/LIB_io/SoftwareServo_attached.xml new file mode 100644 index 000000000..2c2362958 --- /dev/null +++ b/content/api_en/LIB_io/SoftwareServo_attached.xml @@ -0,0 +1,65 @@ + + + +attached() + +I/O + + + +Web & Application + + + + + + + + + +softwareservo.attached() + + + + + + + + +1.0 + +Method + +Library + + diff --git a/content/api_en/LIB_io/SoftwareServo_detach.xml b/content/api_en/LIB_io/SoftwareServo_detach.xml new file mode 100644 index 000000000..f92e9b3ec --- /dev/null +++ b/content/api_en/LIB_io/SoftwareServo_detach.xml @@ -0,0 +1,64 @@ + + + +detach() + +I/O + + + +Web & Application + + + + + + + +
+Calling this method will stop the servo from moving or trying to +hold the current orientation. +]]>
+ + +softwareservo.detach() + + + + + + + + +1.0 + +Method + +Library + +
diff --git a/content/api_en/LIB_io/SoftwareServo_write.xml b/content/api_en/LIB_io/SoftwareServo_write.xml new file mode 100644 index 000000000..02e1de275 --- /dev/null +++ b/content/api_en/LIB_io/SoftwareServo_write.xml @@ -0,0 +1,61 @@ + + + +write() + +I/O + + + +Web & Application + + + + + + + +
+If you are using this class in combination with a continuous rotation +servo, different angles will result in the servo rotating forward or +backward at different speeds. For regular servo motors, this will +instruct the servo to rotate to and hold a specific angle. +]]>
+ + +softwareservo.write() + + + + + + + + +1.0 + +Method + +Library + +
diff --git a/content/api_en/LIB_io/index.html b/content/api_en/LIB_io/index.html new file mode 100755 index 000000000..2637f8462 --- /dev/null +++ b/content/api_en/LIB_io/index.html @@ -0,0 +1,103 @@ + +

Hardware I/O

+ +
+ +

+ The Hardware I/O library allows access to the computer's hardware periperals, such as digital + inputs and outputs, serial busses, and the like, in a fashion similar to the Arduino plaform. + This library is only available for embedded Linux boards with the necessary kernel drivers, + such as the Raspberry Pi. +

+

+ The source code is available on the processing GitHub repository. Please report bugs here. +

+ +
+ +
+

+

GPIO
+

+ The GPIO class reads and writes from General Purpose I/O pins.
+
+ pinMode()
+ digitalWrite()
+ digitalRead()
+ attachInterrupt()
+ noInterrupts()
+ interrupts()
+ releaseInterrupt()
+ waitFor()
+ releasePin()
+
+

+ +
I2C
+

+ The I2C class communicates with peripherals over I2C interfaces.
+
+ I2C
+ list()
+ beginTransmission()
+ write()
+ read()
+ endTransmission()
+ close()
+
+

+ +
LED
+

+ The LED class controls the computer's build-in lights.
+
+ LED
+ list()
+ brightness()
+ close()
+
+

+ +

+
+ +
+

+ +

PWM
+

+ Use the SoftwareServo class below for the time being. Hardware PWM has yet to be made available by the hardware platforms we support.
+
+ PWM
+ list()
+ set()
+ clear()
+ close()
+
+

+ +
SoftwareServo
+

+ The SoftwareServo class controls RC servo motors attached to General Purpose I/O pins.
+
+ SoftwareServo
+ attach()
+ write()
+ attached()
+ detach()
+
+

+ +
SPI
+

+ The SPI class communicates with attached devices over SPI interfaces.
+
+ SPI
+ list()
+ settings()
+ transfer()
+ close()
+
+

+

+
diff --git a/content/api_en/LIB_net/Client.xml b/content/api_en/LIB_net/Client.xml index e32881909..b717d564e 100755 --- a/content/api_en/LIB_net/Client.xml +++ b/content/api_en/LIB_net/Client.xml @@ -12,6 +12,7 @@ + + +active() + +Client + +Client + +Application + + + + 0) { + dataIn = myClient.read(); + } + } else { + println("Client is not active."); + } + background(dataIn); +} + +void mousePressed() { + myClient.stop(); +} + +]]> + + +true if this client is still active and hasn't run into any trouble. +]]> + + + \ No newline at end of file diff --git a/content/api_en/LIB_net/Client_clear.xml b/content/api_en/LIB_net/Client_clear.xml index 99c19711d..3f364f377 100755 --- a/content/api_en/LIB_net/Client_clear.xml +++ b/content/api_en/LIB_net/Client_clear.xml @@ -12,8 +12,6 @@ + + +active() + +Server + +Server + +Application + + + + + + +true if this server is still active and hasn't run into any trouble. +]]> + + + diff --git a/content/api_en/LIB_net/Server_available.xml b/content/api_en/LIB_net/Server_available.xml index 345bd9fa3..930a984b1 100755 --- a/content/api_en/LIB_net/Server_available.xml +++ b/content/api_en/LIB_net/Server_available.xml @@ -12,8 +12,6 @@ diff --git a/content/api_en/LIB_net/index.html b/content/api_en/LIB_net/index.html index 5c29c0557..0296b32e5 100755 --- a/content/api_en/LIB_net/index.html +++ b/content/api_en/LIB_net/index.html @@ -3,7 +3,7 @@

- The Network library makes it easy to read and write data across machines on the Internet. It allows the creation clients and servers. A server connects to a list of clients for reading and writing data. A client is able to read and write data to a server. + The Network library makes it possible to read and write data across machines on the Internet. It allows the creation clients and servers. A server connects to a list of clients for reading and writing data. A client is able to read and write data to a server.

The source code is available on the Processing GitHub repository. Please report bugs here. @@ -14,11 +14,11 @@

Client
-

The Client class is used to create Client objects that connect to a server - to exchange data.
+

The Client class is used to create Client objects that connect to a server to exchange data.

Client
available()
+ active()
read()
readChar()
readBytes()
@@ -37,12 +37,12 @@

Client

Server
-

The Server class is used to create Server objects that send and receive - data to and from associated clients, the other programs connected to it.
+

The Server class is used to create Server objects that send and receive data to and from associated clients, the other programs connected to it.

Server
write()
available()
+ active()
stop()
disconnect()
ip()
diff --git a/content/api_en/LIB_net/serverEvent.xml b/content/api_en/LIB_net/serverEvent.xml index fafa8b0ff..c4fbb2374 100755 --- a/content/api_en/LIB_net/serverEvent.xml +++ b/content/api_en/LIB_net/serverEvent.xml @@ -11,7 +11,6 @@ @@ -256,6 +257,8 @@

  • If you want 3D data, use the DXF recording library instead. +
  • Using hint(ENABLE_DEPTH_SORT) can improve the appearance of 3D geometry drawn to 2D file formats. +
  • Images don't look great, mostly because of the difference of expectations in how a PDF should look (scalable and high res) versus what happens when image data is written to it at 72 dpi. diff --git a/content/api_en/LIB_serial/Serial.xml b/content/api_en/LIB_serial/Serial.xml index a7c9d173b..ab2ff404b 100755 --- a/content/api_en/LIB_serial/Serial.xml +++ b/content/api_en/LIB_serial/Serial.xml @@ -19,7 +19,7 @@ import processing.serial.*; Serial myPort; // List all the available serial ports: -println(Serial.list()); +printArray(Serial.list()); // Open the port you are using at the rate you want: myPort = new Serial(this, Serial.list()[0], 9600); diff --git a/content/api_en/LIB_serial/Serial_available.xml b/content/api_en/LIB_serial/Serial_available.xml index 27e752d31..333a58039 100755 --- a/content/api_en/LIB_serial/Serial_available.xml +++ b/content/api_en/LIB_serial/Serial_available.xml @@ -21,7 +21,7 @@ Serial myPort; void setup() { // List all the available serial ports: - println(Serial.list()); + printArray(Serial.list()); // Open the port you are using at the rate you want: myPort = new Serial(this, Serial.list()[0], 9600); } diff --git a/content/api_en/LIB_serial/Serial_buffer.xml b/content/api_en/LIB_serial/Serial_buffer.xml index d0b4de3e7..a7202aeeb 100755 --- a/content/api_en/LIB_serial/Serial_buffer.xml +++ b/content/api_en/LIB_serial/Serial_buffer.xml @@ -27,7 +27,7 @@ void setup() { myFont = loadFont("ArialMS-18.vlw"); textFont(myFont, 18); // List all the available serial ports: - println(Serial.list()); + printArray(Serial.list()); // Open the port you are using at the rate you want: myPort = new Serial(this, Serial.list()[0], 9600); myPort.buffer(3); diff --git a/content/api_en/LIB_serial/Serial_bufferUntil.xml b/content/api_en/LIB_serial/Serial_bufferUntil.xml index 0a0bed6d8..e190976a4 100755 --- a/content/api_en/LIB_serial/Serial_bufferUntil.xml +++ b/content/api_en/LIB_serial/Serial_bufferUntil.xml @@ -12,22 +12,16 @@ serialEvent(). ]]> diff --git a/content/api_en/LIB_serial/Serial_clear.xml b/content/api_en/LIB_serial/Serial_clear.xml index bba746386..fa56986ea 100755 --- a/content/api_en/LIB_serial/Serial_clear.xml +++ b/content/api_en/LIB_serial/Serial_clear.xml @@ -22,7 +22,7 @@ int i = 0; void setup() { // List all the available serial ports: - println(Serial.list()); + printArray(Serial.list()); // Open the port you are using at the rate you want: myPort = new Serial(this, Serial.list()[0], 9600); diff --git a/content/api_en/LIB_serial/Serial_last.xml b/content/api_en/LIB_serial/Serial_last.xml index a227e56da..cbee0c6fd 100755 --- a/content/api_en/LIB_serial/Serial_last.xml +++ b/content/api_en/LIB_serial/Serial_last.xml @@ -20,7 +20,7 @@ Serial myPort; // The serial port: void setup() { // List all the available serial ports: - println(Serial.list()); + printArray(Serial.list()); // Open the port you are using at the rate you want: myPort = new Serial(this, Serial.list()[0], 9600); } @@ -36,7 +36,7 @@ void draw() { diff --git a/content/api_en/LIB_serial/Serial_lastChar.xml b/content/api_en/LIB_serial/Serial_lastChar.xml index ae7972292..455e50213 100755 --- a/content/api_en/LIB_serial/Serial_lastChar.xml +++ b/content/api_en/LIB_serial/Serial_lastChar.xml @@ -20,7 +20,7 @@ Serial myPort; // The serial port: void setup() { // List all the available serial ports: - println(Serial.list()); + printArray(Serial.list()); // Open the port you are using at the rate you want: myPort = new Serial(this, Serial.list()[0], 9600); myPort.write(45); @@ -37,7 +37,7 @@ void draw() { diff --git a/content/api_en/LIB_serial/Serial_list.xml b/content/api_en/LIB_serial/Serial_list.xml index e1e33476b..e5c448ef4 100755 --- a/content/api_en/LIB_serial/Serial_list.xml +++ b/content/api_en/LIB_serial/Serial_list.xml @@ -20,7 +20,7 @@ import processing.serial.*; Serial myPort; // List all the available serial ports -println(Serial.list()); +printArray(Serial.list()); ]]> diff --git a/content/api_en/LIB_serial/Serial_read.xml b/content/api_en/LIB_serial/Serial_read.xml index c628cb39c..5e8fecb8a 100755 --- a/content/api_en/LIB_serial/Serial_read.xml +++ b/content/api_en/LIB_serial/Serial_read.xml @@ -20,7 +20,7 @@ Serial myPort; // The serial port void setup() { // List all the available serial ports - println(Serial.list()); + printArray(Serial.list()); // Open the port you are using at the rate you want: myPort = new Serial(this, Serial.list()[0], 9600); } diff --git a/content/api_en/LIB_serial/Serial_readBytes.xml b/content/api_en/LIB_serial/Serial_readBytes.xml index d033fc557..ce01e36f4 100755 --- a/content/api_en/LIB_serial/Serial_readBytes.xml +++ b/content/api_en/LIB_serial/Serial_readBytes.xml @@ -20,7 +20,7 @@ Serial myPort; // The serial port void setup() { // List all the available serial ports - println(Serial.list()); + printArray(Serial.list()); // Open the port you are using at the rate you want: myPort = new Serial(this, Serial.list()[0], 9600); } @@ -42,7 +42,7 @@ void draw() { byteBuffer parameter is more memory and time efficient. It grabs the data in the buffer and puts it into the byte array passed in and returns an int value for the number of bytes read. If more bytes are available than can fit into the byteBuffer, only those that fit are read. +Reads a group of bytes from the buffer or null if there are none available. The version with no parameters returns a byte array of all data in the buffer. This is not efficient, but is easy to use. The version with the byteBuffer parameter is more memory and time efficient. It grabs the data in the buffer and puts it into the byte array passed in and returns an int value for the number of bytes read. If more bytes are available than can fit into the byteBuffer, only those that fit are read. ]]> diff --git a/content/api_en/LIB_serial/Serial_readBytesUntil.xml b/content/api_en/LIB_serial/Serial_readBytesUntil.xml index 1128ab0a7..fb7773582 100755 --- a/content/api_en/LIB_serial/Serial_readBytesUntil.xml +++ b/content/api_en/LIB_serial/Serial_readBytesUntil.xml @@ -20,7 +20,7 @@ Serial myPort; // The serial port void setup() { // List all the available serial ports: - println(Serial.list()); + printArray(Serial.list()); // Open the port you are using at the rate you want: myPort = new Serial(this, Serial.list()[0], 9600); myPort.write(65); @@ -43,7 +43,7 @@ void draw() { byteBuffer parameter returns a byte array of all data up to and including the interesting byte. This is not efficient, but is easy to use. The version with the byteBuffer parameter is more memory and time efficient. It grabs the data in the buffer and puts it into the byte array passed in and returns an int value for the number of bytes read. If the byte buffer is not large enough, -1 is returned and an error is printed to the message area. If nothing is in the buffer, 0 is returned. +Reads from the port into a buffer of bytes up to and including a particular character. If the character isn't in the buffer, null is returned. The version with without the byteBuffer parameter returns a byte array of all data up to and including the interesting byte. This is not efficient, but is easy to use. The version with the byteBuffer parameter is more memory and time efficient. It grabs the data in the buffer and puts it into the byte array passed in and returns an int value for the number of bytes read. If the byte buffer is not large enough, -1 is returned and an error is printed to the message area. If nothing is in the buffer, 0 is returned. ]]> diff --git a/content/api_en/LIB_serial/Serial_readChar.xml b/content/api_en/LIB_serial/Serial_readChar.xml index d452c9b6a..87ef03e44 100755 --- a/content/api_en/LIB_serial/Serial_readChar.xml +++ b/content/api_en/LIB_serial/Serial_readChar.xml @@ -20,7 +20,7 @@ Serial myPort; // The serial port: void setup() { // List all the available serial ports: - println(Serial.list()); + printArray(Serial.list()); // Open the port you are using at the rate you want: myPort = new Serial(this, Serial.list()[0], 9600); diff --git a/content/api_en/LIB_serial/Serial_readString.xml b/content/api_en/LIB_serial/Serial_readString.xml index 480009f51..6a960337e 100755 --- a/content/api_en/LIB_serial/Serial_readString.xml +++ b/content/api_en/LIB_serial/Serial_readString.xml @@ -20,7 +20,7 @@ Serial myPort; // The serial port void setup() { // List all the available serial ports: - println(Serial.list()); + printArray(Serial.list()); // Open the port you are using at the rate you want: myPort = new Serial(this, Serial.list()[0], 9600); } @@ -38,7 +38,7 @@ void draw() { null if there is nothing available. This method assumes the incoming characters are ASCII. If you want to transfer Unicode data, first convert the String to a byte stream in the representation of your choice (i.e. UTF8 or two-byte Unicode data), and send it as a byte array. ]]> diff --git a/content/api_en/LIB_serial/Serial_readStringUntil.xml b/content/api_en/LIB_serial/Serial_readStringUntil.xml index c4b40e0d2..3e1829318 100755 --- a/content/api_en/LIB_serial/Serial_readStringUntil.xml +++ b/content/api_en/LIB_serial/Serial_readStringUntil.xml @@ -22,7 +22,7 @@ Serial myPort; // The serial port void setup() { // List all the available serial ports - println(Serial.list()); + printArray(Serial.list()); // Open the port you are using at the rate you want: myPort = new Serial(this, Serial.list()[0], 9600); myPort.clear(); diff --git a/content/api_en/LIB_serial/Serial_stop.xml b/content/api_en/LIB_serial/Serial_stop.xml index 7c1eb70b4..66d1196a0 100755 --- a/content/api_en/LIB_serial/Serial_stop.xml +++ b/content/api_en/LIB_serial/Serial_stop.xml @@ -22,7 +22,7 @@ int i = 0; void setup() { // List all the available serial ports - println(Serial.list()); + printArray(Serial.list()); // Open the port you are using at the rate you want: myPort = new Serial(this, Serial.list()[0], 9600); } diff --git a/content/api_en/LIB_serial/Serial_write.xml b/content/api_en/LIB_serial/Serial_write.xml index fb15f8d2b..bf5df831f 100755 --- a/content/api_en/LIB_serial/Serial_write.xml +++ b/content/api_en/LIB_serial/Serial_write.xml @@ -20,7 +20,7 @@ import processing.serial.*; Serial myPort; // List all the available serial ports: -println(Serial.list()); +printArray(Serial.list()); // Open the port you are using at the rate you want: myPort = new Serial(this, Serial.list()[0], 9600); diff --git a/content/api_en/LIB_serial/serialEvent.xml b/content/api_en/LIB_serial/serialEvent.xml index 91718067c..2f3f5b8de 100755 --- a/content/api_en/LIB_serial/serialEvent.xml +++ b/content/api_en/LIB_serial/serialEvent.xml @@ -26,7 +26,7 @@ void setup() { myFont = loadFont("ArialMS-18.vlw"); textFont(myFont, 18); // List all the available serial ports: - println(Serial.list()); + printArray(Serial.list()); // I know that the first port in the serial list on my mac // is always my Keyspan adaptor, so I open Serial.list()[0]. // Open whatever port is the one you're using. diff --git a/content/api_en/LIB_sound/Amplitude.xml b/content/api_en/LIB_sound/Amplitude.xml index 1ebf69b24..0822d6d93 100755 --- a/content/api_en/LIB_sound/Amplitude.xml +++ b/content/api_en/LIB_sound/Amplitude.xml @@ -8,6 +8,8 @@ Application +Object + - - - - - - - - - -input() -Define the audio input for the analyzer - - - -analyze() -Query an analysis value - - - -stop() -Stop the analyzer - - - - -Amplitude(parent) - - - -parent -PApplet: typically use "this" - - - - - - - -1.0 - -Object - -Library diff --git a/content/api_en/LIB_sound/Amplitude_analyze.xml b/content/api_en/LIB_sound/Amplitude_analyze.xml index 8bd031f7f..f7f92824f 100755 --- a/content/api_en/LIB_sound/Amplitude_analyze.xml +++ b/content/api_en/LIB_sound/Amplitude_analyze.xml @@ -23,6 +23,7 @@ void setup() { // Create an Input stream which is routed into the Amplitude analyzer amp = new Amplitude(this); in = new AudioIn(this, 0); + in.start(); amp.input(in); } diff --git a/content/api_en/LIB_sound/Amplitude_input.xml b/content/api_en/LIB_sound/Amplitude_input.xml index a28e733f4..2d4f89641 100755 --- a/content/api_en/LIB_sound/Amplitude_input.xml +++ b/content/api_en/LIB_sound/Amplitude_input.xml @@ -23,6 +23,7 @@ void setup() { // Create an Input stream which is routed into the Amplitude analyzer amp = new Amplitude(this); in = new AudioIn(this, 0); + in.start(); amp.input(in); } diff --git a/content/api_en/LIB_sound/Amplitude_stop.xml b/content/api_en/LIB_sound/Amplitude_stop.xml index 68a759e6f..5cbc938da 100755 --- a/content/api_en/LIB_sound/Amplitude_stop.xml +++ b/content/api_en/LIB_sound/Amplitude_stop.xml @@ -23,6 +23,7 @@ void setup() { // Create an Input stream which is routed into the Amplitude analyzer amp = new Amplitude(this); in = new AudioIn(this, 0); + in.start(); amp.input(in); } @@ -32,7 +33,6 @@ void draw() { void mousePressed() { in.stop(); - amp.stop(); } ]]> diff --git a/content/api_en/LIB_sound/AudioDevice.xml b/content/api_en/LIB_sound/AudioDevice.xml index 5bb214dba..1172dc020 100755 --- a/content/api_en/LIB_sound/AudioDevice.xml +++ b/content/api_en/LIB_sound/AudioDevice.xml @@ -4,7 +4,7 @@ Sound -I/O +Configuration Application @@ -29,16 +29,6 @@ void draw() { Audio Device allows for configuring the audio server. If you need a low latency server you can reduce the buffer size. Allowed values are power of 2. For changing the sample rate pass the appropriate value in the constructor. ]]> - - - - - - - - - - AudioDevice(parent, samplerate, buffersize) @@ -57,10 +47,8 @@ AudioDevice(parent, samplerate, buffersize) int: buffersize (i.e. 32/64/128 ..) - - - +Sound 1.0 diff --git a/content/api_en/LIB_sound/AudioIn_add.xml b/content/api_en/LIB_sound/AudioIn_add.xml index dbd9db629..13f7472f9 100755 --- a/content/api_en/LIB_sound/AudioIn_add.xml +++ b/content/api_en/LIB_sound/AudioIn_add.xml @@ -23,6 +23,7 @@ void setup() { in = new AudioIn(this, 0); in.start(); in.add(0.2); + in.play(); } void draw() { diff --git a/content/api_en/LIB_sound/AudioSample.xml b/content/api_en/LIB_sound/AudioSample.xml new file mode 100755 index 000000000..053be266c --- /dev/null +++ b/content/api_en/LIB_sound/AudioSample.xml @@ -0,0 +1,49 @@ + + +AudioSample + +Sound + +Audio Files + +Application + + + + + + + + + + + diff --git a/content/api_en/LIB_sound/AudioSample_amp.xml b/content/api_en/LIB_sound/AudioSample_amp.xml new file mode 100644 index 000000000..7a1181b3e --- /dev/null +++ b/content/api_en/LIB_sound/AudioSample_amp.xml @@ -0,0 +1,42 @@ + + + +play() + +Sound Files + + + +Web & Application + + + + + + + + + diff --git a/content/api_en/LIB_sound/AudioSample_channels.xml b/content/api_en/LIB_sound/AudioSample_channels.xml new file mode 100755 index 000000000..af430a14d --- /dev/null +++ b/content/api_en/LIB_sound/AudioSample_channels.xml @@ -0,0 +1,40 @@ + + + +channels() + +Sound Files + + + +Web & Application + + + + + + + + + diff --git a/content/api_en/LIB_sound/AudioSample_cue.xml b/content/api_en/LIB_sound/AudioSample_cue.xml new file mode 100755 index 000000000..c4eae7ace --- /dev/null +++ b/content/api_en/LIB_sound/AudioSample_cue.xml @@ -0,0 +1,37 @@ + + + +cue() + +Sound Files + + + +Web & Application + + + + + + + + + diff --git a/content/api_en/LIB_sound/AudioSample_duration.xml b/content/api_en/LIB_sound/AudioSample_duration.xml new file mode 100755 index 000000000..b083d3e47 --- /dev/null +++ b/content/api_en/LIB_sound/AudioSample_duration.xml @@ -0,0 +1,38 @@ + + + +duration() + +Sound Files + + + +Web & Application + + + + + + + + + diff --git a/content/api_en/LIB_sound/AudioSample_frames.xml b/content/api_en/LIB_sound/AudioSample_frames.xml new file mode 100755 index 000000000..c58a3c077 --- /dev/null +++ b/content/api_en/LIB_sound/AudioSample_frames.xml @@ -0,0 +1,36 @@ + + + +frames() + +Sound Files + + + +Web & Application + + + + + + + + + diff --git a/content/api_en/LIB_sound/AudioSample_isPlaying.xml b/content/api_en/LIB_sound/AudioSample_isPlaying.xml new file mode 100755 index 000000000..9a7ab422b --- /dev/null +++ b/content/api_en/LIB_sound/AudioSample_isPlaying.xml @@ -0,0 +1,45 @@ + + + +isPlaying() + +Sound Files + + + +Web & Application + + + + + + + + + diff --git a/content/api_en/LIB_sound/AudioSample_jump.xml b/content/api_en/LIB_sound/AudioSample_jump.xml new file mode 100755 index 000000000..290eb7cfd --- /dev/null +++ b/content/api_en/LIB_sound/AudioSample_jump.xml @@ -0,0 +1,36 @@ + + + +jump() + +Sound Files + + + +Web & Application + + + + + + + + + diff --git a/content/api_en/LIB_sound/AudioSample_loop.xml b/content/api_en/LIB_sound/AudioSample_loop.xml new file mode 100644 index 000000000..f95b7e484 --- /dev/null +++ b/content/api_en/LIB_sound/AudioSample_loop.xml @@ -0,0 +1,40 @@ + + + +loop() + +Sound Files + + + +Web & Application + + + + + + + + + diff --git a/content/api_en/LIB_sound/AudioSample_pan.xml b/content/api_en/LIB_sound/AudioSample_pan.xml new file mode 100755 index 000000000..7b2b176db --- /dev/null +++ b/content/api_en/LIB_sound/AudioSample_pan.xml @@ -0,0 +1,38 @@ + + + +pan() + +Sound Files + + + +Web & Application + + + + + + + + + diff --git a/content/api_en/LIB_sound/AudioSample_pause.xml b/content/api_en/LIB_sound/AudioSample_pause.xml new file mode 100755 index 000000000..67ece9ab7 --- /dev/null +++ b/content/api_en/LIB_sound/AudioSample_pause.xml @@ -0,0 +1,51 @@ + + + +pause() + +Sound Files + + + +Web & Application + + + + + + + + + diff --git a/content/api_en/LIB_sound/AudioSample_play.xml b/content/api_en/LIB_sound/AudioSample_play.xml new file mode 100755 index 000000000..d1584ae38 --- /dev/null +++ b/content/api_en/LIB_sound/AudioSample_play.xml @@ -0,0 +1,40 @@ + + + +play() + +Sound Files + + + +Web & Application + + + + + + + + + diff --git a/content/api_en/LIB_sound/AudioSample_rate.xml b/content/api_en/LIB_sound/AudioSample_rate.xml new file mode 100755 index 000000000..fbe8dc446 --- /dev/null +++ b/content/api_en/LIB_sound/AudioSample_rate.xml @@ -0,0 +1,47 @@ + + + +rate() + +Sound Files + + + +Web & Application + + + + + + + + + diff --git a/content/api_en/LIB_sound/AudioSample_read.xml b/content/api_en/LIB_sound/AudioSample_read.xml new file mode 100755 index 000000000..b21fc039a --- /dev/null +++ b/content/api_en/LIB_sound/AudioSample_read.xml @@ -0,0 +1,56 @@ + + + +read() + +Sound Files + + + +Web & Application + + + + + + + + + +AudioSample.frames() + + diff --git a/content/api_en/LIB_sound/AudioSample_resize.xml b/content/api_en/LIB_sound/AudioSample_resize.xml new file mode 100755 index 000000000..d326abdc6 --- /dev/null +++ b/content/api_en/LIB_sound/AudioSample_resize.xml @@ -0,0 +1,40 @@ + + + +resize() + +Sound Files + + + +Web & Application + + + + + + + + + diff --git a/content/api_en/LIB_sound/AudioSample_sampleRate.xml b/content/api_en/LIB_sound/AudioSample_sampleRate.xml new file mode 100755 index 000000000..b67c1fb85 --- /dev/null +++ b/content/api_en/LIB_sound/AudioSample_sampleRate.xml @@ -0,0 +1,37 @@ + + + +sampleRate() + +Sound Files + + + +Web & Application + + + + + + + + + diff --git a/content/api_en/LIB_sound/AudioSample_write.xml b/content/api_en/LIB_sound/AudioSample_write.xml new file mode 100755 index 000000000..e8cfbeb4c --- /dev/null +++ b/content/api_en/LIB_sound/AudioSample_write.xml @@ -0,0 +1,49 @@ + + + +write() + +Sound Files + + + +Web & Application + + + + + + + + + +AudioSample.read + + diff --git a/content/api_en/LIB_sound/BandPass.xml b/content/api_en/LIB_sound/BandPass.xml index 0a5c6a62d..4eef4cc78 100755 --- a/content/api_en/LIB_sound/BandPass.xml +++ b/content/api_en/LIB_sound/BandPass.xml @@ -41,6 +41,7 @@ This is a band pass filter. ]]> + diff --git a/content/api_en/LIB_sound/BandPass_bw.xml b/content/api_en/LIB_sound/BandPass_bw.xml index 5dee3cc97..d761114ac 100755 --- a/content/api_en/LIB_sound/BandPass_bw.xml +++ b/content/api_en/LIB_sound/BandPass_bw.xml @@ -32,8 +32,8 @@ void setup() { bandPass.process(noise); // Change the cutoff frequency and bandwidth of the filter - bandpass.bw(bw); - bandpass.freq(freq); + bandPass.bw(bw); + bandPass.freq(freq); } void draw() { diff --git a/content/api_en/LIB_sound/BandPass_freq.xml b/content/api_en/LIB_sound/BandPass_freq.xml index 1fc7efc92..de6f9b28d 100755 --- a/content/api_en/LIB_sound/BandPass_freq.xml +++ b/content/api_en/LIB_sound/BandPass_freq.xml @@ -31,7 +31,7 @@ void setup() { bandPass.process(noise); // Change the cutoff frequency of the filter - bandpass.freq(freq); + bandPass.freq(freq); } void draw() { diff --git a/content/api_en/LIB_sound/BandPass_stop.xml b/content/api_en/LIB_sound/BandPass_stop.xml index cf78196e6..7e7143aeb 100755 --- a/content/api_en/LIB_sound/BandPass_stop.xml +++ b/content/api_en/LIB_sound/BandPass_stop.xml @@ -37,8 +37,8 @@ void draw() { void mousePressed() { //stop the noise generator and the filter - noise.stop(); - bandpass.stop(); + //noise.stop(); + bandPass.stop(); } ]]> diff --git a/content/api_en/LIB_sound/BrownNoise.xml b/content/api_en/LIB_sound/BrownNoise.xml index 72c8fe79b..f8b95cac7 100755 --- a/content/api_en/LIB_sound/BrownNoise.xml +++ b/content/api_en/LIB_sound/BrownNoise.xml @@ -29,66 +29,7 @@ void draw() { - - - - - - - - -play() -Start the generator - - - -stop() -Stop the generator - - - -amp() -Change the amplitude/volume of the generator - - - -add() -Offset the output of the generator by given value - - - -pan() -Move the sound in a stereo panorama - - - -set() -Set multiple parameters at once - - - -BrownNoise(parent) - - - -parent -PApplet: typically use "this" - - - - - - - -1.0 - -Object - -Library - diff --git a/content/api_en/LIB_sound/BrownNoise_add.xml b/content/api_en/LIB_sound/BrownNoise_add.xml index ec5550347..d00869e8d 100755 --- a/content/api_en/LIB_sound/BrownNoise_add.xml +++ b/content/api_en/LIB_sound/BrownNoise_add.xml @@ -35,19 +35,4 @@ void draw() { The .add() method is useful for modulating other audio signals. ]]> - -noise.add(add) - - - - - - -1.0 - -Method - -Library - - diff --git a/content/api_en/LIB_sound/BrownNoise_amp.xml b/content/api_en/LIB_sound/BrownNoise_amp.xml index edb349c7d..4264c2f4b 100755 --- a/content/api_en/LIB_sound/BrownNoise_amp.xml +++ b/content/api_en/LIB_sound/BrownNoise_amp.xml @@ -35,24 +35,4 @@ void draw() { Changes the amplitude/volume of the noise generator. Allowed values are between 0.0 and 1.0. ]]> - -noise.amp(vol) - - - - - - - - - - - -1.0 - -Method - -Library - - diff --git a/content/api_en/LIB_sound/BrownNoise_pan.xml b/content/api_en/LIB_sound/BrownNoise_pan.xml index 71043d021..6644626fd 100755 --- a/content/api_en/LIB_sound/BrownNoise_pan.xml +++ b/content/api_en/LIB_sound/BrownNoise_pan.xml @@ -36,19 +36,4 @@ void draw() { Pan the generator in a stereo panorama. -1.0 pans to the left channel and 1.0 to the right channel. ]]> - -noise.pan(pos) - - - - - - -1.0 - -Method - -Library - - diff --git a/content/api_en/LIB_sound/BrownNoise_play.xml b/content/api_en/LIB_sound/BrownNoise_play.xml index 9a1c30f40..915d8cfcb 100755 --- a/content/api_en/LIB_sound/BrownNoise_play.xml +++ b/content/api_en/LIB_sound/BrownNoise_play.xml @@ -34,19 +34,4 @@ void draw() { Starts the Brown Noise generator. ]]> - -noise.play() - - - - - - -1.0 - -Method - -Library - - diff --git a/content/api_en/LIB_sound/BrownNoise_set.xml b/content/api_en/LIB_sound/BrownNoise_set.xml index 1ace27281..a24a1c3ef 100755 --- a/content/api_en/LIB_sound/BrownNoise_set.xml +++ b/content/api_en/LIB_sound/BrownNoise_set.xml @@ -41,19 +41,4 @@ void mousePressed() { Sets amplitude, add and pan position with one method. ]]> - -noise.set(amp, add, pos) - - - - - - -1.0 - -Method - -Library - - diff --git a/content/api_en/LIB_sound/BrownNoise_stop.xml b/content/api_en/LIB_sound/BrownNoise_stop.xml index 93c88a426..6111b73ae 100755 --- a/content/api_en/LIB_sound/BrownNoise_stop.xml +++ b/content/api_en/LIB_sound/BrownNoise_stop.xml @@ -1,7 +1,7 @@ -play() +stop() Noise @@ -38,19 +38,4 @@ void mousePressed() { Stops the Brown Noise generator. ]]> - -noise.stop() - - - - - - -1.0 - -Method - -Library - - diff --git a/content/api_en/LIB_sound/FFT.xml b/content/api_en/LIB_sound/FFT.xml index 97e44c134..77bc8750e 100755 --- a/content/api_en/LIB_sound/FFT.xml +++ b/content/api_en/LIB_sound/FFT.xml @@ -1,5 +1,6 @@ + FFT Sound @@ -12,6 +13,7 @@ diff --git a/content/api_en/LIB_sound/FFT_analyze.xml b/content/api_en/LIB_sound/FFT_analyze.xml index 4e2118995..4bd4c1bfa 100755 --- a/content/api_en/LIB_sound/FFT_analyze.xml +++ b/content/api_en/LIB_sound/FFT_analyze.xml @@ -13,61 +13,42 @@ - -amp.analyze() - - - - - - - -float - - - -1.0 - -Method - -Library - - diff --git a/content/api_en/LIB_sound/FFT_input.xml b/content/api_en/LIB_sound/FFT_input.xml index 7b3fac978..bb3ab8c58 100755 --- a/content/api_en/LIB_sound/FFT_input.xml +++ b/content/api_en/LIB_sound/FFT_input.xml @@ -13,6 +13,7 @@ diff --git a/content/api_en/LIB_sound/FFT_stop.xml b/content/api_en/LIB_sound/FFT_stop.xml index c90af3cdc..c58f7b983 100755 --- a/content/api_en/LIB_sound/FFT_stop.xml +++ b/content/api_en/LIB_sound/FFT_stop.xml @@ -1,7 +1,7 @@ -analyze() +stop() Sound @@ -13,6 +13,7 @@ diff --git a/content/api_en/LIB_sound/HighPass_freq.xml b/content/api_en/LIB_sound/HighPass_freq.xml index 9c0b81216..499ef5f6d 100755 --- a/content/api_en/LIB_sound/HighPass_freq.xml +++ b/content/api_en/LIB_sound/HighPass_freq.xml @@ -31,7 +31,7 @@ void setup() { highPass.process(noise); // Change the cutoff frequency of the filter - highpass.freq(freq); + highPass.freq(freq); } void draw() { diff --git a/content/api_en/LIB_sound/HighPass_stop.xml b/content/api_en/LIB_sound/HighPass_stop.xml index 94a64a8f4..9f9eb1b0b 100755 --- a/content/api_en/LIB_sound/HighPass_stop.xml +++ b/content/api_en/LIB_sound/HighPass_stop.xml @@ -17,8 +17,6 @@ import processing.sound.*; WhiteNoise noise; HighPass highPass; -float amp=0.0; - void setup() { size(640,360); background(255); diff --git a/content/api_en/LIB_sound/LowPass_freq.xml b/content/api_en/LIB_sound/LowPass_freq.xml index aed66f36d..f4fd2d8ef 100755 --- a/content/api_en/LIB_sound/LowPass_freq.xml +++ b/content/api_en/LIB_sound/LowPass_freq.xml @@ -31,7 +31,7 @@ void setup() { lowPass.process(noise); // Change the cutoff frequency of the filter - highpass.freq(freq); + lowPass.freq(freq); } void draw() { diff --git a/content/api_en/LIB_sound/LowPass_stop.xml b/content/api_en/LIB_sound/LowPass_stop.xml index 13cda1c39..96423bbea 100755 --- a/content/api_en/LIB_sound/LowPass_stop.xml +++ b/content/api_en/LIB_sound/LowPass_stop.xml @@ -17,8 +17,6 @@ import processing.sound.*; WhiteNoise noise; LowPass lowPass; -float amp=0.0; - void setup() { size(640,360); background(255); diff --git a/content/api_en/LIB_sound/PinkNoise.xml b/content/api_en/LIB_sound/PinkNoise.xml index 59f26ae9a..fd74f29e5 100755 --- a/content/api_en/LIB_sound/PinkNoise.xml +++ b/content/api_en/LIB_sound/PinkNoise.xml @@ -29,66 +29,7 @@ void draw() { - - - - - - - - -play() -Start the generator - - - -stop() -Stop the generator - - - -amp() -Change the amplitude/volume of the generator - - - -add() -Offset the output of the generator by given value - - - -pan() -Move the sound in a stereo panorama - - - -set() -Set multiple parameters at once - - - -WhiteNoise(parent) - - - -parent -PApplet: typically use "this" - - - - - - - -1.0 - -Object - -Library - diff --git a/content/api_en/LIB_sound/PinkNoise_add.xml b/content/api_en/LIB_sound/PinkNoise_add.xml index 999b05183..28de64b97 100755 --- a/content/api_en/LIB_sound/PinkNoise_add.xml +++ b/content/api_en/LIB_sound/PinkNoise_add.xml @@ -35,19 +35,4 @@ void draw() { The .add() method is useful for modulating other audio signals. ]]> - -noise.add(add) - - - - - - -1.0 - -Method - -Library - - diff --git a/content/api_en/LIB_sound/PinkNoise_amp.xml b/content/api_en/LIB_sound/PinkNoise_amp.xml index 14e8a8745..67e87cc56 100755 --- a/content/api_en/LIB_sound/PinkNoise_amp.xml +++ b/content/api_en/LIB_sound/PinkNoise_amp.xml @@ -35,24 +35,4 @@ void draw() { Changes the amplitude/volume of the noise generator. Allowed values are between 0.0 and 1.0. ]]> - -noise.amp(vol) - - - - - - - - - - - -1.0 - -Method - -Library - - diff --git a/content/api_en/LIB_sound/PinkNoise_pan.xml b/content/api_en/LIB_sound/PinkNoise_pan.xml index d786b649b..10bb0cf09 100755 --- a/content/api_en/LIB_sound/PinkNoise_pan.xml +++ b/content/api_en/LIB_sound/PinkNoise_pan.xml @@ -36,19 +36,4 @@ void draw() { Pan the generator in a stereo panorama. -1.0 pans to the left channel and 1.0 to the right channel. ]]> - -noise.pan(pos) - - - - - - -1.0 - -Method - -Library - - diff --git a/content/api_en/LIB_sound/PinkNoise_play.xml b/content/api_en/LIB_sound/PinkNoise_play.xml index 9cf795d7d..c40593f4d 100755 --- a/content/api_en/LIB_sound/PinkNoise_play.xml +++ b/content/api_en/LIB_sound/PinkNoise_play.xml @@ -34,19 +34,4 @@ void draw() { Starts the Pink Noise generator. ]]> - -noise.play() - - - - - - -1.0 - -Method - -Library - - diff --git a/content/api_en/LIB_sound/PinkNoise_set.xml b/content/api_en/LIB_sound/PinkNoise_set.xml index ff84919dc..9914d239f 100755 --- a/content/api_en/LIB_sound/PinkNoise_set.xml +++ b/content/api_en/LIB_sound/PinkNoise_set.xml @@ -41,19 +41,4 @@ void mousePressed() { Sets amplitude, add and pan position with one method. ]]> - -noise.set(amp, add, pos) - - - - - - -1.0 - -Method - -Library - - diff --git a/content/api_en/LIB_sound/PinkNoise_stop.xml b/content/api_en/LIB_sound/PinkNoise_stop.xml index 1d99c7db8..f9bc7dca5 100755 --- a/content/api_en/LIB_sound/PinkNoise_stop.xml +++ b/content/api_en/LIB_sound/PinkNoise_stop.xml @@ -1,7 +1,7 @@ -play() +stop() Noise @@ -38,19 +38,4 @@ void mousePressed() { Stops the Pink Noise generator. ]]> - -noise.stop() - - - - - - -1.0 - -Method - -Library - - diff --git a/content/api_en/LIB_sound/Pulse.xml b/content/api_en/LIB_sound/Pulse.xml index 2bae58c81..e1b4402cd 100755 --- a/content/api_en/LIB_sound/Pulse.xml +++ b/content/api_en/LIB_sound/Pulse.xml @@ -9,7 +9,7 @@ Application - +../../../images/LIB_sound_Pulse.png - - - - - - - - -play() -Start the oscillator - - - -stop() -Stop the oscillator - - - -freq() -Change the frequency of the oscillator - - - -width() -Change the pulse width of the oscillator - - - -amp() -Change the amplitude/volume of the oscillator - - - -add() -Offset the output of the oscillator by given value - - - -pan() -Move the sound in a stereo panorama - - - -set() -Set multiple parameters at once - - - -Pulse(parent) - - - -parent -PApplet: typically use "this" - - - - - - - -1.0 - -Object - -Library - diff --git a/content/api_en/LIB_sound/Pulse_set.xml b/content/api_en/LIB_sound/Pulse_set.xml index 0f3d893e0..0e5935e7f 100755 --- a/content/api_en/LIB_sound/Pulse_set.xml +++ b/content/api_en/LIB_sound/Pulse_set.xml @@ -29,11 +29,11 @@ void draw() { void mousePressed() { float freq=200; - float width=0.5; + float plswidth=0.5; float amp=0.5; float add=0.0; float pos=1; - pulse.set(freq, width, amp, add, pos); + pulse.set(freq, plswidth, amp, add, pos); } ]]> diff --git a/content/api_en/LIB_sound/Reverb.xml b/content/api_en/LIB_sound/Reverb.xml index 8d34c05ce..6697df3b9 100755 --- a/content/api_en/LIB_sound/Reverb.xml +++ b/content/api_en/LIB_sound/Reverb.xml @@ -28,6 +28,7 @@ void setup() { // start the input stream in.play(); + reverb.process(in); } void draw() { diff --git a/content/api_en/LIB_sound/Reverb_stop.xml b/content/api_en/LIB_sound/Reverb_stop.xml index 8d2fe420d..574071bfc 100755 --- a/content/api_en/LIB_sound/Reverb_stop.xml +++ b/content/api_en/LIB_sound/Reverb_stop.xml @@ -32,14 +32,14 @@ void setup() { // Patch the reverb reverb.process(in, 5); - reverb.time(0.5); + //reverb.damp(0.5); } void draw() { } void mousePressed() { - in.stop(); + //in.stop(); reverb.stop(); } diff --git a/content/api_en/LIB_sound/SawOsc.xml b/content/api_en/LIB_sound/SawOsc.xml index 514326e8f..979ca1bb5 100755 --- a/content/api_en/LIB_sound/SawOsc.xml +++ b/content/api_en/LIB_sound/SawOsc.xml @@ -9,7 +9,7 @@ Application - +../../../images/LIB_sound_SawOsc.png - - - - - - - - -play() -Start the oscillator - - - -stop() -Stop the oscillator - - - -freq() -Change the frequency of the oscillator - - - -amp() -Change the amplitude/volume of the oscillator - - - -add() -Offset the output of the oscillator by given value - - - -pan() -Move the sound in a stereo panorama - - - -set() -Set multiple parameters at once - - - -SqrOsc(parent) - - - -parent -PApplet: typically use "this" - - - - - - - -1.0 - -Object - -Library - diff --git a/content/api_en/LIB_sound/SinOsc.xml b/content/api_en/LIB_sound/SinOsc.xml index 1f6c8ad1e..abec47858 100755 --- a/content/api_en/LIB_sound/SinOsc.xml +++ b/content/api_en/LIB_sound/SinOsc.xml @@ -9,7 +9,7 @@ Application - +../../../images/LIB_sound_SinOsc.png - - - - - - - - -play() -Start the oscillator - - - -stop() -Stop the oscillator - - - -freq() -Change the frequency of the oscillator - - - -amp() -Change the amplitude/volume of the oscillator - - - -add() -Offset the output of the oscillator by given value - - - -pan() -Move the sound in a stereo panorama - - - -set() -Set multiple parameters at once - - - -SinOsc(parent) - - - -parent -PApplet: typically use "this" - - - - - - - -1.0 - -Object - -Library - diff --git a/content/api_en/LIB_sound/SinOsc_play.xml b/content/api_en/LIB_sound/SinOsc_play.xml index 31761bad6..4c89cd172 100755 --- a/content/api_en/LIB_sound/SinOsc_play.xml +++ b/content/api_en/LIB_sound/SinOsc_play.xml @@ -13,7 +13,7 @@ + +Sound + +Sound + +Configuration + +Application + + + + + + + + +AudioIn + + + \ No newline at end of file diff --git a/content/api_en/LIB_sound/SoundFile.xml b/content/api_en/LIB_sound/SoundFile.xml index 7b0619ed0..c6eb0d03c 100755 --- a/content/api_en/LIB_sound/SoundFile.xml +++ b/content/api_en/LIB_sound/SoundFile.xml @@ -9,7 +9,6 @@ Application - - - - - - - - - -play() -Play the soundfile - - - -loop() -Loop the soundfile - - - -cue() -Set the starting position of the soundfile - - - -jump() -Jump to a specific position in the file while continuing to play - - - -stop() -Stop the soundfile - - - -rate() -Change the playback rate of the soundfile - - - -amp() -Change the amplitude/volume of the player - - - -add() -Offset the output of the player by given value - - - -pan() -Move the soundfile in a stereo panorama - - - -set() -Set multiple parameters at once - - - -duration() -Returns the duration of the soundfile - - - -sampleRate() -Returns the sample rate of the soundfile - - - -frames() -Returns the number of frames/samples of the soundfile - - - -channels() -Returns the number of channels of the soundfile - - - -SoundFile(parent, path) - - - -parent -PApplet: typically use "this" - - - -path -Full Path to file or filename for data path - - - - - - - -1.0 - -Object - -Library - diff --git a/content/api_en/LIB_sound/SoundFile_add.xml b/content/api_en/LIB_sound/SoundFile_add.xml index 28df56508..2b92734e5 100755 --- a/content/api_en/LIB_sound/SoundFile_add.xml +++ b/content/api_en/LIB_sound/SoundFile_add.xml @@ -18,12 +18,12 @@ SoundFile file; void setup() { size(640, 360); background(255); - + // Load a soundfile from the /data folder of the sketch and play it back file = new SoundFile(this, "sample.mp3"); file.play(); file.add(0.1); -} +} void draw() { } @@ -32,7 +32,7 @@ void draw() { diff --git a/content/api_en/LIB_sound/SoundFile_amp.xml b/content/api_en/LIB_sound/SoundFile_amp.xml index f099a4dde..34002bbd2 100755 --- a/content/api_en/LIB_sound/SoundFile_amp.xml +++ b/content/api_en/LIB_sound/SoundFile_amp.xml @@ -1,7 +1,7 @@ -add() +amp() Sound Files @@ -21,8 +21,8 @@ void setup() { // Load a soundfile from the /data folder of the sketch and play it back file = new SoundFile(this, "sample.mp3"); - file.play(); file.amp(0.5); + file.play(); } void draw() { diff --git a/content/api_en/LIB_sound/SoundFile_channels.xml b/content/api_en/LIB_sound/SoundFile_channels.xml index 2e371f9e2..ace503d83 100755 --- a/content/api_en/LIB_sound/SoundFile_channels.xml +++ b/content/api_en/LIB_sound/SoundFile_channels.xml @@ -18,11 +18,11 @@ SoundFile file; void setup() { size(640, 360); background(255); - + // Load a soundfile from the /data folder of the sketch and get the number of channels file = new SoundFile(this, "sample.mp3"); println(file.channels()); -} +} void draw() { } @@ -31,22 +31,7 @@ void draw() { - -file.channels() - - -int - - - -1.0 - -Method - -Library - - diff --git a/content/api_en/LIB_sound/SoundFile_cue.xml b/content/api_en/LIB_sound/SoundFile_cue.xml index 17b4f2f04..bded003ce 100755 --- a/content/api_en/LIB_sound/SoundFile_cue.xml +++ b/content/api_en/LIB_sound/SoundFile_cue.xml @@ -21,33 +21,17 @@ void setup() { // Load a soundfile from the /data folder of the sketch and play it back file = new SoundFile(this, "sample.mp3"); - file.cue(15.3); + file.cue(3.5); file.play(); } void draw() { } - ]]> - -file.cue(second) - - - - - - -1.0 - -Method - -Library - - diff --git a/content/api_en/LIB_sound/SoundFile_duration.xml b/content/api_en/LIB_sound/SoundFile_duration.xml index 2abbb4f61..969d68a02 100755 --- a/content/api_en/LIB_sound/SoundFile_duration.xml +++ b/content/api_en/LIB_sound/SoundFile_duration.xml @@ -21,32 +21,16 @@ void setup() { // Load a soundfile from the data folder of the sketch and get the duration of the file file = new SoundFile(this, "sample.mp3"); - println("SFDuration= " + soundfile.duration() + " seconds"); + println("Duration= " + file.duration() + " seconds"); } void draw() { } - ]]> - -file.duration() - - -float - - - -1.0 - -Method - -Library - - diff --git a/content/api_en/LIB_sound/SoundFile_frames.xml b/content/api_en/LIB_sound/SoundFile_frames.xml index 5125a8b83..f4a66de1a 100755 --- a/content/api_en/LIB_sound/SoundFile_frames.xml +++ b/content/api_en/LIB_sound/SoundFile_frames.xml @@ -18,10 +18,10 @@ SoundFile file; void setup() { size(640, 360); background(255); - - // Load a soundfile from the data folder of the sketch and get the number of channels + + // Load a soundfile from the data folder of the sketch and get the number of frames file = new SoundFile(this, "sample.mp3"); - println("SFSamples= " + soundfile.frames() + " samples"); + println("Frames= " + file.frames() + " frames"); } void draw() { @@ -31,22 +31,7 @@ void draw() { - -file.frames() - - -int - - - -1.0 - -Method - -Library - - diff --git a/content/api_en/LIB_sound/SoundFile_isPlaying.xml b/content/api_en/LIB_sound/SoundFile_isPlaying.xml new file mode 100755 index 000000000..fb5ec3082 --- /dev/null +++ b/content/api_en/LIB_sound/SoundFile_isPlaying.xml @@ -0,0 +1,45 @@ + + + +isPlaying() + +Sound Files + + + +Web & Application + + + + + + + + + diff --git a/content/api_en/LIB_sound/SoundFile_jump.xml b/content/api_en/LIB_sound/SoundFile_jump.xml index caa6a01a9..23bb57fa1 100755 --- a/content/api_en/LIB_sound/SoundFile_jump.xml +++ b/content/api_en/LIB_sound/SoundFile_jump.xml @@ -21,32 +21,16 @@ void setup() { // Load a soundfile from the /data folder of the sketch and play it back file = new SoundFile(this, "sample.mp3"); - file.jump(15.3); + file.jump(3.5); } void draw() { } - ]]> - -file.jump(second) - - - - - - -1.0 - -Method - -Library - - diff --git a/content/api_en/LIB_sound/SoundFile_loop.xml b/content/api_en/LIB_sound/SoundFile_loop.xml index d66e81a83..8f42ae4d9 100755 --- a/content/api_en/LIB_sound/SoundFile_loop.xml +++ b/content/api_en/LIB_sound/SoundFile_loop.xml @@ -31,7 +31,7 @@ void draw() { diff --git a/content/api_en/LIB_sound/SoundFile_pan.xml b/content/api_en/LIB_sound/SoundFile_pan.xml index 52fc29f6b..44e6f2746 100755 --- a/content/api_en/LIB_sound/SoundFile_pan.xml +++ b/content/api_en/LIB_sound/SoundFile_pan.xml @@ -19,7 +19,7 @@ void setup() { size(640, 360); background(255); - // Load a soundfile from the data folder of the sketch and play it back + // Load a MONO soundfile from the data folder of the sketch and play it back file = new SoundFile(this, "sample.mp3"); file.play(); } @@ -32,22 +32,7 @@ void draw() { - -file.pan() - - - - - - -1.0 - -Method - -Library - - diff --git a/content/api_en/LIB_sound/SoundFile_pause.xml b/content/api_en/LIB_sound/SoundFile_pause.xml new file mode 100755 index 000000000..abfe629ae --- /dev/null +++ b/content/api_en/LIB_sound/SoundFile_pause.xml @@ -0,0 +1,44 @@ + + + +pause() + +Sound Files + + + +Web & Application + + + + + + + + + diff --git a/content/api_en/LIB_sound/SoundFile_play.xml b/content/api_en/LIB_sound/SoundFile_play.xml index 95f493497..f3bb129ef 100755 --- a/content/api_en/LIB_sound/SoundFile_play.xml +++ b/content/api_en/LIB_sound/SoundFile_play.xml @@ -22,31 +22,15 @@ void setup() { // Load a soundfile from the /data folder of the sketch and play it back file = new SoundFile(this, "sample.mp3"); file.play(); -} +} void draw() { } - ]]> - -file.play() - - - - - - -1.0 - -Method - -Library - - diff --git a/content/api_en/LIB_sound/SoundFile_rate.xml b/content/api_en/LIB_sound/SoundFile_rate.xml index 48ef77737..953ca579d 100755 --- a/content/api_en/LIB_sound/SoundFile_rate.xml +++ b/content/api_en/LIB_sound/SoundFile_rate.xml @@ -21,34 +21,17 @@ void setup() { // Load a soundfile from the data folder of the sketch and play it back double the speed file = new SoundFile(this, "sample.mp3"); - file.play(); + file.loop(); file.rate(2); } void draw() { } - ]]> - -file.rate() - - - - - - -1.0 - -Method - -Library - - diff --git a/content/api_en/LIB_sound/SoundFile_sampleRate.xml b/content/api_en/LIB_sound/SoundFile_sampleRate.xml deleted file mode 100755 index 4f24779e3..000000000 --- a/content/api_en/LIB_sound/SoundFile_sampleRate.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - -sampleRate() - -Sound Files - - - -Web & Application - - - - - - - - - -file.sampleRate() - - -int - - - -1.0 - -Method - -Library - - - diff --git a/content/api_en/LIB_sound/SoundFile_set.xml b/content/api_en/LIB_sound/SoundFile_set.xml index e77c0dd64..b9f42ee74 100755 --- a/content/api_en/LIB_sound/SoundFile_set.xml +++ b/content/api_en/LIB_sound/SoundFile_set.xml @@ -19,27 +19,26 @@ void setup() { size(640, 360); background(255); - // Load a soundfile from the data folder of the sketch and get the number of channels + // Load a soundfile from the data folder of the sketch file = new SoundFile(this, "sample.mp3"); - println("SFSampleRate= " + sample.sampleRate() + " Hz"); } void draw() { } void mousePressed() { - float rate=3; - float pos=0.5; - float amp=0.5; - float add=0; - file.set(freq, amp, add, pos); + float rate = 3; + float pos = 0.5; + float amp = 0.5; + float add = 0; + file.set(rate, pos, amp, add); } ]]> diff --git a/content/api_en/LIB_sound/SoundFile_stop.xml b/content/api_en/LIB_sound/SoundFile_stop.xml index 044fea7dd..d4b3830e7 100755 --- a/content/api_en/LIB_sound/SoundFile_stop.xml +++ b/content/api_en/LIB_sound/SoundFile_stop.xml @@ -15,23 +15,26 @@ import processing.sound.*; SoundFile file; - void setup() { +void setup() { size(640, 360); background(255); - + // Load a soundfile from the /data folder of the sketch and play it back file = new SoundFile(this, "sample.mp3"); file.play(); - } - - void mousePressed() { +} + +void draw() { +} + +void mousePressed() { file.stop(); - } +} ]]> diff --git a/content/api_en/LIB_sound/Sound_inputDevice.xml b/content/api_en/LIB_sound/Sound_inputDevice.xml new file mode 100755 index 000000000..e09498aac --- /dev/null +++ b/content/api_en/LIB_sound/Sound_inputDevice.xml @@ -0,0 +1,36 @@ + + + +inputDevice() + +Sound + +Configuration + +Web & Application + + + + + + + + + +AudioIn + + + diff --git a/content/api_en/LIB_sound/Sound_list.xml b/content/api_en/LIB_sound/Sound_list.xml new file mode 100755 index 000000000..80644eb01 --- /dev/null +++ b/content/api_en/LIB_sound/Sound_list.xml @@ -0,0 +1,28 @@ + + + +Sound.list() + +Sound + +Configuration + +Web & Application + + + + + + + + + diff --git a/content/api_en/LIB_sound/Sound_outputDevice.xml b/content/api_en/LIB_sound/Sound_outputDevice.xml new file mode 100755 index 000000000..3f26b40eb --- /dev/null +++ b/content/api_en/LIB_sound/Sound_outputDevice.xml @@ -0,0 +1,33 @@ + + + +outputDevice() + +Sound + +Configuration + +Web & Application + + + + + + + + + +AudioIn + + + diff --git a/content/api_en/LIB_sound/Sound_sampleRate.xml b/content/api_en/LIB_sound/Sound_sampleRate.xml new file mode 100755 index 000000000..0e37ce728 --- /dev/null +++ b/content/api_en/LIB_sound/Sound_sampleRate.xml @@ -0,0 +1,31 @@ + + +sampleRate() + +Sound + +Configuration + +Application + + + + + + + + + diff --git a/content/api_en/LIB_sound/Sound_volume.xml b/content/api_en/LIB_sound/Sound_volume.xml new file mode 100755 index 000000000..96d9e6700 --- /dev/null +++ b/content/api_en/LIB_sound/Sound_volume.xml @@ -0,0 +1,46 @@ + + + +volume() + +Sound + +Configuration + +Web & Application + + + + + + + + + diff --git a/content/api_en/LIB_sound/SqrOsc.xml b/content/api_en/LIB_sound/SqrOsc.xml index d1d0c096f..f4ff7ec2f 100755 --- a/content/api_en/LIB_sound/SqrOsc.xml +++ b/content/api_en/LIB_sound/SqrOsc.xml @@ -9,7 +9,7 @@ Application - +../../../images/LIB_sound_SqrOsc.png - - - - - - - - -play() -Start the oscillator - - - -stop() -Stop the oscillator - - - -freq() -Change the frequency of the oscillator - - - -amp() -Change the amplitude/volume of the oscillator - - - -add() -Offset the output of the oscillator by given value - - - -pan() -Move the sound in a stereo panorama - - - -set() -Set multiple parameters at once - - - -SqrOsc(parent) - - - -parent -PApplet: typically use "this" - - - - - - - -1.0 - -Object - -Library - diff --git a/content/api_en/LIB_sound/TriOsc.xml b/content/api_en/LIB_sound/TriOsc.xml index 2ca49c832..d504de89a 100755 --- a/content/api_en/LIB_sound/TriOsc.xml +++ b/content/api_en/LIB_sound/TriOsc.xml @@ -9,7 +9,7 @@ Application - +../../../images/LIB_sound_TriOsc.png - - - - - - - - -play() -Start the oscillator - - - -stop() -Stop the oscillator - - - -freq() -Change the frequency of the oscillator - - - -amp() -Change the amplitude/volume of the oscillator - - - -add() -Offset the output of the oscillator by given value - - - -pan() -Move the sound in a stereo panorama - - - -set() -Set multiple parameters at once - - - -TriOsc(parent) - - - -parent -PApplet: typically use "this" - - - - - - - -1.0 - -Object - -Library - diff --git a/content/api_en/LIB_sound/Waveform.xml b/content/api_en/LIB_sound/Waveform.xml new file mode 100644 index 000000000..4251ddd60 --- /dev/null +++ b/content/api_en/LIB_sound/Waveform.xml @@ -0,0 +1,107 @@ + + + +Waveform + +Sound + +Analyzer + +Application + + + + + + + + + + + + + + + + +input() +Define the audio input for the analyzer + + + +analyze() +Gets the last nsamples captured from the connected input sound source, writes them + into this Waveform's `data` array, and returns it. + + + +stop() +Stop the analyzer + + + +data +`float[]` of length nsamples, with the sample amplitudes between `-1` and `1` + + + +Waveform(parent) + + + +parent +PApplet: typically use "this" + + + + + + + +Object + +Library + + diff --git a/content/api_en/LIB_sound/WhiteNoise.xml b/content/api_en/LIB_sound/WhiteNoise.xml index 0f67dfb46..ba8d252c2 100755 --- a/content/api_en/LIB_sound/WhiteNoise.xml +++ b/content/api_en/LIB_sound/WhiteNoise.xml @@ -29,66 +29,7 @@ void draw() { - - - - - - - - -play() -Start the generator - - - -stop() -Stop the generator - - - -amp() -Change the amplitude/volume of the generator - - - -add() -Offset the output of the generator by given value - - - -pan() -Move the sound in a stereo panorama - - - -set() -Set multiple parameters at once - - - -WhiteNoise(parent) - - - -parent -PApplet: typically use "this" - - - - - - - -1.0 - -Object - -Library - diff --git a/content/api_en/LIB_sound/WhiteNoise_add.xml b/content/api_en/LIB_sound/WhiteNoise_add.xml index 1876dc1ab..a6da5916b 100755 --- a/content/api_en/LIB_sound/WhiteNoise_add.xml +++ b/content/api_en/LIB_sound/WhiteNoise_add.xml @@ -34,19 +34,4 @@ void draw() { The .add() method is useful for modulating other audio signals. ]]> - -noise.add(add) - - - - - - -1.0 - -Method - -Library - - diff --git a/content/api_en/LIB_sound/WhiteNoise_amp.xml b/content/api_en/LIB_sound/WhiteNoise_amp.xml index 98ea36777..83eef598a 100755 --- a/content/api_en/LIB_sound/WhiteNoise_amp.xml +++ b/content/api_en/LIB_sound/WhiteNoise_amp.xml @@ -35,24 +35,4 @@ void draw() { Changes the amplitude/volume of the noise generator. Allowed values are between 0.0 and 1.0. ]]> - -noise.amp(vol) - - - - - - - - - - - -1.0 - -Method - -Library - - diff --git a/content/api_en/LIB_sound/WhiteNoise_pan.xml b/content/api_en/LIB_sound/WhiteNoise_pan.xml index 3bcfab0ec..ffb68b7cf 100755 --- a/content/api_en/LIB_sound/WhiteNoise_pan.xml +++ b/content/api_en/LIB_sound/WhiteNoise_pan.xml @@ -36,19 +36,4 @@ void draw() { Pan the generator in a stereo panorama. -1.0 pans to the left channel and 1.0 to the right channel. ]]> - -noise.pan(pos) - - - - - - -1.0 - -Method - -Library - - diff --git a/content/api_en/LIB_sound/WhiteNoise_play.xml b/content/api_en/LIB_sound/WhiteNoise_play.xml index c25d29486..9dd12d80d 100755 --- a/content/api_en/LIB_sound/WhiteNoise_play.xml +++ b/content/api_en/LIB_sound/WhiteNoise_play.xml @@ -34,19 +34,4 @@ void draw() { Starts the White Noise generator. ]]> - -noise.play() - - - - - - -1.0 - -Method - -Library - - diff --git a/content/api_en/LIB_sound/WhiteNoise_set.xml b/content/api_en/LIB_sound/WhiteNoise_set.xml index a4d965129..6ecf74ca1 100755 --- a/content/api_en/LIB_sound/WhiteNoise_set.xml +++ b/content/api_en/LIB_sound/WhiteNoise_set.xml @@ -41,19 +41,4 @@ void mousePressed() { Sets amplitude, add and pan position with one method. ]]> - -noise.set(amp, add, pos) - - - - - - -1.0 - -Method - -Library - - diff --git a/content/api_en/LIB_sound/WhiteNoise_stop.xml b/content/api_en/LIB_sound/WhiteNoise_stop.xml index c7a0a65d3..783fa8a36 100755 --- a/content/api_en/LIB_sound/WhiteNoise_stop.xml +++ b/content/api_en/LIB_sound/WhiteNoise_stop.xml @@ -1,7 +1,7 @@ -play() +stop() Noise @@ -38,19 +38,4 @@ void mousePressed() { Stops the White Noise generator. ]]> - -noise.stop() - - - - - - -1.0 - -Method - -Library - - diff --git a/content/api_en/LIB_sound/index.html b/content/api_en/LIB_sound/index.html index 85f3f20c2..5bee0974e 100755 --- a/content/api_en/LIB_sound/index.html +++ b/content/api_en/LIB_sound/index.html @@ -1,71 +1,75 @@ - -

    Sound

    - -
    -

    - The Sound library provides a simple way to work with audio in Processing. It can play, analyze, and synthesizing sound. The library comes with a collection of oscillators for basic wave forms, a variety of noise generators, and effects and filters to alter sound files and other generated sounds. The syntax is minimal to make it easy to patch one sound object into another. -

    -

    - The source code is available on the processing-sound GitHub repository. Please report bugs here. -

    - -
    - -
    -

    - - I/O -

    - AudioDevice
    - AudioIn
    -

    - - Audio Files - -

    - SoundFile
    -

    - - Effects - -

    - LowPass
    - HighPass
    - BandPass
    - Delay
    - Reverb
    -

    - - Analysis -

    - Amplitude
    - FFT
    -

    - -

    -
    - -
    -

    - Noise -

    - WhiteNoise
    - PinkNoise
    - BrownNoise
    -

    - - Oscillators -

    - SinOsc
    - SawOsc
    - SqrOsc
    - TriOsc
    - Pulse
    -

    - - Envelopes -

    - Env
    -

    -

    -
    + +

    Sound

    + +
    +

    + The new Sound library for Processing 3 provides a simple way to work with audio. It can play, analyze, and synthesize sound. It provides a collection of oscillators for basic wave forms, a variety of noise generators, and effects and filters to play and alter sound files and other generated sounds. The syntax is minimal to make it easy to patch one sound object into another. The library also comes with example sketches covering many use cases to help you get started. +

    +

    + The source code is available on the processing-sound GitHub repository. Please report bugs here. This library is only compatible with Processing 3.0+. +

    + +
    + +
    +

    + + Configuration +

    + Sound
    +

    + + I/O +

    + AudioIn
    +

    + + Sampling +

    + SoundFile
    + AudioSample
    +

    + + Effects + +

    + LowPass
    + HighPass
    + BandPass
    + Delay
    + Reverb
    +

    + +

    +
    + +
    +

    + Noise +

    + WhiteNoise
    + PinkNoise
    + BrownNoise
    +

    + + Oscillators +

    + SinOsc
    + SawOsc
    + SqrOsc
    + TriOsc
    + Pulse
    +

    + + Envelopes +

    + Env
    +

    + + Analysis +

    + Amplitude
    + FFT
    +

    +

    +
    diff --git a/content/api_en/LIB_svg/index.html b/content/api_en/LIB_svg/index.html new file mode 100644 index 000000000..24737df1d --- /dev/null +++ b/content/api_en/LIB_svg/index.html @@ -0,0 +1,167 @@ + +

    SVG Export

    + +
    +

    The SVG library makes it possible to write SVG files directly from Processing. These vector graphics files can be scaled to any size and output at very high resolutions. The SVG library can flatten 3D data into a 2D vector file, but to export 3D data, use the DXF library. The source code is available on the Processing GitHub repository. Please report bugs here.
    +
    + This library can be used with the core Processing function size(), or createGraphics(). See the examples below for different techniques.

    +
    + +
    +

    +SVG Export (No Screen Display)
    +
    +This example draws a single frame to a SVG file and quits. (Note that no display window will open; this helps when you're trying to create massive SVG images that are far larger than the screen size.)

    + +
    import processing.svg.*;
    +
    +void setup() {
    +  size(400, 400, SVG, "filename.svg");
    +}
    +
    +void draw() {
    +  // Draw something good here
    +  line(0, 0, width/2, height);
    +
    +  // Exit the program
    +  println("Finished.");
    +  exit();
    +}
    + + +

    SVG Export (With Screen Display)
    +
    +To draw to the screen while also saving an SVG beginRecord() +and endRecord() functions. Unlike the PDF renderer, the SVG renderer will only save the final frame of a sequence. This is slower, but is useful when you need to +see what you're working on as it saves.

    + +
    import processing.svg.*;
    +
    +void setup() {
    +  size(400, 400);
    +  noLoop();
    +  beginRecord(SVG, "filename.svg");
    +}
    +
    +void draw() {
    +  // Draw something good here
    +  line(0, 0, width/2, height);
    +
    +  endRecord();
    +}
    + + +

    Single Frame from an Animation (With Screen Display)
    +It's also possible to save one frame from a program with moving elements. +Create a boolean variable to turn the SVG recording process on and off

    + +
    import processing.svg.*;
    +
    +boolean record;
    +
    +void setup() {
    +  size(400, 400);
    +}
    +
    +void draw() {
    +  if (record) {
    +    // Note that #### will be replaced with the frame number. Fancy!
    +    beginRecord(SVG, "frame-####.svg");
    +  }
    +
    +  // Draw something good here
    +  background(255);
    +  line(mouseX, mouseY, width/2, height/2);
    +
    +  if (record) {
    +    endRecord();
    +	record = false;
    +  }
    +}
    +
    +// Use a keypress so thousands of files aren't created
    +void mousePressed() {
    +  record = true;
    +}
    + + +

    SVG Files from 3D Geometry (With Screen Display)
    +
    +To create vectors from 3D data, use the beginRaw() and endRaw() commands. +These commands will grab the shape data just before it is rendered to the screen. +At this stage, your entire scene is nothing but a long list of lines and triangles. +This means that a shape created with sphere() method will be made up of hundreds of +triangles, rather than a single object.

    + +

    When using beginRaw() and endRaw(), it's possible to write to either a 2D or 3D renderer. +For instance, beginRaw() with the SVG library will write the geometry as flattened triangles +and lines.

    + +
    import processing.svg.*;
    +
    +boolean record;
    +
    +void setup() {
    +  size(500, 500, P3D);
    +}
    +
    +void draw() {
    +  if (record) {
    +    beginRaw(SVG, "output.svg");
    +  }
    +
    +  // Do all your drawing here
    +  background(204);
    +  translate(width/2, height/2, -200);
    +  rotateZ(0.2);
    +  rotateY(mouseX/500.0);
    +  box(200);
    +
    +  if (record) {
    +    endRaw();
    +    record = false;
    +  }
    +}
    +
    +// Hit 'r' to record a single frame
    +void keyPressed() {
    +  if (key == 'r') {
    +    record = true;
    +  }
    +}
    +
    + +

    Using createGraphics() to Create an SVG File
    +
    +To write a SVG file using only the createGraphics() command, rather than as +part of a sketch, it's necessary to call dispose() on the PGraphicsSVG object. +This is the same as calling exit(), but it won't quit the sketch.

    + +
    import processing.svg.*;
    +
    +PGraphics svg = createGraphics(300, 300, SVG, "output.svg");
    +svg.beginDraw();
    +svg.background(128, 0, 0);
    +svg.line(50, 50, 250, 250);
    +svg.dispose();
    +svg.endDraw();
    + + +

    +Additional notes for the SVG renderer: + +

      + +
    • If you want 3D data, use the DXF recording library instead. + +
    • Using hint(ENABLE_DEPTH_SORT) can improve the appearance of 3D geometry drawn to 2D file formats. + +
    • Many methods, particularly pixel-based methods, don't make sense for SVG renderers. This includes: loadPixels, updatePixels, get, set, mask, filter, copy, blend, save, and image + +
    • Again, exit() is really important when using SVG with size(). + +
    + +

    + +
    diff --git a/content/api_en/LIB_video/Movie.xml b/content/api_en/LIB_video/Movie.xml index 279abb2c3..95e897c90 100755 --- a/content/api_en/LIB_video/Movie.xml +++ b/content/api_en/LIB_video/Movie.xml @@ -34,7 +34,7 @@ void movieEvent(Movie m) {
    diff --git a/content/api_en/LIB_video/captureEvent.xml b/content/api_en/LIB_video/captureEvent.xml index 9241e3979..2a3d43028 100755 --- a/content/api_en/LIB_video/captureEvent.xml +++ b/content/api_en/LIB_video/captureEvent.xml @@ -31,7 +31,10 @@ void captureEvent(Capture c) { read() method to capture this frame. If there is more than one capture device in the program, captureEvent() is called each time any of the devices has a new frame available. Use an if within the function to determine which device is triggering the event.]]> +This event function is run when a new camera frame is available. Use the read() method to capture this frame. If there is more than one capture device in the program, captureEvent() is called each time any of the devices has a new frame available. Use an if within the function to determine which device is triggering the event. +

    +This function is for people who want to process the image data separately from drawing (and as quickly as possible.) You cannot draw to the screen inside the captureEvent() function. If you want to draw immediately based on the new image, then use the Capture.available() method. +]]> void captureEvent(Capture which) { diff --git a/content/api_en/LIB_video/index.html b/content/api_en/LIB_video/index.html index 1c9b81f29..e27a9739d 100755 --- a/content/api_en/LIB_video/index.html +++ b/content/api_en/LIB_video/index.html @@ -3,11 +3,12 @@

    - The Video library allows Processing to play and display video files, grab video data from - a camera, and make videos directly from a running program. Video can be captured from USB + The Video library plays movie files and captures video data from a camera. Video can be captured from USB Cameras, IEEE 1394 (Firewire) Cameras, or Video Cards with composite or S-video input devices - connected to the computer. Video can be loaded from files located on your computer or anywhere - on the Internet. + connected to the computer. Movies can be loaded from files located on your computer or anywhere + on the Internet. It is based on the GStreamer multimedia framework, and uses the gstreamer-java bindings + to interface GStreamer from Java to support a wide range of media formats. We recommend using H.264, but many + other formats will work as well.

    The source code is available on the processing-video GitHub repository. Please report bugs here. @@ -20,8 +21,7 @@

    Movie

    - The Movie class makes it possible to load movies and to play - them back in many ways including looping, pausing, and changing speed.
    + The Movie class loads movies and plays them back in many ways including looping, pausing, and changing speed.

    Movie
    read()
    @@ -47,8 +47,7 @@

    Movie

    Capture

    - The Capture class makes it possible to grab frames of video from an attached - capture device such as a camera.
    + The Capture class grabs frames of video from an attached capture device such as a camera.

    Capture
    list()
    diff --git a/content/api_en/LIB_video/movieEvent.xml b/content/api_en/LIB_video/movieEvent.xml index d2ff8a274..25fadc4fc 100755 --- a/content/api_en/LIB_video/movieEvent.xml +++ b/content/api_en/LIB_video/movieEvent.xml @@ -36,6 +36,7 @@ void movieEvent(Movie m) { read() method to capture this frame. If there is more than one movie in the program, movieEvent() is called each time any of the movies has a new frame available. Use an if to determine which movie is triggering the event. See the above example for implementation details. +This event function is run when a new movie frame is available. Use the read() method to capture this frame. If there is more than one movie in the program, movieEvent() is called each time any of the movies has a new frame available. Use an if to determine which movie is triggering the event. See the above example for implementation details. +

    +This function is for people who want to process the image data separately from drawing (and as quickly as possible.) You cannot draw to the screen inside the movieEvent() function. If you want to draw immediately based on the new image, then use the Movie.available() method. ]]>
    diff --git a/content/api_en/PFont.xml b/content/api_en/PFont.xml index 3848d0e57..accb757ce 100755 --- a/content/api_en/PFont.xml +++ b/content/api_en/PFont.xml @@ -14,8 +14,8 @@ PFont font; // The font must be located in the sketch's // "data" directory to load successfully -font = loadFont("LetterGothicStd-32.vlw"); -textFont(font, 32); +font = createFont("LetterGothicStd.ttf", 32); +textFont(font); text("word", 10, 50); ]]>
    diff --git a/content/api_en/PFont_list.xml b/content/api_en/PFont_list.xml index 1cf5fc65d..7a70a2cfb 100755 --- a/content/api_en/PFont_list.xml +++ b/content/api_en/PFont_list.xml @@ -14,7 +14,7 @@ diff --git a/content/api_en/PGraphics.xml b/content/api_en/PGraphics.xml index 1d2a23efa..f8df4047b 100755 --- a/content/api_en/PGraphics.xml +++ b/content/api_en/PGraphics.xml @@ -31,7 +31,7 @@ void draw() { createGraphics() function. The beginDraw() and endDraw() methods (see above example) are necessary to set up the buffer and to finalize it. The fields and methods for this class are extensive. For a complete list, visit the developer's reference.
    +Main graphics and rendering context, as well as the base API implementation for processing "core". Use this class if you need to draw into an off-screen graphics buffer. A PGraphics object can be constructed with the createGraphics() function. The beginDraw() and endDraw() methods (see above example) are necessary to set up the buffer and to finalize it. The fields and methods for this class are extensive. For a complete list, visit the developer's reference.

    To create a new graphics context, use the createGraphics() function. Do not use the syntax new PGraphics(). ]]>
    diff --git a/content/api_en/PI.xml b/content/api_en/PI.xml index d8de1ba8e..9567f9521 100755 --- a/content/api_en/PI.xml +++ b/content/api_en/PI.xml @@ -22,7 +22,7 @@ arc(x, y, d-60, d-60, 0, TWO_PI); sin() and cos(). +PI is a mathematical constant with the value 3.1415927. It is the ratio of the circumference of a circle to its diameter. It is useful in combination with the trigonometric functions sin() and cos(). ]]> diff --git a/content/api_en/PImage_filter.xml b/content/api_en/PImage_filter.xml index 30df9a9da..f30582ad1 100755 --- a/content/api_en/PImage_filter.xml +++ b/content/api_en/PImage_filter.xml @@ -156,7 +156,7 @@ POSTERIZE
    Limits each channel of the image to the number of colors specified as the parameter. The parameter can be set to values between 2 and 255, but results are most noticeable in the lower ranges.

    BLUR
    -Executes a Guassian blur with the level parameter specifying the extent of the blurring. If no parameter is used, the blur is equivalent to Guassian blur of radius 1. Larger values increase the blur.
    +Executes a Gaussian blur with the level parameter specifying the extent of the blurring. If no parameter is used, the blur is equivalent to Gaussian blur of radius 1. Larger values increase the blur.

    ERODE
    Reduces the light areas. No parameter is used.
    diff --git a/content/api_en/PImage_loadPixels.xml b/content/api_en/PImage_loadPixels.xml index 5e84cfc90..a9c353f84 100644 --- a/content/api_en/PImage_loadPixels.xml +++ b/content/api_en/PImage_loadPixels.xml @@ -34,8 +34,6 @@ void draw() { pixels[] array. This function must always be called before reading from or writing to pixels[]. -

    -Certain renderers may or may not seem to require loadPixels() or updatePixels(). However, the rule is that any time you want to manipulate the pixels[] array, you must first call loadPixels(), and after changes have been made, call updatePixels(). Even if the renderer may not seem to use this function in the current Processing release, this will always be subject to change. ]]>
    diff --git a/content/api_en/PImage_pixels.xml b/content/api_en/PImage_pixels.xml index 1ec84949f..1f2a363e2 100755 --- a/content/api_en/PImage_pixels.xml +++ b/content/api_en/PImage_pixels.xml @@ -31,7 +31,9 @@ void draw() { index value defines the position of a value within the array. For example, the statement color b = img.pixels[230] will set the variable b equal to the value at that location in the array. Before accessing this array, the data must loaded with the loadPixels() method. After the array data has been modified, the updatePixels() method must be run to update the changes. Without loadPixels(), running the code may (or will in future releases) result in a NullPointerException. +The pixels[] array contains the values for all the pixels in the image. These values are of the color datatype. This array is the size of the image, meaning if the image is 100 x 100 pixels, there will be 10,000 values and if the window is 200 x 300 pixels, there will be 60,000 values.
    +
    +Before accessing this array, the data must loaded with the loadPixels() method. Failure to do so may result in a NullPointerException. After the array data has been modified, the updatePixels() method must be run to update the content of the display window. ]]>
    diff --git a/content/api_en/PImage_save.xml b/content/api_en/PImage_save.xml index d485f5cc8..0c6830b00 100755 --- a/content/api_en/PImage_save.xml +++ b/content/api_en/PImage_save.xml @@ -29,7 +29,7 @@ newImage.save("outputImage.jpg"); filename parameter. For example, "image.tif" will have a TIFF image and "image.png" will save a PNG image. If no extension is included in the filename, the image will save in TIFF format and .tif will be added to the name. These files are saved to the sketch's folder, which may be opened by selecting "Show sketch folder" from the "Sketch" menu. It is not possible to use save() while running the program in a web browser.

    To save an image created within the code, rather than through loading, it's necessary to make the image with the createImage() function so it is aware of the location of the program and can therefore save the file to the right place. See the createImage() reference for more information. +Saves the image into a file. Append a file extension to the name of the file, to indicate the file format to be used: either TIFF (.tif), TARGA (.tga), JPEG (.jpg), or PNG (.png). If no extension is included in the filename, the image will save in TIFF format and .tif will be added to the name. These files are saved to the sketch's folder, which may be opened by selecting "Show sketch folder" from the "Sketch" menu.

    To save an image created within the code, rather than through loading, it's necessary to make the image with the createImage() function so it is aware of the location of the program and can therefore save the file to the right place. See the createImage() reference for more information. ]]>
    diff --git a/content/api_en/PImage_updatePixels.xml b/content/api_en/PImage_updatePixels.xml index 7e713fffd..470c33d07 100644 --- a/content/api_en/PImage_updatePixels.xml +++ b/content/api_en/PImage_updatePixels.xml @@ -34,10 +34,6 @@ void draw() { pixels[] array. Use in conjunction with loadPixels(). If you're only reading pixels from the array, there's no need to call updatePixels(). -

    -Certain renderers may or may not seem to require loadPixels() or updatePixels(). However, the rule is that any time you want to manipulate the pixels[] array, you must first call loadPixels(), and after changes have been made, call updatePixels(). Even if the renderer may not seem to use this function in the current Processing release, this will always be subject to change. -

    -Currently, none of the renderers use the additional parameters to updatePixels(), however this may be implemented in the future. ]]>
    diff --git a/content/api_en/PShape.xml b/content/api_en/PShape.xml index 1fa56a426..5626a04da 100644 --- a/content/api_en/PShape.xml +++ b/content/api_en/PShape.xml @@ -32,7 +32,7 @@ void draw() { PShape square; // The PShape object void setup() { - size(100, 100, P2D); + size(100, 100); // Creating the PShape as a square. The corner // is 0,0 so that the center is at 40,40 square = createShape(RECT, 0, 0, 80, 80); @@ -45,9 +45,9 @@ void draw() { loadShape() or created with the createShape(). The shape() function is used to draw the shape to the display window. Processing can currently load and display SVG (Scalable Vector Graphics) and OBJ shapes. OBJ files can only be opened using the P3D renderer and createShape() is only available with the P2D and P3D renderers. The loadShape() function supports SVG files created with Inkscape and Adobe Illustrator. It is not a full SVG implementation, but offers some straightforward support for handling vector data. +Datatype for storing shapes. Before a shape is used, it must be loaded with the loadShape() or created with the createShape(). The shape() function is used to draw the shape to the display window. Processing can currently load and display SVG (Scalable Vector Graphics) and OBJ shapes. OBJ files can only be opened using the P3D renderer. The loadShape() function supports SVG files created with Inkscape and Adobe Illustrator. It is not a full SVG implementation, but offers some straightforward support for handling vector data.

    -The PShape object contains a group of methods that can operate on the shape data. Some of the methods are listed below, but the full list used for creating and modifying shapes is available here in the Processing Javadoc.
    +The PShape object contains a group of methods that can operate on the shape data. Some of the methods are listed below, but the full list used for creating and modifying shapes is available here in the Processing Javadoc.

    To create a new shape, use the createShape() function. Do not use the syntax new PShape(). ]]>
    diff --git a/content/api_en/PShape_addChild.xml b/content/api_en/PShape_addChild.xml index 71453a66d..36dcc867a 100644 --- a/content/api_en/PShape_addChild.xml +++ b/content/api_en/PShape_addChild.xml @@ -11,12 +11,40 @@ path, rectangle, and circle are added to a parent PShape variable named house that is a GROUP. ]]> diff --git a/content/api_en/PShape_beginContour.xml b/content/api_en/PShape_beginContour.xml index 57b5f2a1a..510cf16f1 100644 --- a/content/api_en/PShape_beginContour.xml +++ b/content/api_en/PShape_beginContour.xml @@ -14,12 +14,12 @@ PShape s; void setup() { - size(100, 100, P2D); + size(200, 200, P2D); // Make a shape s = createShape(); s.beginShape(); - s.noStroke(); + //s.noStroke(); // Exterior part of shape s.vertex(-50,-50); @@ -30,17 +30,17 @@ void setup() { // Interior part of shape s.beginContour(); s.vertex(-20,-20); - s.vertex(20,-20); - s.vertex(20,20); s.vertex(-20,20); + s.vertex(20,20); + s.vertex(20,-20); s.endContour(); // Finish off shape - s.endShape(); + s.endShape(CLOSE); } void draw() { - background(52); + background(204); translate(width/2, height/2); s.rotate(0.01); shape(s); @@ -49,7 +49,9 @@ void draw() { beginContour() and endContour() methods make it possible to define shapes with other shapes cut out of them. For example, the inside of a letter 'O'. These two functions are always used together, you'll never use one without the other. Between them, define the geometry you want to create. As you'll see when you run the example above, the second smaller shape is cut out of the first larger shape. +The beginContour() and endContour() methods make it possible to define shapes with other shapes cut out of them. For example, the inside of a letter 'O'. These two functions are always used together, you'll never use one without the other. Between them, define the geometry you want to create. As you'll see when you run the example above, the second smaller shape is cut out of the first larger shape.
    +
    +The exterior shape and the interior contour must wind in opposite directions. This means that if the points of the geometry for the exterior shape are described in a clockwise order, the points on the interior shape are defined in a counterclockwise order. ]]>
    diff --git a/content/api_en/PShape_beginShape.xml b/content/api_en/PShape_beginShape.xml index a68acba76..6cb030f6d 100644 --- a/content/api_en/PShape_beginShape.xml +++ b/content/api_en/PShape_beginShape.xml @@ -14,7 +14,7 @@ PShape s; // The PShape object void setup() { - size(100, 100, P2D); + size(100, 100); s = createShape(); s.beginShape(); s.fill(0, 0, 255); diff --git a/content/api_en/PShape_endContour.xml b/content/api_en/PShape_endContour.xml index 436364968..43119b0ea 100644 --- a/content/api_en/PShape_endContour.xml +++ b/content/api_en/PShape_endContour.xml @@ -14,12 +14,12 @@ PShape s; void setup() { - size(100, 100, P2D); + size(200, 200, P2D); // Make a shape s = createShape(); s.beginShape(); - s.noStroke(); + //s.noStroke(); // Exterior part of shape s.vertex(-50,-50); @@ -30,17 +30,17 @@ void setup() { // Interior part of shape s.beginContour(); s.vertex(-20,-20); - s.vertex(20,-20); - s.vertex(20,20); s.vertex(-20,20); + s.vertex(20,20); + s.vertex(20,-20); s.endContour(); // Finish off shape - s.endShape(); + s.endShape(CLOSE); } void draw() { - background(52); + background(204); translate(width/2, height/2); s.rotate(0.01); shape(s); @@ -49,7 +49,9 @@ void draw() { beginContour() and endContour() methods make it possible to define shapes with other shapes cut out of them. For example, the inside of a letter 'O'. These two functions are always used together, you'll never use one without the other. Between them, define the geometry you want to create. As you'll see when you run the example above, the second smaller shape is cut out of the first larger shape. +The beginContour() and endContour() methods make it possible to define shapes with other shapes cut out of them. For example, the inside of a letter 'O'. These two functions are always used together, you'll never use one without the other. Between them, define the geometry you want to create. As you'll see when you run the example above, the second smaller shape is cut out of the first larger shape.
    +
    +The exterior shape and the interior contour must wind in opposite directions. This means that if the points of the geometry for the exterior shape are described in a clockwise order, the points on the interior shape are defined in a counterclockwise order. ]]>
    diff --git a/content/api_en/PShape_endShape.xml b/content/api_en/PShape_endShape.xml index bc52dd798..0f5a7ef6c 100644 --- a/content/api_en/PShape_endShape.xml +++ b/content/api_en/PShape_endShape.xml @@ -14,7 +14,7 @@ PShape s; // The PShape object void setup() { - size(100, 100, P2D); + size(100, 100); s = createShape(); s.beginShape(); s.fill(0, 0, 255); diff --git a/content/api_en/PShape_getVertex.xml b/content/api_en/PShape_getVertex.xml index f240d171f..0ea1be5c1 100644 --- a/content/api_en/PShape_getVertex.xml +++ b/content/api_en/PShape_getVertex.xml @@ -14,7 +14,7 @@ PShape s; void setup() { - size(100, 100, P2D); + size(100, 100); s = createShape(); s.beginShape(); s.vertex(0, 0); @@ -38,7 +38,7 @@ void draw() { getVertex() method returns a PVector with the coordinates of the vertex point located at the position defined by the index parameter. This method works when shapes are created as shown in the example above, but won't work properly when a shape is defined explicitly (e.g. createShape(RECT, 20, 20, 80, 80). +The getVertex() method returns a PVector with the coordinates of the vertex point located at the position defined by the index parameter. This method works when shapes are created as shown in the example above, but won't work properly when a shape is defined explicitly (e.g. createShape(RECT, 20, 20, 80, 80). ]]> diff --git a/content/api_en/PShape_getVertexCount.xml b/content/api_en/PShape_getVertexCount.xml index e8f869da6..6d15db70d 100644 --- a/content/api_en/PShape_getVertexCount.xml +++ b/content/api_en/PShape_getVertexCount.xml @@ -14,7 +14,7 @@ PShape s; void setup() { - size(100, 100, P2D); + size(100, 100); s = createShape(); s.beginShape(); s.vertex(0, 0); diff --git a/content/api_en/PShape_rotate.xml b/content/api_en/PShape_rotate.xml index 16da5477f..a45ade1de 100644 --- a/content/api_en/PShape_rotate.xml +++ b/content/api_en/PShape_rotate.xml @@ -31,7 +31,7 @@ void mousePressed() { angle parameter. Angles should be specified in radians (values from 0 to TWO_PI) or converted to radians with the radians() method. +Rotates the shape the amount specified by the angle parameter. Angles should be specified in radians (values from 0 to TWO_PI) or converted from degrees to radians with the radians() method.

    Shapes are always rotated around the upper-left corner of their bounding box. Positive numbers rotate objects in a clockwise direction. Transformations apply to everything that happens after and subsequent calls to the method accumulates the effect. For example, calling rotate(HALF_PI) and then rotate(HALF_PI) is the same as rotate(PI). This transformation is applied directly to the shape, it's not refreshed each time draw() is run. ]]>
    diff --git a/content/api_en/PShape_rotateX.xml b/content/api_en/PShape_rotateX.xml index f1183d080..5b2cc31dc 100644 --- a/content/api_en/PShape_rotateX.xml +++ b/content/api_en/PShape_rotateX.xml @@ -31,7 +31,7 @@ void mousePressed() { angle parameter. Angles should be specified in radians (values from 0 to TWO_PI) or converted to radians with the radians() method. +Rotates the shape around the x-axis the amount specified by the angle parameter. Angles should be specified in radians (values from 0 to TWO_PI) or converted from degrees to radians with the radians() method.

    Shapes are always rotated around the upper-left corner of their bounding box. Positive numbers rotate objects in a clockwise direction. Subsequent calls to the method accumulates the effect. For example, calling rotateX(HALF_PI) and then rotateX(HALF_PI) is the same as rotateX(PI). This transformation is applied directly to the shape, it's not refreshed each time draw() is run.

    diff --git a/content/api_en/PShape_rotateY.xml b/content/api_en/PShape_rotateY.xml index f53594811..ca2c14616 100644 --- a/content/api_en/PShape_rotateY.xml +++ b/content/api_en/PShape_rotateY.xml @@ -31,7 +31,7 @@ void mousePressed() { angle parameter. Angles should be specified in radians (values from 0 to TWO_PI) or converted to radians with the radians() method. +Rotates the shape around the y-axis the amount specified by the angle parameter. Angles should be specified in radians (values from 0 to TWO_PI) or converted from degrees to radians with the radians() method.

    Shapes are always rotated around the upper-left corner of their bounding box. Positive numbers rotate objects in a clockwise direction. Subsequent calls to the method accumulates the effect. For example, calling rotateY(HALF_PI) and then rotateY(HALF_PI) is the same as rotateY(PI). This transformation is applied directly to the shape, it's not refreshed each time draw() is run.

    diff --git a/content/api_en/PShape_rotateZ.xml b/content/api_en/PShape_rotateZ.xml index 77c57e791..53c3aa66b 100644 --- a/content/api_en/PShape_rotateZ.xml +++ b/content/api_en/PShape_rotateZ.xml @@ -31,7 +31,7 @@ void mousePressed() { angle parameter. Angles should be specified in radians (values from 0 to TWO_PI) or converted to radians with the radians() method. +Rotates the shape around the z-axis the amount specified by the angle parameter. Angles should be specified in radians (values from 0 to TWO_PI) or converted from degrees to radians with the radians() method.

    Shapes are always rotated around the upper-left corner of their bounding box. Positive numbers rotate objects in a clockwise direction. Subsequent calls to the method accumulates the effect. For example, calling rotateZ(HALF_PI) and then rotateZ(HALF_PI) is the same as rotateZ(PI). This transformation is applied directly to the shape, it's not refreshed each time draw() is run.

    diff --git a/content/api_en/PShape_setFill.xml b/content/api_en/PShape_setFill.xml new file mode 100644 index 000000000..c827a4376 --- /dev/null +++ b/content/api_en/PShape_setFill.xml @@ -0,0 +1,36 @@ + + +setFill() + +PShape + +Method + + + + + + + + +setFill() method defines the fill color of a PShape. This method is used after shapes are created or when a shape is defined explicitly (e.g. createShape(RECT, 20, 20, 80, 80)) as shown in the above example. When a shape is created with beginShape() and endShape(), its attributes may be changed with fill() and stroke() within beginShape() and endShape(). However, after the shape is created, only the setFill() method can define a new fill value for the PShape. +]]> + + diff --git a/content/api_en/PShape_setStroke.xml b/content/api_en/PShape_setStroke.xml new file mode 100644 index 000000000..edf9b4072 --- /dev/null +++ b/content/api_en/PShape_setStroke.xml @@ -0,0 +1,36 @@ + + +setStroke() + +PShape + +Method + + + + + + + + +setStroke() method defines the outline color of a PShape. This method is used after shapes are created or when a shape is defined explicitly (e.g. createShape(RECT, 20, 20, 80, 80)) as shown in the above example. When a shape is created with beginShape() and endShape(), its attributes may be changed with fill() and stroke() within beginShape() and endShape(). However, after the shape is created, only the setStroke() method can define a new stroke value for the PShape. +]]> + + \ No newline at end of file diff --git a/content/api_en/PShape_setVertex.xml b/content/api_en/PShape_setVertex.xml index 16bb9c8d2..9905ade92 100644 --- a/content/api_en/PShape_setVertex.xml +++ b/content/api_en/PShape_setVertex.xml @@ -14,7 +14,7 @@ PShape s; void setup() { - size(100, 100, P2D); + size(100, 100); s = createShape(); s.beginShape(); s.vertex(0, 0); @@ -38,7 +38,7 @@ void draw() { setVertex() method defines the coordinates of the vertex point located at the position defined by the index parameter. This method works when shapes are created as shown in the example above, but won't work properly when a shape is defined explicitly (e.g. createShape(RECT, 20, 20, 80, 80). +The setVertex() method defines the coordinates of the vertex point located at the position defined by the index parameter. This method works when shapes are created as shown in the example above, but won't work properly when a shape is defined explicitly (e.g. createShape(RECT, 20, 20, 80, 80). ]]> diff --git a/content/api_en/PVector_add.xml b/content/api_en/PVector_add.xml index 859f30b37..89937fd8f 100644 --- a/content/api_en/PVector_add.xml +++ b/content/api_en/PVector_add.xml @@ -70,7 +70,7 @@ void draw() { diff --git a/content/api_en/PVector_array.xml b/content/api_en/PVector_array.xml index b39ed5d07..b4a7f9cd8 100644 --- a/content/api_en/PVector_array.xml +++ b/content/api_en/PVector_array.xml @@ -21,7 +21,7 @@ println(f[2]); // Prints "30.0" PVector.get() method to copy into your own array. +Return a representation of this vector as a float array. This is only for temporary use. If used in any other fashion, the contents should be copied by using the copy() method to copy into your own array. ]]> diff --git a/content/api_en/PVector_div.xml b/content/api_en/PVector_div.xml index 48f6f098a..c5f153892 100644 --- a/content/api_en/PVector_div.xml +++ b/content/api_en/PVector_div.xml @@ -46,7 +46,7 @@ void draw() { diff --git a/content/api_en/PVector_lerp.xml b/content/api_en/PVector_lerp.xml index 82e8097a3..511cbefe8 100644 --- a/content/api_en/PVector_lerp.xml +++ b/content/api_en/PVector_lerp.xml @@ -65,7 +65,7 @@ void draw() { lerp(), but for vectors.)

    -Note that there is one static version of this method, and two non-static versions. The static version, lerp(v1, v2, amt) is given the two vectors to interpolate and returns a new PVector object. The static version is used by referencing the PVector class directly. (See the middle example above.) The non-static versions, lerp(v, amt) and lerp(x, y, z, amt), do not return a new PVector, but transform the values of the PVector on which they are called. These non-static versions function the same way, but the former takes another vector as input, while the latter takes three float values. (See the top and bottom examples above, respectively.) +Note that there is one static version of this method, and two non-static versions. The static version, lerp(v1, v2, amt) is given the two vectors to interpolate and returns a new PVector object. The static version is used by referencing the PVector class directly. (See the middle example above.) The non-static versions, lerp(v, amt) and lerp(x, y, z, amt), do not create a new PVector, but transform the values of the PVector on which they are called. These non-static versions perform the same operation, but the former takes another vector as input, while the latter takes three float values. (See the top and bottom examples above, respectively.) ]]>
    diff --git a/content/api_en/PVector_mult.xml b/content/api_en/PVector_mult.xml index 4385342d2..778c37a24 100644 --- a/content/api_en/PVector_mult.xml +++ b/content/api_en/PVector_mult.xml @@ -46,7 +46,7 @@ void draw() { diff --git a/content/api_en/PVector_sub.xml b/content/api_en/PVector_sub.xml index d43f5cc83..ad7f6bc70 100644 --- a/content/api_en/PVector_sub.xml +++ b/content/api_en/PVector_sub.xml @@ -70,7 +70,7 @@ void draw() { diff --git a/content/api_en/QUARTER_PI.xml b/content/api_en/QUARTER_PI.xml index 0ae6805d5..66ceae319 100644 --- a/content/api_en/QUARTER_PI.xml +++ b/content/api_en/QUARTER_PI.xml @@ -22,7 +22,7 @@ arc(x, y, d-60, d-60, 0, TWO_PI); sin() and cos(). +QUARTER_PI is a mathematical constant with the value 0.7853982. It is one quarter the ratio of the circumference of a circle to its diameter. It is useful in combination with the trigonometric functions sin() and cos(). ]]> diff --git a/content/api_en/StringList_hasValue.xml b/content/api_en/StringList_hasValue.xml index 764dfa9d9..c864feb07 100755 --- a/content/api_en/StringList_hasValue.xml +++ b/content/api_en/StringList_hasValue.xml @@ -21,8 +21,8 @@ void setup() { inventory.append("flour"); inventory.append("tea"); println(inventory); - if (inventory.hasValue("tea") == true) { - println("Yes, we have a tea"); + if (inventory.hasValue("tea")) { + println("Yes, we have tea"); } else { println("Sorry, no tea"); } diff --git a/content/api_en/TAU.xml b/content/api_en/TAU.xml index fdf2aa147..ba3fe363a 100644 --- a/content/api_en/TAU.xml +++ b/content/api_en/TAU.xml @@ -22,7 +22,7 @@ arc(x, y, d-60, d-60, 0, TAU); sin() and cos(). +TAU is a mathematical constant with the value 6.2831855. It is the circle constant relating the circumference of a circle to its linear dimension, the ratio of the circumference of a circle to its radius. It is useful in combination with trigonometric functions such as sin() and cos(). ]]> diff --git a/content/api_en/TWO_PI.xml b/content/api_en/TWO_PI.xml index 86843be6c..50388e870 100755 --- a/content/api_en/TWO_PI.xml +++ b/content/api_en/TWO_PI.xml @@ -22,7 +22,7 @@ arc(x, y, d-60, d-60, 0, TWO_PI); sin() and cos(). +TWO_PI is a mathematical constant with the value 6.2831855. It is twice the ratio of the circumference of a circle to its diameter. It is useful in combination with the trigonometric functions sin() and cos(). ]]> diff --git a/content/api_en/Table.xml b/content/api_en/Table.xml index dd0071150..1df13c6cd 100755 --- a/content/api_en/Table.xml +++ b/content/api_en/Table.xml @@ -37,7 +37,10 @@ void setup() { Table objects store data with multiple rows and columns, much like in a traditional spreadsheet. Tables can be generated from scratch, dynamically, or using data from an existing file. Tables can also be output and saved to disk, as in the example above. +Table objects store data with multiple rows and columns, much like in a traditional spreadsheet. Tables can be generated from scratch, dynamically, or using data from an existing file. Tables can also be output and saved to disk, as in the example above.
    +
    +Additional Table methods are documented in the Processing Table Javadoc. + ]]>
    diff --git a/content/api_en/TableRow.xml b/content/api_en/TableRow.xml index aaf992285..f6510325e 100755 --- a/content/api_en/TableRow.xml +++ b/content/api_en/TableRow.xml @@ -35,7 +35,9 @@ void setup() { TableRow object represents a single row of data values, stored in columns, from a table. +A TableRow object represents a single row of data values, stored in columns, from a table.
    +
    +Additional TableRow methods are documented in the Processing Data Javadoc. ]]>
    diff --git a/content/api_en/TableRow_getColumnCount.xml b/content/api_en/TableRow_getColumnCount.xml new file mode 100755 index 000000000..f43d72856 --- /dev/null +++ b/content/api_en/TableRow_getColumnCount.xml @@ -0,0 +1,36 @@ + + + +getColumnCount() + +TableRow + +Method + +method + + + + + + +TableRow. +]]> + + diff --git a/content/api_en/TableRow_getColumnTitle.xml b/content/api_en/TableRow_getColumnTitle.xml new file mode 100755 index 000000000..51c7502a8 --- /dev/null +++ b/content/api_en/TableRow_getColumnTitle.xml @@ -0,0 +1,38 @@ + + + +getColumnTitle() + +TableRow + +Method + +method + + + + + + +TableRow based on its ID (e.g. 0, 1, 2, etc.) +]]> + + diff --git a/content/api_en/Table_sort.xml b/content/api_en/Table_sort.xml new file mode 100755 index 000000000..6ef191f52 --- /dev/null +++ b/content/api_en/Table_sort.xml @@ -0,0 +1,91 @@ + + + +sort() + +Table + +Method + +method + + + + + + + + + + + + + + diff --git a/content/api_en/ambientLight.xml b/content/api_en/ambientLight.xml index 8f2ed792f..029c8dcf4 100755 --- a/content/api_en/ambientLight.xml +++ b/content/api_en/ambientLight.xml @@ -41,7 +41,7 @@ sphere(30); draw() to remain persistent in a looping program. Placing them in the setup() of a looping program will cause them to only have an effect the first time through the loop. The v1, v2, and v3 parameters are interpreted as either RGB or HSB values, depending on the current color mode. +Adds an ambient light. Ambient light doesn't come from a specific direction, the rays of light have bounced around so much that objects are evenly lit from all sides. Ambient lights are almost always used in combination with other types of lights. Lights need to be included in the draw() to remain persistent in a looping program. Placing them in the setup() of a looping program will cause them to only have an effect the first time through the loop. The v1, v2, and v3 parameters are interpreted as either RGB or HSB values, depending on the current color mode. ]]> diff --git a/content/api_en/append.xml b/content/api_en/append.xml index d9fc3aecc..fea9cc952 100755 --- a/content/api_en/append.xml +++ b/content/api_en/append.xml @@ -23,7 +23,7 @@ println(sa2); element parameter must be the same as the datatype of the array.
    +Expands a one-dimensional array by one element and adds data to the new position. The datatype of the element parameter must be the same as the datatype of the array.

    When using an array of objects, the data returned from the function must be cast to the object array's data type. For example: SomeClass[] items = (SomeClass[]) append(originalArray, element) ]]>
    diff --git a/content/api_en/arc.xml b/content/api_en/arc.xml index b48f0a376..071891848 100755 --- a/content/api_en/arc.xml +++ b/content/api_en/arc.xml @@ -37,9 +37,11 @@ arc(50, 50, 80, 80, 0, PI+QUARTER_PI, PIE); a, b, c, and d parameters. The origin of the arc's ellipse may be changed with the ellipseMode() function. Use the start and stop parameters to specify the angles (in radians) at which to draw the arc.
    -
    -There are three ways to draw an arc; the rendering technique used is defined by the optional seventh paramter. The three options, depicted in the above examples, are PIE, OPEN, and CHORD. The default mode is the OPEN stroke with a PIE fill. +Draws an arc to the screen. Arcs are drawn along the outer edge of an ellipse defined by the a, b, c, and d parameters. The origin of the arc's ellipse may be changed with the ellipseMode() function. Use the start and stop parameters to specify the angles (in radians) at which to draw the arc. The start/stop values must be in clockwise order. +

    +There are three ways to draw an arc; the rendering technique used is defined by the optional seventh parameter. The three options, depicted in the above examples, are PIE, OPEN, and CHORD. The default mode is the OPEN stroke with a PIE fill. +

    +In some cases, the arc() function isn't accurate enough for smooth drawing. For example, the shape may jitter on screen when rotating slowly. If you're having an issue with how arcs are rendered, you'll need to draw the arc yourself with beginShape()/endShape() or a PShape. ]]>
    diff --git a/content/api_en/arrayCopy.xml b/content/api_en/arrayCopy.xml index 1d0d41ef7..1b5165a10 100644 --- a/content/api_en/arrayCopy.xml +++ b/content/api_en/arrayCopy.xml @@ -41,7 +41,7 @@ Copies an array (or part of an array) to another array. The src array is
    The simplified version with only two arguments — arrayCopy(src, dst) — copies an entire array to another of the same size. It is equivalent to arrayCopy(src, 0, dst, 0, src.length).

    -Using this function is far more efficient for copying array data than iterating through a for() loop and copying each element individually. This function only copies references, which means that for most purposes it only copies one-dimensional arrays (a single set of brackets). If used with a two (or three or more) dimensional array, it will only copy the references at the first level, because a two dimensional array is simply an "array of arrays". This does not produce an error, however, because this is often the desired behavior. Internally, this function calls Java's System.arraycopy() method, so most things that apply there are inherited. +Using this function is far more efficient for copying array data than iterating through a for() loop and copying each element individually. This function only copies references, which means that for most purposes it only copies one-dimensional arrays (a single set of brackets). If used with a two (or three or more) dimensional array, it will only copy the references at the first level, because a two dimensional array is simply an "array of arrays". This does not produce an error, however, because this is often the desired behavior. Internally, this function calls Java's System.arraycopy() method, so most things that apply there are inherited. ]]>
    diff --git a/content/api_en/attrib.xml b/content/api_en/attrib.xml new file mode 100644 index 000000000..3d21bc538 --- /dev/null +++ b/content/api_en/attrib.xml @@ -0,0 +1,63 @@ + + + +attrib() + +Rendering + + + + + + + + + + +attrib() function attaches custom values to each vertex in the scene. By default, Processing handles several per-vertex attributes: position, color, normal, texture coordinates, etc. These attributes are used by the renderer to determine how the geometry will look on the screen as result of applying the built-in shaders that compute texture, lighting, etc. However, if the coder sets a custom shader that does some additional rendering calculations, then she might need to pass additional information to the the shader in the form of custom attributes. These attributes can be of three types: position, normal, color, and other. The first three are meant to specify xyz coordinates, normal coordinates, and color components, respectively. The third type can be use to pass any kind of attribute value. +]]> + + diff --git a/content/api_en/beginContour.xml b/content/api_en/beginContour.xml index f11804d23..2ac030959 100644 --- a/content/api_en/beginContour.xml +++ b/content/api_en/beginContour.xml @@ -32,7 +32,7 @@ endShape(CLOSE); beginContour() and endContour() function to create negative shapes within shapes such as the center of the letter 'O'. beginContour() begins recording vertices for the shape and endContour() stops recording. The vertices that define a negative shape must "wind" in the opposite direction from the exterior shape. First draw vertices for the exterior shape in clockwise order, then for internal shapes, draw vertices counter-clockwise.
    +Use the beginContour() and endContour() function to create negative shapes within shapes such as the center of the letter 'O'. beginContour() begins recording vertices for the shape and endContour() stops recording. The vertices that define a negative shape must "wind" in the opposite direction from the exterior shape. First draw vertices for the exterior shape in clockwise order, then for internal shapes, draw vertices counterclockwise.

    These functions can only be used within a beginShape()/endShape() pair and transformations such as translate(), rotate(), and scale() do not work within a beginContour()/endContour() pair. It is also not possible to use other shapes, such as ellipse() or rect() within. ]]>
    diff --git a/content/api_en/beginRaw.xml b/content/api_en/beginRaw.xml index 17a899383..caaeb869c 100755 --- a/content/api_en/beginRaw.xml +++ b/content/api_en/beginRaw.xml @@ -38,7 +38,7 @@ When using beginRaw() and endRaw(), it's possible to write to eith

    If you want a background to show up in your files, use rect(0, 0, width, height) after setting the fill() to the background color. Otherwise the background will not be rendered to the file because the background is not shape.

    -Using hint(ENABLE_DEPTH_SORT) can improve the appearance of 3D geometry drawn to 2D file formats. See the hint() reference for more details. +Using hint(ENABLE_DEPTH_SORT) can improve the appearance of 3D geometry drawn to 2D file formats.

    See examples in the reference for the PDF and DXF libraries for more information. ]]>
    diff --git a/content/api_en/blend.xml b/content/api_en/blend.xml index 54425c3a0..59d8431c9 100755 --- a/content/api_en/blend.xml +++ b/content/api_en/blend.xml @@ -52,15 +52,15 @@ blend(img, 0, 0, 33, 100, 67, 0, 33, 100, LIGHTEST);
    -BLEND - linear interpolation of colours: C = A*factor + B
    +BLEND - linear interpolation of colors: C = A*factor + B

    ADD - additive blending with white clip: C = min(A*factor + B, 255)

    SUBTRACT - subtractive blending with black clip: C = max(B - A*factor, 0)

    -DARKEST - only the darkest colour succeeds: C = min(A*factor, B)
    +DARKEST - only the darkest color succeeds: C = min(A*factor, B)

    -LIGHTEST - only the lightest colour succeeds: C = max(A*factor, B)
    +LIGHTEST - only the lightest color succeeds: C = max(A*factor, B)

    DIFFERENCE - subtract colors from underlying image.

    @@ -84,7 +84,7 @@ Called "Color Dodge" in Illustrator and Photoshop.
    BURN - Darker areas are applied, increasing contrast, ignores lights. Called "Color Burn" in Illustrator and Photoshop.

    -All modes use the alpha information (highest byte) of source image pixels as the blending factor. If the source and destination regions are different sizes, the image will be automatically resized to match the destination size. If the srcImg parameter is not used, the display window is used as the source image.
    +All modes use the alpha information (highest byte) of source image pixels as the blending factor. If the source and destination regions are different sizes, the image will be automatically resized to match the destination size. If the src parameter is not used, the display window is used as the source image.

    As of release 0149, this function ignores imageMode(). ]]>
    diff --git a/content/api_en/blendMode.xml b/content/api_en/blendMode.xml index 09a5698db..a3c309cb1 100755 --- a/content/api_en/blendMode.xml +++ b/content/api_en/blendMode.xml @@ -35,17 +35,17 @@ line(75, 25, 25, 75); +Blends the pixels in the display window according to a defined mode. There is a choice of the following modes to blend the source pixels (A) with the ones of pixels already in the display window (B). Each pixel's final color is the result of applying one of the blend modes with each channel of (A) and (B) independently. The red channel is compared with red, green with green, and blue with blue.

    -BLEND - linear interpolation of colours: C = A*factor + B. This is the default blending mode.
    +BLEND - linear interpolation of colors: C = A*factor + B. This is the default.

    ADD - additive blending with white clip: C = min(A*factor + B, 255)

    SUBTRACT - subtractive blending with black clip: C = max(B - A*factor, 0)

    -DARKEST - only the darkest colour succeeds: C = min(A*factor, B)
    +DARKEST - only the darkest color succeeds: C = min(A*factor, B)

    -LIGHTEST - only the lightest colour succeeds: C = max(A*factor, B)
    +LIGHTEST - only the lightest color succeeds: C = max(A*factor, B)

    DIFFERENCE - subtract colors from underlying image.

    @@ -57,7 +57,7 @@ SCREEN - opposite multiply, uses inverse values of the colors.

    REPLACE - the pixels entirely replace the others and don't utilize alpha (transparency) values

    -For Processing 2.0, we recommend using blendMode() and not the previous blend() function. However, unlike blend(), the blendMode() function does not support the following: HARD_LIGHT, SOFT_LIGHT, OVERLAY, DODGE, BURN. On older hardware, the LIGHTEST, DARKEST, and DIFFERENCE modes might not be available as well. +We recommend using blendMode() and not the previous blend() function. However, unlike blend(), the blendMode() function does not support the following: HARD_LIGHT, SOFT_LIGHT, OVERLAY, DODGE, BURN. On older hardware, the LIGHTEST, DARKEST, and DIFFERENCE modes might not be available as well. ]]>
    diff --git a/content/api_en/circle.xml b/content/api_en/circle.xml new file mode 100755 index 000000000..0e1d9adfb --- /dev/null +++ b/content/api_en/circle.xml @@ -0,0 +1,23 @@ + + +circle() + +Shape + +2D Primitives + + + + +ellipse_.png + + + +ellipseMode() function. +]]> + + + diff --git a/content/api_en/clear.xml b/content/api_en/clear.xml index 5c0ce2e63..4db47b198 100644 --- a/content/api_en/clear.xml +++ b/content/api_en/clear.xml @@ -15,27 +15,31 @@ PGraphics pg; void setup() { size(200, 200); - pg = createGraphics(100, 100); + pg = createGraphics(width, height); } void draw() { background(204); - pg.beginDraw(); - pg.stroke(0, 102, 153); - pg.line(0, 0, mouseX, mouseY); - pg.endDraw(); - image(pg, 50, 50); -} - -// Click to clear the PGraphics object -void mousePressed() { - pg.clear(); + + // Clear the PGraphics when the mouse is pressed + if (mousePressed == true) { + pg.beginDraw(); + pg.clear(); + pg.endDraw(); + } else { + pg.beginDraw(); + pg.stroke(0, 102, 153); + pg.line(width/2, height/2, mouseX, mouseY); + pg.endDraw(); + } + + image(pg, 0, 0); } ]]>
    createGraphics() function; it won't work with the main display window. Unlike the main graphics context (the display window), pixels in additional graphics areas created with createGraphics() can be entirely or partially transparent. This function clears everything to make all of the pixels 100% transparent. +Clears the pixels within a buffer. This function only works on PGraphics objects created with the createGraphics() function. Unlike the main graphics context (the display window), pixels in additional graphics areas created with createGraphics() can be entirely or partially transparent. This function clears everything in a PGraphics object to make all of the pixels 100% transparent. ]]> diff --git a/content/api_en/clip.xml b/content/api_en/clip.xml index 278a8cdf1..8dce98720 100644 --- a/content/api_en/clip.xml +++ b/content/api_en/clip.xml @@ -14,14 +14,13 @@ fill(), stroke(), background(), and color() are defined by values between 0 and 255 using the RGB color model. The colorMode() function is used to change the numerical range used for specifying colors and to switch color systems. For example, calling colorMode(RGB, 1.0) will specify that values are specified between 0 and 1. The limits for defining colors are altered by setting the parameters max, max1, max2, max3, and maxA. +Changes the way Processing interprets color data. By default, the parameters for fill(), stroke(), background(), and color() are defined by values between 0 and 255 using the RGB color model. The colorMode() function is used to change the numerical range used for specifying colors and to switch color systems. For example, calling colorMode(RGB, 1.0) will specify that values are specified between 0 and 1. The limits for defining colors are altered by setting the parameters max, max1, max2, max3, and maxA. +

    +After changing the range of values for colors with code like colorMode(HSB, 360, 100, 100), those ranges remain in use until they are explicitly changed again. For example, after running colorMode(HSB, 360, 100, 100) and then changing back to colorMode(RGB), the range for R will be 0 to 360 and the range for G and B will be 0 to 100. To avoid this, be explicit about the ranges when changing the color mode. For instance, instead of colorMode(RGB), write colorMode(RGB, 255, 255, 255). ]]>
    diff --git a/content/api_en/createFont.xml b/content/api_en/createFont.xml index da08e9dd9..bf7388edf 100755 --- a/content/api_en/createFont.xml +++ b/content/api_en/createFont.xml @@ -17,7 +17,7 @@ void setup() { size(200, 200); // Uncomment the following two lines to see the available fonts //String[] fontList = PFont.list(); - //println(fontList); + //printArray(fontList); myFont = createFont("Georgia", 32); textFont(myFont); textAlign(CENTER, CENTER); diff --git a/content/api_en/createGraphics.xml b/content/api_en/createGraphics.xml index 64ab9244c..2eb84e5bc 100755 --- a/content/api_en/createGraphics.xml +++ b/content/api_en/createGraphics.xml @@ -30,11 +30,13 @@ void draw() { PGraphics object. Use this class if you need to draw into an off-screen graphics buffer. The first two parameters define the width and height in pixels. The third, optional parameter specifies the renderer. It can be defined as P2D, P3D, or PDF. If the third parameter isn't used, the default renderer is set. The PDF renderer requires the filename parameter.
    +Creates and returns a new PGraphics object. Use this class if you need to draw into an off-screen graphics buffer. The first two parameters define the width and height in pixels. The third, optional parameter specifies the renderer. It can be defined as P2D, P3D, PDF, or SVG. If the third parameter isn't used, the default renderer is set. The PDF and SVG renderers require the filename parameter.

    -It's important to consider the renderer used with createGraphics() in relation to the main renderer specified in size(). For example, it's only possible to use P2D or P3D with createGraphics() when one of them is defined in size(). Unlike Processing 1.0, P2D and P3D use OpenGL for drawing, and when using an OpenGL renderer it's necessary for the main drawing surface to be OpenGL-based. If P2D or P3D are used as the renderer in size(), then any of the options can be used with createGraphics(). If the default renderer is used in size(), then only the default or PDF can be used with createGraphics().
    +It's important to consider the renderer used with createGraphics() in relation to the main renderer specified in size(). For example, it's only possible to use P2D or P3D with createGraphics() when one of them is defined in size(). Unlike Processing 1.0, P2D and P3D use OpenGL for drawing, and when using an OpenGL renderer it's necessary for the main drawing surface to be OpenGL-based. If P2D or P3D are used as the renderer in size(), then any of the options can be used with createGraphics(). If the default renderer is used in size(), then only the default, PDF, or SVG can be used with createGraphics().

    -It's important to call any drawing functions between beginDraw() and endDraw() statements. This is also true for any functions that affect drawing, such as smooth() or colorMode().
    +It's important to run all drawing functions between the beginDraw() and endDraw(). As the exception to this rule, smooth() should be run on the PGraphics object before beginDraw(). See the reference for smooth() for more detail.
    +
    +The createGraphics() function should almost never be used inside draw() because of the memory and time needed to set up the graphics. One-time or occasional use during draw() might be acceptable, but code that calls createGraphics() at 60 frames per second might run out of memory or freeze your sketch.

    Unlike the main drawing surface which is completely opaque, surfaces created with createGraphics() can have transparency. This makes it possible to draw into a graphics and maintain the alpha channel. By using save() to write a PNG or TGA file, the transparency of the graphics object will be honored. ]]>
    diff --git a/content/api_en/createReader.xml b/content/api_en/createReader.xml index 497241c94..5ffe8049a 100644 --- a/content/api_en/createReader.xml +++ b/content/api_en/createReader.xml @@ -11,37 +11,33 @@ BufferedReader object that can be used to read files line-by-line as individual String objects. This is the complement to the createWriter() function. -

    +Creates a BufferedReader object that can be used to read files line-by-line as individual String objects. This is the complement to the createWriter() function. For more information about the BufferedReader class and its methods like readLine() and close used in the above example, please consult a Java reference.
    +
    Starting with Processing release 0134, all files loaded and saved by the Processing API use UTF-8 encoding. In previous releases, the default encoding for your platform was used, which causes problems when files are moved to other platforms. ]]>
    diff --git a/content/api_en/createShape.xml b/content/api_en/createShape.xml index 812789187..4469495e8 100755 --- a/content/api_en/createShape.xml +++ b/content/api_en/createShape.xml @@ -14,7 +14,7 @@ PShape square; // The PShape object void setup() { - size(100, 100, P2D); + size(100, 100); // Creating the PShape as a square. The // numeric arguments are similar to rect(). square = createShape(RECT, 0, 0, 50, 50); @@ -34,7 +34,7 @@ void draw() { PShape s; // The PShape object void setup() { - size(100, 100, P2D); + size(100, 100); // Creating a custom PShape as a square, by // specifying a series of vertices. s = createShape(); @@ -85,12 +85,13 @@ void draw() { PShape alien, head, body; void setup() { - size(100, 100, P2D); + size(100, 100); // Create the shape group alien = createShape(GROUP); // Make two shapes + ellipseMode(CORNER); head = createShape(ELLIPSE, -25, 0, 50, 50); head.setFill(color(255)); body = createShape(RECT, -25, 45, 50, 40); @@ -111,15 +112,13 @@ void draw() { createShape() function is used to define a new shape. Once created, this shape can be drawn with the shape() function. The basic way to use the function defines new primitive shapes. One of the following parameters are used as the first parameter: ELLIPSE, RECT, ARC, TRIANGLE, SPHERE, BOX, QUAD, or LINE. The parameters for each of these different shapes are the same as their corresponding functions: ellipse(), rect(), arc(), triangle(), sphere(), box(), and line(). The first example above clarifies how this works.
    -
    -Custom, unique shapes can be made by using createShape() without a parameter. After the shape is started, the drawing attributes and geometry can be set directly to the shape within the beginShape() and endShape() methods. See the second example above for specifics.
    +The createShape() function is used to define a new shape. Once created, this shape can be drawn with the shape() function. The basic way to use the function defines new primitive shapes. One of the following parameters are used as the first parameter: ELLIPSE, RECT, ARC, TRIANGLE, SPHERE, BOX, QUAD, or LINE. The parameters for each of these different shapes are the same as their corresponding functions: ellipse(), rect(), arc(), triangle(), sphere(), box(), quad(), and line(). The first example above clarifies how this works.

    -Geometry that groups vertices to build larger forms, such as group of triangles, can be created with parameters to beginShape(). These options are POINTS, LINES, TRIANGLES, TRIANGLE_FAN, TRIANGLE_STRIP, QUADS, and QUAD_STRIP. See the third example above.
    +Custom, unique shapes can be made by using createShape() without a parameter. After the shape is started, the drawing attributes and geometry can be set directly to the shape within the beginShape() and endShape() methods. See the second example above for specifics, and the reference for beginShape() for all of its options.

    The createShape() function can also be used to make a complex shape made of other shapes. This is called a "group" and it's created by using the parameter GROUP as the first parameter. See the fourth example above to see how it works.

    -When a shape is first created inside the beginShape() and endShape() methods, the normal Processing style functions like fill() and stroke() are used to define the drawing attributes. However, after a shape is created, a different set of functions needs to be used. These include the setFill() and setStroke() functions shown in the examples above. The complete list of methods and fields for the PShape class are in the Processing Javadoc. +After using createShape(), stroke and fill color can be set by calling methods like setFill() and setStroke(), as seen in the examples above. The complete list of methods and fields for the PShape class are in the Processing Javadoc. ]]>
    diff --git a/content/api_en/cursor.xml b/content/api_en/cursor.xml index c407a1b29..81499ab44 100755 --- a/content/api_en/cursor.xml +++ b/content/api_en/cursor.xml @@ -14,8 +14,11 @@ // Move the mouse left and right across the image // to see the cursor change from a cross to a hand -void draw() -{ +void setup() { + size(100, 100); +} + +void draw() { if (mouseX < 50) { cursor(CROSS); } else { @@ -26,9 +29,11 @@ void draw() x and y must be less than the dimensions of the image. -

    +Sets the cursor to a predefined symbol or an image, or makes it visible if already hidden. If you are trying to set an image as the cursor, the recommended size is 16x16 or 32x32 pixels. The values for parameters x and y must be less than the dimensions of the image. +

    Setting or hiding the cursor does not generally work with "Present" mode (when running full-screen). +

    +With the P2D and P3D renderers, a generic set of cursors are used because the OpenGL renderer doesn't have access to the default cursor images for each platform (Issue 3791). ]]>
    diff --git a/content/api_en/curvePoint.xml b/content/api_en/curvePoint.xml index 8c9a6e011..c38a07c22 100755 --- a/content/api_en/curvePoint.xml +++ b/content/api_en/curvePoint.xml @@ -30,7 +30,7 @@ for (int i = 0; i <= steps; i++) { t for points a, b, c, d. The parameter t may range from 0 (the start of the curve) and 1 (the end of the curve). a and d are points on the curve, and b and c are the control points. This can be used once with the x coordinates and a second time with the y coordinates to get the location of a curve at t. +Evaluates the curve at point t for points a, b, c, d. The parameter t may range from 0 (the start of the curve) and 1 (the end of the curve). a and d are the control points, and b and c are points on the curve. As seen in the example above, this can be used once with the x coordinates and a second time with the y coordinates to get the location of a curve at t. ]]> diff --git a/content/api_en/delay.xml b/content/api_en/delay.xml new file mode 100644 index 000000000..38877fe29 --- /dev/null +++ b/content/api_en/delay.xml @@ -0,0 +1,39 @@ + + +delay() + +Environment + + + + + + 0) { + int inByte = myPort.read(); + println(inByte); + } + delay(100); +} +]]> + + +delay() function halts for a specified time. Delay times are specified in thousandths of a second. For example, running delay(3000) will stop the program for three seconds and delay(500) will stop the program for a half-second.
    +
    +The screen only updates when the end of draw() is reached, so delay() cannot be used to slow down drawing. For instance, you cannot use delay() to control the timing of an animation.
    +
    +The delay() function should only be used for pausing scripts (i.e. a script that needs to pause a few seconds before attempting a download, or a sketch that needs to wait a few milliseconds before reading from the serial port.) +]]>
    + +
    diff --git a/content/api_en/displayDensity.xml b/content/api_en/displayDensity.xml index bbc7c867f..1eabe02e9 100644 --- a/content/api_en/displayDensity.xml +++ b/content/api_en/displayDensity.xml @@ -13,8 +13,7 @@ setup(), the draw() function continuously executes the lines of code contained inside its block until the program is stopped or noLoop() is called. draw() is called automatically and should never be called explicitly.
    +Called directly after setup(), the draw() function continuously executes the lines of code contained inside its block until the program is stopped or noLoop() is called. draw() is called automatically and should never be called explicitly. All Processing programs update the screen at the end of draw(), never earlier.

    -It should always be controlled with noLoop(), redraw() and loop(). If noLoop() is used to stop the code in draw() from executing, then redraw() will cause the code inside draw() to be executed a single time, and loop() will cause the code inside draw() to resume executing continuously.
    +To stop the code inside of draw() from running continuously, use noLoop(), redraw() and loop(). If noLoop() is used to stop the code in draw() from running, then redraw() will cause the code inside draw() to run a single time, and loop() will cause the code inside draw() to resume running continuously.

    The number of times draw() executes in each second may be controlled with the frameRate() function.

    -It is common to call background() near the beginning of the draw() loop to clear the contents of the window, as shown in the first example above. Since pixels drawn to the window are cumulative, omitting background() may result in unintended results, especially when drawing anti-aliased shapes or text. -

    +It is common to call background() near the beginning of the draw() loop to clear the contents of the window, as shown in the first example above. Since pixels drawn to the window are cumulative, omitting background() may result in unintended results.
    +
    There can only be one draw() function for each sketch, and draw() must exist if you want the code to run continuously, or to process events such as mousePressed(). Sometimes, you might have an empty call to draw() in your program, as shown in the second example above. ]]>
    diff --git a/content/api_en/endContour.xml b/content/api_en/endContour.xml index 2a63311a6..306aa284d 100644 --- a/content/api_en/endContour.xml +++ b/content/api_en/endContour.xml @@ -32,7 +32,7 @@ endShape(CLOSE); beginContour() and endContour() function to create negative shapes within shapes such as the center of the letter 'O'. beginContour() begins recording vertices for the shape and endContour() stops recording. The vertices that define a negative shape must "wind" in the opposite direction from the exterior shape. First draw vertices for the exterior shape in clockwise order, then for internal shapes, draw vertices counter-clockwise.
    +Use the beginContour() and endContour() function to create negative shapes within shapes such as the center of the letter 'O'. beginContour() begins recording vertices for the shape and endContour() stops recording. The vertices that define a negative shape must "wind" in the opposite direction from the exterior shape. First draw vertices for the exterior shape in clockwise order, then for internal shapes, draw vertices counterclockwise.

    These functions can only be used within a beginShape()/endShape() pair and transformations such as translate(), rotate(), and scale() do not work within a beginContour()/endContour() pair. It is also not possible to use other shapes, such as ellipse() or rect() within. ]]>
    diff --git a/content/api_en/endShape.xml b/content/api_en/endShape.xml index a6c604615..eaa2d1e05 100755 --- a/content/api_en/endShape.xml +++ b/content/api_en/endShape.xml @@ -28,7 +28,7 @@ endShape(); endShape() function is the companion to beginShape() and may only be called after beginShape(). When endshape() is called, all of image data defined since the previous call to beginShape() is written into the image buffer. The constant CLOSE as the value for the MODE parameter to close the shape (to connect the beginning and the end). +The endShape() function is the companion to beginShape() and may only be called after beginShape(). When endShape() is called, all of image data defined since the previous call to beginShape() is written into the image buffer. The constant CLOSE as the value for the MODE parameter to close the shape (to connect the beginning and the end). ]]> diff --git a/content/api_en/environment/index.html b/content/api_en/environment/index.html index d14ccb605..5d92731eb 100644 --- a/content/api_en/environment/index.html +++ b/content/api_en/environment/index.html @@ -100,7 +100,7 @@

    - Additional commands are found within the five menus: File, Edit, Sketch, Debug, Tools, Help. + Additional commands are found within the six menus: File, Edit, Sketch, Debug, Tools, Help. The menus are context sensitive which means only those items relevant to the work currently being carried out are available.

    @@ -112,8 +112,6 @@
    File
    "sketch_YYMMDDa".
  • Open...
    Open a sketch in a new window. -
  • Sketchbook
    - Open a sketch from the sketchbook folder.
  • Open Recent
    Select a sketch to open from the list of recently closed sketches.
  • Sketchbook...
    @@ -200,22 +198,22 @@
    Sketch
    Debug
    • Enable Debugger
      - (Description to come...) + Activates the debugger. Note that the Run button will change to Debug. New Continue and Step buttons will appear, along with a separate window for viewing variable values.
    • Continue
      - (Description to come...) + Advances the code until the next breakpoint.
    • Step
      - (Description to come...) + Advances the code one line at a time. (Note that once the code reaches the end of the current function call, the debugger will revert to "continue.")
    • -
    • Step Into
      - (Description to come...) +ff
    • Step Into
      + Advances the debugger into the interior of a function call. This only works for user-defined functions in the sketch.
    • Step Out
      - (Description to come...) + Advances the debugger outside of a function to the calling area. This only works for user-defined functions in the sketch.
    • Toggle Breakpoint
      - (Description to come...) + Add or remove a breakpoint. When a breakpoint is added, the line number is replaced with the symbol: <>.
    @@ -229,7 +227,7 @@
    Tools
  • Archive Sketch
    Archives a copy of the current sketch in .zip format. The archive is placed in the same folder as the sketch.
  • Install "processing-java"
    - (Description to come...)
  • + Installs the processing-java program to make it possible to build and run Java mode sketches from the command line.
  • Movie Maker
    Creates a QuickTime movie from a sequence of images. Options include setting the size, frame rate, and compression, as well as an audio file.
  • Add Tool...
    @@ -250,10 +248,10 @@
    Help
    Select an element of the Processing language in the text editor and select Find in Reference to open that page in the default web browser.
  • Libraries Reference
    - (Description to come...) + Select from the list to open the reference for compatiable Libraries.
  • Tools Reference
    - (Description to come...) + Select from the list to open the reference for compatiable Tools.
  • Getting Started
    Opens the online Getting Started tutorial in the default browser. @@ -327,11 +325,11 @@
  • Code completion with Ctrl-space
    - (Description to come...) + Turn on and off code completion. Press Ctrl-space to activate code completion while typing.
  • Suggest import statements
    - (Description to come...) + When checked, Processing will try to suggest libraries to import when code from that library is detected.
  • Increase maximum available memory
    @@ -383,7 +381,11 @@

    - Processing has six built-in screen renderers. The default renderer is for drawing two-dimensional shapes. P2D is a faster, but less accurate renderer for drawing two-dimensional shapes. P3D is for three-dimensional geometry; it can also control the camera, lighting, and materials. The P2D and P3D renderers are accelerated if your computer has an OpenGL compatible graphics card. Each of these three renderers has a "_2X" version for rendering on high definition screens. To render for a high def screen, use the JAVA2D_2X, P2D_2X, or P3D_2X depending on the type of sketch. The smooth() function affects the amount of antialiasing for each renderer. Check the reference for smooth() for more information. + Processing has four built-in screen renderers. The default renderer is for drawing two-dimensional shapes. P2D is a faster, but less accurate renderer for drawing two-dimensional shapes. P3D is for three-dimensional geometry; it can also control the camera, lighting, and materials. The P2D and P3D renderers are accelerated if your computer has an OpenGL compatible graphics card. The smooth() function affects the amount of antialiasing for each renderer. Check the reference for smooth() for more information. +

    + +

    + With the release of Processing 3.0, the FX2D renderer is included. Use it for fast 2D graphics on large and high resolution displays for more speed than the default renderer. This renderer is still experimental, but it useful for certain conditions.

    @@ -475,7 +477,15 @@

    - (Description to come...) + The Processing Debugger is a tool for diagnosing problems with a sketch. Enable it to pause a sketch while running and advance through the code one line at a time. The debugger is enabled through the File menu (Debug > Enable Debugger) or by clicking the Debugger icon, the butterfly in the upper-right corner of the PDE. +

    + +

    + When the Debugger is enabled, the program runs as normal, but stops at "breakpoints." To create a breakpoint, set the cursor at the line you want to pause the sketch and select Debug > Toggle Breakpoint. The keyboard shortcut is Command-B. To remove the breakpoint, select Toggle Breakpoint again. When a breakpoint is added, the line number is replaced with the symbol: <>. +

    + +

    + Running the sketch in Debug mode causes the sketch to pause at any breakpoints. When paused, current variable values are visible in a separate pane. You can advance to the next breakpoint by selecting "Continue" or advance line by line through the code with "Step". Stepping only works within the scope of the current function being run.

    @@ -486,21 +496,14 @@

    - Processing has different programming modes to make it possible to deploy sketches - on different platforms and program in different ways. The current default programming mode - is Java mode. Other programming modes such as Android Mode and - Python are added by selecting "Add Mode..." from the menu in the upper-right - corner of the PDE. + Processing has different programming modes to make it possible to deploy sketches on different platforms and program in different ways. The current default programming mode is Java mode. Other programming modes such as Android Mode and Python are added by selecting "Add Mode..." from the menu in the upper-right corner of the PDE.

    Java Mode

    - This mode makes it possible to write short programs to draw to the screen, but also - enables complex Java programs as well. It can be used simply by beginners, but - it scales to professional Java software development. Sketches written in this mode can - be exported as Java Applications to run on Linux, Mac OS X, and Windows operating - systems. + This mode makes it possible to write short programs to draw to the screen, but also enables complex Java programs as well. It can be used simply by beginners, but it scales to professional Java software development. Sketches written in this mode can + be exported as Java Applications to run on Linux, Mac OS X, and Windows operating systems.

    @@ -509,11 +512,7 @@

    Java Mode
    Advanced

    - Java files with the extension .java can be included with a Java mode sketch. - They may be created directly in the PDE or copied into the sketch folder through - the "Add File..." item in the Sketch menu or dragged into the text editor. It's possible - to write any Java code in files with the .java extension. In fact, complete Java code - can be written from inside the Processing Environment by subclassing PApplet like this: + Java files with the extension .java can be included with a Java mode sketch. They may be created directly in the PDE or copied into the sketch folder through the "Add File..." item in the Sketch menu or dragged into the text editor. It's possible to write any Java code in files with the .java extension. In fact, complete Java code can be written from inside the Processing Environment by subclassing PApplet like this:
     
    @@ -532,8 +531,8 @@ 
    Android Mode

    Sketches written in this mode can be exported to run on Android phones and tablets. - This mode is documented on the - Processing for Android page of the Processing Wiki. To add this mode, click on + This mode is documented on the + Processing for Android page. To add this mode, click on the mode button in the upper-right corner of the PDE and select "Add Mode..."

    --> @@ -575,7 +574,7 @@

    - The Export information and + The Export information and Tips page on the Processing Wiki covers the details of exporting Applications from Java mode.

    @@ -589,4 +588,4 @@
    Exporting from Android mode is discussed on the Android page of the Processing Wiki.

    --> - \ No newline at end of file + diff --git a/content/api_en/exit.xml b/content/api_en/exit.xml index 1df2bb8a0..e6ee94323 100755 --- a/content/api_en/exit.xml +++ b/content/api_en/exit.xml @@ -22,7 +22,7 @@ void mousePressed() { draw() function exit automatically after the last line has run, but programs with draw() run continuously until the program is manually stopped or exit() is run.
    +Quits/stops/exits the program. Programs without a draw() function stop automatically after the last line has run, but programs with draw() run continuously until the program is manually stopped or exit() is run.

    Rather than terminating immediately, exit() will cause the sketch to exit after draw() has completed (or after setup() completes if called during the setup() function).

    diff --git a/content/api_en/expand.xml b/content/api_en/expand.xml index 30c9d4afe..f0f020319 100755 --- a/content/api_en/expand.xml +++ b/content/api_en/expand.xml @@ -32,7 +32,7 @@ println(imgs.length); // Prints "64" newSize parameter provides precise control over the increase in size. +Increases the size of a one-dimensional array. By default, this function doubles the size of the array, but the optional newSize parameter provides precise control over the increase in size.

    When using an array of objects, the data returned from the function must be cast to the object array's data type. For example: SomeClass[] items = (SomeClass[]) expand(originalArray) ]]>
    diff --git a/content/api_en/fill.xml b/content/api_en/fill.xml index 32b3dbab2..fa7f98980 100755 --- a/content/api_en/fill.xml +++ b/content/api_en/fill.xml @@ -25,7 +25,7 @@ rect(30, 20, 55, 55); fill(204, 102, 0), all subsequent shapes will be filled with orange. This color is either specified in terms of the RGB or HSB color depending on the current colorMode(). (The default color space is RGB, with each value in the range from 0 to 255.) +Sets the color used to fill shapes. For example, if you run fill(204, 102, 0), all subsequent shapes will be filled with orange. This color is either specified in terms of the RGB or HSB color depending on the current colorMode(). The default color space is RGB, with each value in the range from 0 to 255.

    When using hexadecimal notation to specify a color, use "#" or "0x" before the values (e.g., #CCFFAA or 0xFFCCFFAA). The # syntax uses six digits to specify a color (just as colors are typically specified in HTML and CSS). When using the hexadecimal notation starting with "0x", the hexadecimal value must be specified with eight characters; the first two characters define the alpha component, and the remainder define the red, green, and blue components.

    diff --git a/content/api_en/frustum.xml b/content/api_en/frustum.xml index 5469e611d..f9645bd5a 100755 --- a/content/api_en/frustum.xml +++ b/content/api_en/frustum.xml @@ -25,7 +25,7 @@ Sets a perspective matrix as defined by the parameters.

    A frustum is a geometric form: a pyramid with its top cut off. With the viewer's eye at the imaginary top of the pyramid, the six planes of the frustum act as clipping planes when rendering a 3D view. Thus, any form inside the clipping planes is rendered and visible; anything outside those planes is not visible.

    -Setting the frustum has the effect of changing the perspective with which the scene is rendered. This can be acheived more simply in many cases by using perspective().
    +Setting the frustum has the effect of changing the perspective with which the scene is rendered. This can be achieved more simply in many cases by using perspective().

    Note that the near value must be greater than zero (as the point of the frustum "pyramid" cannot converge "behind" the viewer). Similarly, the far value must be greater than the near value (as the "far" plane of the frustum must be "farther away" from the viewer than the near plane).

    diff --git a/content/api_en/fullScreen.xml b/content/api_en/fullScreen.xml index eb1fea958..e75bfd541 100755 --- a/content/api_en/fullScreen.xml +++ b/content/api_en/fullScreen.xml @@ -34,7 +34,7 @@ void draw() { setup(). The first parameter defines the renderer to use and the second defines either an individual screen to display to or to open a full-screen window across all of the attached displays if there are more than one.
    +This function is new for Processing 3.0. It opens a sketch using the full size of the computer's display. This function must be the first line in setup(). The size() and fullScreen() functions cannot both be used in the same program, just choose one.

    -The size() and fullScreen() methods cannot both be used in the same program, just choose one. Prior to Processing 3.0, a full-screen program was defined with size(displayWidth, displayHeight). +When fullScreen() is used without a parameter, it draws the sketch to the screen currently selected inside the Preferences window. When it is used with a single parameter, this number defines the screen to display to program on (e.g. 1, 2, 3...). When used with two parameters, the first defines the renderer to use (e.g. P2D) and the second defines the screen. The SPAN parameter can be used in place of a screen number to draw the sketch as a full-screen window across all of the attached displays if there are more than one.
    +
    +Prior to Processing 3.0, a full-screen program was defined with size(displayWidth, displayHeight). ]]>
    diff --git a/content/api_en/get.xml b/content/api_en/get.xml index c1307b3cd..be56dc889 100755 --- a/content/api_en/get.xml +++ b/content/api_en/get.xml @@ -31,10 +31,12 @@ rect(25, 25, 50, 50); x and y parameters to get the value of one pixel. Get a section of the display window by specifying additional w and h parameters. When getting an image, the x and y parameters define the coordinates for the upper-left corner of the image, regardless of the current imageMode().
    -
    +Reads the color of any pixel or grabs a section of an image. If no parameters are specified, the entire image is returned. Use the x and y parameters to get the value of one pixel. Get a section of the display window by specifying additional w and h parameters. When getting an image, the x and y parameters define the coordinates for the upper-left corner of the image, regardless of the current imageMode(). +

    If the pixel requested is outside of the image window, black is returned. The numbers returned are scaled according to the current color ranges, but only RGB values are returned by this function. For example, even though you may have drawn a shape with colorMode(HSB), the numbers returned will be in RGB format.

    +If a width and a height are specified, get(x, y, w, h) returns a PImage corresponding to the part of the original PImage where the top left pixel is at the (x, y) position with a width of w a height of h. +

    Getting the color of a single pixel with get(x, y) is easy, but not as fast as grabbing the data directly from pixels[]. The equivalent statement to get(x, y) using pixels[] is pixels[y*width+x]. See the reference for pixels[] for more information. ]]>
    diff --git a/content/api_en/green.xml b/content/api_en/green.xml index 7d3ff0566..f1c38fe88 100755 --- a/content/api_en/green.xml +++ b/content/api_en/green.xml @@ -27,8 +27,8 @@ Extracts the green value from a color, scaled to match current colorMode() The green() function is easy to use and understand, but it is slower than a technique called bit shifting. When working in colorMode(RGB, 255), you can acheive the same results as green() but with greater speed by using the right shift operator (>>) with a bit mask. For example, the following two lines of code are equivalent means of getting the green value of the color value c:

    -
    float r1 = green(c);  // Simpler, but slower to calculate
    -float r2 = c >> 8 & 0xFF;  // Very fast to calculate
    +
    float g1 = green(c);  // Simpler, but slower to calculate
    +float g2 = c >> 8 & 0xFF;  // Very fast to calculate
    ]]>
    diff --git a/content/api_en/hint.xml b/content/api_en/hint.xml deleted file mode 100644 index c16ec4726..000000000 --- a/content/api_en/hint.xml +++ /dev/null @@ -1,39 +0,0 @@ - - -hint() - -Rendering - - - - - -
    -Implementing a hint() is a last resort that's used when a more elegant solution cannot be found. Some options might graduate to standard features instead of hints over time, or be added and removed between (major) releases. -

    -Hints that are used by the default (Java2D) renderer: -

    -hint(ENABLE_STROKE_PURE) - Fixes a problem with shapes that have a stroke and are rendered using small steps (for instance, using vertex() with points that are close to one another), or are drawn at small sizes. -

    -Hints for use with both P2D and P3D: -

    -hint(DISABLE_OPENGL_ERRORS) - Speeds up the P3D renderer setting by not checking for errors while running. -

    -hint(DISABLE_TEXTURE_MIPMAPS) - Disable generation of texture mipmaps in P2D or P3D. This results in lower quality - but faster - rendering of texture images when they appear smaller than their native resolutions (the mipmaps are scaled-down versions of a texture that make it look better when drawing it at a small size). However, the difference in performance is fairly minor on recent desktop video cards. -

    -Hints for use with P3D only: -

    -hint(DISABLE_DEPTH_MASK) - Disables writing into the depth buffer. This means that a shape drawn with this hint can be hidden by another shape drawn later, irrespective of their distances to the camera. Note that this is different from disabling the depth test. The depth test is still applied, as long as the DISABLE_DEPTH_TEST hint is not called, but the depth values of the objects are not recorded. This is useful when drawing a semi-transparent 3D object without depth sorting, in order to avoid visual glitches due the faces of the object being at different distances from the camera, but still having the object properly occluded by the rest of the objects in the scene. -

    -hint(ENABLE_DEPTH_SORT) - Enable primitive z-sorting of triangles and lines in P3D. This can slow performance considerably, and the algorithm is not yet perfect. -

    -hint(DISABLE_DEPTH_TEST) - Disable the zbuffer, allowing you to draw on top of everything at will. When depth testing is disabled, items will be drawn to the screen sequentially, like a painting. This hint is most often used to draw in 3D, then draw in 2D on top of it (for instance, to draw GUI controls in 2D on top of a 3D interface). When called, this will also clear the depth buffer. Restore the default with hint(ENABLE_DEPTH_TEST), but note that with the depth buffer cleared, any 3D drawing that happens later in will ignore existing shapes on the screen. -

    -hint(DISABLE_OPTIMIZED_STROKE) - It forces the P3D renderer to draw each shape (including its strokes) separately, instead of batching them into larger groups for better performance. One consequence of this is that 2D items drawn with P3D are correctly stacked on the screen, depending on the order in which they were drawn. Otherwise, glitches such as the stroke lines being drawn on top of the interior of all the shapes will occur. However, this hint can make rendering substantially slower, so it is recommended to use it only when drawing a small amount of shapes. For drawing two-dimensional scenes, use the P2D renderer instead, which doesn't need the hint to properly stack shapes and their strokes. -

    -hint(ENABLE_STROKE_PERSPECTIVE) - This causes stroke geometry (lines and points) to be affected by the perspective, meaning that they will look smaller as they move away from the camera. -]]>
    - -
    diff --git a/content/api_en/include/ArrayList.xml b/content/api_en/include/ArrayList.xml index ea63b6262..8feb4dc3a 100644 --- a/content/api_en/include/ArrayList.xml +++ b/content/api_en/include/ArrayList.xml @@ -50,7 +50,7 @@ println(particles.size()); // Now one less! // then you cannot use the enhanced loop syntax. // In addition, when deleting in order to hit all elements, // you should loop through it backwards, as shown here: -for (int i = particles.size - 1; i >= 0; i--) { +for (int i = particles.size() - 1; i >= 0; i--) { Particle part = particles.get(i); if (part.finished()) { particles.remove(i); @@ -64,7 +64,7 @@ An ArrayList stores a variable number of objects. This is similar to maki
    An ArrayList is a resizable-array implementation of the Java List interface. It has many methods used to control and search its contents. For example, the length of the ArrayList is returned by its size() method, which is an integer value for the total number of elements in the list. An element is added to an ArrayList with the add() method and is deleted with the remove() method. The get() method returns the element at the specified position in the list. (See the above example for context.)

    -For a list of the numerous ArrayList features, please read the Java reference description. +For a list of the numerous ArrayList features, please read the Java reference description. ]]>
    diff --git a/content/api_en/include/BufferedReader.xml b/content/api_en/include/BufferedReader.xml index 354daa453..c7ef0855d 100644 --- a/content/api_en/include/BufferedReader.xml +++ b/content/api_en/include/BufferedReader.xml @@ -45,17 +45,14 @@ A BufferedReader object is used to read files line-by-line as individual Starting with Processing release 0134, all files loaded and saved by the Processing API use UTF-8 encoding. In previous releases, the default encoding for your platform was used, which causes problems when files are moved to other platforms. ]]> + + readLine() returns a String that is the current line in the text file - - - - - - + @@ -67,8 +64,9 @@ catch 1.0 -Function +Object + +PDE -Core diff --git a/content/api_en/include/HashMap.xml b/content/api_en/include/HashMap.xml index 56ba42897..493e893de 100644 --- a/content/api_en/include/HashMap.xml +++ b/content/api_en/include/HashMap.xml @@ -22,7 +22,7 @@ hm.put("Ava", 1); hm.put("Cait", 35); hm.put("Casey", 36); -// Using an enhanced loop to interate over each entry +// Using an enhanced loop to iterate over each entry for (Map.Entry me : hm.entrySet()) { print(me.getKey() + " is "); println(me.getValue()); @@ -39,7 +39,7 @@ println("Casey is " + val); HashMap stores a collection of objects, each referenced by a key. This is similar to an Array, only instead of accessing elements with a numeric index, a String is used. (If you are familiar with associative arrays from other languages, this is the same idea.) The above example covers basic use, but there's a more extensive example included with the Processing examples. In addition, for simple pairings of Strings and integers, Strings and floats, or Strings and Strings, you can now use the simpler IntDict, FloatDict, and StringDict classes.

    -For a list of the numerous HashMap features, please read the Java reference description. +For a list of the numerous HashMap features, please read the Java reference description. ]]>
    diff --git a/content/api_en/include/Object.xml b/content/api_en/include/Object.xml index 46ff0c441..c2b5dc9dd 100755 --- a/content/api_en/include/Object.xml +++ b/content/api_en/include/Object.xml @@ -35,7 +35,7 @@ class HLine { } void update() { ypos += speed; - if (ypos > width) { + if (ypos > height) { ypos = 0; } line(0, ypos, width, ypos); diff --git a/content/api_en/include/String.xml b/content/api_en/include/String.xml index e4c4a9625..2febbe7de 100755 --- a/content/api_en/include/String.xml +++ b/content/api_en/include/String.xml @@ -24,12 +24,9 @@ println(str2); // Prints "CCCP" to the console @@ -46,11 +43,11 @@ println(quoted); // This one has "quotes" String includes methods for examining individual characters, comparing strings, searching strings, extracting parts of strings, and for converting an entire string uppercase and lowercase. Strings are always defined inside double quotes ("Abc"), and characters are always defined inside single quotes ('A').

    -To compare the contents of two Strings, use the equals() method, as in if (a.equals(b)), instead of if (a == b). A String is an Object, so comparing them with the == operator only compares whether both Strings are stored in the same memory location. Using the equals() method will ensure that the actual contents are compared. (The troubleshooting reference has a longer explanation.)
    +To compare the contents of two Strings, use the equals() method, as in if (a.equals(b)), instead of if (a == b). A String is an Object, so comparing them with the == operator only compares whether both Strings are stored in the same memory location. Using the equals() method will ensure that the actual contents are compared. (The troubleshooting reference has a longer explanation.)

    Because a String is defined between double quotation marks, to include such marks within the String itself you must use the \ (backslash) character. (See the third example above.) This is known as an escape sequence. Other escape sequences include \t for the tab character and \n for new line. Because backslash is the escape character, to include a single backslash within a String, you must use two consecutive backslashes, as in: \\

    -There are more string methods than those linked from this page. Additional documentation is located online in the official Java documentation. +There are more string methods than those linked from this page. Additional documentation is located online in the official Java documentation. ]]>
    @@ -110,7 +107,6 @@ String(data, offset, length) int: number of characters - @@ -124,6 +120,4 @@ text() PDE - - diff --git a/content/api_en/include/String_substring.xml b/content/api_en/include/String_substring.xml index 0514f23ae..40813a34c 100755 --- a/content/api_en/include/String_substring.xml +++ b/content/api_en/include/String_substring.xml @@ -16,8 +16,8 @@ String str1 = "CCCP"; String str2 = "Rabbit"; String ss1 = str1.substring(2); // Returns "CP" String ss2 = str2.substring(3); // Returns "bit" -String ss3 = str1.substring(0, 2); // Returns "CC" -println(ss1 + ":" + ss2 + ":" + ss3); // Prints "CP:bit:CC" +String ss3 = str2.substring(0, 2); // Returns "Ra" +println(ss1 + ":" + ss2 + ":" + ss3); // Prints "CP:bit:Ra" ]]>
    diff --git a/content/api_en/include/class.xml b/content/api_en/include/class.xml index 45eedd292..5f1e84cab 100755 --- a/content/api_en/include/class.xml +++ b/content/api_en/include/class.xml @@ -46,7 +46,7 @@ class HLine { Object-Oriented Programming is hosted on the Oracle website. +Keyword used to indicate the declaration of a class. A class is a composite of fields (data) and methods (functions that are a part of the class) which may be instantiated as objects. The first letter of a class name is usually uppercase to separate it from other kinds of variables. A related tutorial on Object-Oriented Programming is hosted on the Oracle website. ]]> diff --git a/content/api_en/include/color_datatype.xml b/content/api_en/include/color_datatype.xml index 2b501bf56..0f0b7b8f0 100755 --- a/content/api_en/include/color_datatype.xml +++ b/content/api_en/include/color_datatype.xml @@ -23,7 +23,7 @@ rect(50, 0, 50, 100); get() and color() or they may be specified directly using hexadecimal notation such as #FFCC00 or 0xFFFFCCOO. +Datatype for storing color values. Colors may be assigned with get() and color() or they may be specified directly using hexadecimal notation such as #FFCC00 or 0xFFFFCC00.

    Using print() or println() on a color will produce strange results (usually negative numbers) because of the way colors are stored in memory. A better technique is to use the hex() function to format the color data, or use the red(), green(), and blue() functions to get individual values and print those. The hue(), saturation(), and brightness() functions work in a similar fashion. To extract red, green, and blue values more quickly (for instance when analyzing an image or a frame of video), use bit shifting.

    diff --git a/content/api_en/include/curlybraces.xml b/content/api_en/include/curlybraces.xml index f4f1898c9..e9984f0d7 100755 --- a/content/api_en/include/curlybraces.xml +++ b/content/api_en/include/curlybraces.xml @@ -26,7 +26,7 @@ void draw() { for and if structures. Curly braces are also used for defining inital values in array declarations. +Define the beginning and end of functions blocks and statement blocks such as the for and if structures. Curly braces are also used for defining initial values in array declarations. ]]> diff --git a/content/api_en/include/doccomment.xml b/content/api_en/include/doccomment.xml index bb4331414..fa036a032 100755 --- a/content/api_en/include/doccomment.xml +++ b/content/api_en/include/doccomment.xml @@ -22,7 +22,9 @@ line(50, 0, 50, 100);
    +Doc comments may be converted into browseable documentation using external editors and tools such as the command line javadoc, doc generators such as Doxygen, or IDEs such as Eclipse, Netbeans, or IntelliJ IDEA. ]]>
    diff --git a/content/api_en/include/double.xml b/content/api_en/include/double.xml index 75ce6f466..24942764e 100644 --- a/content/api_en/include/double.xml +++ b/content/api_en/include/double.xml @@ -11,11 +11,11 @@ diff --git a/content/api_en/include/equality.xml b/content/api_en/include/equality.xml index 4ddfbd69a..a47eac505 100755 --- a/content/api_en/include/equality.xml +++ b/content/api_en/include/equality.xml @@ -14,15 +14,16 @@ int a = 23; int b = 23; if (a == b) { - println("variables a and b are equal"); + println("the values of variables 'a' and 'b' are the same"); } ]]>
    +Determines if two values are equivalent. Please note the equality operator (==) is different from the assignment operator (=) and although they look similar, they have a different use. If you're comparing two variables, the equality operator (==) only works with primitive data types like int, boolean, and char. It doesn't work with composite data types like Array, Table, and PVector.
    +
    +Note that when comparing String objects, you must use the equals() method instead of ==. See the reference for String or the troubleshooting note for more explanation.

    -Note that when comparing String objects, you must use the equals() method instead of == to compare their contents. See the reference for String or the troubleshooting note for more explanation. ]]>
    diff --git a/content/api_en/include/float.xml b/content/api_en/include/float.xml index 8457a6362..134cb33f4 100755 --- a/content/api_en/include/float.xml +++ b/content/api_en/include/float.xml @@ -21,15 +21,18 @@ float c = a + b; // Declare variable 'c' and assign it the sum of 'a' and 'b' @@ -38,7 +41,7 @@ Data type for floating-point numbers, e.g. numbers that have a decimal point.
    Floats are not precise, so adding small values (such as 0.0001) may not always increment precisely due to rounding errors. If you want to increment a value in small intervals, use an int, and divide by a float value before using it. (See the second example above.)

    -Floating-point numbers can be as large as 3.40282347E+38 and as low as -3.40282347E+38. They are stored as 32 bits (4 bytes) of information. The float data type is inherited from Java; you can read more about the technical details here and here.
    +Floating-point numbers can be as large as 3.40282347E+38 and as low as -3.40282347E+38. They are stored as 32 bits (4 bytes) of information. The float data type is inherited from Java; you can read more about the technical details here and here.

    Processing supports the double datatype from Java as well. However, none of the Processing functions use double values, which use more memory and are typically overkill for most work created in Processing. We do not plan to add support for double values, as doing so would require increasing the number of API functions significantly. ]]> diff --git a/content/api_en/include/hint.xml b/content/api_en/include/hint.xml new file mode 100644 index 000000000..a48311069 --- /dev/null +++ b/content/api_en/include/hint.xml @@ -0,0 +1,94 @@ + + +hint() + +Rendering + + + +function + + + + + + +hint() to allow people to tune the settings for their particular sketch. Implementing a hint() is a last resort that's used when a more elegant solution cannot be found. Some options might graduate to standard features instead of hints over time, or be added and removed between (major) releases. +
    +
    +Hints used by the default renderer: +

    +ENABLE_STROKE_PURE
    +Fixes a problem with shapes that have a stroke and are rendered using small steps (for instance, using vertex() with points that are close to one another), or are drawn at small sizes. +
    +
    +Hints for use with P2D and P3D: +

    +DISABLE_ASYNC_SAVEFRAME
    +save() and saveFrame() will not use separate threads for saving and will block until the image is written to the drive. This was the default behavior in 3.0b7 and before. To enable, call hint(ENABLE_ASYNC_SAVEFRAME). +

    +DISABLE_OPENGL_ERRORS
    +Speeds up the P3D renderer setting by not checking for errors while running. +

    +DISABLE_TEXTURE_MIPMAPS
    +Disable generation of texture mipmaps in P2D or P3D. This results in lower quality - but faster - rendering of texture images when they appear smaller than their native resolutions (the mipmaps are scaled-down versions of a texture that make it look better when drawing it at a small size). However, the difference in performance is fairly minor on recent desktop video cards. +
    +
    +Hints for use with P3D only: +

    +DISABLE_DEPTH_MASK
    +Disables writing into the depth buffer. This means that a shape drawn with this hint can be hidden by another shape drawn later, irrespective of their distances to the camera. Note that this is different from disabling the depth test. The depth test is still applied, as long as the DISABLE_DEPTH_TEST hint is not called, but the depth values of the objects are not recorded. This is useful when drawing a semi-transparent 3D object without depth sorting, in order to avoid visual glitches due the faces of the object being at different distances from the camera, but still having the object properly occluded by the rest of the objects in the scene. +

    +ENABLE_DEPTH_SORT
    +Enable primitive z-sorting of triangles and lines in P3D. This can slow performance considerably, and the algorithm is not yet perfect. +

    +DISABLE_DEPTH_TEST
    +Disable the zbuffer, allowing you to draw on top of everything at will. When depth testing is disabled, items will be drawn to the screen sequentially, like a painting. This hint is most often used to draw in 3D, then draw in 2D on top of it (for instance, to draw GUI controls in 2D on top of a 3D interface). When called, this will also clear the depth buffer. Restore the default with hint(ENABLE_DEPTH_TEST), but note that with the depth buffer cleared, any 3D drawing that happens later in will ignore existing shapes on the screen. +

    +DISABLE_OPTIMIZED_STROKE
    +Forces the P3D renderer to draw each shape (including its strokes) separately, instead of batching them into larger groups for better performance. One consequence of this is that 2D items drawn with P3D are correctly stacked on the screen, depending on the order in which they were drawn. Otherwise, glitches such as the stroke lines being drawn on top of the interior of all the shapes will occur. However, this hint can make rendering substantially slower, so it is recommended to use it only when drawing a small amount of shapes. For drawing two-dimensional scenes, use the P2D renderer instead, which doesn't need the hint to properly stack shapes and their strokes. +

    +ENABLE_STROKE_PERSPECTIVE
    +Enables stroke geometry (lines and points) to be affected by the perspective, meaning that they will look smaller as they move away from the camera. +]]>
    + + +hint(which) + + + + + + + +void + + +PGraphics +createGraphics() +size() + + +1.0 + +Function + +PDE + +
    diff --git a/content/api_en/include/import.xml b/content/api_en/include/import.xml index f2d50946f..453a63a37 100644 --- a/content/api_en/include/import.xml +++ b/content/api_en/include/import.xml @@ -14,7 +14,7 @@ import processing.pdf.*; void setup() { - size(screenWidth, screenHeight, PDF); + size(1024, 768, PDF); } void draw() { @@ -54,10 +54,4 @@ import libraryName PDE - - - - - - diff --git a/content/api_en/include/intconvert.xml b/content/api_en/include/intconvert.xml index f14376165..56ba6ddb8 100755 --- a/content/api_en/include/intconvert.xml +++ b/content/api_en/include/intconvert.xml @@ -20,7 +20,7 @@ println(c + " : " + i); // Prints "E : 69" boolean, byte, char, color, float, int, or long) to its integer representation.
    +Converts any value of a primitive data type (boolean, byte, char, color, float, int, or long) or String to its integer representation.

    When an array of values is passed in, then an int array of the same length is returned. ]]>
    diff --git a/content/api_en/include/logicalNOT.xml b/content/api_en/include/logicalNOT.xml index e82486c18..d67ec2154 100755 --- a/content/api_en/include/logicalNOT.xml +++ b/content/api_en/include/logicalNOT.xml @@ -15,7 +15,20 @@ boolean a = false; if (!a) { rect(30, 20, 50, 50); } -a = true; +if (a) { + line(20, 10, 90, 80); + line(20, 80, 90, 10); +} +]]> + + + +logicalNOT_2.png + long integer has a minimum value of -9,223,372,036,854,775,808 and a maximum value of 9,223,372,036,854,775,807 (stored as 64 bits). Use this datatype when you need a number to have a greater magnitude than can be stored within an int. Processing functions don't use this datatype, so while they work in the language, you'll usually have to convert to a int using the (int) syntax before passing into a function. +Datatype for large integers. While integers can be as large as 2,147,483,647 and as low as -2,147,483,648 (stored as 32 bits), a long integer has a minimum value of -9,223,372,036,854,775,808 and a maximum value of 9,223,372,036,854,775,807 (stored as 64 bits). Use this datatype when you need a number to have a greater magnitude than can be stored within an int. When assigning literal values that are larger than this magnitude, it is necessary to also append the qualifier "L" to the number, as shown in the example above. Processing functions don't use this datatype, so while they work in the language, you'll usually have to convert to a int using the (int) syntax before passing into a function. ]]> diff --git a/content/api_en/include/multilinecomment.xml b/content/api_en/include/multilinecomment.xml index bd88002cb..a1c9dd6a1 100755 --- a/content/api_en/include/multilinecomment.xml +++ b/content/api_en/include/multilinecomment.xml @@ -22,7 +22,7 @@ line(50, 0, 50, 100); diff --git a/content/api_en/include/multiply.xml b/content/api_en/include/multiply.xml index 20c71bb1f..a125ad6fd 100755 --- a/content/api_en/include/multiply.xml +++ b/content/api_en/include/multiply.xml @@ -37,7 +37,7 @@ Multiplies the values of the two parameters. Multiplication is equivalent to a s -+ (add) ++ (addition) / (divide) @@ -48,10 +48,4 @@ Multiplies the values of the two parameters. Multiplication is equivalent to a s PDE - - - - - - diff --git a/content/api_en/include/private.xml b/content/api_en/include/private.xml index 254857f60..b7ba6301f 100644 --- a/content/api_en/include/private.xml +++ b/content/api_en/include/private.xml @@ -9,7 +9,7 @@ Web & Application private keyword is used before a field or method that you want to be available only within the class. In Processing, all fields and methods are public unless otherwise specified by the private keyword.
    +This keyword is used to disallow other classes access to the fields and methods within a class. The private keyword is used before a field or method that you want to be available only within the class. In Processing, all fields and methods are public unless otherwise specified by the private keyword.

    This keyword is an essential part of Java programming and is not usually used with Processing. Consult a Java language reference or tutorial for more information. ]]>
    diff --git a/content/api_en/include/rightshift.xml b/content/api_en/include/rightshift.xml index 27526643b..06437e001 100755 --- a/content/api_en/include/rightshift.xml +++ b/content/api_en/include/rightshift.xml @@ -37,7 +37,7 @@ rect(30, 20, 55, 55);
    Bit shifting is helpful when using the color data type. A right shift can extract red, green, blue, and alpha values from a color. A left shift can be used to quickly reassemble a color value (more quickly than the color() function). ]]>
    diff --git a/content/api_en/include/setLocation.xml b/content/api_en/include/setLocation.xml new file mode 100644 index 000000000..c54f0ee04 --- /dev/null +++ b/content/api_en/include/setLocation.xml @@ -0,0 +1,60 @@ + + +setLocation() + +Structure + + + +function + + + + + + +setLocation() function defines the position of the Processing sketch in relation to the upper-left corner of the computer screen. +

    +There are more features of PSurface documented in the Processing JavaDoc. +]]>
    + + +surface.setLocation(x, y) + + + + + + + + + + + + +void + + + + +3.0 + +Function + +PDE + +
    diff --git a/content/api_en/include/setResizable.xml b/content/api_en/include/setResizable.xml new file mode 100644 index 000000000..3b4261790 --- /dev/null +++ b/content/api_en/include/setResizable.xml @@ -0,0 +1,55 @@ + + +setResizable() + +Structure + + + +function + + + + + + +surface.setResizable(true) is used within a sketch, the window can be resized while it's running. +

    +There are more features of PSurface documented in the Processing JavaDoc. +]]>
    + + +surface.setResizable(resizable) + + + + + + + +void + + + + +3.0 + +Function + +PDE + +
    diff --git a/content/api_en/include/setTitle.xml b/content/api_en/include/setTitle.xml new file mode 100644 index 000000000..1c18e6d22 --- /dev/null +++ b/content/api_en/include/setTitle.xml @@ -0,0 +1,55 @@ + + +setTitle() + +Structure + + + +function + + + + + + +setTitle() function defines the title to appear at the top of the sketch window. +

    +There are more features of PSurface documented in the Processing JavaDoc. +]]>
    + + +surface.setTitle(title) + + + + + + + +void + + + + +3.0 + +Function + +PDE + +
    diff --git a/content/api_en/include/strconvert.xml b/content/api_en/include/strconvert.xml index 2126306f9..e81be07c5 100755 --- a/content/api_en/include/strconvert.xml +++ b/content/api_en/include/strconvert.xml @@ -29,7 +29,7 @@ println(sb); // Prints 'false-28R-32.61024' boolean, byte, char, color, double, float, int, or long) to its String representation. For example, converting an integer with str(3) will return the String value of "3", converting a float with str(-12.6) will return "-12.6", and converting a boolean with str(true) will return "true".
    +Converts a value of a primitive data type (boolean, byte, char, int, or float) to its String representation. For example, converting an integer with str(3) will return the String value of "3", converting a float with str(-12.6) will return "-12.6", and converting a boolean with str(true) will return "true".

    When an array of values is passed in, then a String array of the same length is returned. ]]>
    diff --git a/content/api_en/key.xml b/content/api_en/key.xml index 72693c50b..0b7d3bde0 100755 --- a/content/api_en/key.xml +++ b/content/api_en/key.xml @@ -30,7 +30,9 @@ void draw() { key always contains the value of the most recent key on the keyboard that was used (either pressed or released).

    -For non-ASCII keys, use the keyCode variable. The keys included in the ASCII specification (BACKSPACE, TAB, ENTER, RETURN, ESC, and DELETE) do not require checking to see if they key is coded, and you should simply use the key variable instead of keyCode If you're making cross-platform projects, note that the ENTER key is commonly used on PCs and Unix and the RETURN key is used instead on Macintosh. Check for both ENTER and RETURN to make sure your program will work for all platforms. +For non-ASCII keys, use the keyCode variable. The keys included in the ASCII specification (BACKSPACE, TAB, ENTER, RETURN, ESC, and DELETE) do not require checking to see if the key is coded, and you should simply use the key variable instead of keyCode If you're making cross-platform projects, note that the ENTER key is commonly used on PCs and Unix and the RETURN key is used instead on Macintosh. Check for both ENTER and RETURN to make sure your program will work for all platforms. +

    +There are issues with how keyCode behaves across different renderers and operating systems. Watch out for unexpected behavior as you switch renderers and operating systems. ]]>
    diff --git a/content/api_en/keyCode.xml b/content/api_en/keyCode.xml index 0b7facaec..8a3cd3d2f 100755 --- a/content/api_en/keyCode.xml +++ b/content/api_en/keyCode.xml @@ -33,13 +33,17 @@ void keyPressed() { keyCode is used to detect special keys such as the arrow keys (UP, DOWN, LEFT, and RIGHT) as well as ALT, CONTROL, SHIFT, PAGE_UP, PAGE_DOWN, HOME, and END. +The variable keyCode is used to detect special keys such as the arrow keys (UP, DOWN, LEFT, and RIGHT) as well as ALT, CONTROL, and SHIFT.

    When checking for these keys, it can be useful to first check if the key is coded. This is done with the conditional if (key == CODED), as shown in the example above.

    The keys included in the ASCII specification (BACKSPACE, TAB, ENTER, RETURN, ESC, and DELETE) do not require checking to see if the key is coded; for those keys, you should simply use the key variable directly (and not keyCode). If you're making cross-platform projects, note that the ENTER key is commonly used on PCs and Unix, while the RETURN key is used on Macs. Make sure your program will work on all platforms by checking for both ENTER and RETURN.

    -For those familiar with Java, the values for UP and DOWN are simply shorter versions of Java's KeyEvent.VK_UP and KeyEvent.VK_DOWN. Other keyCode values can be found in the Java KeyEvent reference. +For those familiar with Java, the values for UP and DOWN are simply shorter versions of Java's KeyEvent.VK_UP and KeyEvent.VK_DOWN. Other keyCode values can be found in the Java KeyEvent reference. +

    +There are issues with how keyCode behaves across different renderers and operating systems. Watch out for unexpected behavior as you switch renderers and operating systems and you are using keys are aren't mentioned in this reference entry. +

    +If you are using P2D or P3D as your renderer, use the NEWT KeyEvent constants. ]]>
    diff --git a/content/api_en/keyPressed.xml b/content/api_en/keyPressed.xml index 224ed7da8..9cc506b40 100755 --- a/content/api_en/keyPressed.xml +++ b/content/api_en/keyPressed.xml @@ -41,6 +41,8 @@ Because of how operating systems handle key repeats, holding down a key may caus Note that there is a similarly named boolean variable called keyPressed. See its reference page for more information.

    Mouse and keyboard events only work when a program has draw(). Without draw(), the code is only run once and then stops listening for events. +

    +With the release of macOS Sierra, Apple changed how key repeat works, so keyPressed may not function as expected. See here for details of the problem and how to fix it. ]]> diff --git a/content/api_en/launch.xml b/content/api_en/launch.xml index 464902f0a..87b86e389 100755 --- a/content/api_en/launch.xml +++ b/content/api_en/launch.xml @@ -27,36 +27,14 @@ void mousePressed() { ]]>
    - - - - - - filename parameter is a String specifying the file name and location. The location parameter must be a full path name, or the name of an executable in the system's PATH. In most cases, using a full path is the best option, rather than relying on the system PATH. Be sure to make the file executable before attempting to open it (chmod +x). -

    -The argv parameter is a String or String array which is passed to the command line. If you have multiple parameters, e.g. an application and a document, or a command with multiple switches, use the version that takes a String array, and place each individual item in a separate element. -

    -If argv is a String (not an array), then it can only be a single file or application with no parameters. It's not the same as executing that String using a shell. For instance, open("jikes -help") will not work properly. -

    -This function behaves differently on each platform. On Windows, the parameters are sent to the Windows shell via "cmd /c". On Mac OS X, the "open" command is used (type "man open" in Terminal.app for documentation). On Linux, it first tries gnome-open, then kde-open, but if neither are available, it sends the command to the shell without any alterations. -

    -For users familiar with Java, this is not quite the same as Runtime.exec(), because the launcher command is prepended. Instead, the exec(String[]) function is a shortcut for Runtime.getRuntime.exec(String[]). +Attempts to open an application or file using your platform's launcher. The filename parameter is a String specifying the file name and location. The location parameter must be a full path name, or the name of an executable in the system's PATH. In most cases, using a full path is the best option, rather than relying on the system PATH. Be sure to make the file executable before attempting to open it (chmod +x).
    +
    +This function (roughly) emulates what happens when you double-click an application or document in the macOS Finder, the Windows Explorer, or your favorite Linux file manager. If you're trying to run command line functions directly, use the exec() function instead (see below).
    +
    +This function behaves differently on each platform. On Windows, the parameters are sent to the Windows shell via "cmd /c". On Mac OS X, the "open" command is used (type "man open" in Terminal.app for documentation). On Linux, it first tries gnome-open, then kde-open, but if neither are available, it sends the command to the shell and prays that something useful happens.
    +
    +For users familiar with Java, this is not the same as Runtime.exec(), because the launcher command is prepended. Instead, the exec(String[]) function is a shortcut for Runtime.getRuntime.exec(String[]). The exec() function is documented in the JavaDoc in the PApplet class. ]]>
    diff --git a/content/api_en/lerpColor.xml b/content/api_en/lerpColor.xml index 07e24aa29..99ab9f4f4 100755 --- a/content/api_en/lerpColor.xml +++ b/content/api_en/lerpColor.xml @@ -29,7 +29,7 @@ rect(70, 20, 20, 60); amt parameter is the amount to interpolate between the two values where 0.0 equal to the first point, 0.1 is very near the first point, 0.5 is halfway in between, etc. +Calculates a color between two colors at a specific increment. The amt parameter is the amount to interpolate between the two values where 0.0 is equal to the first point, 0.1 is very near the first point, 0.5 is halfway in between, etc.
    An amount below 0 will be treated as 0. Likewise, amounts above 1 will be capped at 1. This is different from the behavior of lerp(), but necessary because otherwise numbers outside the range will produce strange and unexpected colors. ]]>
    diff --git a/content/api_en/libraries/index.html b/content/api_en/libraries/index.html index c33c26703..e507a7c8b 100644 --- a/content/api_en/libraries/index.html +++ b/content/api_en/libraries/index.html @@ -16,7 +16,12 @@
    PDF Export
    Network

    Send and receive data over the Internet through simple clients and servers.

  • - + +
  • +
    SVG Export
    +

    Create SVG files.

    +
  • +
  • Serial

    Send data between Processing and external hardware through serial communication (RS-232).

    @@ -37,7 +42,12 @@
    Video
    Sound

    Playback audio files, audio input, synthesize sound, and effects.

  • - + +
  • +
    Hardware I/O
    +

    Access peripherals on the Raspberry Pi and other Linux-based computers

    +
  • +

    Contributions

    diff --git a/content/api_en/loadJSONArray.xml b/content/api_en/loadJSONArray.xml index d7b7444ac..da22530e9 100755 --- a/content/api_en/loadJSONArray.xml +++ b/content/api_en/loadJSONArray.xml @@ -13,24 +13,26 @@ pixels[] array. This function must always be called before reading from or writing to pixels[].
    -
    -Certain renderers may or may not seem to require loadPixels() or updatePixels(). However, the rule is that any time you want to manipulate the pixels[] array, you must first call loadPixels(), and after changes have been made, call updatePixels(). Even if the renderer may not seem to use this function in the current Processing release, this will always be subject to change. +Loads the pixel data of the current display window into the pixels[] array. This function must always be called before reading from or writing to pixels[]. Subsequent changes to the display window will not be reflected in pixels until loadPixels() is called again. ]]>
    diff --git a/content/api_en/loadStrings.xml b/content/api_en/loadStrings.xml index 50a71d6cf..321fa0140 100755 --- a/content/api_en/loadStrings.xml +++ b/content/api_en/loadStrings.xml @@ -11,7 +11,7 @@ .tsv.
    +Reads the contents of a file or URL and creates an Table object with its values. If a file is specified, it must be located in the sketch's "data" folder. The filename parameter can also be a URL to a file found online. The filename must either end in an extension or an extension must be specified in the options parameter. For example, to use tab-separated data, include "tsv" in the options parameter if the filename or URL does not end in .tsv. Note: If an extension is in both places, the extension in the options is used.
    +
    +If the file contains a header row, include "header" in the options parameter. If the file does not have a header row, then simply omit the "header" option.

    -If the file contains a header row, include "header" in the options parameter. If the file does not have a header row, then simply omit the "header" option.
    +Some CSV files contain newline (CR or LF) characters inside cells. This is rare, but adding the "newlines" option will handle them properly. (This is not enabled by default because the parsing code is much slower.)

    -When specifying both a header and the file type, separate the options with commas, as in: loadTable("data.csv", "header, tsv")
    +When specifying multiple options, separate them with commas, as in: loadTable("data.csv", "header, tsv")

    All files loaded and saved by the Processing API use UTF-8 encoding. ]]>
    diff --git a/content/api_en/loadXML.xml b/content/api_en/loadXML.xml index 07002b68d..6290c6e28 100755 --- a/content/api_en/loadXML.xml +++ b/content/api_en/loadXML.xml @@ -46,7 +46,7 @@ void setup() {
    -All files loaded and saved by the Processing API use UTF-8 encoding. If you need to load an XML file that's not in UTF-8 format, see the developer's reference for the XML object. +All files loaded and saved by the Processing API use UTF-8 encoding. If you need to load an XML file that's not in UTF-8 format, see the developer's reference for the XML object. ]]>
    diff --git a/content/api_en/match.xml b/content/api_en/match.xml index 1db3a9f3a..92d1b2fdf 100755 --- a/content/api_en/match.xml +++ b/content/api_en/match.xml @@ -51,7 +51,7 @@ To use the function, first check to see if the result is null. If the result is
    If there are groups (specified by sets of parentheses) in the regular expression, then the contents of each will be returned in the array. Element [0] of a regular expression match returns the entire matching string, and the match groups start at element [1] (the first group is [1], the second [2], and so on).

    -The syntax can be found in the reference for Java's Pattern class. For regular expression syntax, read the Java Tutorial on the topic. +The syntax can be found in the reference for Java's Pattern class. For regular expression syntax, read the Java Tutorial on the topic. ]]> diff --git a/content/api_en/matchAll.xml b/content/api_en/matchAll.xml index 56feb6b5b..4f0345fbe 100644 --- a/content/api_en/matchAll.xml +++ b/content/api_en/matchAll.xml @@ -33,7 +33,7 @@ To use the function, first check to see if the result is null. If the result is
    If there are groups (specified by sets of parentheses) in the regular expression, then the contents of each will be returned in the array. Assuming a loop with counter variable i, element [i][0] of a regular expression match returns the entire matching string, and the match groups start at element [i][1] (the first group is [i][1], the second [i][2], and so on).

    -The syntax can be found in the reference for Java's Pattern class. For regular expression syntax, read the Java Tutorial on the topic. +The syntax can be found in the reference for Java's Pattern class. For regular expression syntax, read the Java Tutorial on the topic. ]]> diff --git a/content/api_en/mouseReleased.xml b/content/api_en/mouseReleased.xml index 7d10362ba..2905cbf99 100755 --- a/content/api_en/mouseReleased.xml +++ b/content/api_en/mouseReleased.xml @@ -6,7 +6,7 @@ Mouse - +p5function diff --git a/content/api_en/mouseWheel.xml b/content/api_en/mouseWheel.xml index 02c01cd7a..0a2344176 100755 --- a/content/api_en/mouseWheel.xml +++ b/content/api_en/mouseWheel.xml @@ -26,7 +26,7 @@ void mouseWheel(MouseEvent event) { mouseWheel() function returns positive values when the mouse wheel is rotated down (toward the user), and negative values for the other direction (up or away from the user). On OS X with "natural" scrolling enabled, the values are opposite. +The code within the mouseWheel() event function is run when the mouse wheel is moved. (Some mice don't have wheels and this function is only applicable with mice that have a wheel.) The getCount() function used within mouseWheel() returns positive values when the mouse wheel is rotated down (toward the user), and negative values for the other direction (up or away from the user). On OS X with "natural" scrolling enabled, the values are opposite.

    Mouse and keyboard events only work when a program has draw(). Without draw(), the code is only run once and then stops listening for events. ]]>
    diff --git a/content/api_en/nf.xml b/content/api_en/nf.xml index f1e6123dd..295db43ac 100755 --- a/content/api_en/nf.xml +++ b/content/api_en/nf.xml @@ -26,11 +26,16 @@ String se = nf(e, 5, 3); println(se); // Prints "00040.200" String sf = nf(f, 3, 5); println(sf); // Prints "009.01200" + +String sf2 = nf(f, 0, 5); +println(sf2); // Prints "9.01200" +String sf3 = nf(f, 0, 2); +println(sf3); // Prints "9.01" ]]>
    digits, left, and right parameters should always be positive integers.

    As shown in the above example, nf() is used to add zeros to the left and/or right of a number. This is typically for aligning a list of numbers. To remove digits from a floating-point number, use the int(), ceil(), floor(), or round() functions. +Utility function for formatting numbers into strings. There are two versions: one for formatting floats, and one for formatting ints. The values for the digits and right parameters should always be positive integers. The left parameter should be positive or 0. If it is zero, only the right side is formatted.

    As shown in the above example, nf() is used to add zeros to the left and/or right of a number. This is typically for aligning a list of numbers. To remove digits from a floating-point number, use the int(), ceil(), floor(), or round() functions. ]]>
    diff --git a/content/api_en/nfc.xml b/content/api_en/nfc.xml index 7eb3d6803..c65a5886b 100755 --- a/content/api_en/nfc.xml +++ b/content/api_en/nfc.xml @@ -21,9 +21,24 @@ println(fi); // Prints "42,525.34" ]]>
    + + + + + right parameter should always be a positive integer. -

    +Utility function for formatting numbers into strings and placing appropriate commas to mark units of 1000. There are four versions: one for formatting ints, one for formatting an array of ints, one for formatting floats, and one for formatting an array of floats.
    +
    +The value for the right parameter should always be a positive integer.
    +
    For a non-US locale, this will insert periods instead of commas, or whatever is apprioriate for that region. ]]>
    diff --git a/content/api_en/noClip.xml b/content/api_en/noClip.xml index 8c45b46a0..71e932b48 100644 --- a/content/api_en/noClip.xml +++ b/content/api_en/noClip.xml @@ -14,14 +14,13 @@ smooth() is active by default, so it is necessary to call noSmooth() to disable smoothing of geometry, fonts, and images. Since the release of Processing 3.0, the noSmooth() function can only be run once for each sketch, either at the top of a sketch without a setup(), or after the size() function when used in a sketch with setup(). See the examples above for both scenarios. +Draws all geometry and fonts with jagged (aliased) edges and images with hard edges between the pixels when enlarged rather than interpolating pixels. Note that smooth() is active by default, so it is necessary to call noSmooth() to disable smoothing of geometry, fonts, and images. Since the release of Processing 3.0, the noSmooth() function can only be run once for each sketch, either at the top of a sketch without a setup(), or after the size() function when used in a sketch with setup(). See the examples above for both scenarios. ]]> diff --git a/content/api_en/noise.xml b/content/api_en/noise.xml index f5c2822f3..c7435b714 100755 --- a/content/api_en/noise.xml +++ b/content/api_en/noise.xml @@ -25,13 +25,12 @@ void draw() { random() function. It was invented by Ken Perlin in the 1980s and has been used in graphical applications to generate procedural textures, shapes, terrains, and other seemingly organic forms.
    +Returns the Perlin noise value at specified coordinates. Perlin noise is a random sequence generator producing a more natural, harmonic succession of numbers than that of the standard random() function. It was developed by Ken Perlin in the 1980s and has been used in graphical applications to generate procedural textures, shapes, terrains, and other seemingly organic forms.

    In contrast to the random() function, Perlin noise is defined in an infinite n-dimensional space, in which each pair of coordinates corresponds to a fixed semi-random value (fixed only for the lifespan of the program). The resulting value will always be between 0.0 and 1.0. Processing can compute 1D, 2D and 3D noise, depending on the number of coordinates given. The noise value can be animated by moving through the noise space, as demonstrated in the first example above. The 2nd and 3rd dimensions can also be interpreted as time.

    The actual noise structure is similar to that of an audio signal, in respect to the function's use of frequencies. Similar to the concept of harmonics in physics, Perlin noise is computed over several octaves which are added together for the final result.

    -Another way to adjust the character of the resulting sequence is the scale of the input coordinates. As the function works within an infinite space, the value of the coordinates doesn't matter as such; only the distance between successive coordinates is important (such as when using noise() within a loop). As a general rule, the smaller the difference between coordinates, the smoother the resulting noise sequence. Steps of 0.005-0.03 work best for most applications, but this will differ depending on use. +Another way to adjust the character of the resulting sequence is the scale of the input coordinates. As the function works within an infinite space, the value of the coordinates doesn't matter as such; only the distance between successive coordinates is important (such as when using noise() within a loop). As a general rule, the smaller the difference between coordinates, the smoother the resulting noise sequence. Steps of 0.005-0.03 work best for most applications, but this will differ depending on use.
    +
    +There have been debates over the accuracy of the implementation of noise in Processing. For clarification, it's an implementation of "classic Perlin noise" from 1983, and not the newer "simplex noise" method from 2001. ]]>
    diff --git a/content/api_en/noiseDetail.xml b/content/api_en/noiseDetail.xml index b770659f0..dfd0d0633 100755 --- a/content/api_en/noiseDetail.xml +++ b/content/api_en/noiseDetail.xml @@ -31,7 +31,7 @@ void draw() {
    +Adjusts the character and level of detail produced by the Perlin noise function. Similar to harmonics in physics, noise is computed over several octaves. Lower octaves contribute more to the output signal and as such define the overall intensity of the noise, whereas higher octaves create finer-grained details in the noise sequence.

    By default, noise is computed over 4 octaves with each octave contributing exactly half than its predecessor, starting at 50% strength for the first octave. This falloff amount can be changed by adding an additional function parameter. For example, a falloff factor of 0.75 means each octave will now have 75% impact (25% less) of the previous lower octave. While any number between 0.0 and 1.0 is valid, note that values greater than 0.5 may result in noise() returning values greater than 1.0.

    diff --git a/content/api_en/ortho.xml b/content/api_en/ortho.xml index d9a0fc93f..41cfe21b4 100755 --- a/content/api_en/ortho.xml +++ b/content/api_en/ortho.xml @@ -13,7 +13,7 @@ diff --git a/content/api_en/parseJSONArray.xml b/content/api_en/parseJSONArray.xml new file mode 100755 index 000000000..cdb4a4832 --- /dev/null +++ b/content/api_en/parseJSONArray.xml @@ -0,0 +1,39 @@ + + +parseJSONArray() + +Input + +Files + + + + + + + + +String, parses its contents, and returns a JSONArray. If the String does not contain JSONArray data or cannot be parsed, a null value is returned.
    +
    +parseJSONArray() is most useful when pulling data dynamically, such as from third-party APIs. Normally, API results would be saved to a String, and then can be converted to a structured JSONArray using parseJSONArray(). Be sure to check if null is returned before performing operations on the new JSONArray in case the String content could not be parsed.
    +
    +If your data already exists as a JSON file in the data folder, it is simpler to use loadJSONArray(). +]]>
    + +
    diff --git a/content/api_en/parseJSONObject.xml b/content/api_en/parseJSONObject.xml new file mode 100755 index 000000000..45a6c02bb --- /dev/null +++ b/content/api_en/parseJSONObject.xml @@ -0,0 +1,39 @@ + + +parseJSONObject() + +Input + +Files + + + + + + + + +String, parses its contents, and returns a JSONObject. If the String does not contain JSONObject data or cannot be parsed, a null value is returned.
    +
    +parseJSONObject() is most useful when pulling data dynamically, such as from third-party APIs. Normally, API results would be saved to a String, and then can be converted to a structured JSONObject using parseJSONObject(). Be sure to check if null is returned before performing operations on the new JSONObject in case the String content could not be parsed.
    +
    +If your data already exists as a JSON file in the data folder, it is simpler to use loadJSONObject(). +]]>
    + +
    diff --git a/content/api_en/pixelDensity.xml b/content/api_en/pixelDensity.xml index f757532ef..35b15bac1 100755 --- a/content/api_en/pixelDensity.xml +++ b/content/api_en/pixelDensity.xml @@ -37,8 +37,30 @@ void draw() { ]]>
    + + + + + size() in a program without a setup() and used within setup() when a program has one. +This function is new with Processing 3.0. It makes it possible for Processing to render using all of the pixels on high resolutions screens like Apple Retina displays and Windows High-DPI displays. This function can only be run once within a program and it must be used right after size() in a program without a setup() and used within setup() when a program has one. The pixelDensity() should only be used with hardcoded numbers (in almost all cases this number will be 2) or in combination with displayDensity() as in the third example above. +

    +When the pixel density is set to more than 1, it changes all of the pixel operations including the way get(), set(), blend(), copy(), and updatePixels() all work. See the reference for pixelWidth and pixelHeight for more information. +

    +To use variables as the arguments to pixelDensity() function, place the pixelDensity() function within the settings() function. There is more information about this on the settings() reference page. ]]>
    diff --git a/content/api_en/pixelHeight.xml b/content/api_en/pixelHeight.xml index 007bf5ecf..1a2e15e63 100755 --- a/content/api_en/pixelHeight.xml +++ b/content/api_en/pixelHeight.xml @@ -8,10 +8,41 @@ + + + + @@ -19,5 +50,4 @@ println(pixelWidth, pixelHeight); When pixelDensity(2) is used to make use of a high resolution display (called a Retina display on OS X or high-dpi on Windows and Linux), the width and height of the sketch do not change, but the number of pixels is doubled. As a result, all operations that use pixels (like loadPixels(), get(), set(), etc.) happen in this doubled space. As a convenience, the variables pixelWidth and pixelHeight hold the actual width and height of the sketch in pixels. This is useful for any sketch that uses the pixels[] array, for instance, because the number of elements in the array will be pixelWidth*pixelHeight, not width*height. ]]>
    - - + \ No newline at end of file diff --git a/content/api_en/pixelWidth.xml b/content/api_en/pixelWidth.xml index 1c715ee9d..5f88fa136 100755 --- a/content/api_en/pixelWidth.xml +++ b/content/api_en/pixelWidth.xml @@ -8,10 +8,41 @@ + + + + @@ -19,4 +50,4 @@ println(pixelWidth, pixelHeight); When pixelDensity(2) is used to make use of a high resolution display (called a Retina display on OS X or high-dpi on Windows and Linux), the width and height of the sketch do not change, but the number of pixels is doubled. As a result, all operations that use pixels (like loadPixels(), get(), set(), etc.) happen in this doubled space. As a convenience, the variables pixelWidth and pixelHeight hold the actual width and height of the sketch in pixels. This is useful for any sketch that uses the pixels[] array, for instance, because the number of elements in the array will be pixelWidth*pixelHeight, not width*height. ]]> - + \ No newline at end of file diff --git a/content/api_en/pixels.xml b/content/api_en/pixels.xml index 5a5607c69..536f50338 100755 --- a/content/api_en/pixels.xml +++ b/content/api_en/pixels.xml @@ -21,9 +21,9 @@ updatePixels(); index value defines the position of a value within the array. For example, the statement color b = pixels[230] will set the variable b to be equal to the value at that location in the array.
    -
    -Before accessing this array, the data must loaded with the loadPixels() function. After the array data has been modified, the updatePixels() function must be run to update the changes. Without loadPixels(), running the code may (or will in future releases) result in a NullPointerException. +The pixels[] array contains the values for all the pixels in the display window. These values are of the color datatype. This array is defined by the size of the display window. For example, if the window is 100 x 100 pixels, there will be 10,000 values and if the window is 200 x 300 pixels, there will be 60,000 values. When the pixel density is set to higher than 1 with the pixelDensity() function, these values will change. See the reference for pixelWidth or pixelHeight for more information. +

    +Before accessing this array, the data must loaded with the loadPixels() function. Failure to do so may result in a NullPointerException. Subsequent changes to the display window will not be reflected in pixels until loadPixels() is called again. After pixels has been modified, the updatePixels() function must be run to update the content of the display window. ]]>
    diff --git a/content/api_en/point.xml b/content/api_en/point.xml index ef1900aa8..6034c7f82 100755 --- a/content/api_en/point.xml +++ b/content/api_en/point.xml @@ -33,6 +33,12 @@ point(30, 75, -50); z parameter requires the P3D parameter in combination with size() as shown in the above example. +

    +Use stroke() to set the color of a point(). +

    +Point appears round with the default strokeCap(ROUND) and square with strokeCap(PROJECT). Points are invisible with strokeCap(SQUARE) (no cap). +

    +Using point() with strokeWeight(1) or smaller may draw nothing to the screen, depending on the graphics settings of the computer. Workarounds include setting the pixel using set() or drawing the point using either circle() or square(). ]]>
    diff --git a/content/api_en/pop.xml b/content/api_en/pop.xml new file mode 100644 index 000000000..743748933 --- /dev/null +++ b/content/api_en/pop.xml @@ -0,0 +1,51 @@ + + +pop() + +Structure + + + + + + +popMatrix_.png + + + + +popStyle_0.png + + + +pop() function restores the previous drawing style settings and transformations after push() has changed them. Note that these functions are always used together. They allow you to change the style and transformation settings and later return to what you had. When a new state is started with push(), it builds on the current style and transform information.
    +
    +push() stores information related to the current transformation state and style settings controlled by the following functions: rotate(), translate(), scale(), fill(), stroke(), tint(), strokeWeight(), strokeCap(), strokeJoin(), imageMode(), rectMode(), ellipseMode(), colorMode(), textAlign(), textFont(), textMode(), textSize(), textLeading().
    +
    +The push() and pop() functions were added with Processing 3.5. They can be used in place of pushMatrix(), popMatrix(), pushStyles(), and popStyles(). The difference is that push() and pop() control both the transformations (rotate, scale, translate) and the drawing styles at the same time. +]]> + + diff --git a/content/api_en/print.xml b/content/api_en/print.xml index 0f5e13438..162f82ebe 100755 --- a/content/api_en/print.xml +++ b/content/api_en/print.xml @@ -42,7 +42,7 @@ The print() function writes to the console area, the black rectangle at t
    Using print() on an object will output null, a memory location that may look like "@10be08," or the result of the toString() method from the object that's being printed. Advanced users who want more useful output when calling print() on their own classes can add a toString() method to the class that returns a String.

    -Note that the console is relatively slow. It works well for occasional messages, but does not support high-speed, real-time output (such as at 60 frames per second). +Note that the console is relatively slow. It works well for occasional messages, but does not support high-speed, real-time output (such as at 60 frames per second). It should also be noted, that a print() within a for loop can sometimes lock up the program, and cause the sketch to freeze. ]]> diff --git a/content/api_en/println.xml b/content/api_en/println.xml index 464aaa022..80c273526 100755 --- a/content/api_en/println.xml +++ b/content/api_en/println.xml @@ -43,7 +43,7 @@ The println() function writes to the console area, the black rectangle at
    Before Processing 2.1, println() was used to write array data to the console. Now, use printArray() to write array data to the console.

    -Note that the console is relatively slow. It works well for occasional messages, but does not support high-speed, real-time output (such as at 60 frames per second). +Note that the console is relatively slow. It works well for occasional messages, but does not support high-speed, real-time output (such as at 60 frames per second). It should also be noted, that a println() within a for loop can sometimes lock up the program, and cause the sketch to freeze. ]]> diff --git a/content/api_en/push.xml b/content/api_en/push.xml new file mode 100644 index 000000000..e926650fb --- /dev/null +++ b/content/api_en/push.xml @@ -0,0 +1,51 @@ + + +push() + +Structure + + + + + + +pushMatrix_.png + + + + +pushStyle_0.png + + + +push() function saves the current drawing style settings and transformations, while pop() restores these settings. Note that these functions are always used together. They allow you to change the style and transformation settings and later return to what you had. When a new state is started with push(), it builds on the current style and transform information.
    +
    +push() stores information related to the current transformation state and style settings controlled by the following functions: rotate(), translate(), scale(), fill(), stroke(), tint(), strokeWeight(), strokeCap(), strokeJoin(), imageMode(), rectMode(), ellipseMode(), colorMode(), textAlign(), textFont(), textMode(), textSize(), textLeading().
    +
    +The push() and pop() functions were added with Processing 3.5. They can be used in place of pushMatrix(), popMatrix(), pushStyles(), and popStyles(). The difference is that push() and pop() control both the transformations (rotate, scale, translate) and the drawing styles at the same time. +]]>
    + +
    diff --git a/content/api_en/quadraticVertex.xml b/content/api_en/quadraticVertex.xml index 1cf51f929..c3dd03bc5 100644 --- a/content/api_en/quadraticVertex.xml +++ b/content/api_en/quadraticVertex.xml @@ -35,7 +35,7 @@ endShape(); quadraticVertex() defines the position of one control points and one anchor point of a Bezier curve, adding a new segment to a line or shape. The first time quadraticVertex() is used within a beginShape() call, it must be prefaced with a call to vertex() to set the first anchor point. This function must be used between beginShape() and endShape() and only when there is no MODE parameter specified to beginShape(). Using the 3D version requires rendering with P3D (see the Environment reference for more information). +Specifies vertex coordinates for quadratic Bezier curves. Each call to quadraticVertex() defines the position of one control point and one anchor point of a Bezier curve, adding a new segment to a line or shape. The first time quadraticVertex() is used within a beginShape() call, it must be prefaced with a call to vertex() to set the first anchor point. This function must be used between beginShape() and endShape() and only when there is no MODE parameter specified to beginShape(). Using the 3D version requires rendering with P3D (see the Environment reference for more information). ]]> diff --git a/content/api_en/resetMatrix.xml b/content/api_en/resetMatrix.xml index 733a2803b..fb1c6ac42 100755 --- a/content/api_en/resetMatrix.xml +++ b/content/api_en/resetMatrix.xml @@ -9,7 +9,7 @@ -resetMatrix_.png + angle parameter. Angles must be specified in radians (values from 0 to TWO_PI), or they can be converted from degrees to radians with the radians() function. +Rotates the amount specified by the angle parameter. Angles must be specified in radians (values from 0 to TWO_PI), or they can be converted from degrees to radians with the radians() function.

    -Objects are always rotated around their relative position to the origin, and positive numbers rotate objects in a clockwise direction. Transformations apply to everything that happens afterward, and subsequent calls to the function compound the effect. For example, calling rotate(HALF_PI) once and then calling rotate(HALF_PI) a second time is the same as a single rotate(PI). All tranformations are reset when draw() begins again. +The coordinates are always rotated around their relative position to the origin. Positive numbers rotate objects in a clockwise direction and negative numbers rotate in the couterclockwise direction. Transformations apply to everything that happens afterward, and subsequent calls to the function compound the effect. For example, calling rotate(PI/2.0) once and then calling rotate(PI/2.0) a second time is the same as a single rotate(PI). All tranformations are reset when draw() begins again.

    Technically, rotate() multiplies the current transformation matrix by a rotation matrix. This function can be further controlled by pushMatrix() and popMatrix(). ]]>
    diff --git a/content/api_en/rotateX.xml b/content/api_en/rotateX.xml index 38618bafd..8d92559c2 100755 --- a/content/api_en/rotateX.xml +++ b/content/api_en/rotateX.xml @@ -29,7 +29,7 @@ rect(-26, -26, 52, 52);
    angle parameter. Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the radians() function. Objects are always rotated around their relative position to the origin and positive numbers rotate objects in a counterclockwise direction. Transformations apply to everything that happens after and subsequent calls to the function accumulates the effect. For example, calling rotateX(PI/2) and then rotateX(PI/2) is the same as rotateX(PI). If rotateX() is called within the draw(), the transformation is reset when the loop begins again. This function requires using P3D as a third parameter to size() as shown in the example above. +Rotates around the x-axis the amount specified by the angle parameter. Angles should be specified in radians (values from 0 to TWO_PI) or converted from degrees to radians with the radians() function. Coordinates are always rotated around their relative position to the origin. Positive numbers rotate in a clockwise direction and negative numbers rotate in a counterclockwise direction. Transformations apply to everything that happens after and subsequent calls to the function accumulates the effect. For example, calling rotateX(PI/2) and then rotateX(PI/2) is the same as rotateX(PI). If rotateX() is run within the draw(), the transformation is reset when the loop begins again. This function requires using P3D as a third parameter to size() as shown in the example above. ]]> diff --git a/content/api_en/rotateY.xml b/content/api_en/rotateY.xml index 1f4728184..dc6c35d75 100755 --- a/content/api_en/rotateY.xml +++ b/content/api_en/rotateY.xml @@ -29,7 +29,7 @@ rect(-26, -26, 52, 52); angle parameter. Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the radians() function. Objects are always rotated around their relative position to the origin and positive numbers rotate objects in a counterclockwise direction. Transformations apply to everything that happens after and subsequent calls to the function accumulates the effect. For example, calling rotateY(PI/2) and then rotateY(PI/2) is the same as rotateY(PI). If rotateY() is called within the draw(), the transformation is reset when the loop begins again. This function requires using P3D as a third parameter to size() as shown in the examples above. +Rotates around the y-axis the amount specified by the angle parameter. Angles should be specified in radians (values from 0 to TWO_PI) or converted from degrees to radians with the radians() function. Coordinates are always rotated around their relative position to the origin. Positive numbers rotate in a clockwise direction and negative numbers rotate in a counterclockwise direction. Transformations apply to everything that happens after and subsequent calls to the function accumulates the effect. For example, calling rotateY(PI/2) and then rotateY(PI/2) is the same as rotateY(PI). If rotateY() is run within the draw(), the transformation is reset when the loop begins again. This function requires using P3D as a third parameter to size() as shown in the example above. ]]> diff --git a/content/api_en/rotateZ.xml b/content/api_en/rotateZ.xml index 5f5566ec9..3148ff4bc 100755 --- a/content/api_en/rotateZ.xml +++ b/content/api_en/rotateZ.xml @@ -29,7 +29,7 @@ rect(-26, -26, 52, 52); angle parameter. Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the radians() function. Objects are always rotated around their relative position to the origin and positive numbers rotate objects in a counterclockwise direction. Transformations apply to everything that happens after and subsequent calls to the function accumulates the effect. For example, calling rotateZ(PI/2) and then rotateZ(PI/2) is the same as rotateZ(PI). If rotateZ() is called within the draw(), the transformation is reset when the loop begins again. This function requires using P3D as a third parameter to size() as shown in the examples above. +Rotates around the z-axis the amount specified by the angle parameter. Angles should be specified in radians (values from 0 to TWO_PI) or converted from degrees to radians with the radians() function. Coordinates are always rotated around their relative position to the origin. Positive numbers rotate in a clockwise direction and negative numbers rotate in a counterclockwise direction. Transformations apply to everything that happens after and subsequent calls to the function accumulates the effect. For example, calling rotateZ(PI/2) and then rotateZ(PI/2) is the same as rotateZ(PI). If rotateZ() is run within the draw(), the transformation is reset when the loop begins again. This function requires using P3D as a third parameter to size() as shown in the example above. ]]> diff --git a/content/api_en/scale.xml b/content/api_en/scale.xml index c2397c0db..1dd1215f8 100755 --- a/content/api_en/scale.xml +++ b/content/api_en/scale.xml @@ -43,7 +43,7 @@ box(20, 20, 20); scale(2.0) increases the dimension of a shape by 200%.

    -Transformations apply to everything that happens after and subsequent calls to the function multiply the effect. For example, calling scale(2.0) and then scale(1.5) is the same as scale(3.0). If scale() is called within draw(), the transformation is reset when the loop begins again. Using this fuction with the z parameter requires using P3D as a parameter for size(), as shown in the third example above. This function can be further controlled with pushMatrix() and popMatrix(). +Transformations apply to everything that happens after and subsequent calls to the function multiply the effect. For example, calling scale(2.0) and then scale(1.5) is the same as scale(3.0). If scale() is called within draw(), the transformation is reset when the loop begins again. Using this function with the z parameter requires using P3D as a parameter for size(), as shown in the third example above. This function can be further controlled with pushMatrix() and popMatrix(). ]]>
    diff --git a/content/api_en/settings.xml b/content/api_en/settings.xml index 1ad61e94b..3cf6b5022 100644 --- a/content/api_en/settings.xml +++ b/content/api_en/settings.xml @@ -107,7 +107,9 @@ void draw() { settings() function is new with Processing 3.0. It's not needed in most sketches. It's only useful when it's necessary to define the parameters to size() with a variable or to load that information from a file. Alternately, the settings() function is necessary when using Processing code outside of the Processing Development Environment (PDE). For example, when using the Eclipse code editor, it's necessary to use settings() to define the size() and smooth() values for a sketch.. +The settings() function is new with Processing 3.0. It's not needed in most sketches. It's only useful when it's absolutely necessary to define the parameters to size() with a variable. Alternately, the settings() function is necessary when using Processing code outside of the Processing Development Environment (PDE). For example, when using the Eclipse code editor, it's necessary to use settings() to define the size() and smooth() values for a sketch.. +

    +The settings() method runs before the sketch has been set up, so other Processing functions cannot be used at that point. For instance, do not use loadImage() inside settings(). The settings() method runs "passively" to set a few variables, compared to the setup() command that call commands in the Processing API. ]]>
    diff --git a/content/api_en/shorten.xml b/content/api_en/shorten.xml index 82961260a..41746c5ad 100755 --- a/content/api_en/shorten.xml +++ b/content/api_en/shorten.xml @@ -20,7 +20,7 @@ println(sa2); // 'sa2' now contains OH, NY
    When using an array of objects, the data returned from the function must be cast to the object array's data type. For example: SomeClass[] items = (SomeClass[]) shorten(originalArray) ]]>
    diff --git a/content/api_en/size.xml b/content/api_en/size.xml index 91b88ce52..bd6f4c1b0 100755 --- a/content/api_en/size.xml +++ b/content/api_en/size.xml @@ -51,25 +51,31 @@ box(35); setup() function, the size() function must be the first line of code inside setup().
    +Defines the dimension of the display window width and height in units of pixels. In a program that has the setup() function, the size() function must be the first line of code inside setup(), and the setup() function must appear in the code tab with the same name as your sketch folder.

    -The system variables width and height are set by the parameters passed to this function. For example, running size(640, 480) will assign 640 to the width variable and 480 to the height variable. If size() is not used, the window will be given a default size of 100 x 100 pixels.
    +The built-in variables width and height are set by the parameters passed to this function. For example, running size(640, 480) will assign 640 to the width variable and 480 to the height variable. If size() is not used, the window will be given a default size of 100 x 100 pixels.

    The size() function can only be used once inside a sketch, and it cannot be used for resizing.

    -As of Processing 3.0, to run a sketch at the full dimensions of a screen, use the fullScreen() function, rather than the older way of using size(displayWidth, displayHeight).
    +As of Processing 3, to run a sketch at the full dimensions of a screen, use the fullScreen() function, rather than the older way of using size(displayWidth, displayHeight).

    The maximum width and height is limited by your operating system, and is usually the width and height of your actual screen. On some machines it may simply be the number of pixels on your current screen, meaning that a screen of 800 x 600 could support size(1600, 300), since that is the same number of pixels. This varies widely, so you'll have to try different rendering modes and sizes until you get what you're looking for. If you need something larger, use createGraphics to create a non-visible drawing surface.

    +The minimum width and height is around 100 pixels in each direction. This is the smallest that is supported across Windows, macOS, and Linux. We enforce the minimum size so that sketches will run identically on different machines. +
    The renderer parameter selects which rendering engine to use. For example, if you will be drawing 3D shapes, use P3D. In addition to the default renderer, other renderers are:

    P2D (Processing 2D): 2D graphics renderer that makes use of OpenGL-compatible graphics hardware.

    P3D (Processing 3D): 3D graphics renderer that makes use of OpenGL-compatible graphics hardware.

    +FX2D (JavaFX 2D): A 2D renderer that uses JavaFX, which may be faster for some applications, but has some compatibility quirks. +
    PDF: The PDF renderer draws 2D graphics directly to an Acrobat PDF file. This produces excellent results when you need vector shapes for high-resolution output or printing. You must first use Import Library → PDF to make use of the library. More information can be found in the PDF library reference.

    -As of Processing 3.0, to use variables as the parameters to size() function, place the size() function within the settings() function. There is more information about this on the settings() reference page.
    +SVG: The SVG renderer draws 2D graphics directly to an SVG file. This is great for importing into other vector programs or using for digital fabrication. You must first use Import Library → SVG Export to make use of the library.
    +
    +As of Processing 3.0, to use variables as the parameters to size() function, place the size() function within the settings() function (instead of setup()). There is more information about this on the settings() reference page.

    ]]>
    diff --git a/content/api_en/smooth.xml b/content/api_en/smooth.xml index 6b82e35b5..c19f7a303 100755 --- a/content/api_en/smooth.xml +++ b/content/api_en/smooth.xml @@ -28,6 +28,8 @@ void draw() { + + + + + smooth() only needs to be used when a program needs to set the smoothing in a different way. The level parameter increases the level of smoothness. This is the level of over sampling applied to the graphics buffer.
    -
    -With the P2D and P3D renderers, smooth(2) is the default, this is called "2x anti-aliasing." The code smooth(4) is used for 4x anti-aliasing and smooth(8) is specified for 8x anti-aliasing. The maximum anti-aliasing level is determined by the hardware of the machine that is running the software, so smooth(4) and smooth(8) will not work with every computer.
    -
    -The default renderer uses smooth(3) by default. This is bicubic smoothing. The other option for the default renderer is smooth(2), which is bilinear smoothing.
    -
    +Draws all geometry with smooth (anti-aliased) edges. This behavior is the default, so smooth() only needs to be used when a program needs to set the smoothing in a different way. The level parameter increases the amount of smoothness. This is the level of over sampling applied to the graphics buffer. +

    +With the P2D and P3D renderers, smooth(2) is the default, this is called "2x anti-aliasing." The code smooth(4) is used for 4x anti-aliasing and smooth(8) is specified for "8x anti-aliasing." The maximum anti-aliasing level is determined by the hardware of the machine that is running the software, so smooth(4) and smooth(8) will not work with every computer. +

    +The default renderer uses smooth(3) by default. This is bicubic smoothing. The other option for the default renderer is smooth(2), which is bilinear smoothing. +

    With Processing 3.0, smooth() is different than before. It was common to use smooth() and noSmooth() to turn on and off antialiasing within a sketch. Now, because of how the software has changed, smooth() can only be set once within a sketch. It can be used either at the top of a sketch without a setup(), or after the size() function when used in a sketch with setup(). The noSmooth() function also follows the same rules. +

    +When smooth() is used with a PGraphics object, it should be run right after the object is created with createGraphics(), as shown in the Reference in the third example. ]]>
    diff --git a/content/api_en/splice.xml b/content/api_en/splice.xml index c62c959e8..a9f5358c6 100755 --- a/content/api_en/splice.xml +++ b/content/api_en/splice.xml @@ -39,7 +39,7 @@ println(a); +Inserts a value or an array of values into an existing array. The first two parameters must be arrays of the same datatype. The first parameter specifies the initial array to be modified, and the second parameter defines the data to be inserted. The third parameter is an index value which specifies the array position from which to insert data. (Remember that array index numbering starts at zero, so the first position is 0, the second position is 1, and so on.)

    When splicing an array of objects, the data returned from the function must be cast to the object array's data type. For example: SomeClass[] items = (SomeClass[]) splice(array1, array2, index) ]]>
    diff --git a/content/api_en/split.xml b/content/api_en/split.xml index 13841d3ba..5b01ca9f2 100755 --- a/content/api_en/split.xml +++ b/content/api_en/split.xml @@ -38,7 +38,7 @@ String[] list = split(men, " ] "); split() function breaks a String into pieces using a character or string as the delimiter. The delim parameter specifies the character or characters that mark the boundaries between each piece. A String[] array is returned that contains each of the pieces.

    -If the result is a set of numbers, you can convert the String[] array to to a float[] or int[] array using the datatype conversion functions int() and float(). (See the second example above.) +If the result is a set of numbers, you can convert the String[] array to a float[] or int[] array using the datatype conversion functions int() and float(). (See the second example above.)

    The splitTokens() function works in a similar fashion, except that it splits using a range of characters instead of a specific character or sequence. Reference for Processing version 1.5. If you have a previous version, use the reference included with your software. If you see any errors or have suggestions, please let us know. - If you prefer a more technical reference, visit the Processing Javadoc. + If you prefer a more technical reference, visit the Processing Javadoc. diff --git a/content/api_en/trim.xml b/content/api_en/trim.xml index 4b91885ed..68afbfec6 100755 --- a/content/api_en/trim.xml +++ b/content/api_en/trim.xml @@ -18,7 +18,7 @@ println(s2); // Prints "Somerville MA" String[] a1 = { " inconsistent ", " spacing" }; // Note spaces String[] a2 = trim(a1); -println(a2); +printArray(a2); // Prints the following array contents to the console: // [0] "inconsistent" // [1] "spacing" diff --git a/content/api_en/updatePixels.xml b/content/api_en/updatePixels.xml index 200667c22..fb3ba9af1 100755 --- a/content/api_en/updatePixels.xml +++ b/content/api_en/updatePixels.xml @@ -24,10 +24,6 @@ updatePixels(); pixels[] array. Use in conjunction with loadPixels(). If you're only reading pixels from the array, there's no need to call updatePixels() — updating is only necessary to apply changes. -

    -Certain renderers may or may not seem to require loadPixels() or updatePixels(). However, the rule is that any time you want to manipulate the pixels[] array, you must first call loadPixels(), and after changes have been made, call updatePixels(). Even if the renderer may not seem to use this function in the current Processing release, this will always be subject to change. -

    -Currently, while none of the renderers use the additional parameters to updatePixels(), this may be implemented in the future. ]]>
    diff --git a/content/api_media/LIB_sound_Pulse.png b/content/api_media/LIB_sound_Pulse.png new file mode 100644 index 000000000..6104e4931 Binary files /dev/null and b/content/api_media/LIB_sound_Pulse.png differ diff --git a/content/api_media/LIB_sound_SawOsc.png b/content/api_media/LIB_sound_SawOsc.png new file mode 100644 index 000000000..845db35d1 Binary files /dev/null and b/content/api_media/LIB_sound_SawOsc.png differ diff --git a/content/api_media/LIB_sound_SinOsc.png b/content/api_media/LIB_sound_SinOsc.png new file mode 100644 index 000000000..f510c14ed Binary files /dev/null and b/content/api_media/LIB_sound_SinOsc.png differ diff --git a/content/api_media/LIB_sound_SqrOsc.png b/content/api_media/LIB_sound_SqrOsc.png new file mode 100644 index 000000000..1e6941c6e Binary files /dev/null and b/content/api_media/LIB_sound_SqrOsc.png differ diff --git a/content/api_media/LIB_sound_TriOsc.png b/content/api_media/LIB_sound_TriOsc.png new file mode 100644 index 000000000..a7d89b40d Binary files /dev/null and b/content/api_media/LIB_sound_TriOsc.png differ diff --git a/content/api_media/logicalNOT.png b/content/api_media/logicalNOT.png index 6d5e1d0eb..6dbd3074c 100644 Binary files a/content/api_media/logicalNOT.png and b/content/api_media/logicalNOT.png differ diff --git a/content/api_media/logicalNOT_2.png b/content/api_media/logicalNOT_2.png new file mode 100644 index 000000000..20e3a73ba Binary files /dev/null and b/content/api_media/logicalNOT_2.png differ diff --git a/content/api_media/text_2.png b/content/api_media/text_2.png index 464217613..841e5e16d 100644 Binary files a/content/api_media/text_2.png and b/content/api_media/text_2.png differ diff --git a/content/curated.xml b/content/curated.xml index 0d4fbb3bf..87029364a 100755 --- a/content/curated.xml +++ b/content/curated.xml @@ -1,6 +1,138 @@ - + + + images/pour.jpg + + ‘Pour Reception’ is a playful radio that uses machine learning and tangible computing to challenge our cultural understanding of what an interface is and can be. Two glasses of water are turned into a digital material for the user to explore and appropriate. + http://www.toreknudsen.dk/work/pour-reception/ + Tore Knudsen + + + + images/digits.jpg + + Gysin-Vanetti are an artist duo exploring images and patterns using the type geometries of multipurpose displays. Using only prevailing forms, Gysin-Vanetti build images, animations and generate patterns. + https://www.creativeapplications.net/processing/gysin-vanetti-o-is-not-a-letter-its-a-circle/ + Gysin&Vanetti + CreativeApplications.Net + + + + images/volume.jpg + + Created by NY based art and architecture collective Softlab, ‘Volume’ is an interactive cube of responsive mirrors that redirect light and sound to spatialize and reflect the excitement of surrounding festival goers. + http://softlabnyc.com/portfolio/volume/ + Softlab + + + + images/komorebi.jpg + + komorebi is a platform that uses a robotic projector and generative projections to replicate the natural reflections and shadows of sunlight. komorebi can create sunlight filtering through leaves or a dance of light and shadow. + http://komorebi.studio/ + Leslie Nooteboom + + + + images/particleflow.jpg + + Particle Flow is a physical installation comprised of granules driven by gravity and topography forming an analogue particle system. A moving slanted plane and a grid of motorized stamps control the elements to form infinite variations of behaviours and patterns. + http://neoanalog.io/particle-flow/ + NEOANALOG + CreativeApplications.Net + + + + images/objectifier.jpg + + Objectifier empowers people to train objects in their daily environment to respond to their unique behaviours. Interacting with Objectifier is much like training a pet and it sees and understands its environment. + https://bjoernkarmann.dk/objectifier + Bjørn Karmann + CreativeApplications.Net + + + + images/random.jpg + + Created by Berlin based Ralf Baecker, Random Access Memory is a fully functional digital memory. Instead of operating on semi-conducting components to represent either the binary states of 0 (zero) or 1 (one), the memory uses grains of sand as storage material. + http://www.rlfbckr.org/work/random-access-memory/ + Ralf Baecker + CreativeApplications.Net + + + + images/aadrl.jpg + + The AADRL is a post-professional graduate design programme at the Architectural Association School of Architecture in London. Their research is focused on architectural design that is proto-typical, scenario driven and uses behaviour robotics as a design enquiry. + http://www.creativeapplications.net/processing/aadrl-behavioural-complexity/ + AADRL + CreativeApplications.Net + + + + images/terrapattern.jpg + + Terrapattern is a visual search tool for satellite imagery. The project provides journalists, citizen scientists, and other researchers with the ability to quickly scan large geographical regions for specific visual features. + http://www.terrapattern.com + Terrapattern + + + + images/FluidLeaves.jpg + + A generative approach to pattern design, which in combination with variable printing results in a unique design each time. The project grew out of an identity investigation for tea boutique, ‘Tee & Cupp’ in Xian. + + http://reinoudvanlaar.nl/project/leavespattern/ + Reinoud van Laar + + + + images/cfcityflows.jpg + + cf.city flows is a comparative visualization environment of urban bike mobility designed to help citizens casually analyze three bike-sharing systems in the context of a public exhibition space. + + https://uclab.fh-potsdam.de/cf/ + cf.city flows + + + + images/autoorchestra.jpg + + The Automatic Orchestra is an audio installation exploring algorithmic composition and networked music. The perpetual interaction among the devices and the interpretation of encoded musical messages blurs the distinctiveness between structured composition and performative improvisation. + + http://digitalmedia-bremen.de/en/project/automatic-orchestra/ + Digital Media Bremen + + + + images/possible.jpg + + Possible, Plausible, Potential is a set of three series of isometric drawings generated by code and printed with colored markers on a plotter machine. In these drawings, Miguel explores a bridge between the iterative aspect of algorithms and the utopian aspect of modern architecture. Each drawing is a unique variation of the same set of rules and carefully placed random decisions. + + http://superficie.ink/ + Miguel Nóbrega + + + + images/stewart.jpg + + Created by Felix Ros, Stewart is a hypothetical tactile interface designed for a fully autonomous car. Working around the idea that even thought self-driving offer obvious benefits, they also eliminate a sense of freedom, expression, and control while driving. Stewart’s objective is to accommodate a healthy relation between man and machine. + + http://felixros.com + Felix Ros + + + + images/traces.jpg + + Traces project explores the concept of programming everyday materials where objects are “made to act” by re-forming following a set of specific instructions. Dana developed 12 processed-folding objects series, using Processing and various physical techniques – printing, twisting, laser-cutting, knotting and framing. + + https://vimeo.com/133662815 + Vimeo + More Info + + images/pixtil.jpg @@ -9,8 +141,8 @@ http://pixtil.fr/php/produits/accueil.php?page=2#debut Pixtil More Info - - + + images/lightkinetics.jpg @@ -18,19 +150,19 @@ http://espadaysantacruz.com/Light-kinetics Light Kinetics - - + + images/pathfinder.jpg - Created by Princemio in collaboration with onformative and presented at Choreographic Coding laboratory in Frankfurt 2013, the Pathfinder project was created with aim to contribute to the creative processes of choreographic development. + Created by Princemio in collaboration with onformative and presented at Choreographic Coding laboratory in Frankfurt 2013, the Pathfinder project was created with aim to contribute to the creative processes of choreographic development. http://princemio.net/portfolio/pathfinder/ Pathfinder Motionbank Onformative - + images/dextro.jpg @@ -40,7 +172,7 @@ Dextro Vimeo - + images/rc4.jpg @@ -50,7 +182,7 @@ GAD – RC4 CreativeApplications.Net - + images/filament.jpg @@ -60,7 +192,7 @@ http://www.liaworks.com/theprojects/filament-sculptures/ Lia liasomething.tumblr.com - + images/Phantogram.jpg @@ -71,16 +203,16 @@ Timothy Saccenti Joshua Davis Watch Video - + images/keyflies.jpg Created by Miles Peyton, first year student at the Carnegie Mellon University, Keyfleas is an experiment in interactive augmented projection. Miles used Processing and Box2D to create an augmented projection on the keyboard. As the user types, the “fleas” swarm around the pressed key, avoiding the letters. - http://cmuems.com/2013/a/miles/10/17/keyfleas/ - CMU / Electronic Media Studio 2 - + https://vimeo.com/151334392 + CMU / Electronic Media Studio 2 + images/petting.jpg @@ -89,7 +221,7 @@
    http://minimaforms.com/#item=petting-zoo-frac-2 Minimaforms - + images/fragmented.jpg @@ -98,8 +230,8 @@ http://phillipstearns.wordpress.com/fragmented-memory/ Phillip Stearns - - + + images/avena.jpg @@ -107,7 +239,7 @@ http://benedikt-gross.de/log/2013/06/avena-test-bed_agricultural-printing-and-altered-landscapes/ Benedikt Groß - + images/kinograph.jpg @@ -117,7 +249,7 @@ http://mepler.com/Kinograph Kinograph - + images/fluid.jpg @@ -126,7 +258,7 @@ http://cargocollective.com/hnx/fluid Hannes Jung - + images/3dprintedrecord.jpg @@ -135,7 +267,7 @@ http://www.instructables.com/id/3D-Printed-Record/ Instructables - + images/digitalnatives.jpg @@ -144,7 +276,7 @@ http://www.plummerfernandez.com/Digital-Natives Matthew Plummer-Fernandez - + images/stonespray.jpg @@ -153,7 +285,7 @@ http://www.stonespray.com Petr Novikov, Inder Shergill and Anna Kulik - + images/citysymphonies.jpg @@ -161,9 +293,8 @@ http://markmckeague.com/work/city-symphonies/ Mark McKeague - More on CreativeApplications.Net - + images/silenc2.png @@ -171,9 +302,8 @@ http://www.flickr.com/photos/kennethaleksander/sets/72157629659743887 Flick Page - CreativeApplications.Net - + images/unnamed.jpg @@ -182,7 +312,7 @@ http://wearechopchop.com/%E2%80%9Cunnamed-soundsculpture%E2%80%9D/ We Are Chopchop - + images/soundmachines.jpg @@ -190,9 +320,8 @@ http://www.the-product.org/soundmachines The Product - CreativeApplications.Net - + images/visualeditions.jpg @@ -201,7 +330,7 @@ http://www.visual-editions.com Visual Editions - + images/maxplanck.jpg @@ -210,7 +339,7 @@ http://max-planck-research-networks.net/ Max Planck Reasearch Networks - + images/creators.jpg @@ -219,7 +348,7 @@ http://www.thecreators.tv The Creators - + images/golberg.jpg @@ -228,7 +357,7 @@ http://www.the-product.org/rube-goldberg-processor The Product - + images/prototyp0.jpg @@ -236,8 +365,8 @@ http://www.yannickmathey.com/prototyp Yannick Mathey - - + + images/nytcascade.jpg @@ -246,7 +375,7 @@ http://nytlabs.com/projects/cascade.html NYTimes R&D Lab - + images/mitidentity.jpg @@ -255,7 +384,7 @@ http://www.thegreeneyl.com/mit-media-lab-identity-1 TheGreenEyl - + images/continuum.jpg @@ -264,7 +393,7 @@ http://www.rhymeandreasoncreative.com/portfolio/index.php?project=continuum Mary Huang - + - + images/casey_pc.jpg @@ -286,7 +415,7 @@ Download from CAN Casey Reas - + images/108.jpg @@ -295,7 +424,7 @@ http://nilsvoelker.com/content/onehundredandeight/index.html Nils Völker - + images/privacy.jpg @@ -304,7 +433,7 @@ http://www.niklasroy.com/project/88/my-little-piece-of-privacy/ Niklas Roy - + images/strata.jpg @@ -313,7 +442,7 @@ http://www.quayola.com/selectedartworks/strata3/ Quayola - + images/shakespeare.jpg @@ -322,7 +451,7 @@ http://www.understanding-shakespeare.com Stephan Thiel - + images/one-perfect-cube.jpg @@ -331,7 +460,7 @@ http://florianjenett.de/one-perfect-cube-making-of/ FlorianJenett.de - + images/feltron.jpg @@ -341,7 +470,7 @@ 2009 Report and Processing Feltron.com - + images/computing-kaizen.jpg @@ -351,7 +480,7 @@ Proxy GSAPP - + images/finecollection.jpg @@ -361,7 +490,7 @@ geschoir.de theplacetofindme.de - + images/justlanded.jpg @@ -370,7 +499,7 @@ http://blog.blprnt.com/blog/blprnt/just-landed-processing-twitter-metacarta-hidden-data blprnt.com - + images/johnhenry.jpg @@ -379,7 +508,7 @@ http://brysonian.com/john-henry-von-neumann brysonian.com - + images/intheair.jpg @@ -389,7 +518,7 @@ Victor Viña Nerea Calvillo - + images/silica.jpg @@ -399,17 +528,17 @@ tadar.net tadar Flickr - + images/mycelium.png - A simulation of fungal hyphae growth using images as food. + A simulation of fungal hyphae growth using images as food. http://onecm.com/projects/mycelium/ onecm.com onecm Flickr - + images/nyx.jpg @@ -418,7 +547,7 @@ http://vimeo.com/3872857 NYX Blog - + images/golan_cards.jpg @@ -438,7 +567,7 @@ shiftcontrol NR2154 - + images/branching.jpg @@ -450,7 +579,7 @@ Andrew Lucia Jones Lab - + images/realtime.jpg @@ -460,7 +589,7 @@ Zum Kuckuck Atelier Markgraph - + images/wf3.png @@ -470,7 +599,7 @@ benhem.com RogueBasin - + images/mud.jpg @@ -480,7 +609,7 @@ tomgerhardt.com NYU ITP - + images/mos.gif @@ -491,7 +620,7 @@ ComputationalPile Arcade - + images/terre.jpg @@ -504,7 +633,7 @@ Michael Doherty Hans-Christoph Steiner - + images/mtv.gif @@ -514,7 +643,7 @@ Dmtr.org Piloto - + images/camp.jpg @@ -523,7 +652,7 @@ http://www.field.io/project/interim-camp field - + images/aeolab.jpg @@ -532,7 +661,7 @@ http://www.aeolab.com/projects/peoplemover/applet/ Aeolab - + images/balldroppings.gif @@ -542,7 +671,7 @@ BallDroppings JTNimoy.net - + images/oasis.gif @@ -551,7 +680,7 @@ http://everyware.kr/portfolio/contents/09_oasis/ everyware - + images/platonic.jpg @@ -561,47 +690,47 @@ Michael Hansmeyer Subdivision Flickr Set - + images/monsters.gif - Black and white, reactive monsters created by the Processing community. + Black and white, reactive monsters created by the Processing community. http://www.rmx.cz/monsters/ Rmx - + images/itp2.jpg - For the second year, Dan Shiffman's NYU students write software for a 120 by 12 - foot video wall at IAC's world headquarters in NYC. + For the second year, Dan Shiffman's NYU students write software for a 120 by 12 + foot video wall at IAC's world headquarters in NYC. http://gizmodo.com/5110633/120-feet-of-video-art-final-exams-at-nyus-big-screens-class Shiffman.net - + images/emergence.jpg - Realtime art installation that explores how complex systems and patterns arise out of + Realtime art installation that explores how complex systems and patterns arise out of a multiplicity of simple interactions. http://emergenceproject.org/blog/?page_id=180 The Emergence Project Daniel Sauter - + images/roots.jpg - An interactive installation where participants engage in making generative / semi-generative / and or + An interactive installation where participants engage in making generative / semi-generative / and or composed music by moving their fingers and objects around the Brick multi-touch surface. http://flipmu.com/work/bricktable/what-is-roots/ Memo.tv - + images/npz.gif @@ -614,18 +743,18 @@ Banas' design Banas' oceanography - + images/maeve.jpg - Provides visual and tangible access to the conceptual networks behind architectural projects. + Provides visual and tangible access to the conceptual networks behind architectural projects. The installation is part of the 11th International Architecture Exhibition of the Venice Biennale. http://portal.mace-project.eu/maeve/ FH Potsdam MACE - + images/ymyi.jpg @@ -635,7 +764,7 @@ Joao Martinho Moura Master in Technology and Digital Art - + images/bodynavigation.jpg @@ -655,7 +784,7 @@ http://casualdata.com/newsknitter Mahir M. Yavuz - + images/cho.jpg @@ -665,26 +794,26 @@ Typotopo.com Pcho.net - + images/muth.jpg - A generative video piece with music by Hiaz. + A generative video piece with music by Hiaz. http://www.davidmuth.net/videos/counterclockwise/ DavidMuth.net - + images/proximity.gif - Generative, parameterized images and sound. + Generative, parameterized images and sound. http://www.proximityofneeds.org/ strangethingshappen.org - - + + images/houck.jpg @@ -693,19 +822,19 @@ http://www.johnhouck.com/p/ JohnHouck.com - + images/itp.jpg Dan Shiffman's NYU students write software for a 120 by 12 foot video wall - at IAC's world headquarters designed by Frank Gehry. + at IAC's world headquarters designed by Frank Gehry. http://www.flickr.com/photos/shiffman/sets/72157601572932676/ Shiffman.net - + images/nervous.jpg @@ -715,18 +844,18 @@ http://www.n-e-r-v-o-u-s.com/play_and_learn.php Nervous System - + images/mit.jpg - Shows the global exchange of information by visualizing volumes of data flowing + Shows the global exchange of information by visualizing volumes of data flowing in and out of New York City. http://senseable.mit.edu/nyte/ SENSEable City Lab AaronKoblin.com - + images/cascade.jpg @@ -735,17 +864,17 @@ http://www.trsp.net/cow/ Transparent - + images/mypocket.jpg - Discloses the artist's personal financial records by exploring and revealing essential + Discloses the artist's personal financial records by exploring and revealing essential patterns in daily transactions. http://transition.turbulence.org/Works/mypocket/ Burak-Arikan.com - + images/taobot.jpg @@ -755,7 +884,7 @@ Taobot Michael Fakesch - + images/whiteglove.jpg @@ -765,7 +894,7 @@ Evan Roth Ben Engebreth - + images/foxmovies.jpg @@ -775,7 +904,7 @@ Flight404 Nervo - + images/firstborn.jpg @@ -784,7 +913,7 @@ http://www.firstborn.com/#/our-portfolio/1007/ Firstborn - + images/simdiv.jpg @@ -794,19 +923,19 @@ Philipp Steinweber Andreas Koller - + - + images/sheep.gif @@ -818,7 +947,7 @@ Aaron Koblin - + images/catanese.jpg @@ -829,7 +958,7 @@ http://www.paulcatanese.com/artwork/celestial/process.html PaulCatanese.com - + images/any.gif @@ -838,7 +967,7 @@ http://carohorn.de/anymails/ CaroHorn.de - + images/hehe.jpg @@ -848,7 +977,7 @@ http://hehe.org.free.fr/hehe/champsdozone/ HeHe - + images/carden.jpg @@ -857,7 +986,7 @@ http://www.tom-carden.co.uk/p5/tube_map_travel_times/applet/ Tom Carden - + images/proto.jpg @@ -866,27 +995,27 @@ http://www.fidgt.com/visualize/ Protohaus - + images/lovebytes.png - A population of unique friendly furry faces to appear across all festival literature for Lovebytes 2007. + A population of unique friendly furry faces to appear across all festival literature for Lovebytes 2007. http://universaleverything.com/#/UE205 Universal Everything - + images/house.jpg - An environment constructed from thousands of low tech components that can be reconfigured by its occupants. + An environment constructed from thousands of low tech components that can be reconfigured by its occupants. http://house.propositions.org.uk/ Haque Aether Reorient - + images/muon.jpg @@ -895,7 +1024,7 @@ http://www.movingbrands.com/?category_name=kef-work#experience Moving Brands - + images/universe.gif @@ -904,18 +1033,18 @@ http://www.number27.org/universe.html Jonathan Harris - + - + images/suzung.jpg @@ -924,27 +1053,27 @@ http://www.suzung.com/body/2006/Kaleido/display.htm Studio Site Suzung - + images/stateoftheunion.gif - Provides access to the corpus of all the State of the Union addresses from 1790 to 2006. + Provides access to the corpus of all the State of the Union addresses from 1790 to 2006. http://stateoftheunion.onetwothree.net/ onetwothree - + - + images/juani.jpg @@ -954,7 +1083,7 @@ Onionlab Yo soy la Juani - + images/spies.gif @@ -964,7 +1093,7 @@ Pentagram JamesNSears.com - + images/mutualism.jpg @@ -1022,7 +1151,7 @@ Motion Theory --> - + images/wefeelfine.jpg @@ -1131,7 +1260,7 @@ images/aqueous.jpg - Aqueous is a meditative space that encourages perception of small things. Water droplets fall from the ceiling through the space into water-filled tubes approximately tuned in a scale spanning two octaves. + Aqueous is a meditative space that encourages perception of small things. Water droplets fall from the ceiling through the space into water-filled tubes approximately tuned in a scale spanning two octaves. works/aqueous/ Zehao.com @@ -1225,7 +1354,7 @@ haohao/haohao.pde --> - + - + images/timescape.jpg @@ -1248,7 +1377,7 @@ Phantasian Gone - + images/ortho.gif @@ -1258,7 +1387,7 @@ ortho/orthotype.pde Ortho-type - + images/acoustic.jpg @@ -1269,22 +1398,22 @@ Acoustic Cartography Zum Kuckuck - + images/min_mod.gif - A sound phenomenon represented through a spatial distribution of minimal elements, creating a sensitive environment influenced by the sounds generated in the surrounding space. + A sound phenomenon represented through a spatial distribution of minimal elements, creating a sensitive environment influenced by the sounds generated in the surrounding space. http://www.limiteazero.com/min_mod/ min_mod/min_mod.pde Limiteazero - + - + images/chronodraw.gif @@ -1302,18 +1431,18 @@ chronodraw/chronodraw.txt www.ertdfgcvb.ch - + images/papa.jpg - Software for Papa Roach's "Getting Away with Murder" music video by Motion Theory + Software for Papa Roach's "Getting Away with Murder" music video by Motion Theory works/papa/index.html papa/ticker_applet.txt Quilime Motion Theory - + - + images/ecstasy.gif @@ -1336,18 +1465,18 @@ ecstasy/n_e_13.pde Machinatus - + images/d5lv.jpg - Exploring volume and emotional texture with simple generative geometry. + Exploring volume and emotional texture with simple generative geometry. Interaction and randomness modify the structure. works/d5lv/index.html d5lv/D5LV.pde W:Mute - + images/discom.jpg @@ -1361,7 +1490,7 @@ Justin Manor SOSOlimited - + images/pachinko.jpg @@ -1373,7 +1502,7 @@ c505 Pretendster - + images/tokyo.jpg @@ -1383,7 +1512,7 @@ tokyo/Tokyo.pde SMS - + images/katya.jpg @@ -1394,7 +1523,7 @@ lab5769 lab5769 portraits - + images/ttc.gif @@ -1405,7 +1534,7 @@ Chronotext Chronotext Devices - + images/liquid.jpg @@ -1416,7 +1545,7 @@ Quasimondo Incubator Quasimondo - + images/relations.gif @@ -1427,7 +1556,7 @@ Abstract-Codex Ghost Agency - + images/nudemengarden.gif @@ -1438,7 +1567,7 @@ db-db Experimental Vision - + images/starnursery.jpg @@ -1449,7 +1578,7 @@ Ryan Alexander Motion Theory - + images/techsupport.gif @@ -1459,7 +1588,7 @@ techsupport/tech_support.pde Coin-Operated - + images/base26.gif @@ -1471,7 +1600,7 @@ Toxi processing work Toxi blog - + images/superhero.gif @@ -1482,7 +1611,7 @@ Beyond Three Processing @ Beyond Three - + images/redux.jpg @@ -1492,7 +1621,7 @@ redux/moviemap3.pde Brendan Dawes - + images/872a_jogan.gif @@ -1501,7 +1630,7 @@ works/versionb/index.html versionb/mmj_project_FINALd.pde - + images/872a_stanat.gif @@ -1510,7 +1639,7 @@ works/bees/index.html bees/bees6.pde - + - + - + images/chamber.gif @@ -1547,7 +1676,7 @@ Bubble Chamber Levitated.net - + images/jackolantern.jpg @@ -1557,7 +1686,7 @@ jackolantern/jackolantern.pde LCD modules - + images/sonicwire.gif @@ -1568,7 +1697,7 @@ Pitaru.com InsertSilence - + images/tracking.jpg @@ -1578,7 +1707,7 @@ tracking/tracking.pde Flight404 - + images/juhuu.gif @@ -1588,7 +1717,7 @@ juhuu/juhuu.pde Juhuu.nu - + images/ricochet.gif @@ -1599,7 +1728,7 @@ JTNimoy Potatoland - + images/skyline.gif @@ -1609,7 +1738,7 @@ skyline/skyline.pde Lightcycle - + images/wiggle.gif @@ -1619,7 +1748,7 @@ wiggle/wiggle.pde Uncontrol - + images/withouttitle.jpg @@ -1630,7 +1759,7 @@ Re-Move Wofbot - + images/articulate.gif @@ -1640,7 +1769,7 @@ articulate/articulate.pde GroupC - + images/sodaprocessing.gif @@ -1651,18 +1780,18 @@ Soda SodaPlay - + images/c_drawer.jpg - Like drawing with a bunch of crayons in one hand. + Like drawing with a bunch of crayons in one hand. Simple and messy, but fun. works/cdrawer/index.html cdrawer/cdrawer.pde Evolution Zone - + images/inequality.gif @@ -1673,7 +1802,7 @@ They Rule Future Farmers - + images/pond.gif @@ -1684,7 +1813,7 @@ Metaphorical Royal College of Art - + images/hinundher.gif @@ -1694,7 +1823,7 @@ hinundher/hinundher.pde Esono - + images/yellowtail.gif @@ -1705,7 +1834,7 @@ Yellowtail Flong - + images/004.gif @@ -1716,7 +1845,7 @@ Alphabot ACG - + images/europa.gif @@ -1727,7 +1856,7 @@ Glen Murphy Body Tag - + images/003.gif @@ -1738,7 +1867,7 @@ Schoenerwissen Minitasking - + images/002.gif @@ -1747,7 +1876,7 @@ 002/code.html kramdesign - + images/001.gif @@ -1758,5 +1887,5 @@ Genomic Cartography ACG - + diff --git a/content/curated_images/FluidLeaves.jpg b/content/curated_images/FluidLeaves.jpg new file mode 100644 index 000000000..9d483098f Binary files /dev/null and b/content/curated_images/FluidLeaves.jpg differ diff --git a/content/curated_images/FluidLeaves@2x.jpg b/content/curated_images/FluidLeaves@2x.jpg new file mode 100644 index 000000000..fa2964263 Binary files /dev/null and b/content/curated_images/FluidLeaves@2x.jpg differ diff --git a/content/curated_images/aadrl.jpg b/content/curated_images/aadrl.jpg new file mode 100644 index 000000000..2c5348d9f Binary files /dev/null and b/content/curated_images/aadrl.jpg differ diff --git a/content/curated_images/aadrl@2x.jpg b/content/curated_images/aadrl@2x.jpg new file mode 100644 index 000000000..39a09ccee Binary files /dev/null and b/content/curated_images/aadrl@2x.jpg differ diff --git a/content/curated_images/autoorchestra.jpg b/content/curated_images/autoorchestra.jpg new file mode 100644 index 000000000..0d09ca9bb Binary files /dev/null and b/content/curated_images/autoorchestra.jpg differ diff --git a/content/curated_images/autoorchestra@2x.jpg b/content/curated_images/autoorchestra@2x.jpg new file mode 100644 index 000000000..315ede249 Binary files /dev/null and b/content/curated_images/autoorchestra@2x.jpg differ diff --git a/content/curated_images/cfcityflows.jpg b/content/curated_images/cfcityflows.jpg new file mode 100644 index 000000000..fec63eb3b Binary files /dev/null and b/content/curated_images/cfcityflows.jpg differ diff --git a/content/curated_images/cfcityflows@2x.jpg b/content/curated_images/cfcityflows@2x.jpg new file mode 100644 index 000000000..9f05a006d Binary files /dev/null and b/content/curated_images/cfcityflows@2x.jpg differ diff --git a/content/curated_images/digits.jpg b/content/curated_images/digits.jpg new file mode 100644 index 000000000..ce85f5658 Binary files /dev/null and b/content/curated_images/digits.jpg differ diff --git a/content/curated_images/digits@2x.jpg b/content/curated_images/digits@2x.jpg new file mode 100644 index 000000000..4210c3068 Binary files /dev/null and b/content/curated_images/digits@2x.jpg differ diff --git a/content/curated_images/komorebi.jpg b/content/curated_images/komorebi.jpg new file mode 100644 index 000000000..2ac8c3e54 Binary files /dev/null and b/content/curated_images/komorebi.jpg differ diff --git a/content/curated_images/komorebi@2x.jpg b/content/curated_images/komorebi@2x.jpg new file mode 100644 index 000000000..051402f92 Binary files /dev/null and b/content/curated_images/komorebi@2x.jpg differ diff --git a/content/curated_images/objectifier.jpg b/content/curated_images/objectifier.jpg new file mode 100644 index 000000000..3ee65e4ca Binary files /dev/null and b/content/curated_images/objectifier.jpg differ diff --git a/content/curated_images/objectifier@2x.jpg b/content/curated_images/objectifier@2x.jpg new file mode 100644 index 000000000..654ad9dec Binary files /dev/null and b/content/curated_images/objectifier@2x.jpg differ diff --git a/content/curated_images/particleflow.jpg b/content/curated_images/particleflow.jpg new file mode 100644 index 000000000..67775c29c Binary files /dev/null and b/content/curated_images/particleflow.jpg differ diff --git a/content/curated_images/particleflow@2x.jpg b/content/curated_images/particleflow@2x.jpg new file mode 100644 index 000000000..efa22981f Binary files /dev/null and b/content/curated_images/particleflow@2x.jpg differ diff --git a/content/curated_images/possible.jpg b/content/curated_images/possible.jpg new file mode 100644 index 000000000..fe89a9c80 Binary files /dev/null and b/content/curated_images/possible.jpg differ diff --git a/content/curated_images/possible@2x.jpg b/content/curated_images/possible@2x.jpg new file mode 100644 index 000000000..ceb5b5913 Binary files /dev/null and b/content/curated_images/possible@2x.jpg differ diff --git a/content/curated_images/pour.jpg b/content/curated_images/pour.jpg new file mode 100644 index 000000000..2ba0d0b6c Binary files /dev/null and b/content/curated_images/pour.jpg differ diff --git a/content/curated_images/pour@2x.jpg b/content/curated_images/pour@2x.jpg new file mode 100644 index 000000000..3abdca466 Binary files /dev/null and b/content/curated_images/pour@2x.jpg differ diff --git a/content/curated_images/random.jpg b/content/curated_images/random.jpg new file mode 100644 index 000000000..8585738d9 Binary files /dev/null and b/content/curated_images/random.jpg differ diff --git a/content/curated_images/random@2x.jpg b/content/curated_images/random@2x.jpg new file mode 100644 index 000000000..fa423c542 Binary files /dev/null and b/content/curated_images/random@2x.jpg differ diff --git a/content/curated_images/stewart.jpg b/content/curated_images/stewart.jpg new file mode 100644 index 000000000..5b9374476 Binary files /dev/null and b/content/curated_images/stewart.jpg differ diff --git a/content/curated_images/stewart@2x.jpg b/content/curated_images/stewart@2x.jpg new file mode 100644 index 000000000..7fc072cfe Binary files /dev/null and b/content/curated_images/stewart@2x.jpg differ diff --git a/content/curated_images/terrapattern.jpg b/content/curated_images/terrapattern.jpg new file mode 100644 index 000000000..0db5a3f80 Binary files /dev/null and b/content/curated_images/terrapattern.jpg differ diff --git a/content/curated_images/terrapattern@2x.jpg b/content/curated_images/terrapattern@2x.jpg new file mode 100644 index 000000000..fe130d3a7 Binary files /dev/null and b/content/curated_images/terrapattern@2x.jpg differ diff --git a/content/curated_images/traces.jpg b/content/curated_images/traces.jpg new file mode 100644 index 000000000..858572beb Binary files /dev/null and b/content/curated_images/traces.jpg differ diff --git a/content/curated_images/traces@2x.jpg b/content/curated_images/traces@2x.jpg new file mode 100644 index 000000000..66c69b1e7 Binary files /dev/null and b/content/curated_images/traces@2x.jpg differ diff --git a/content/curated_images/volume.jpg b/content/curated_images/volume.jpg new file mode 100644 index 000000000..1233bc741 Binary files /dev/null and b/content/curated_images/volume.jpg differ diff --git a/content/curated_images/volume@2x.jpg b/content/curated_images/volume@2x.jpg new file mode 100644 index 000000000..ddd536094 Binary files /dev/null and b/content/curated_images/volume@2x.jpg differ diff --git a/content/examples/Basics/Arrays/Array/Array.pde b/content/examples/Basics/Arrays/Array/Array.pde index 1fd43308e..57f4ce959 100644 --- a/content/examples/Basics/Arrays/Array/Array.pde +++ b/content/examples/Basics/Arrays/Array/Array.pde @@ -5,7 +5,7 @@ * is identified by an index number representing its position in * the array. Arrays are zero based, which means that the first * element in the array is [0], the second element is [1], and so on. - * In this example, an array named "coswav" is created and + * In this example, an array named "coswave" is created and * filled with the cosine values. This data is displayed three * separate ways on the screen. */ @@ -47,4 +47,4 @@ void draw() { line(i, y1, i, y2); } -} \ No newline at end of file +} diff --git a/content/examples/Basics/Color/Brightness/Brightness.pde b/content/examples/Basics/Color/Brightness/Brightness.pde index 261fdce38..7f0e4093a 100644 --- a/content/examples/Basics/Color/Brightness/Brightness.pde +++ b/content/examples/Basics/Color/Brightness/Brightness.pde @@ -11,7 +11,7 @@ int lastBar = -1; void setup() { size(640, 360); - colorMode(HSB, width, 100, width); + colorMode(HSB, width, 100, height); noStroke(); background(0); } diff --git a/content/examples/Basics/Color/RadialGradient/RadialGradient.pde b/content/examples/Basics/Color/RadialGradient/RadialGradient.pde index ed358a1e5..62df103d8 100644 --- a/content/examples/Basics/Color/RadialGradient/RadialGradient.pde +++ b/content/examples/Basics/Color/RadialGradient/RadialGradient.pde @@ -1,7 +1,7 @@ /** * Radial Gradient. * - * Draws are series of concentric circles to create a gradient + * Draws a series of concentric circles to create a gradient * from one color to another. */ diff --git a/content/examples/Basics/Color/WaveGradient/WaveGradient.pde b/content/examples/Basics/Color/WaveGradient/WaveGradient.pde index aba6b2bcf..f83f8dd71 100644 --- a/content/examples/Basics/Color/WaveGradient/WaveGradient.pde +++ b/content/examples/Basics/Color/WaveGradient/WaveGradient.pde @@ -5,35 +5,37 @@ * Generate a gradient along a sin() wave. */ -float angle = 0; -float px = 0, py = 0; float amplitude = 30; -float frequency = 0; float fillGap = 2.5; -color c; void setup() { size(640, 360); background(200); - noLoop(); -} - -void draw() { + + // To efficiently set all the pixels on screen, make the set() + // calls on a PImage, then write the result to the screen. + PImage gradient = createImage(width, height, RGB); + float frequency = 0; + for (int i =- 75; i < height+75; i++){ // Reset angle to 0, so waves stack properly - angle = 0; + float angle = 0; // Increasing frequency causes more gaps - frequency+=.002; + frequency += 0.002; for (float j = 0; j < width+75; j++){ - py = i + sin(radians(angle)) * amplitude; + float py = i + sin(radians(angle)) * amplitude; angle += frequency; - c = color(abs(py-i)*255/amplitude, 255-abs(py-i)*255/amplitude, j*(255.0/(width+50))); + color c = color(abs(py-i)*255/amplitude, 255-abs(py-i)*255/amplitude, j*(255.0/(width+50))); // Hack to fill gaps. Raise value of fillGap if you increase frequency for (int filler = 0; filler < fillGap; filler++){ - set(int(j-filler), int(py)-filler, c); - set(int(j), int(py), c); - set(int(j+filler), int(py)+filler, c); + gradient.set(int(j-filler), int(py)-filler, c); + gradient.set(int(j), int(py), c); + gradient.set(int(j+filler), int(py)+filler, c); } } } -} \ No newline at end of file + // Draw the image to the screen + set(0, 0, gradient); + // Another alternative for drawing to the screen + //image(gradient, 0, 0); +} diff --git a/content/examples/Basics/Data/CharactersStrings/CharactersStrings.pde b/content/examples/Basics/Data/CharactersStrings/CharactersStrings.pde index b269baf02..3be296d72 100644 --- a/content/examples/Basics/Data/CharactersStrings/CharactersStrings.pde +++ b/content/examples/Basics/Data/CharactersStrings/CharactersStrings.pde @@ -38,7 +38,7 @@ void draw() { text(words, 50, 120, 540, 300); } -void keyPressed() { +void keyTyped() { // The variable "key" always contains the value // of the most recent key pressed. if ((key >= 'A' && key <= 'z') || key == ' ') { diff --git a/content/examples/Basics/Data/DatatypeConversion/DatatypeConversion.pde b/content/examples/Basics/Data/DatatypeConversion/DatatypeConversion.pde index 1c2a398c9..ee7e74daf 100644 --- a/content/examples/Basics/Data/DatatypeConversion/DatatypeConversion.pde +++ b/content/examples/Basics/Data/DatatypeConversion/DatatypeConversion.pde @@ -16,7 +16,7 @@ textFont(createFont("SourceCodePro-Regular.ttf",24)); char c; // Chars are used for storing alphanumeric symbols float f; // Floats are decimal numbers int i; // Integers are values between 2,147,483,647 and -2147483648 -byte b; // Bytes are values between -128 and 128 +byte b; // Bytes are values between -128 and 127 c = 'A'; f = float(c); // Sets f = 65.0 diff --git a/content/examples/Basics/Form/PieChart/PieChart.pde b/content/examples/Basics/Form/PieChart/PieChart.pde index 915a1ef7e..0dd505e0e 100644 --- a/content/examples/Basics/Form/PieChart/PieChart.pde +++ b/content/examples/Basics/Form/PieChart/PieChart.pde @@ -23,8 +23,8 @@ void pieChart(float diameter, int[] data) { for (int i = 0; i < data.length; i++) { float gray = map(i, 0, data.length, 0, 255); fill(gray); - arc(width/2, height/2, diameter, diameter, lastAngle, lastAngle+radians(angles[i])); - lastAngle += radians(angles[i]); + arc(width/2, height/2, diameter, diameter, lastAngle, lastAngle+radians(data[i])); + lastAngle += radians(data[i]); } } diff --git a/content/examples/Basics/Form/RegularPolygon/RegularPolygon.pde b/content/examples/Basics/Form/RegularPolygon/RegularPolygon.pde index 09379230c..52d8f81af 100644 --- a/content/examples/Basics/Form/RegularPolygon/RegularPolygon.pde +++ b/content/examples/Basics/Form/RegularPolygon/RegularPolygon.pde @@ -24,7 +24,7 @@ void draw() { pushMatrix(); translate(width*0.5, height*0.5); rotate(frameCount / 50.0); - polygon(0, 0, 80, 20); // Icosahedron + polygon(0, 0, 80, 20); // Icosagon popMatrix(); pushMatrix(); diff --git a/content/examples/Basics/Input/KeyboardFunctions/KeyboardFunctions.pde b/content/examples/Basics/Input/KeyboardFunctions/KeyboardFunctions.pde index f29106535..7e70c2f0b 100644 --- a/content/examples/Basics/Input/KeyboardFunctions/KeyboardFunctions.pde +++ b/content/examples/Basics/Input/KeyboardFunctions/KeyboardFunctions.pde @@ -27,7 +27,7 @@ void setup() { noStroke(); colorMode(HSB, numChars); background(numChars/2); - // Set a gray value for each key + // Set a hue value for each key for(int i = 0; i < numChars; i++) { colors[i] = color(i, numChars, numChars); } @@ -58,11 +58,11 @@ void keyPressed() if(key <= 'Z') { keyIndex = key-'A'; letterHeight = maxHeight; - fill(colors[key-'A']); + fill(colors[keyIndex]); } else { keyIndex = key-'a'; letterHeight = minHeight; - fill(colors[key-'a']); + fill(colors[keyIndex]); } } else { fill(0); @@ -84,4 +84,4 @@ void keyPressed() if( y > height - letterHeight) { y = 0; // reset y to 0 } -} \ No newline at end of file +} diff --git a/content/examples/Basics/Input/MouseSignals/MouseSignals.pde b/content/examples/Basics/Input/MouseSignals/MouseSignals.pde index c4776751d..32824354d 100644 --- a/content/examples/Basics/Input/MouseSignals/MouseSignals.pde +++ b/content/examples/Basics/Input/MouseSignals/MouseSignals.pde @@ -11,8 +11,7 @@ int[] xvals; int[] yvals; int[] bvals; -void setup() -{ +void setup() { size(640, 360); noSmooth(); xvals = new int[width]; @@ -22,11 +21,10 @@ void setup() int arrayindex = 0; -void draw() -{ +void draw() { background(102); - for(int i = 1; i < width; i++) { + for (int i = 1; i < width; i++) { xvals[i-1] = xvals[i]; yvals[i-1] = yvals[i]; bvals[i-1] = bvals[i]; @@ -34,22 +32,28 @@ void draw() // Add the new values to the end of the array xvals[width-1] = mouseX; yvals[width-1] = mouseY; - if(mousePressed) { + + if (mousePressed == true) { bvals[width-1] = 0; } else { - bvals[width-1] = 255; + bvals[width-1] = height/3; } fill(255); noStroke(); rect(0, height/3, width, height/3+1); - for(int i=1; i 20 && mouseX < 95 && mouseY > 60 && mouseY < 135) { - overLeftButton = true; - } else if (mouseX > 105 && mouseX < 180 && mouseY > 60 && mouseY <135) { - overRightButton = true; + if (mouseX > 105 && mouseX < 180 && mouseY > 60 && mouseY <135) { + overButton = true; } else { - overLeftButton = overRightButton = false; + overButton = false; } } - - - - diff --git a/content/examples/Basics/Web/LoadingImages/LoadingImages.pde b/content/examples/Basics/Web/LoadingImages/LoadingImages.pde index 9f2f3fa04..3ebc338e7 100644 --- a/content/examples/Basics/Web/LoadingImages/LoadingImages.pde +++ b/content/examples/Basics/Web/LoadingImages/LoadingImages.pde @@ -1,11 +1,8 @@ /** * Loading Images. * - * Processing applications can only load images from the network - * while running in the Processing environment. + * Processing applications can load images from the network. * - * This example will not run in a web broswer and will only work when - * the computer is connected to the Internet. */ PImage img; diff --git a/content/examples/Demos/Graphics/LowLevelGL/LowLevelGL.pde b/content/examples/Demos/Graphics/LowLevelGL/LowLevelGL.pde deleted file mode 100644 index 0e7d6a628..000000000 --- a/content/examples/Demos/Graphics/LowLevelGL/LowLevelGL.pde +++ /dev/null @@ -1,103 +0,0 @@ -// Draws a triangle using low-level OpenGL calls. -import java.nio.*; - -PGL pgl; -PShader sh; - -int vertLoc; -int colorLoc; - -float[] vertices; -float[] colors; - -FloatBuffer vertData; -FloatBuffer colorData; - -void setup() { - size(640, 360, P3D); - - // Loads a shader to render geometry w/out - // textures and lights. - sh = loadShader("frag.glsl", "vert.glsl"); - - vertices = new float[12]; - vertData = allocateDirectFloatBuffer(12); - - colors = new float[12]; - colorData = allocateDirectFloatBuffer(12); -} - -void draw() { - background(0); - - // The geometric transformations will be automatically passed - // to the shader. - rotate(frameCount * 0.01, width, height, 0); - - updateGeometry(); - - pgl = beginPGL(); - sh.bind(); - - vertLoc = pgl.getAttribLocation(sh.glProgram, "vertex"); - colorLoc = pgl.getAttribLocation(sh.glProgram, "color"); - - pgl.enableVertexAttribArray(vertLoc); - pgl.enableVertexAttribArray(colorLoc); - - pgl.vertexAttribPointer(vertLoc, 4, PGL.FLOAT, false, 0, vertData); - pgl.vertexAttribPointer(colorLoc, 4, PGL.FLOAT, false, 0, colorData); - - pgl.drawArrays(PGL.TRIANGLES, 0, 3); - - pgl.disableVertexAttribArray(vertLoc); - pgl.disableVertexAttribArray(colorLoc); - - sh.unbind(); - - endPGL(); -} - -void updateGeometry() { - // Vertex 1 - vertices[0] = 0; - vertices[1] = 0; - vertices[2] = 0; - vertices[3] = 1; - colors[0] = 1; - colors[1] = 0; - colors[2] = 0; - colors[3] = 1; - - // Corner 2 - vertices[4] = width/2; - vertices[5] = height; - vertices[6] = 0; - vertices[7] = 1; - colors[4] = 0; - colors[5] = 1; - colors[6] = 0; - colors[7] = 1; - - // Corner 3 - vertices[8] = width; - vertices[9] = 0; - vertices[10] = 0; - vertices[11] = 1; - colors[8] = 0; - colors[9] = 0; - colors[10] = 1; - colors[11] = 1; - - vertData.rewind(); - vertData.put(vertices); - vertData.position(0); - - colorData.rewind(); - colorData.put(colors); - colorData.position(0); -} - -FloatBuffer allocateDirectFloatBuffer(int n) { - return ByteBuffer.allocateDirect(n * Float.SIZE/8).order(ByteOrder.nativeOrder()).asFloatBuffer(); -} diff --git a/content/examples/Demos/Graphics/LowLevelGLVboInterleaved/LowLevelGLVboInterleaved.pde b/content/examples/Demos/Graphics/LowLevelGLVboInterleaved/LowLevelGLVboInterleaved.pde new file mode 100644 index 000000000..78800d5ad --- /dev/null +++ b/content/examples/Demos/Graphics/LowLevelGLVboInterleaved/LowLevelGLVboInterleaved.pde @@ -0,0 +1,163 @@ +// Draws a triangle using low-level OpenGL calls. + +import java.nio.*; + +PShader sh; + +float[] attribs; + +FloatBuffer attribBuffer; + +int attribVboId; + +final static int VERT_CMP_COUNT = 4; // vertex component count (x, y, z, w) -> 4 +final static int CLR_CMP_COUNT = 4; // color component count (r, g, b, a) -> 4 + +public void setup() { + size(640, 360, P3D); + + // Loads a shader to render geometry w/out + // textures and lights. + sh = loadShader("frag.glsl", "vert.glsl"); + + attribs = new float[24]; + attribBuffer = allocateDirectFloatBuffer(24); + + PGL pgl = beginPGL(); + + IntBuffer intBuffer = IntBuffer.allocate(1); + pgl.genBuffers(1, intBuffer); + + attribVboId = intBuffer.get(0); + + endPGL(); +} + +public void draw() { + + PGL pgl = beginPGL(); + + background(0); + + // The geometric transformations will be automatically passed + // to the shader. + rotate(frameCount * 0.01f, width, height, 0); + + updateGeometry(); + sh.bind(); + + // get "vertex" attribute location in the shader + final int vertLoc = pgl.getAttribLocation(sh.glProgram, "vertex"); + // enable array for "vertex" attribute + pgl.enableVertexAttribArray(vertLoc); + + // get "color" attribute location in the shader + final int colorLoc = pgl.getAttribLocation(sh.glProgram, "color"); + // enable array for "color" attribute + pgl.enableVertexAttribArray(colorLoc); + + + /* + BUFFER LAYOUT from updateGeometry() + + xyzwrgbaxyzwrgbaxyzwrgba... + + |v1 |v2 |v3 |... + |0 |4 |8 |12 |16 |20 |... + |xyzw|rgba|xyzw|rgba|xyzw|rgba|... + + stride (values per vertex) is 8 floats + vertex offset is 0 floats (starts at the beginning of each line) + color offset is 4 floats (starts after vertex coords) + + |0 |4 |8 + v1 |xyzw|rgba| + v2 |xyzw|rgba| + v3 |xyzw|rgba| + |... + */ + final int stride = (VERT_CMP_COUNT + CLR_CMP_COUNT) * Float.BYTES; + final int vertexOffset = 0 * Float.BYTES; + final int colorOffset = VERT_CMP_COUNT * Float.BYTES; + + // bind VBO + pgl.bindBuffer(PGL.ARRAY_BUFFER, attribVboId); + // fill VBO with data + pgl.bufferData(PGL.ARRAY_BUFFER, Float.BYTES * attribs.length, attribBuffer, PGL.DYNAMIC_DRAW); + // associate currently bound VBO with "vertex" shader attribute + pgl.vertexAttribPointer(vertLoc, VERT_CMP_COUNT, PGL.FLOAT, false, stride, vertexOffset); + // associate currently bound VBO with "color" shader attribute + pgl.vertexAttribPointer(colorLoc, CLR_CMP_COUNT, PGL.FLOAT, false, stride, colorOffset); + // unbind VBO + pgl.bindBuffer(PGL.ARRAY_BUFFER, 0); + + + pgl.drawArrays(PGL.TRIANGLES, 0, 3); + + + // disable arrays for attributes before unbinding the shader + pgl.disableVertexAttribArray(vertLoc); + pgl.disableVertexAttribArray(colorLoc); + + sh.unbind(); + + endPGL(); +} + +// Triggers a crash when closing the output window using the close button +//public void dispose() { +// PGL pgl = beginPGL(); + +// IntBuffer intBuffer = IntBuffer.allocate(1); +// intBuffer.put(attribVboId); +// intBuffer.rewind(); +// pgl.deleteBuffers(1, intBuffer); + +// endPGL(); +//} + +void updateGeometry() { + // Vertex 1 + attribs[0] = 0; + attribs[1] = 0; + attribs[2] = 0; + attribs[3] = 1; + + // Color 1 + attribs[4] = 1; + attribs[5] = 0; + attribs[6] = 0; + attribs[7] = 1; + + // Vertex 2 + attribs[8] = width/2; + attribs[9] = height; + attribs[10] = 0; + attribs[11] = 1; + + // Color 2 + attribs[12] = 0; + attribs[13] = 1; + attribs[14] = 0; + attribs[15] = 1; + + // Vertex 3 + attribs[16] = width; + attribs[17] = 0; + attribs[18] = 0; + attribs[19] = 1; + + // Color 3 + attribs[20] = 0; + attribs[21] = 0; + attribs[22] = 1; + attribs[23] = 1; + + attribBuffer.rewind(); + attribBuffer.put(attribs); + attribBuffer.rewind(); +} + +FloatBuffer allocateDirectFloatBuffer(int n) { + return ByteBuffer.allocateDirect(n * Float.BYTES).order(ByteOrder.nativeOrder()).asFloatBuffer(); +} \ No newline at end of file diff --git a/content/examples/Demos/Graphics/LowLevelGL/data/frag.glsl b/content/examples/Demos/Graphics/LowLevelGLVboInterleaved/data/frag.glsl similarity index 100% rename from content/examples/Demos/Graphics/LowLevelGL/data/frag.glsl rename to content/examples/Demos/Graphics/LowLevelGLVboInterleaved/data/frag.glsl diff --git a/content/examples/Demos/Graphics/LowLevelGL/data/vert.glsl b/content/examples/Demos/Graphics/LowLevelGLVboInterleaved/data/vert.glsl similarity index 100% rename from content/examples/Demos/Graphics/LowLevelGL/data/vert.glsl rename to content/examples/Demos/Graphics/LowLevelGLVboInterleaved/data/vert.glsl diff --git a/content/examples/Demos/Graphics/LowLevelGLVboSeparate/LowLevelGLVboSeparate.pde b/content/examples/Demos/Graphics/LowLevelGLVboSeparate/LowLevelGLVboSeparate.pde new file mode 100644 index 000000000..2caf653e6 --- /dev/null +++ b/content/examples/Demos/Graphics/LowLevelGLVboSeparate/LowLevelGLVboSeparate.pde @@ -0,0 +1,188 @@ +// Draws a triangle using low-level OpenGL calls. + +import java.nio.*; + +PShader sh; + +float[] vertices; +float[] colors; + +FloatBuffer vertexBuffer; +FloatBuffer colorBuffer; + +int vertexVboId; +int colorVboId; + +final static int VERT_CMP_COUNT = 4; // vertex component count (x, y, z, w) -> 4 +final static int CLR_CMP_COUNT = 4; // color component count (r, g, b, a) -> 4 + +public void setup() { + size(640, 360, P3D); + + // Loads a shader to render geometry w/out + // textures and lights. + sh = loadShader("frag.glsl", "vert.glsl"); + + vertices = new float[12]; + colors = new float[12]; + + vertexBuffer = allocateDirectFloatBuffer(12); + colorBuffer = allocateDirectFloatBuffer(12); + + PGL pgl = beginPGL(); + + // allocate buffer big enough to get all VBO ids back + IntBuffer intBuffer = IntBuffer.allocate(2); + pgl.genBuffers(2, intBuffer); + + vertexVboId = intBuffer.get(0); + colorVboId = intBuffer.get(1); + + endPGL(); +} + +public void draw() { + + PGL pgl = beginPGL(); + + background(0); + + // The geometric transformations will be automatically passed + // to the shader. + rotate(frameCount * 0.01f, width, height, 0); + + updateGeometry(); + sh.bind(); + + // get "vertex" attribute location in the shader + final int vertLoc = pgl.getAttribLocation(sh.glProgram, "vertex"); + // enable array for "vertex" attribute + pgl.enableVertexAttribArray(vertLoc); + + // get "color" attribute location in the shader + final int colorLoc = pgl.getAttribLocation(sh.glProgram, "color"); + // enable array for "color" attribute + pgl.enableVertexAttribArray(colorLoc); + + /* + BUFFER LAYOUT from updateGeometry() + + Vertex buffer: + + xyzwxyzwxyzw... + + |v1 |v2 |v3 |... + |0 |4 |8 |... + |xyzw|xyzw|xyzw|... + + + Color buffer: + + rgbargbargba... + + |v1 |v2 |v3 |... + |0 |4 |8 |... + |rgba|rgba|rgba|... + + stride (values per vertex) is 4 floats in both cases + vertex offset is 0 floats in both cases + */ + final int vertexStride = VERT_CMP_COUNT * Float.BYTES; + final int colorStride = CLR_CMP_COUNT * Float.BYTES; + final int vertexOffset = 0 * Float.BYTES; + final int colorOffset = 0 * Float.BYTES; + + + { // VERTEX + // bind VBO + pgl.bindBuffer(PGL.ARRAY_BUFFER, vertexVboId); + // fill VBO with data + pgl.bufferData(PGL.ARRAY_BUFFER, Float.BYTES * vertices.length, vertexBuffer, PGL.DYNAMIC_DRAW); + // associate currently bound VBO with shader attribute + pgl.vertexAttribPointer(vertLoc, VERT_CMP_COUNT, PGL.FLOAT, false, vertexStride, vertexOffset); + } + + { // COLOR + // bind VBO + pgl.bindBuffer(PGL.ARRAY_BUFFER, colorVboId); + // fill bound VBO with data + pgl.bufferData(PGL.ARRAY_BUFFER, Float.BYTES * colors.length, colorBuffer, PGL.DYNAMIC_DRAW); + // associate currently bound VBO with shader attribute + pgl.vertexAttribPointer(colorLoc, CLR_CMP_COUNT, PGL.FLOAT, false, colorStride, colorOffset); + } + + // unbind VBOs + pgl.bindBuffer(PGL.ARRAY_BUFFER, 0); + + + pgl.drawArrays(PGL.TRIANGLES, 0, 3); + + + // disable arrays for attributes before unbinding the shader + pgl.disableVertexAttribArray(vertLoc); + pgl.disableVertexAttribArray(colorLoc); + + sh.unbind(); + + endPGL(); +} + +// Triggers a crash when closing the output window using the close button +//public void dispose() { +// PGL pgl = beginPGL(); + +// IntBuffer intBuffer = IntBuffer.allocate(2); +// intBuffer.put(vertexVboId); +// intBuffer.put(colorVboId); +// intBuffer.rewind(); +// pgl.deleteBuffers(2, intBuffer); + +// endPGL(); +//} + +void updateGeometry() { + // Vertex 1 + vertices[0] = 0; + vertices[1] = 0; + vertices[2] = 0; + vertices[3] = 1; + + colors[0] = 1; + colors[1] = 0; + colors[2] = 0; + colors[3] = 1; + + // Vertex 2 + vertices[4] = width/2; + vertices[5] = height; + vertices[6] = 0; + vertices[7] = 1; + + colors[4] = 0; + colors[5] = 1; + colors[6] = 0; + colors[7] = 1; + + // Vertex 3 + vertices[8] = width; + vertices[9] = 0; + vertices[10] = 0; + vertices[11] = 1; + + colors[8] = 0; + colors[9] = 0; + colors[10] = 1; + colors[11] = 1; + + vertexBuffer.rewind(); + vertexBuffer.put(vertices); + vertexBuffer.rewind(); + + colorBuffer.rewind(); + colorBuffer.put(colors); + colorBuffer.rewind(); +} + +FloatBuffer allocateDirectFloatBuffer(int n) { + return ByteBuffer.allocateDirect(n * Float.BYTES).order(ByteOrder.nativeOrder()).asFloatBuffer(); +} \ No newline at end of file diff --git a/content/examples/Demos/Graphics/LowLevelGLVboSeparate/data/frag.glsl b/content/examples/Demos/Graphics/LowLevelGLVboSeparate/data/frag.glsl new file mode 100644 index 000000000..16742d2bd --- /dev/null +++ b/content/examples/Demos/Graphics/LowLevelGLVboSeparate/data/frag.glsl @@ -0,0 +1,30 @@ +/* + Part of the Processing project - http://processing.org + + Copyright (c) 2011-12 Ben Fry and Casey Reas + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License version 2.1 as published by the Free Software Foundation. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + */ + +#ifdef GL_ES +precision mediump float; +precision mediump int; +#endif + +varying vec4 vertColor; + +void main() { + gl_FragColor = vertColor; +} \ No newline at end of file diff --git a/content/examples/Demos/Graphics/LowLevelGLVboSeparate/data/vert.glsl b/content/examples/Demos/Graphics/LowLevelGLVboSeparate/data/vert.glsl new file mode 100644 index 000000000..27c255ee5 --- /dev/null +++ b/content/examples/Demos/Graphics/LowLevelGLVboSeparate/data/vert.glsl @@ -0,0 +1,31 @@ +/* + Part of the Processing project - http://processing.org + + Copyright (c) 2011-12 Ben Fry and Casey Reas + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License version 2.1 as published by the Free Software Foundation. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + */ + +uniform mat4 transform; + +attribute vec4 vertex; +attribute vec4 color; + +varying vec4 vertColor; + +void main() { + gl_Position = transform * vertex; + vertColor = color; +} \ No newline at end of file diff --git a/content/examples/Demos/Graphics/MeshTweening/MeshTweening.pde b/content/examples/Demos/Graphics/MeshTweening/MeshTweening.pde new file mode 100644 index 000000000..14c5e4490 --- /dev/null +++ b/content/examples/Demos/Graphics/MeshTweening/MeshTweening.pde @@ -0,0 +1,50 @@ +// Use of custom vertex attributes. +// Inspired by +// http://pyopengl.sourceforge.net/context/tutorials/shader_4.html + +PShader sh; +PShape grid; + +void setup() { + size(640, 360, P3D); + sh = loadShader("frag.glsl", "vert.glsl"); + shader(sh); + + grid = createShape(); + grid.beginShape(QUADS); + grid.noStroke(); + grid.fill(150); + float d = 10; + for (int x = -500; x < 500; x += d) { + for (int y = -500; y < 500; y += d) { + grid.fill(255 * noise(x, y)); + grid.attribPosition("tweened", x, y, 100 * noise(x, y)); + grid.vertex(x, y, 0); + + grid.fill(255 * noise(x + d, y)); + grid.attribPosition("tweened", x + d, y, 100 * noise(x + d, y)); + grid.vertex(x + d, y, 0); + + grid.fill(255 * noise(x + d, y + d)); + grid.attribPosition("tweened", x + d, y + d, 100 * noise(x + d, y + d)); + grid.vertex(x + d, y + d, 0); + + grid.fill(255 * noise(x, y + d)); + grid.attribPosition("tweened", x, y + d, 100 * noise(x, y + d)); + grid.vertex(x, y + d, 0); + } + } + grid.endShape(); +} + +void draw() { + background(255); + + sh.set("tween", map(mouseX, 0, width, 0, 1)); + + translate(width/2, height/2, 0); + rotateX(frameCount * 0.01); + rotateY(frameCount * 0.01); + + shape(grid); +} \ No newline at end of file diff --git a/content/examples/Demos/Graphics/MeshTweening/data/frag.glsl b/content/examples/Demos/Graphics/MeshTweening/data/frag.glsl new file mode 100644 index 000000000..3585015a2 --- /dev/null +++ b/content/examples/Demos/Graphics/MeshTweening/data/frag.glsl @@ -0,0 +1,5 @@ +varying vec4 vertColor; + +void main() { + gl_FragColor = vertColor; +} \ No newline at end of file diff --git a/content/examples/Demos/Graphics/MeshTweening/data/vert.glsl b/content/examples/Demos/Graphics/MeshTweening/data/vert.glsl new file mode 100644 index 000000000..69fb682e0 --- /dev/null +++ b/content/examples/Demos/Graphics/MeshTweening/data/vert.glsl @@ -0,0 +1,14 @@ +uniform mat4 transformMatrix; +uniform float tween; + +attribute vec4 position; +attribute vec4 tweened; +attribute vec4 color; + +varying vec4 vertColor; + +void main() { + gl_Position = transformMatrix * ((1.0 - tween) * position + tween * tweened); + + vertColor = color; +} \ No newline at end of file diff --git a/content/examples/Demos/Graphics/Planets/Planets.pde b/content/examples/Demos/Graphics/Planets/Planets.pde index 3e6494a54..2fae28072 100644 --- a/content/examples/Demos/Graphics/Planets/Planets.pde +++ b/content/examples/Demos/Graphics/Planets/Planets.pde @@ -85,19 +85,6 @@ void draw() { image(starfield, 0, 0, width, height); hint(ENABLE_DEPTH_MASK); - /* - // Displacing the u texture coordinate of layer 1 in planet - // so it creates the effect of moving clouds. - PShape3D p = (PShape3D)planet1; - p.loadTexcoords(1); - for (int i = 0; i < p.getVertexCount(); i++) { - float u = p.texcoords[2 * i + 0]; - u += 0.002; - p.texcoords[2 * i + 0] = u; - } - p.updateTexcoords(); - */ - pushMatrix(); translate(width/2, height/2, -300); @@ -119,4 +106,4 @@ void draw() { translate(0.75 * width, 0.6 * height, 50); shape(planet1); -} +} \ No newline at end of file diff --git a/content/examples/Demos/Graphics/Ribbons/Geometry.pde b/content/examples/Demos/Graphics/Ribbons/Geometry.pde index 302b0f413..ca978e9f0 100644 --- a/content/examples/Demos/Graphics/Ribbons/Geometry.pde +++ b/content/examples/Demos/Graphics/Ribbons/Geometry.pde @@ -316,23 +316,23 @@ void generateFlatRibbon(ArrayList vertices, ArrayList normals) { Normal1.normalize(); // The (Sid1Point0, Sid1Point1, CentPoint1) triangle is added. - vertices.add(new PVector(Sid1Point0.x, Sid1Point0.y, Sid1Point0.z)); - normals.add(new PVector(Normal0.x, Normal0.y, Normal0.z)); + vertices.add(new PVector(CentPoint1.x, CentPoint1.y, CentPoint1.z)); + normals.add(new PVector(Normal1.x, Normal1.y, Normal1.z)); vertices.add(new PVector(Sid1Point1.x, Sid1Point1.y, Sid1Point1.z)); normals.add(new PVector(Normal1.x, Normal1.y, Normal1.z)); - vertices.add(new PVector(CentPoint1.x, CentPoint1.y, CentPoint1.z)); - normals.add(new PVector(Normal1.x, Normal1.y, Normal1.z)); + vertices.add(new PVector(Sid1Point0.x, Sid1Point0.y, Sid1Point0.z)); + normals.add(new PVector(Normal0.x, Normal0.y, Normal0.z)); // The (Sid1Point0, CentPoint1, CentPoint0) triangle is added. - vertices.add(new PVector(Sid1Point0.x, Sid1Point0.y, Sid1Point0.z)); + vertices.add(new PVector(CentPoint0.x, CentPoint0.y, CentPoint0.z)); normals.add(new PVector(Normal0.x, Normal0.y, Normal0.z)); vertices.add(new PVector(CentPoint1.x, CentPoint1.y, CentPoint1.z)); normals.add(new PVector(Normal1.x, Normal1.y, Normal1.z)); - vertices.add(new PVector(CentPoint0.x, CentPoint0.y, CentPoint0.z)); + vertices.add(new PVector(Sid1Point0.x, Sid1Point0.y, Sid1Point0.z)); normals.add(new PVector(Normal0.x, Normal0.y, Normal0.z)); // (Sid2Point0, Sid2Point1, CentPoint1) triangle is added. @@ -494,4 +494,4 @@ void constructControlPoints(ArrayList residues, int res, int ss, int handness) { PVector linearComb(float scalar0, PVector vector0, float scalar1, PVector vector1) { return PVector.add(PVector.mult(vector0, scalar0), PVector.mult(vector1, scalar1)); -} +} \ No newline at end of file diff --git a/content/examples/Demos/Graphics/Ribbons/Ribbons.pde b/content/examples/Demos/Graphics/Ribbons/Ribbons.pde index e581e8114..3a5acfe9a 100644 --- a/content/examples/Demos/Graphics/Ribbons/Ribbons.pde +++ b/content/examples/Demos/Graphics/Ribbons/Ribbons.pde @@ -48,4 +48,4 @@ void mousePressed(){ void mouseDragged(){ arcball.mouseDragged(); -} +} \ No newline at end of file diff --git a/content/examples/Demos/Graphics/Wiggling/Wiggling.pde b/content/examples/Demos/Graphics/Wiggling/Wiggling.pde index 126c7d35f..06f77ad5e 100644 --- a/content/examples/Demos/Graphics/Wiggling/Wiggling.pde +++ b/content/examples/Demos/Graphics/Wiggling/Wiggling.pde @@ -38,7 +38,7 @@ void draw() { } } - println(frameRate); + if (frameCount % 60 == 0) println(frameRate); } public void keyPressed() { @@ -60,150 +60,75 @@ void createCube() { PShape face; - // Front face - face = createShape(); - face.beginShape(POLYGON); - face.stroke(255, 0, 0); - face.fill(255); - face.beginContour(); - face.vertex(-cubeSize/2, -cubeSize/2, +cubeSize/2); - face.vertex(+cubeSize/2, -cubeSize/2, +cubeSize/2); - face.vertex(+cubeSize/2, +cubeSize/2, +cubeSize/2); - face.vertex(-cubeSize/2, +cubeSize/2, +cubeSize/2); - face.endContour(); - face.beginContour(); - for (int i = 0; i < circleRes; i++) { - float angle = TWO_PI * i / circleRes; - float x = circleRad * sin(angle); - float y = circleRad * cos(angle); - float z = +cubeSize/2; - face.vertex(x, y, z); + // Create all faces at front position + for (int i = 0; i < 6; i++) { + face = createShape(); + createFaceWithHole(face); + cube.addChild(face); } - face.endContour(); - face.endShape(CLOSE); - cube.addChild(face); + + // Rotate all the faces to their positions + + // Front face - already correct + face = cube.getChild(0); // Back face - face = createShape(); - face.beginShape(POLYGON); - face.stroke(255, 0, 0); - face.fill(255); - face.beginContour(); - face.vertex(+cubeSize/2, -cubeSize/2, -cubeSize/2); - face.vertex(-cubeSize/2, -cubeSize/2, -cubeSize/2); - face.vertex(-cubeSize/2, +cubeSize/2, -cubeSize/2); - face.vertex(+cubeSize/2, +cubeSize/2, -cubeSize/2); - face.endContour(); - face.beginContour(); - for (int i = 0; i < circleRes; i++) { - float angle = TWO_PI * i / circleRes; - float x = circleRad * sin(angle); - float y = circleRad * cos(angle); - float z = -cubeSize/2; - face.vertex(x, y, z); - } - face.endContour(); - face.endShape(CLOSE); - cube.addChild(face); + face = cube.getChild(1); + face.rotateY(radians(180)); // Right face - face = createShape(); - face.beginShape(POLYGON); - face.stroke(255, 0, 0); - face.fill(255); - face.beginContour(); - face.vertex(+cubeSize/2, -cubeSize/2, +cubeSize/2); - face.vertex(+cubeSize/2, -cubeSize/2, -cubeSize/2); - face.vertex(+cubeSize/2, +cubeSize/2, -cubeSize/2); - face.vertex(+cubeSize/2, +cubeSize/2, +cubeSize/2); - face.endContour(); - face.beginContour(); - for (int i = 0; i < circleRes; i++) { - float angle = TWO_PI * i / circleRes; - float x = +cubeSize/2; - float y = circleRad * sin(angle); - float z = circleRad * cos(angle); - face.vertex(x, y, z); - } - face.endContour(); - face.endShape(CLOSE); - cube.addChild(face); + face = cube.getChild(2); + face.rotateY(radians(90)); // Left face - face = createShape(); - face.beginShape(POLYGON); - face.stroke(255, 0, 0); - face.fill(255); - face.beginContour(); - face.vertex(-cubeSize/2, -cubeSize/2, -cubeSize/2); - face.vertex(-cubeSize/2, -cubeSize/2, +cubeSize/2); - face.vertex(-cubeSize/2, +cubeSize/2, +cubeSize/2); - face.vertex(-cubeSize/2, +cubeSize/2, -cubeSize/2); - face.endContour(); - face.beginContour(); - for (int i = 0; i < circleRes; i++) { - float angle = TWO_PI * i / circleRes; - float x = -cubeSize/2; - float y = circleRad * sin(angle); - float z = circleRad * cos(angle); - face.vertex(x, y, z); - } - face.endContour(); - face.endShape(CLOSE); - cube.addChild(face); + face = cube.getChild(3); + face.rotateY(radians(-90)); // Top face - face = createShape(); - face.beginShape(POLYGON); - face.stroke(255, 0, 0); - face.fill(255); - face.beginContour(); - face.vertex(-cubeSize/2, +cubeSize/2, +cubeSize/2); - face.vertex(+cubeSize/2, +cubeSize/2, +cubeSize/2); - face.vertex(+cubeSize/2, +cubeSize/2, -cubeSize/2); - face.vertex(-cubeSize/2, +cubeSize/2, -cubeSize/2); - face.endContour(); - face.beginContour(); - for (int i = 0; i < circleRes; i++) { - float angle = TWO_PI * i / circleRes; - float x = circleRad * sin(angle); - float y = +cubeSize/2; - float z = circleRad * cos(angle); - face.vertex(x, y, z); - } - face.endContour(); - face.endShape(CLOSE); - cube.addChild(face); + face = cube.getChild(4); + face.rotateX(radians(90)); // Bottom face - face = createShape(); + face = cube.getChild(5); + face.rotateX(radians(-90)); +} + +void createFaceWithHole(PShape face) { face.beginShape(POLYGON); face.stroke(255, 0, 0); face.fill(255); - face.beginContour(); - face.vertex(+cubeSize/2, -cubeSize/2, +cubeSize/2); + + // Draw main shape Clockwise face.vertex(-cubeSize/2, -cubeSize/2, +cubeSize/2); - face.vertex(-cubeSize/2, -cubeSize/2, -cubeSize/2); - face.vertex(+cubeSize/2, -cubeSize/2, -cubeSize/2); - face.endContour(); + face.vertex(+cubeSize/2, -cubeSize/2, +cubeSize/2); + face.vertex(+cubeSize/2, +cubeSize/2, +cubeSize/2); + face.vertex(-cubeSize / 2, +cubeSize / 2, +cubeSize / 2); + + // Draw contour (hole) Counter-Clockwise face.beginContour(); for (int i = 0; i < circleRes; i++) { float angle = TWO_PI * i / circleRes; float x = circleRad * sin(angle); - float y = -cubeSize/2; - float z = circleRad * cos(angle); + float y = circleRad * cos(angle); + float z = +cubeSize/2; face.vertex(x, y, z); } face.endContour(); + face.endShape(CLOSE); - cube.addChild(face); } void restoreCube() { - PShape face; + // Rotation of faces is preserved, so we just reset them + // the same way as the "front" face and they will stay + // rotated correctly + for (int i = 0; i < 6; i++) { + PShape face = cube.getChild(i); + restoreFaceWithHole(face); + } +} - // Front face - face = cube.getChild(0); +void restoreFaceWithHole(PShape face) { face.setVertex(0, -cubeSize/2, -cubeSize/2, +cubeSize/2); face.setVertex(1, +cubeSize/2, -cubeSize/2, +cubeSize/2); face.setVertex(2, +cubeSize/2, +cubeSize/2, +cubeSize/2); @@ -215,75 +140,4 @@ void restoreCube() { float z = +cubeSize/2; face.setVertex(4 + i, x, y, z); } - - // Back face - face = cube.getChild(1); - face.setVertex(0, +cubeSize/2, -cubeSize/2, -cubeSize/2); - face.setVertex(1, -cubeSize/2, -cubeSize/2, -cubeSize/2); - face.setVertex(2, -cubeSize/2, +cubeSize/2, -cubeSize/2); - face.setVertex(3, +cubeSize/2, +cubeSize/2, -cubeSize/2); - for (int i = 0; i < circleRes; i++) { - float angle = TWO_PI * i / circleRes; - float x = circleRad * sin(angle); - float y = circleRad * cos(angle); - float z = -cubeSize/2; - face.setVertex(4 + i, x, y, z); - } - - // Right face - face = cube.getChild(2); - face.setVertex(0, +cubeSize/2, -cubeSize/2, +cubeSize/2); - face.setVertex(1, +cubeSize/2, -cubeSize/2, -cubeSize/2); - face.setVertex(2, +cubeSize/2, +cubeSize/2, -cubeSize/2); - face.setVertex(3, +cubeSize/2, +cubeSize/2, +cubeSize/2); - for (int i = 0; i < circleRes; i++) { - float angle = TWO_PI * i / circleRes; - float x = +cubeSize/2; - float y = circleRad * sin(angle); - float z = circleRad * cos(angle); - face.setVertex(4 + i, x, y, z); - } - - // Left face - face = cube.getChild(3); - face.setVertex(0, -cubeSize/2, -cubeSize/2, -cubeSize/2); - face.setVertex(1, -cubeSize/2, -cubeSize/2, +cubeSize/2); - face.setVertex(2, -cubeSize/2, +cubeSize/2, +cubeSize/2); - face.setVertex(3, -cubeSize/2, +cubeSize/2, -cubeSize/2); - for (int i = 0; i < circleRes; i++) { - float angle = TWO_PI * i / circleRes; - float x = -cubeSize/2; - float y = circleRad * sin(angle); - float z = circleRad * cos(angle); - face.setVertex(4 + i, x, y, z); - } - - // Top face - face = cube.getChild(4); - face.setVertex(0, -cubeSize/2, +cubeSize/2, +cubeSize/2); - face.setVertex(1, +cubeSize/2, +cubeSize/2, +cubeSize/2); - face.setVertex(2, +cubeSize/2, +cubeSize/2, -cubeSize/2); - face.setVertex(3, -cubeSize/2, +cubeSize/2, -cubeSize/2); - for (int i = 0; i < circleRes; i++) { - float angle = TWO_PI * i / circleRes; - float x = circleRad * sin(angle); - float y = +cubeSize/2; - float z = circleRad * cos(angle); - face.setVertex(4 + i, x, y, z); - } - - // Bottom face - face = cube.getChild(5); - face.setVertex(0, +cubeSize/2, -cubeSize/2, +cubeSize/2); - face.setVertex(1, -cubeSize/2, -cubeSize/2, +cubeSize/2); - face.setVertex(2, -cubeSize/2, -cubeSize/2, -cubeSize/2); - face.setVertex(3, +cubeSize/2, -cubeSize/2, -cubeSize/2); - for (int i = 0; i < circleRes; i++) { - float angle = TWO_PI * i / circleRes; - float x = circleRad * sin(angle); - float y = -cubeSize/2; - float z = circleRad * cos(angle); - face.setVertex(4 + i, x, y, z); - } -} - +} \ No newline at end of file diff --git a/content/examples/Demos/Tests/MenuBar/MenuBar.pde b/content/examples/Demos/Tests/MenuBar/MenuBar.pde deleted file mode 100644 index 801ffc1a0..000000000 --- a/content/examples/Demos/Tests/MenuBar/MenuBar.pde +++ /dev/null @@ -1,56 +0,0 @@ -// Example showing how to add a Swing menu bar to an OpenGL sketch. -// This requires JOGL's NewtCanvasAWT class for native parenting: -// http://jogamp.org/deployment/jogamp-next/javadoc/jogl/javadoc/com/jogamp/newt/awt/NewtCanvasAWT.html -// in order to wrap the native GLWindow as a Canvas that can be added -// to AWT/Swing components. - -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; -import com.jogamp.newt.awt.*; -import com.jogamp.newt.opengl.*; - -void init() { - JFrame frame = new JFrame("Parent JFrame"); - frame.setLayout(new BorderLayout()); - frame.setResizable(false); - - JMenuBar menuBar = new JMenuBar(); - JMenu menu = new JMenu("Menu"); - JMenuItem exitItem = new JMenuItem("Exit"); - exitItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - exit(); - } - }); - menu.add(exitItem); - menuBar.add(menu); - - // Wrap the native surface using a NewtCanvasAWT object - // that can be used to embed inside the JFrame. - GLWindow win = (GLWindow)surface.getNative(); - Canvas canvas = new NewtCanvasAWT(win); - canvas.setBounds(0, 0, win.getWidth(), win.getHeight()); - - frame.setJMenuBar(menuBar); - frame.add(canvas); - - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.pack(); - frame.setVisible(true); - frame.setLocation(200, 200); - - super.init(); -} - -void settings() { - size(400, 400, P3D); -} - -void draw() { - background(150); - line(0, 0, 400, 400); - line(0, 400, 400, 0); - ellipse(mouseX, mouseY, 50, 50); -} \ No newline at end of file diff --git a/content/examples/README.md b/content/examples/README.md new file mode 100644 index 000000000..0f5d7c1c1 --- /dev/null +++ b/content/examples/README.md @@ -0,0 +1 @@ +The examples without a credit line were written by Casey Reas or Ben Fry and they are in the public domain. Daniel Shiffman's examples are in the public domain. We appreciate a link back to the original and/or an acknowledgement when they are used. The copyrights for other credited files remains with the original authors. diff --git a/content/examples/Topics/Advanced Data/LoadSaveJSON/LoadSaveJSON.pde b/content/examples/Topics/Advanced Data/LoadSaveJSON/LoadSaveJSON.pde index 4fcba4cf6..b402763db 100644 --- a/content/examples/Topics/Advanced Data/LoadSaveJSON/LoadSaveJSON.pde +++ b/content/examples/Topics/Advanced Data/LoadSaveJSON/LoadSaveJSON.pde @@ -1,5 +1,5 @@ /** - * Loading XML Data + * Loading JSON Data * by Daniel Shiffman. * * This example demonstrates how to use loadJSON() diff --git a/content/examples/Topics/Advanced Data/Threads/Threads.pde b/content/examples/Topics/Advanced Data/Threads/Threads.pde index f43bc3d2e..f7714a10e 100644 --- a/content/examples/Topics/Advanced Data/Threads/Threads.pde +++ b/content/examples/Topics/Advanced Data/Threads/Threads.pde @@ -9,7 +9,6 @@ * the code inside the function passed to thread() will operate * in the background. * - * For more about threads, see: http://wiki.processing.org/w/Threading */ // This sketch will load data from all of these URLs in a separate thread diff --git a/content/examples/Topics/Advanced Data/XMLYahooWeather/XMLYahooWeather.pde b/content/examples/Topics/Advanced Data/XMLYahooWeather/XMLYahooWeather.pde index 5499410b1..7f1d904bd 100644 --- a/content/examples/Topics/Advanced Data/XMLYahooWeather/XMLYahooWeather.pde +++ b/content/examples/Topics/Advanced Data/XMLYahooWeather/XMLYahooWeather.pde @@ -11,8 +11,12 @@ int temperature = 0; // We're going to store text about the weather String weather = ""; -// The zip code we'll check for + +// Yahoo weather uses something called A WOEID (Where On Earth IDentifier) +// https://en.wikipedia.org/wiki/WOEID +// This is the WOEID for zip code 10003 String zip = "10003"; +String woeid = "12761335"; PFont font; @@ -23,13 +27,13 @@ void setup() { textFont(font); // The URL for the XML document - String url = "http://xml.weather.yahoo.com/forecastrss?p=" + zip; + String url = "http://query.yahooapis.com/v1/public/yql?format=xml&q=select+*+from+weather.forecast+where+woeid=" + woeid + "+and+u='F'"; // Load the XML document XML xml = loadXML(url); // Grab the element we want - XML forecast = xml.getChild("channel/item/yweather:forecast"); + XML forecast = xml.getChild("results/channel/item/yweather:forecast"); // Get the attributes we want temperature = forecast.getInt("high"); @@ -41,8 +45,8 @@ void draw() { fill(0); // Display all the stuff we want to display - text("Zip code: " + zip, width*0.15, height*0.33); - text("Today’s high: " + temperature, width*0.15, height*0.5); + text("Zip: " + zip, width*0.15, height*0.33); + text("Today’s high: " + temperature + "°F", width*0.15, height*0.5); text("Forecast: " + weather, width*0.15, height*0.66); -} +} \ No newline at end of file diff --git a/content/examples/Topics/Curves/ArcLengthParametrization/BezierCurve.pde b/content/examples/Topics/Curves/ArcLengthParametrization/BezierCurve.pde index 531ea367b..299ba8180 100644 --- a/content/examples/Topics/Curves/ArcLengthParametrization/BezierCurve.pde +++ b/content/examples/Topics/Curves/ArcLengthParametrization/BezierCurve.pde @@ -110,7 +110,7 @@ class BezierCurve { if (index < 0) { // if the index is negative, exact length is not in the table, // but it tells us where it should be in the table - // see http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#binarySearch(float[], float) + // see https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#binarySearch-float:A-float- // interpolate two surrounding indexes int nextIndex = -(index + 1); diff --git a/content/examples/Topics/File IO/DirectoryList/DirectoryList.pde b/content/examples/Topics/File IO/DirectoryList/DirectoryList.pde index 2bf64b991..80568a5b5 100644 --- a/content/examples/Topics/File IO/DirectoryList/DirectoryList.pde +++ b/content/examples/Topics/File IO/DirectoryList/DirectoryList.pde @@ -14,13 +14,14 @@ import java.util.Date; void setup() { - // Path - String path = sketchPath; + // Using just the path of this sketch to demonstrate, + // but you can list any directory you like. + String path = sketchPath(); println("Listing all filenames in a directory: "); String[] filenames = listFileNames(path); - println(filenames); - + printArray(filenames); + println("\nListing info about all files in a directory: "); File[] files = listFiles(path); for (int i = 0; i < files.length; i++) { @@ -32,11 +33,11 @@ void setup() { println("Last Modified: " + lastModified); println("-----------------------"); } - + println("\nListing info about all files in a directory and all subdirectories: "); ArrayList allFiles = listFilesRecursive(path); - - for (File f: allFiles) { + + for (File f : allFiles) { println("Name: " + f.getName()); println("Full path: " + f.getAbsolutePath()); println("Is directory: " + f.isDirectory()); @@ -52,7 +53,6 @@ void setup() { // Nothing is drawn in this program and the draw() doesn't loop because // of the noLoop() in setup() void draw() { - } // This function returns all the files in a directory as an array of Strings @@ -82,9 +82,9 @@ File[] listFiles(String dir) { // Function to get a list of all files in a directory and all subdirectories ArrayList listFilesRecursive(String dir) { - ArrayList fileList = new ArrayList(); - recurseDir(fileList,dir); - return fileList; + ArrayList fileList = new ArrayList(); + recurseDir(fileList, dir); + return fileList; } // Recursive function to traverse subdirectories @@ -96,9 +96,9 @@ void recurseDir(ArrayList a, String dir) { File[] subfiles = file.listFiles(); for (int i = 0; i < subfiles.length; i++) { // Call this function on all files in this directory - recurseDir(a,subfiles[i].getAbsolutePath()); + recurseDir(a, subfiles[i].getAbsolutePath()); } } else { a.add(file); } -} +} \ No newline at end of file diff --git a/content/examples/Topics/File IO/SaveFile1/SaveFile1.pde b/content/examples/Topics/File IO/SaveFile1/SaveFile1.pde index 9bcdbec18..510bdb8de 100644 --- a/content/examples/Topics/File IO/SaveFile1/SaveFile1.pde +++ b/content/examples/Topics/File IO/SaveFile1/SaveFile1.pde @@ -4,8 +4,7 @@ * Saving files is a useful way to store data so it can be viewed after a * program has stopped running. The saveStrings() function writes an array * of strings to a file, with each string written to a new line. This file - * is saved to the sketch's folder. This example won't work in a web browser - * because of Java security restrictions. + * is saved to the sketch's folder. */ int[] x = new int[0]; diff --git a/content/examples/Topics/File IO/SaveFile2/SaveFile2.pde b/content/examples/Topics/File IO/SaveFile2/SaveFile2.pde index f47265063..6a41c58f1 100644 --- a/content/examples/Topics/File IO/SaveFile2/SaveFile2.pde +++ b/content/examples/Topics/File IO/SaveFile2/SaveFile2.pde @@ -3,8 +3,7 @@ * * This file a PrintWriter object to write data continuously to a file * while the mouse is pressed. When a key is pressed, the file closes - * itself and the program is stopped. This example won't work in a web browser - * because of Java security restrictions. + * itself and the program is stopped. */ PrintWriter output; diff --git a/content/examples/Topics/Fractals and L-Systems/Mandelbrot/Mandelbrot.pde b/content/examples/Topics/Fractals and L-Systems/Mandelbrot/Mandelbrot.pde index 1c82c6ca4..58a3b3d01 100644 --- a/content/examples/Topics/Fractals and L-Systems/Mandelbrot/Mandelbrot.pde +++ b/content/examples/Topics/Fractals and L-Systems/Mandelbrot/Mandelbrot.pde @@ -1,7 +1,8 @@ /** * The Mandelbrot Set * by Daniel Shiffman. - * + * (slight modification by l8l) + * * Simple rendering of the Mandelbrot set. */ @@ -13,7 +14,7 @@ background(255); // A different range will allow us to "zoom" in or out on the fractal // It all starts with the width, try higher or lower values -float w = 5; +float w = 4; float h = (w * height) / width; // Start at negative half the width and height @@ -43,21 +44,30 @@ for (int j = 0; j < height; j++) { float x = xmin; for (int i = 0; i < width; i++) { - // Now we test, as we iterate z = z^2 + cm does z tend towards infinity? + // Now we test, as we iterate z = z^2 + c does z tend towards infinity? float a = x; float b = y; int n = 0; + float max = 4.0; // Infinity in our finite world is simple, let's just consider it 4 + float absOld = 0.0; + float convergeNumber = maxiterations; // this will change if the while loop breaks due to non-convergence while (n < maxiterations) { + // We suppose z = a+ib float aa = a * a; float bb = b * b; - float twoab = 2.0 * a * b; - a = aa - bb + x; - b = twoab + y; - // Infinty in our finite world is simple, let's just consider it 16 - if (aa + bb > 16.0) { + float abs = sqrt(aa + bb); + if (abs > max) { // |z| = sqrt(a^2+b^2) + // Now measure how much we exceeded the maximum: + float diffToLast = (float) (abs - absOld); + float diffToMax = (float) (max - absOld); + convergeNumber = n + diffToMax/diffToLast; break; // Bail } + float twoab = 2.0 * a * b; + a = aa - bb + x; // this operation corresponds to z -> z^2+c where z=a+ib c=(x,y) + b = twoab + y; n++; + absOld = abs; } // We color each pixel based on how long it takes to get to infinity @@ -66,7 +76,8 @@ for (int j = 0; j < height; j++) { pixels[i+j*width] = color(0); } else { // Gosh, we could make fancy colors here if we wanted - pixels[i+j*width] = color(n*16 % 255); + float norm = map(convergeNumber, 0, maxiterations, 0, 1); + pixels[i+j*width] = color(map(sqrt(norm), 0, 1, 0, 255)); } x += dx; } diff --git a/content/examples/Topics/GUI/Button/Button.pde b/content/examples/Topics/GUI/Button/Button.pde index 4b8a536cc..041bb594d 100644 --- a/content/examples/Topics/GUI/Button/Button.pde +++ b/content/examples/Topics/GUI/Button/Button.pde @@ -1,7 +1,7 @@ /** * Button. * - * Click on one of the colored squares in the + * Click on one of the colored shapes in the * center of the image to change the color of * the background. */ diff --git a/content/examples/Topics/Motion/CircleCollision/Ball.pde b/content/examples/Topics/Motion/CircleCollision/Ball.pde index 7cb12eb8c..a3618b3e2 100644 --- a/content/examples/Topics/Motion/CircleCollision/Ball.pde +++ b/content/examples/Topics/Motion/CircleCollision/Ball.pde @@ -2,14 +2,14 @@ class Ball { PVector position; PVector velocity; - float r, m; + float radius, m; Ball(float x, float y, float r_) { position = new PVector(x, y); velocity = PVector.random2D(); velocity.mult(3); - r = r_; - m = r*.1; + radius = r_; + m = radius*.1; } void update() { @@ -17,35 +17,41 @@ class Ball { } void checkBoundaryCollision() { - if (position.x > width-r) { - position.x = width-r; + if (position.x > width-radius) { + position.x = width-radius; velocity.x *= -1; - } - else if (position.x < r) { - position.x = r; + } else if (position.x < radius) { + position.x = radius; velocity.x *= -1; - } - else if (position.y > height-r) { - position.y = height-r; + } else if (position.y > height-radius) { + position.y = height-radius; velocity.y *= -1; - } - else if (position.y < r) { - position.y = r; + } else if (position.y < radius) { + position.y = radius; velocity.y *= -1; } } void checkCollision(Ball other) { - // get distances between the balls components - PVector bVect = PVector.sub(other.position, position); + // Get distances between the balls components + PVector distanceVect = PVector.sub(other.position, position); - // calculate magnitude of the vector separating the balls - float bVectMag = bVect.mag(); + // Calculate magnitude of the vector separating the balls + float distanceVectMag = distanceVect.mag(); - if (bVectMag < r + other.r) { - // get angle of bVect - float theta = bVect.heading(); + // Minimum distance before they are touching + float minDistance = radius + other.radius; + + if (distanceVectMag < minDistance) { + float distanceCorrection = (minDistance-distanceVectMag)/2.0; + PVector d = distanceVect.copy(); + PVector correctionVector = d.normalize().mult(distanceCorrection); + other.position.add(correctionVector); + position.sub(correctionVector); + + // get angle of distanceVect + float theta = distanceVect.heading(); // precalculate trig values float sine = sin(theta); float cosine = cos(theta); @@ -54,23 +60,23 @@ class Ball { just need to worry about bTemp[1] position*/ PVector[] bTemp = { new PVector(), new PVector() - }; + }; - /* this ball's position is relative to the other - so you can use the vector between them (bVect) as the - reference point in the rotation expressions. - bTemp[0].position.x and bTemp[0].position.y will initialize - automatically to 0.0, which is what you want - since b[1] will rotate around b[0] */ - bTemp[1].x = cosine * bVect.x + sine * bVect.y; - bTemp[1].y = cosine * bVect.y - sine * bVect.x; + /* this ball's position is relative to the other + so you can use the vector between them (bVect) as the + reference point in the rotation expressions. + bTemp[0].position.x and bTemp[0].position.y will initialize + automatically to 0.0, which is what you want + since b[1] will rotate around b[0] */ + bTemp[1].x = cosine * distanceVect.x + sine * distanceVect.y; + bTemp[1].y = cosine * distanceVect.y - sine * distanceVect.x; // rotate Temporary velocities PVector[] vTemp = { new PVector(), new PVector() - }; + }; - vTemp[0].x = cosine * velocity.x + sine * velocity.y; + vTemp[0].x = cosine * velocity.x + sine * velocity.y; vTemp[0].y = cosine * velocity.y - sine * velocity.x; vTemp[1].x = cosine * other.velocity.x + sine * other.velocity.y; vTemp[1].y = cosine * other.velocity.y - sine * other.velocity.x; @@ -80,7 +86,7 @@ class Ball { the final velocity along the x-axis. */ PVector[] vFinal = { new PVector(), new PVector() - }; + }; // final rotated velocity for b[0] vFinal[0].x = ((m - other.m) * vTemp[0].x + 2 * other.m * vTemp[1].x) / (m + other.m); @@ -100,7 +106,7 @@ class Ball { // rotate balls PVector[] bFinal = { new PVector(), new PVector() - }; + }; bFinal[0].x = cosine * bTemp[0].x - sine * bTemp[0].y; bFinal[0].y = cosine * bTemp[0].y + sine * bTemp[0].x; @@ -121,11 +127,9 @@ class Ball { } } - void display() { noStroke(); fill(204); - ellipse(position.x, position.y, r*2, r*2); + ellipse(position.x, position.y, radius*2, radius*2); } -} - +} \ No newline at end of file diff --git a/content/examples/Topics/Shaders/DomeProjection/CubeMapUtils.pde b/content/examples/Topics/Shaders/DomeProjection/CubeMapUtils.pde index 49c822eb7..8a82b75a4 100644 --- a/content/examples/Topics/Shaders/DomeProjection/CubeMapUtils.pde +++ b/content/examples/Topics/Shaders/DomeProjection/CubeMapUtils.pde @@ -49,13 +49,12 @@ void drawCubeMap() { drawDomeMaster(); - pgl.disable(PGL.TEXTURE_CUBE_MAP); - pgl.bindTexture(PGL.TEXTURE_CUBE_MAP, 0); + pgl.bindTexture(PGL.TEXTURE_CUBE_MAP, 0); } void drawDomeMaster() { camera(); - ortho(0, width, 0, height); + ortho(); resetMatrix(); shader(cubemapShader); shape(domeSphere); @@ -96,4 +95,4 @@ void regenerateEnvMap(PGL pgl) { noLights(); // Disabling lights to avoid adding many times pgl.framebufferTexture2D(PGL.FRAMEBUFFER, PGL.COLOR_ATTACHMENT0, face, 0, 0); } -} +} \ No newline at end of file diff --git a/content/examples/Topics/Shaders/DomeProjection/DomeProjection.pde b/content/examples/Topics/Shaders/DomeProjection/DomeProjection.pde index 2c39c08cc..863133e49 100644 --- a/content/examples/Topics/Shaders/DomeProjection/DomeProjection.pde +++ b/content/examples/Topics/Shaders/DomeProjection/DomeProjection.pde @@ -6,6 +6,8 @@ * * Based on the FullDomeTemplate code from Christopher Warnow: * https://github.com/mphasize/FullDome + * + * Note: This example needs desktop-class graphics to function. * */ diff --git a/content/examples/Topics/Shaders/InfiniteTiles/InfiniteTiles.pde b/content/examples/Topics/Shaders/InfiniteTiles/InfiniteTiles.pde new file mode 100644 index 000000000..ae0af484f --- /dev/null +++ b/content/examples/Topics/Shaders/InfiniteTiles/InfiniteTiles.pde @@ -0,0 +1,26 @@ +//------------------------------------------------------------- +// Display endless moving background using a tile texture. +// Contributed by martiSteiger +//------------------------------------------------------------- + +PImage tileTexture; +PShader tileShader; + +void setup() { + size(640, 480, P2D); + textureWrap(REPEAT); + tileTexture = loadImage("penrose.jpg"); + loadTileShader(); +} + +void loadTileShader() { + tileShader = loadShader("scroller.glsl"); + tileShader.set("resolution", float(width), float(height)); + tileShader.set("tileImage", tileTexture); +} + +void draw() { + tileShader.set("time", millis() / 1000.0); + shader(tileShader); + rect(0, 0, width, height); +} \ No newline at end of file diff --git a/content/examples/Topics/Shaders/InfiniteTiles/data/penrose.jpg b/content/examples/Topics/Shaders/InfiniteTiles/data/penrose.jpg new file mode 100644 index 000000000..94e10607f Binary files /dev/null and b/content/examples/Topics/Shaders/InfiniteTiles/data/penrose.jpg differ diff --git a/content/examples/Topics/Shaders/InfiniteTiles/data/scroller.glsl b/content/examples/Topics/Shaders/InfiniteTiles/data/scroller.glsl new file mode 100644 index 000000000..0717bea3c --- /dev/null +++ b/content/examples/Topics/Shaders/InfiniteTiles/data/scroller.glsl @@ -0,0 +1,17 @@ +//--------------------------------------------------------- +// Display endless moving background using a tile texture. +// Contributed by martiSteiger +//--------------------------------------------------------- + +uniform float time; +uniform vec2 resolution; +uniform sampler2D tileImage; + +#define TILES_COUNT_X 4.0 + +void main() { + vec2 pos = gl_FragCoord.xy - vec2(4.0 * time); + vec2 p = (resolution - TILES_COUNT_X * pos) / resolution.x; + vec3 col = texture2D (tileImage, p).xyz; + gl_FragColor = vec4 (col, 1.0); +} \ No newline at end of file diff --git a/content/examples/Topics/Shaders/Landscape/Landscape.pde b/content/examples/Topics/Shaders/Landscape/Landscape.pde index 31d765457..a37370983 100644 --- a/content/examples/Topics/Shaders/Landscape/Landscape.pde +++ b/content/examples/Topics/Shaders/Landscape/Landscape.pde @@ -6,25 +6,26 @@ * Processing port by Raphaël de Courville. */ -PShader shader; +PShader landscape; void setup() { size(640, 360, P2D); noStroke(); - // The code of this shader shows how to integrate shaders from shadertoy - // into Processing with minimal changes. - shader = loadShader("landscape.glsl"); - shader.set("resolution", float(width), float(height)); + // This GLSL code shows how to use shaders from + // shadertoy in Processing with minimal changes. + landscape = loadShader("landscape.glsl"); + landscape.set("resolution", float(width), float(height)); } void draw() { background(0); - shader.set("time", (float)(millis()/1000.0)); - shader(shader); + landscape.set("time", millis() / 1000.0); + shader(landscape); rect(0, 0, width, height); - frame.setTitle("frame: " + frameCount + " - fps: " + frameRate); + if (frameCount % 10 == 0) { // every 10th frame + println("frame: " + frameCount + " - fps: " + frameRate); + } } - diff --git a/content/examples/Topics/Simulate/Chain/Chain.pde b/content/examples/Topics/Simulate/Chain/Chain.pde deleted file mode 100644 index 75b7ea36d..000000000 --- a/content/examples/Topics/Simulate/Chain/Chain.pde +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Chain. - * - * One mass is attached to the mouse position and the other - * is attached the position of the other mass. The gravity - * in the environment pulls down on both. - */ - - -Spring2D s1, s2; - -float gravity = 9.0; -float mass = 2.0; - -void setup() { - size(640, 360); - fill(255, 126); - // Inputs: x, y, mass, gravity - s1 = new Spring2D(0.0, width/2, mass, gravity); - s2 = new Spring2D(0.0, width/2, mass, gravity); -} - -void draw() { - background(0); - s1.update(mouseX, mouseY); - s1.display(mouseX, mouseY); - s2.update(s1.x, s1.y); - s2.display(s1.x, s1.y); -} - -class Spring2D { - float vx, vy; // The x- and y-axis velocities - float x, y; // The x- and y-coordinates - float gravity; - float mass; - float radius = 30; - float stiffness = 0.2; - float damping = 0.7; - - Spring2D(float xpos, float ypos, float m, float g) { - x = xpos; - y = ypos; - mass = m; - gravity = g; - } - - void update(float targetX, float targetY) { - float forceX = (targetX - x) * stiffness; - float ax = forceX / mass; - vx = damping * (vx + ax); - x += vx; - float forceY = (targetY - y) * stiffness; - forceY += gravity; - float ay = forceY / mass; - vy = damping * (vy + ay); - y += vy; - } - - void display(float nx, float ny) { - noStroke(); - ellipse(x, y, radius*2, radius*2); - stroke(255); - line(x, y, nx, ny); - } -} diff --git a/content/examples/Topics/Simulate/Flocking/Boid.pde b/content/examples/Topics/Simulate/Flocking/Boid.pde index a7f425451..fbcc177c5 100644 --- a/content/examples/Topics/Simulate/Flocking/Boid.pde +++ b/content/examples/Topics/Simulate/Flocking/Boid.pde @@ -2,7 +2,7 @@ class Boid { - PVector location; + PVector position; PVector velocity; PVector acceleration; float r; @@ -19,7 +19,7 @@ class Boid { float angle = random(TWO_PI); velocity = new PVector(cos(angle), sin(angle)); - location = new PVector(x, y); + position = new PVector(x, y); r = 2.0; maxspeed = 2; maxforce = 0.03; @@ -52,13 +52,13 @@ class Boid { applyForce(coh); } - // Method to update location + // Method to update position void update() { // Update velocity velocity.add(acceleration); // Limit speed velocity.limit(maxspeed); - location.add(velocity); + position.add(velocity); // Reset accelertion to 0 each cycle acceleration.mult(0); } @@ -66,7 +66,7 @@ class Boid { // A method that calculates and applies a steering force towards a target // STEER = DESIRED MINUS VELOCITY PVector seek(PVector target) { - PVector desired = PVector.sub(target, location); // A vector pointing from the location to the target + PVector desired = PVector.sub(target, position); // A vector pointing from the position to the target // Scale to maximum speed desired.normalize(); desired.mult(maxspeed); @@ -89,7 +89,7 @@ class Boid { fill(200, 100); stroke(255); pushMatrix(); - translate(location.x, location.y); + translate(position.x, position.y); rotate(theta); beginShape(TRIANGLES); vertex(0, -r*2); @@ -101,10 +101,10 @@ class Boid { // Wraparound void borders() { - if (location.x < -r) location.x = width+r; - if (location.y < -r) location.y = height+r; - if (location.x > width+r) location.x = -r; - if (location.y > height+r) location.y = -r; + if (position.x < -r) position.x = width+r; + if (position.y < -r) position.y = height+r; + if (position.x > width+r) position.x = -r; + if (position.y > height+r) position.y = -r; } // Separation @@ -115,11 +115,11 @@ class Boid { int count = 0; // For every boid in the system, check if it's too close for (Boid other : boids) { - float d = PVector.dist(location, other.location); + float d = PVector.dist(position, other.position); // If the distance is greater than 0 and less than an arbitrary amount (0 when you are yourself) if ((d > 0) && (d < desiredseparation)) { // Calculate vector pointing away from neighbor - PVector diff = PVector.sub(location, other.location); + PVector diff = PVector.sub(position, other.position); diff.normalize(); diff.div(d); // Weight by distance steer.add(diff); @@ -153,7 +153,7 @@ class Boid { PVector sum = new PVector(0, 0); int count = 0; for (Boid other : boids) { - float d = PVector.dist(location, other.location); + float d = PVector.dist(position, other.position); if ((d > 0) && (d < neighbordist)) { sum.add(other.velocity); count++; @@ -178,21 +178,21 @@ class Boid { } // Cohesion - // For the average location (i.e. center) of all nearby boids, calculate steering vector towards that location + // For the average position (i.e. center) of all nearby boids, calculate steering vector towards that position PVector cohesion (ArrayList boids) { float neighbordist = 50; - PVector sum = new PVector(0, 0); // Start with empty vector to accumulate all locations + PVector sum = new PVector(0, 0); // Start with empty vector to accumulate all positions int count = 0; for (Boid other : boids) { - float d = PVector.dist(location, other.location); + float d = PVector.dist(position, other.position); if ((d > 0) && (d < neighbordist)) { - sum.add(other.location); // Add location + sum.add(other.position); // Add position count++; } } if (count > 0) { sum.div(count); - return seek(sum); // Steer towards the location + return seek(sum); // Steer towards the position } else { return new PVector(0, 0); diff --git a/content/examples/Topics/Simulate/ForcesWithVectors/ForcesWithVectors.pde b/content/examples/Topics/Simulate/ForcesWithVectors/ForcesWithVectors.pde index 12d2588b1..46b268189 100644 --- a/content/examples/Topics/Simulate/ForcesWithVectors/ForcesWithVectors.pde +++ b/content/examples/Topics/Simulate/ForcesWithVectors/ForcesWithVectors.pde @@ -27,12 +27,12 @@ void setup() { void draw() { background(0); - + // Draw water liquid.display(); for (Mover mover : movers) { - + // Is the Mover in the liquid? if (liquid.contains(mover)) { // Calculate drag force @@ -45,16 +45,15 @@ void draw() { PVector gravity = new PVector(0, 0.1*mover.mass); // Apply gravity mover.applyForce(gravity); - + // Update and display mover.update(); mover.display(); mover.checkEdges(); } - + fill(255); - text("click mouse to reset",10,30); - + text("click mouse to reset", 10, 30); } void mousePressed() { @@ -66,4 +65,4 @@ void reset() { for (int i = 0; i < movers.length; i++) { movers[i] = new Mover(random(0.5, 3), 40+i*70, 0); } -} +} \ No newline at end of file diff --git a/content/examples/Topics/Simulate/ForcesWithVectors/Liquid.pde b/content/examples/Topics/Simulate/ForcesWithVectors/Liquid.pde index c7d4652fe..2f5b93bc4 100644 --- a/content/examples/Topics/Simulate/ForcesWithVectors/Liquid.pde +++ b/content/examples/Topics/Simulate/ForcesWithVectors/Liquid.pde @@ -6,13 +6,13 @@ * Bodies experience gravity continuously * Bodies experience fluid resistance when in "water" */ - - // Liquid class - class Liquid { - +// Liquid class +class Liquid { + + // Liquid is a rectangle - float x,y,w,h; + float x, y, w, h; // Coefficient of drag float c; @@ -23,18 +23,17 @@ h = h_; c = c_; } - + // Is the Mover in the Liquid? boolean contains(Mover m) { - PVector l = m.location; + PVector l = m.position; if (l.x > x && l.x < x + w && l.y > y && l.y < y + h) { return true; - } - else { + } else { return false; } } - + // Calculate drag force PVector drag(Mover m) { // Magnitude is coefficient * speed squared @@ -44,16 +43,15 @@ // Direction is inverse of velocity PVector drag = m.velocity.copy(); drag.mult(-1); - + // Scale according to magnitude drag.setMag(dragMagnitude); return drag; } - + void display() { noStroke(); fill(127); - rect(x,y,w,h); + rect(x, y, w, h); } - -} +} \ No newline at end of file diff --git a/content/examples/Topics/Simulate/ForcesWithVectors/Mover.pde b/content/examples/Topics/Simulate/ForcesWithVectors/Mover.pde index b14754b71..2dd51116c 100644 --- a/content/examples/Topics/Simulate/ForcesWithVectors/Mover.pde +++ b/content/examples/Topics/Simulate/ForcesWithVectors/Mover.pde @@ -10,17 +10,17 @@ class Mover { - // location, velocity, and acceleration - PVector location; + // position, velocity, and acceleration + PVector position; PVector velocity; PVector acceleration; - + // Mass is tied to size float mass; Mover(float m, float x, float y) { mass = m; - location = new PVector(x, y); + position = new PVector(x, y); velocity = new PVector(0, 0); acceleration = new PVector(0, 0); } @@ -35,30 +35,28 @@ class Mover { } void update() { - + // Velocity changes according to acceleration velocity.add(acceleration); - // Location changes by velocity - location.add(velocity); + // position changes by velocity + position.add(velocity); // We must clear acceleration each frame acceleration.mult(0); } - + // Draw Mover void display() { stroke(255); strokeWeight(2); fill(255, 200); - ellipse(location.x, location.y, mass*16, mass*16); + ellipse(position.x, position.y, mass*16, mass*16); } - + // Bounce off bottom of window void checkEdges() { - if (location.y > height) { + if (position.y > height) { velocity.y *= -0.9; // A little dampening when hitting the bottom - location.y = height; + position.y = height; } } -} - - +} \ No newline at end of file diff --git a/content/examples/Topics/Simulate/GravitationalAttraction3D/Planet.pde b/content/examples/Topics/Simulate/GravitationalAttraction3D/Planet.pde index ae8be2537..ec93bde8d 100644 --- a/content/examples/Topics/Simulate/GravitationalAttraction3D/Planet.pde +++ b/content/examples/Topics/Simulate/GravitationalAttraction3D/Planet.pde @@ -4,30 +4,30 @@ // A class for an orbiting Planet class Planet { - - // Basic physics model (location, velocity, acceleration, mass) - PVector location; + + // Basic physics model (position, velocity, acceleration, mass) + PVector position; PVector velocity; PVector acceleration; float mass; Planet(float m, float x, float y, float z) { mass = m; - location = new PVector(x,y,z); - velocity = new PVector(1,0); // Arbitrary starting velocity - acceleration = new PVector(0,0); + position = new PVector(x, y, z); + velocity = new PVector(1, 0); // Arbitrary starting velocity + acceleration = new PVector(0, 0); } - + // Newton's 2nd Law (F = M*A) applied void applyForce(PVector force) { - PVector f = PVector.div(force,mass); + PVector f = PVector.div(force, mass); acceleration.add(f); } // Our motion algorithm (aka Euler Integration) void update() { velocity.add(acceleration); // Velocity changes according to acceleration - location.add(velocity); // Location changes according to velocity + position.add(velocity); // position changes according to velocity acceleration.mult(0); } @@ -36,10 +36,8 @@ class Planet { noStroke(); fill(255); pushMatrix(); - translate(location.x,location.y,location.z); + translate(position.x, position.y, position.z); sphere(mass*8); popMatrix(); } -} - - +} \ No newline at end of file diff --git a/content/examples/Topics/Simulate/GravitationalAttraction3D/Sun.pde b/content/examples/Topics/Simulate/GravitationalAttraction3D/Sun.pde index 10fcc0373..b8ea25956 100644 --- a/content/examples/Topics/Simulate/GravitationalAttraction3D/Sun.pde +++ b/content/examples/Topics/Simulate/GravitationalAttraction3D/Sun.pde @@ -5,20 +5,20 @@ class Sun { float mass; // Mass, tied to size - PVector location; // Location + PVector position; // position float G; // Universal gravitational constant (arbitrary value) Sun() { - location = new PVector(0,0); + position = new PVector(0, 0); mass = 20; G = 0.4; } PVector attract(Planet m) { - PVector force = PVector.sub(location,m.location); // Calculate direction of force + PVector force = PVector.sub(position, m.position); // Calculate direction of force float d = force.mag(); // Distance between objects - d = constrain(d,5.0,25.0); // Limiting the distance to eliminate "extreme" results for very close or very far objects + d = constrain(d, 5.0, 25.0); // Limiting the distance to eliminate "extreme" results for very close or very far objects float strength = (G * mass * m.mass) / (d * d); // Calculate gravitional force magnitude force.setMag(strength); // Get force vector --> magnitude * direction return force; @@ -29,10 +29,8 @@ class Sun { stroke(255); noFill(); pushMatrix(); - translate(location.x,location.y,location.z); + translate(position.x, position.y, position.z); sphere(mass*2); popMatrix(); } -} - - +} \ No newline at end of file diff --git a/content/examples/Topics/Simulate/MultipleParticleSystems/CrazyParticle.pde b/content/examples/Topics/Simulate/MultipleParticleSystems/CrazyParticle.pde index 9c77dc6e3..f18d04ee6 100644 --- a/content/examples/Topics/Simulate/MultipleParticleSystems/CrazyParticle.pde +++ b/content/examples/Topics/Simulate/MultipleParticleSystems/CrazyParticle.pde @@ -30,11 +30,10 @@ class CrazyParticle extends Particle { super.display(); // Then add a rotating line pushMatrix(); - translate(location.x,location.y); + translate(position.x, position.y); rotate(theta); - stroke(255,lifespan); - line(0,0,25,0); + stroke(255, lifespan); + line(0, 0, 25, 0); popMatrix(); } - -} +} \ No newline at end of file diff --git a/content/examples/Topics/Simulate/MultipleParticleSystems/MultipleParticleSystems.pde b/content/examples/Topics/Simulate/MultipleParticleSystems/MultipleParticleSystems.pde index 5bc038e7d..605f1a9d5 100644 --- a/content/examples/Topics/Simulate/MultipleParticleSystems/MultipleParticleSystems.pde +++ b/content/examples/Topics/Simulate/MultipleParticleSystems/MultipleParticleSystems.pde @@ -3,7 +3,7 @@ * by Daniel Shiffman. * * Click the mouse to generate a burst of particles - * at mouse location. + * at mouse position. * * Each burst is one instance of a particle system * with Particles and CrazyParticles (a subclass of Particle) @@ -19,7 +19,7 @@ void setup() { void draw() { background(0); - for (ParticleSystem ps: systems) { + for (ParticleSystem ps : systems) { ps.run(); ps.addParticle(); } @@ -32,4 +32,4 @@ void draw() { void mousePressed() { systems.add(new ParticleSystem(1, new PVector(mouseX, mouseY))); -} +} \ No newline at end of file diff --git a/content/examples/Topics/Simulate/MultipleParticleSystems/Particle.pde b/content/examples/Topics/Simulate/MultipleParticleSystems/Particle.pde index 078ef23c5..a3d0b8780 100644 --- a/content/examples/Topics/Simulate/MultipleParticleSystems/Particle.pde +++ b/content/examples/Topics/Simulate/MultipleParticleSystems/Particle.pde @@ -1,15 +1,15 @@ // A simple Particle class class Particle { - PVector location; + PVector position; PVector velocity; PVector acceleration; float lifespan; Particle(PVector l) { - acceleration = new PVector(0,0.05); - velocity = new PVector(random(-1,1),random(-2,0)); - location = l.get(); + acceleration = new PVector(0, 0.05); + velocity = new PVector(random(-1, 1), random(-2, 0)); + position = l.copy(); lifespan = 255.0; } @@ -18,23 +18,22 @@ class Particle { display(); } - // Method to update location + // Method to update position void update() { velocity.add(acceleration); - location.add(velocity); + position.add(velocity); lifespan -= 2.0; } // Method to display void display() { - stroke(255,lifespan); - fill(255,lifespan); - ellipse(location.x,location.y,8,8); + stroke(255, lifespan); + fill(255, lifespan); + ellipse(position.x, position.y, 8, 8); } // Is the particle still useful? boolean isDead() { return (lifespan < 0.0); } - -} +} \ No newline at end of file diff --git a/content/examples/Topics/Simulate/MultipleParticleSystems/ParticleSystem.pde b/content/examples/Topics/Simulate/MultipleParticleSystems/ParticleSystem.pde index e4deac945..8db8462ed 100644 --- a/content/examples/Topics/Simulate/MultipleParticleSystems/ParticleSystem.pde +++ b/content/examples/Topics/Simulate/MultipleParticleSystems/ParticleSystem.pde @@ -7,7 +7,7 @@ class ParticleSystem { ParticleSystem(int num, PVector v) { particles = new ArrayList(); // Initialize the arraylist - origin = v.get(); // Store the origin point + origin = v.copy(); // Store the origin point for (int i = 0; i < num; i++) { particles.add(new Particle(origin)); // Add "num" amount of particles to the arraylist } diff --git a/content/examples/Topics/Simulate/SimpleParticleSystem/Particle.pde b/content/examples/Topics/Simulate/SimpleParticleSystem/Particle.pde index b6fa0c02d..6d949c725 100644 --- a/content/examples/Topics/Simulate/SimpleParticleSystem/Particle.pde +++ b/content/examples/Topics/Simulate/SimpleParticleSystem/Particle.pde @@ -1,15 +1,15 @@ // A simple Particle class class Particle { - PVector location; + PVector position; PVector velocity; PVector acceleration; float lifespan; Particle(PVector l) { - acceleration = new PVector(0,0.05); - velocity = new PVector(random(-1,1),random(-2,0)); - location = l.get(); + acceleration = new PVector(0, 0.05); + velocity = new PVector(random(-1, 1), random(-2, 0)); + position = l.copy(); lifespan = 255.0; } @@ -18,20 +18,20 @@ class Particle { display(); } - // Method to update location + // Method to update position void update() { velocity.add(acceleration); - location.add(velocity); + position.add(velocity); lifespan -= 1.0; } // Method to display void display() { - stroke(255,lifespan); - fill(255,lifespan); - ellipse(location.x,location.y,8,8); + stroke(255, lifespan); + fill(255, lifespan); + ellipse(position.x, position.y, 8, 8); } - + // Is the particle still useful? boolean isDead() { if (lifespan < 0.0) { @@ -40,4 +40,4 @@ class Particle { return false; } } -} +} \ No newline at end of file diff --git a/content/examples/Topics/Simulate/SimpleParticleSystem/ParticleSystem.pde b/content/examples/Topics/Simulate/SimpleParticleSystem/ParticleSystem.pde index bd5937e77..94a528abf 100644 --- a/content/examples/Topics/Simulate/SimpleParticleSystem/ParticleSystem.pde +++ b/content/examples/Topics/Simulate/SimpleParticleSystem/ParticleSystem.pde @@ -5,8 +5,8 @@ class ParticleSystem { ArrayList particles; PVector origin; - ParticleSystem(PVector location) { - origin = location.get(); + ParticleSystem(PVector position) { + origin = position.copy(); particles = new ArrayList(); } @@ -23,4 +23,4 @@ class ParticleSystem { } } } -} +} \ No newline at end of file diff --git a/content/examples/Topics/Simulate/SimpleParticleSystem/SimpleParticleSystem.pde b/content/examples/Topics/Simulate/SimpleParticleSystem/SimpleParticleSystem.pde index 9b46822f1..e198edbac 100644 --- a/content/examples/Topics/Simulate/SimpleParticleSystem/SimpleParticleSystem.pde +++ b/content/examples/Topics/Simulate/SimpleParticleSystem/SimpleParticleSystem.pde @@ -7,18 +7,16 @@ * A ParticleSystem object manages a variable size (ArrayList) * list of particles. */ - + ParticleSystem ps; void setup() { - size(640,360); - ps = new ParticleSystem(new PVector(width/2,50)); + size(640, 360); + ps = new ParticleSystem(new PVector(width/2, 50)); } void draw() { background(0); ps.addParticle(); ps.run(); -} - - +} \ No newline at end of file diff --git a/content/examples/Topics/Simulate/SmokeParticleSystem/Particle.pde b/content/examples/Topics/Simulate/SmokeParticleSystem/Particle.pde index 40b980ffa..a0948b478 100644 --- a/content/examples/Topics/Simulate/SmokeParticleSystem/Particle.pde +++ b/content/examples/Topics/Simulate/SmokeParticleSystem/Particle.pde @@ -8,12 +8,12 @@ class Particle { float lifespan; PImage img; - Particle(PVector l,PImage img_) { - acc = new PVector(0,0); + Particle(PVector l, PImage img_) { + acc = new PVector(0, 0); float vx = randomGaussian()*0.3; float vy = randomGaussian()*0.3 - 1.0; - vel = new PVector(vx,vy); - loc = l.get(); + vel = new PVector(vx, vy); + loc = l.copy(); lifespan = 100.0; img = img_; } @@ -22,14 +22,14 @@ class Particle { update(); render(); } - + // Method to apply a force vector to the Particle object // Note we are ignoring "mass" here void applyForce(PVector f) { acc.add(f); } - // Method to update location + // Method to update position void update() { vel.add(acc); loc.add(vel); @@ -40,8 +40,8 @@ class Particle { // Method to display void render() { imageMode(CENTER); - tint(255,lifespan); - image(img,loc.x,loc.y); + tint(255, lifespan); + image(img, loc.x, loc.y); // Drawing a circle instead // fill(255,lifespan); // noStroke(); @@ -56,4 +56,4 @@ class Particle { return false; } } -} +} \ No newline at end of file diff --git a/content/examples/Topics/Simulate/SmokeParticleSystem/ParticleSystem.pde b/content/examples/Topics/Simulate/SmokeParticleSystem/ParticleSystem.pde index 9dd4ca62a..ba77243d7 100644 --- a/content/examples/Topics/Simulate/SmokeParticleSystem/ParticleSystem.pde +++ b/content/examples/Topics/Simulate/SmokeParticleSystem/ParticleSystem.pde @@ -6,10 +6,10 @@ class ParticleSystem { ArrayList particles; // An arraylist for all the particles PVector origin; // An origin point for where particles are birthed PImage img; - + ParticleSystem(int num, PVector v, PImage img_) { particles = new ArrayList(); // Initialize the arraylist - origin = v.get(); // Store the origin point + origin = v.copy(); // Store the origin point img = img_; for (int i = 0; i < num; i++) { particles.add(new Particle(origin, img)); // Add "num" amount of particles to the arraylist @@ -25,18 +25,16 @@ class ParticleSystem { } } } - + // Method to add a force vector to all particles currently in the system void applyForce(PVector dir) { // Enhanced loop!!! - for (Particle p: particles) { + for (Particle p : particles) { p.applyForce(dir); } - } void addParticle() { - particles.add(new Particle(origin,img)); + particles.add(new Particle(origin, img)); } - -} +} \ No newline at end of file diff --git a/content/examples/Topics/Simulate/SmokeParticleSystem/SmokeParticleSystem.pde b/content/examples/Topics/Simulate/SmokeParticleSystem/SmokeParticleSystem.pde index 32683de91..3b1e51fec 100644 --- a/content/examples/Topics/Simulate/SmokeParticleSystem/SmokeParticleSystem.pde +++ b/content/examples/Topics/Simulate/SmokeParticleSystem/SmokeParticleSystem.pde @@ -9,17 +9,17 @@ ParticleSystem ps; void setup() { - size(640,360); + size(640, 360); PImage img = loadImage("texture.png"); - ps = new ParticleSystem(0,new PVector(width/2,height-60),img); + ps = new ParticleSystem(0, new PVector(width/2, height-60), img); } void draw() { background(0); // Calculate a "wind" force based on mouse horizontal position - float dx = map(mouseX,0,width,-0.2,0.2); - PVector wind = new PVector(dx,0); + float dx = map(mouseX, 0, width, -0.2, 0.2); + PVector wind = new PVector(dx, 0); ps.applyForce(wind); ps.run(); for (int i = 0; i < 2; i++) { @@ -27,24 +27,23 @@ void draw() { } // Draw an arrow representing the wind force - drawVector(wind, new PVector(width/2,50,0),500); - + drawVector(wind, new PVector(width/2, 50, 0), 500); } -// Renders a vector object 'v' as an arrow and a location 'loc' +// Renders a vector object 'v' as an arrow and a position 'loc' void drawVector(PVector v, PVector loc, float scayl) { pushMatrix(); float arrowsize = 4; - // Translate to location to render vector - translate(loc.x,loc.y); + // Translate to position to render vector + translate(loc.x, loc.y); stroke(255); // Call vector heading function to get direction (note that pointing up is a heading of 0) and rotate rotate(v.heading()); // Calculate length of vector & scale it to be bigger or smaller if necessary float len = v.mag()*scayl; // Draw three lines to make an arrow (draw pointing up since we've rotate to the proper direction) - line(0,0,len,0); - line(len,0,len-arrowsize,+arrowsize/2); - line(len,0,len-arrowsize,-arrowsize/2); + line(0, 0, len, 0); + line(len, 0, len-arrowsize, +arrowsize/2); + line(len, 0, len-arrowsize, -arrowsize/2); popMatrix(); -} +} \ No newline at end of file diff --git a/content/examples/Topics/Simulate/SoftBody/SoftBody.pde b/content/examples/Topics/Simulate/SoftBody/SoftBody.pde index b0eb8f826..e3d0d266f 100644 --- a/content/examples/Topics/Simulate/SoftBody/SoftBody.pde +++ b/content/examples/Topics/Simulate/SoftBody/SoftBody.pde @@ -46,7 +46,7 @@ void draw() { } void drawShape() { - // calculate node starting locations + // calculate node starting positions for (int i=0; i left && mouseX < right && mouseY > ps && mouseY < ps + springHeight) { - over = true; - } else { - over = false; - } - - // Set and constrain the position of top bar - if(move) { - ps = mouseY - springHeight/2; - ps = constrain(ps, min, max); - } -} - -void mousePressed() { - if(over) { - move = true; - } -} - -void mouseReleased() { - move = false; -} diff --git a/content/examples/Topics/Simulate/Springs/Springs.pde b/content/examples/Topics/Simulate/Springs/Springs.pde deleted file mode 100644 index 877e79e26..000000000 --- a/content/examples/Topics/Simulate/Springs/Springs.pde +++ /dev/null @@ -1,151 +0,0 @@ -/** - * Springs. - * - * Move the mouse over one of the circles and click to re-position. - * When you release the mouse, it will snap back into position. - * Each circle has a slightly different behavior. - */ - - -int num = 3; -Spring[] springs = new Spring[num]; - -void setup() { - size(640, 360); - noStroke(); - springs[0] = new Spring(240, 260, 40, 0.98, 8.0, 0.1, springs, 0); - springs[1] = new Spring(320, 210, 120, 0.95, 9.0, 0.1, springs, 1); - springs[2] = new Spring(180, 170, 200, 0.90, 9.9, 0.1, springs, 2); -} - -void draw() { - background(51); - - for (Spring spring : springs) { - spring.update(); - spring.display(); - } -} - -void mousePressed() { - for (Spring spring : springs) { - spring.pressed(); - } -} - -void mouseReleased() { - for (Spring spring : springs) { - spring.released(); - } -} - -class Spring { - // Screen values - float xpos, ypos; - float tempxpos, tempypos; - int size = 20; - boolean over = false; - boolean move = false; - - // Spring simulation constants - float mass; // Mass - float k = 0.2; // Spring constant - float damp; // Damping - float rest_posx; // Rest position X - float rest_posy; // Rest position Y - - // Spring simulation variables - //float pos = 20.0; // Position - float velx = 0.0; // X Velocity - float vely = 0.0; // Y Velocity - float accel = 0; // Acceleration - float force = 0; // Force - - Spring[] friends; - int me; - - // Constructor - Spring(float x, float y, int s, float d, float m, - float k_in, Spring[] others, int id) { - xpos = tempxpos = x; - ypos = tempypos = y; - rest_posx = x; - rest_posy = y; - size = s; - damp = d; - mass = m; - k = k_in; - friends = others; - me = id; - } - - void update() { - if (move) { - rest_posy = mouseY; - rest_posx = mouseX; - } - - force = -k * (tempypos - rest_posy); // f=-ky - accel = force / mass; // Set the acceleration, f=ma == a=f/m - vely = damp * (vely + accel); // Set the velocity - tempypos = tempypos + vely; // Updated position - - force = -k * (tempxpos - rest_posx); // f=-ky - accel = force / mass; // Set the acceleration, f=ma == a=f/m - velx = damp * (velx + accel); // Set the velocity - tempxpos = tempxpos + velx; // Updated position - - - if ((overEvent() || move) && !otherOver() ) { - over = true; - } else { - over = false; - } - } - - // Test to see if mouse is over this spring - boolean overEvent() { - float disX = tempxpos - mouseX; - float disY = tempypos - mouseY; - if (sqrt(sq(disX) + sq(disY)) < size/2 ) { - return true; - } else { - return false; - } - } - - // Make sure no other springs are active - boolean otherOver() { - for (int i=0; i - Statements and Comments - Coordinates - Width and Height - Setup and Draw - No Loop - Loop - Redraw - Functions - Recursion - CreateGraphics + Statements and Comments + Coordinates + Width and Height + Setup and Draw + No Loop + Loop + Redraw + Functions + Recursion + CreateGraphics - Points and Lines - Shape Primitives - Pie Chart - Regular Polygon - Star - Triangle Strip - Bezier + Points and Lines + Shape Primitives + Pie Chart + Regular Polygon + Star + Triangle Strip + Bezier 3D Primitives - Variables - Integers and Floats - True/False - Characters and Strings + Variables + Integers and Floats + True/False + Characters and Strings Variable Scope + Datatype Conversion - Array - Array 2D - Array Objects + Array + Array 2D + Array Objects - Iteration - Embedded Iteration - Conditionals 1 - Conditionals 2 - Logical Operators + Iteration + Embedded Iteration + Conditionals 1 + Conditionals 2 + Logical Operators - Load and Display Image - Background Image - Transparency - Alphamask - CreateImage - Pointillism + Load and Display Image + Background Image + Transparency + Alphamask + CreateImage + Pointillism + Request Image Load and Display SVG @@ -56,61 +58,75 @@ Get Child - Hue - Saturation - Brightness - Color Variables - Relativity - Linear Gradient - Radial Gradient + Hue + Saturation + Brightness + Color Variables + Relativity + Linear Gradient + Radial Gradient Wave Gradient - Increment/Decrement - Operator Precedence - Distance 1D - Distance 2D - Sine - Sine and Cosine - Sine Wave - Additive Wave - Polar to Cartesian - Arctangent - Graphing 2D Equation - Random - Double Random - Noise 1D - NoiseWave + Increment/Decrement + Operator Precedence + Distance 1D + Distance 2D + Map + Sine + Sine and Cosine + Sine Wave + Additive Wave + Polar to Cartesian + Arctangent + Graphing 2D Equation + Interpolate + Random + Double Random + Random Gaussian + Noise 1D + Noise 2D + Noise 3D + NoiseWave - Mouse 1D - Mouse 2D - MousePress - Mouse Signals - Easing - Constrain - Storing Input - Mouse Functions - Keyboard - Keyboard Functions - Milliseconds - Clock + Mouse 1D + Mouse 2D + MousePress + Mouse Signals + Easing + Constrain + Storing Input + Mouse Functions + Keyboard + Keyboard Functions + Milliseconds + Clock - Translate - Scale - Rotate + Translate + Scale + Rotate RotateXY RotatePushPop - Arm + Arm - Objects - Multiple Constructors - Composite Objects - Inheritance + Objects + Multiple Constructors + Composite Objects + Inheritance - + + Letters + Words + Text Rotation + + + Embedded Links + Loading Images + + On/Off Directional Spot diff --git a/content/examples_p5/Basics/Arrays/Array/Array.js b/content/examples_p5/Basics/Arrays/Array/Array.js index 95312e602..fbfd82061 100644 --- a/content/examples_p5/Basics/Arrays/Array/Array.js +++ b/content/examples_p5/Basics/Arrays/Array/Array.js @@ -13,7 +13,8 @@ var coswave; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); coswave = []; for (var i = 0; i < width; i++) { var amount = map(i, 0, width, 0, PI); diff --git a/content/examples_p5/Basics/Arrays/Array2D/Array2D.js b/content/examples_p5/Basics/Arrays/Array2D/Array2D.js index 9fb5e5fd5..4bebca12b 100644 --- a/content/examples_p5/Basics/Arrays/Array2D/Array2D.js +++ b/content/examples_p5/Basics/Arrays/Array2D/Array2D.js @@ -12,7 +12,8 @@ var maxDistance; var spacer; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); maxDistance = dist(width/2, height/2, width, height); distances = []; for (var x = 0; x < width; x++) { diff --git a/content/examples_p5/Basics/Arrays/ArrayObjects/ArrayObjects.js b/content/examples_p5/Basics/Arrays/ArrayObjects/ArrayObjects.js index be3abe64a..e52eddfaa 100644 --- a/content/examples_p5/Basics/Arrays/ArrayObjects/ArrayObjects.js +++ b/content/examples_p5/Basics/Arrays/ArrayObjects/ArrayObjects.js @@ -9,7 +9,8 @@ var count; var mods; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); noStroke(); var wideCount = width / unit; var highCount = height / unit; diff --git a/content/examples_p5/Basics/Color/Brightness/Brightness.js b/content/examples_p5/Basics/Color/Brightness/Brightness.js index 1854d360e..62b6f20a5 100644 --- a/content/examples_p5/Basics/Color/Brightness/Brightness.js +++ b/content/examples_p5/Basics/Color/Brightness/Brightness.js @@ -10,7 +10,8 @@ var barWidth = 20; var lastBar = -1; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); colorMode(HSB, width, 100, width); noStroke(); background(0); diff --git a/content/examples_p5/Basics/Color/ColorVariables/ColorVariables.js b/content/examples_p5/Basics/Color/ColorVariables/ColorVariables.js index 651173f86..0f98f0e55 100644 --- a/content/examples_p5/Basics/Color/ColorVariables/ColorVariables.js +++ b/content/examples_p5/Basics/Color/ColorVariables/ColorVariables.js @@ -6,7 +6,8 @@ */ function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); noStroke(); background(51, 0, 0); diff --git a/content/examples_p5/Basics/Color/Hue/Hue.js b/content/examples_p5/Basics/Color/Hue/Hue.js index 6769bd6d6..c186668e4 100644 --- a/content/examples_p5/Basics/Color/Hue/Hue.js +++ b/content/examples_p5/Basics/Color/Hue/Hue.js @@ -11,7 +11,8 @@ var lastBar = -1; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); colorMode(HSB, height, height, height); noStroke(); background(0); diff --git a/content/examples_p5/Basics/Color/LinearGradient/LinearGradient.js b/content/examples_p5/Basics/Color/LinearGradient/LinearGradient.js index 313beb0e3..8ee5b9f92 100644 --- a/content/examples_p5/Basics/Color/LinearGradient/LinearGradient.js +++ b/content/examples_p5/Basics/Color/LinearGradient/LinearGradient.js @@ -11,7 +11,8 @@ var X_AXIS = 2; var b1, b2, c1, c2; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); // Define colors b1 = color(255); diff --git a/content/examples_p5/Basics/Color/RadialGradient/RadialGradient.js b/content/examples_p5/Basics/Color/RadialGradient/RadialGradient.js index 1e1b74e82..f79678a9d 100644 --- a/content/examples_p5/Basics/Color/RadialGradient/RadialGradient.js +++ b/content/examples_p5/Basics/Color/RadialGradient/RadialGradient.js @@ -1,14 +1,15 @@ /** * Radial Gradient. * - * Draws are series of concentric circles to create a gradient + * Draws a series of concentric circles to create a gradient * from one color to another. */ var dim; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); dim = width/2; background(0); colorMode(HSB, 360, 100, 100); diff --git a/content/examples_p5/Basics/Color/Relativity/Relativity.js b/content/examples_p5/Basics/Color/Relativity/Relativity.js index 1e1c5e49b..a58c003c7 100644 --- a/content/examples_p5/Basics/Color/Relativity/Relativity.js +++ b/content/examples_p5/Basics/Color/Relativity/Relativity.js @@ -9,7 +9,8 @@ var a, b, c, d, e; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); noStroke(); a = color(165, 167, 20); b = color(77, 86, 59); diff --git a/content/examples_p5/Basics/Color/Saturation/Saturation.js b/content/examples_p5/Basics/Color/Saturation/Saturation.js index 2385e116c..2092d18f6 100644 --- a/content/examples_p5/Basics/Color/Saturation/Saturation.js +++ b/content/examples_p5/Basics/Color/Saturation/Saturation.js @@ -12,7 +12,8 @@ var lastBar = -1; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); colorMode(HSB, width, height, 100); noStroke(); } diff --git a/content/examples_p5/Basics/Color/WaveGradient/WaveGradient.js b/content/examples_p5/Basics/Color/WaveGradient/WaveGradient.js index 51b8164cc..eb5afa1c1 100644 --- a/content/examples_p5/Basics/Color/WaveGradient/WaveGradient.js +++ b/content/examples_p5/Basics/Color/WaveGradient/WaveGradient.js @@ -12,15 +12,19 @@ var frequency = 0; var fillGap = 2.5; var c; +var gradient; + function setup() { - devicePixelScaling(false); - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + pixelDensity(1); + canvas.parent("p5container"); background(200); + gradient = createImage(width, height, RGB); noLoop(); } function draw() { - //loadPixels(); + gradient.loadPixels(); for (var i =- 75; i < height+75; i++){ // Reset angle to 0, so waves stack properly angle = 0; @@ -29,14 +33,37 @@ function draw() { for (var j = 0; j < width+75; j++){ py = i + sin(radians(angle)) * amplitude; angle += frequency; - c = color(abs(py-i)*255/amplitude, 255-abs(py-i)*255/amplitude, j*(255.0/(width+50))); + // c = color(abs(py-i)*255/amplitude;, 255-abs(py-i)*255/amplitude, j*(255.0/(width+50))); + var r = int(abs(py-i)*255/amplitude); + var g = int(255-abs(py-i)*255/amplitude); + var b = int(j*(255.0/(width+50))); + // Hack to fill gaps. Raise value of fillGap if you increase frequency for (var filler = 0; filler < fillGap; filler++){ - set(int(j-filler), int(py)-filler, c); - set(int(j), int(py), c); - set(int(j+filler), int(py)+filler, c); + var x = int(j-filler); + var y = int(py)-filler; + + var index = (x + y * width)*4; + gradient.pixels[index] = r; gradient.pixels[index+1] = g; gradient.pixels[index+2] = b; gradient.pixels[index+3] = 255; + + x = int(j); + y = int(py); + index = (x + y * width)*4; + gradient.pixels[index] = r; gradient.pixels[index+1] = g; gradient.pixels[index+2] = b; gradient.pixels[index+3] = 255; + + x = int(j+filler); + y = int(py)+filler; + index = (x + y * width)*4; + gradient.pixels[index] = r; gradient.pixels[index+1] = g; gradient.pixels[index+2] = b; gradient.pixels[index+3] = 255; + + //set(int(j-filler), int(py)-filler, c); + //set(int(j), int(py), c); + //set(int(j+filler), int(py)+filler, c); } } } - updatePixels(); + gradient.updatePixels(); + image(gradient, 0, 0); + noLoop(); + //console.log('complete'); } diff --git a/content/examples_p5/Basics/Control/Conditionals1/Conditionals1.js b/content/examples_p5/Basics/Control/Conditionals1/Conditionals1.js index f4e37425d..69bbd33cc 100644 --- a/content/examples_p5/Basics/Control/Conditionals1/Conditionals1.js +++ b/content/examples_p5/Basics/Control/Conditionals1/Conditionals1.js @@ -11,7 +11,8 @@ */ function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); background(0); for(var i = 10; i < width; i += 10) { diff --git a/content/examples_p5/Basics/Control/Conditionals2/Conditionals2.js b/content/examples_p5/Basics/Control/Conditionals2/Conditionals2.js index 41d88e2d7..1dd2374a4 100644 --- a/content/examples_p5/Basics/Control/Conditionals2/Conditionals2.js +++ b/content/examples_p5/Basics/Control/Conditionals2/Conditionals2.js @@ -9,7 +9,8 @@ function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); background(0); for(var i = 2; i < width-2; i += 2) { diff --git a/content/examples_p5/Basics/Control/EmbeddedIteration/EmbeddedIteration.js b/content/examples_p5/Basics/Control/EmbeddedIteration/EmbeddedIteration.js index ca962f9b2..4e927be27 100644 --- a/content/examples_p5/Basics/Control/EmbeddedIteration/EmbeddedIteration.js +++ b/content/examples_p5/Basics/Control/EmbeddedIteration/EmbeddedIteration.js @@ -6,7 +6,8 @@ */ function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); background(0); noStroke(); diff --git a/content/examples_p5/Basics/Control/Iteration/Iteration.js b/content/examples_p5/Basics/Control/Iteration/Iteration.js index f3839d3e4..12d092873 100644 --- a/content/examples_p5/Basics/Control/Iteration/Iteration.js +++ b/content/examples_p5/Basics/Control/Iteration/Iteration.js @@ -8,7 +8,8 @@ function setup() { var y; var num = 14; - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); background(102); noStroke(); diff --git a/content/examples_p5/Basics/Control/LogicalOperators/LogicalOperators.js b/content/examples_p5/Basics/Control/LogicalOperators/LogicalOperators.js index edac7ae4e..e0c2ba445 100644 --- a/content/examples_p5/Basics/Control/LogicalOperators/LogicalOperators.js +++ b/content/examples_p5/Basics/Control/LogicalOperators/LogicalOperators.js @@ -8,7 +8,8 @@ function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); background(126); var test = false; diff --git a/content/examples_p5/Basics/Data/CharactersStrings/CharactersStrings.js b/content/examples_p5/Basics/Data/CharactersStrings/CharactersStrings.js index c3026ec1a..8bb2e7bc3 100644 --- a/content/examples_p5/Basics/Data/CharactersStrings/CharactersStrings.js +++ b/content/examples_p5/Basics/Data/CharactersStrings/CharactersStrings.js @@ -23,7 +23,8 @@ var letter = ''; var words = "Begin..."; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); // Create the font textFont("Georgia", 36); } diff --git a/content/examples_p5/Basics/Data/DatatypeConversion/DatatypeConversion.js b/content/examples_p5/Basics/Data/DatatypeConversion/DatatypeConversion.js index aa532a234..66af616b2 100644 --- a/content/examples_p5/Basics/Data/DatatypeConversion/DatatypeConversion.js +++ b/content/examples_p5/Basics/Data/DatatypeConversion/DatatypeConversion.js @@ -11,7 +11,8 @@ /* @pjs font="Georgia.ttf"; */ function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); background(0); noStroke(); diff --git a/content/examples_p5/Basics/Data/IntegersFloats/IntegersFloats.js b/content/examples_p5/Basics/Data/IntegersFloats/IntegersFloats.js index 2cabdd7ae..9fa5fdd64 100644 --- a/content/examples_p5/Basics/Data/IntegersFloats/IntegersFloats.js +++ b/content/examples_p5/Basics/Data/IntegersFloats/IntegersFloats.js @@ -12,7 +12,8 @@ var a = 0; // Create a variable "a" of the datatype "int" var b = 0.0; // Create a variable "b" of the datatype "float" function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); stroke(255); frameRate(30); } diff --git a/content/examples_p5/Basics/Data/TrueFalse/TrueFalse.js b/content/examples_p5/Basics/Data/TrueFalse/TrueFalse.js index 5c8733e16..9d7f72cae 100644 --- a/content/examples_p5/Basics/Data/TrueFalse/TrueFalse.js +++ b/content/examples_p5/Basics/Data/TrueFalse/TrueFalse.js @@ -11,7 +11,8 @@ function setup() { var b = false; - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); background(0); stroke(255); diff --git a/content/examples_p5/Basics/Data/VariableScope/VariableScope.js b/content/examples_p5/Basics/Data/VariableScope/VariableScope.js index 60a662e39..e0e048de7 100644 --- a/content/examples_p5/Basics/Data/VariableScope/VariableScope.js +++ b/content/examples_p5/Basics/Data/VariableScope/VariableScope.js @@ -15,7 +15,8 @@ var a = 80; // Create a global variable "a" function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); background(0); stroke(255); noLoop(); diff --git a/content/examples_p5/Basics/Data/Variables/Variables.js b/content/examples_p5/Basics/Data/Variables/Variables.js index 16005bfed..a28c7b8b7 100644 --- a/content/examples_p5/Basics/Data/Variables/Variables.js +++ b/content/examples_p5/Basics/Data/Variables/Variables.js @@ -6,7 +6,8 @@ */ function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); background(0); stroke(153); strokeWeight(4); diff --git a/content/examples_p5/Basics/Form/Bezier/Bezier.js b/content/examples_p5/Basics/Form/Bezier/Bezier.js index 3fba06273..f1825839e 100644 --- a/content/examples_p5/Basics/Form/Bezier/Bezier.js +++ b/content/examples_p5/Basics/Form/Bezier/Bezier.js @@ -8,7 +8,8 @@ */ function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); stroke(255); noFill(); } diff --git a/content/examples_p5/Basics/Form/PieChart/PieChart.js b/content/examples_p5/Basics/Form/PieChart/PieChart.js index 3a38ef975..e4212fa7e 100644 --- a/content/examples_p5/Basics/Form/PieChart/PieChart.js +++ b/content/examples_p5/Basics/Form/PieChart/PieChart.js @@ -8,7 +8,8 @@ var angles = [ 30, 10, 45, 35, 60, 38, 75, 67 ]; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); noStroke(); noLoop(); // Run once and stop } diff --git a/content/examples_p5/Basics/Form/PointsLines/PointsLines.js b/content/examples_p5/Basics/Form/PointsLines/PointsLines.js index 0d1faa1ab..ddef81e95 100644 --- a/content/examples_p5/Basics/Form/PointsLines/PointsLines.js +++ b/content/examples_p5/Basics/Form/PointsLines/PointsLines.js @@ -13,7 +13,8 @@ function setup() { var p3 = p2+d; var p4 = p3+d; - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); noSmooth(); background(0); translate(140, 0); diff --git a/content/examples_p5/Basics/Form/RegularPolygon/RegularPolygon.js b/content/examples_p5/Basics/Form/RegularPolygon/RegularPolygon.js index 703f08d25..527d3b465 100644 --- a/content/examples_p5/Basics/Form/RegularPolygon/RegularPolygon.js +++ b/content/examples_p5/Basics/Form/RegularPolygon/RegularPolygon.js @@ -9,7 +9,8 @@ */ function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); } function draw() { diff --git a/content/examples_p5/Basics/Form/ShapePrimitives/ShapePrimitives.js b/content/examples_p5/Basics/Form/ShapePrimitives/ShapePrimitives.js index cd7918e2c..4a087a8aa 100644 --- a/content/examples_p5/Basics/Form/ShapePrimitives/ShapePrimitives.js +++ b/content/examples_p5/Basics/Form/ShapePrimitives/ShapePrimitives.js @@ -9,7 +9,8 @@ */ function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); background(0); noStroke(); diff --git a/content/examples_p5/Basics/Form/Star/Star.js b/content/examples_p5/Basics/Form/Star/Star.js index 91da2c7c2..6fa7a43b2 100644 --- a/content/examples_p5/Basics/Form/Star/Star.js +++ b/content/examples_p5/Basics/Form/Star/Star.js @@ -7,7 +7,8 @@ */ function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); } function draw() { diff --git a/content/examples_p5/Basics/Form/TriangleStrip/TriangleStrip.js b/content/examples_p5/Basics/Form/TriangleStrip/TriangleStrip.js index 915ea3c5d..9b5183e04 100644 --- a/content/examples_p5/Basics/Form/TriangleStrip/TriangleStrip.js +++ b/content/examples_p5/Basics/Form/TriangleStrip/TriangleStrip.js @@ -13,7 +13,8 @@ var outsideRadius = 150; var insideRadius = 100; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); background(204); x = width/2; y = height/2; diff --git a/content/examples_p5/Basics/Image/Alphamask/Alphamask.js b/content/examples_p5/Basics/Image/Alphamask/Alphamask.js index fe4827eba..c0ea76172 100644 --- a/content/examples_p5/Basics/Image/Alphamask/Alphamask.js +++ b/content/examples_p5/Basics/Image/Alphamask/Alphamask.js @@ -13,12 +13,13 @@ var img; var imgMask; function preload() { - img = loadImage("data/moonwalk.jpg"); - imgMask = loadImage("data/mask.png"); + img = loadImage("moonwalk.jpg"); + imgMask = loadImage("mask.png"); } function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); // Temporary fix until https://github.com/lmccart/p5.js/pull/533 imgMask.loadPixels(); for (var i = 0; i < imgMask.pixels.length; i+=4) { diff --git a/content/examples_p5/Basics/Image/BackgroundImage/BackgroundImage.js b/content/examples_p5/Basics/Image/BackgroundImage/BackgroundImage.js index 6813c9081..06e439c28 100644 --- a/content/examples_p5/Basics/Image/BackgroundImage/BackgroundImage.js +++ b/content/examples_p5/Basics/Image/BackgroundImage/BackgroundImage.js @@ -16,11 +16,12 @@ function preload() { // The background image must be the same size as the parameters // into the size() method. In this program, the size of the image // is 640 x 360 pixels. - bg = loadImage("data/moonwalk.jpg"); + bg = loadImage("moonwalk.jpg"); } function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); } function draw() { diff --git a/content/examples_p5/Basics/Image/CreateImage/CreateImage.js b/content/examples_p5/Basics/Image/CreateImage/CreateImage.js index 1cef69c08..6e895bbd3 100644 --- a/content/examples_p5/Basics/Image/CreateImage/CreateImage.js +++ b/content/examples_p5/Basics/Image/CreateImage/CreateImage.js @@ -8,7 +8,8 @@ var img; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); img = createImage(230, 230); img.loadPixels(); for(var i = 0; i < img.pixels.length; i+=4) { diff --git a/content/examples_p5/Basics/Image/LoadDisplayImage/LoadDisplayImage.js b/content/examples_p5/Basics/Image/LoadDisplayImage/LoadDisplayImage.js index dda8c7198..32805b06b 100644 --- a/content/examples_p5/Basics/Image/LoadDisplayImage/LoadDisplayImage.js +++ b/content/examples_p5/Basics/Image/LoadDisplayImage/LoadDisplayImage.js @@ -5,19 +5,17 @@ * or any other size. */ -// The next line is needed if running in JavaScript Mode with Processing.js -/* @pjs preload="moonwalk.jpg"; */ - var img; // Declare variable "a" of type PImage function preload() { // The image file must be in the data folder of the current sketch // to load successfully - img = loadImage("data/moonwalk.jpg"); + img = loadImage("moonwalk.jpg"); } function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); } function draw() { @@ -25,4 +23,5 @@ function draw() { image(img, 0, 0); // Displays the image at point (0, height/2) at half of its size image(img, 0, height/2, img.width/2, img.height/2); + noLoop(); } diff --git a/content/examples_p5/Basics/Image/Pointillism/Pointillism.js b/content/examples_p5/Basics/Image/Pointillism/Pointillism.js index e1c685c40..a17f0a564 100644 --- a/content/examples_p5/Basics/Image/Pointillism/Pointillism.js +++ b/content/examples_p5/Basics/Image/Pointillism/Pointillism.js @@ -14,12 +14,13 @@ var img; var smallPoint, largePoint; function preload() { - img = loadImage("data/moonwalk.jpg"); + img = loadImage("moonwalk.jpg"); } function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); smallPoint = 4; largePoint = 40; imageMode(CENTER); @@ -32,6 +33,6 @@ function draw() { var x = int(random(img.width)); var y = int(random(img.height)); var pix = img.get(x, y); - fill(pix, 128); + fill(pix[0], pix[1], pix[2], 128); ellipse(x, y, pointillize, pointillize); } diff --git a/content/examples_p5/Basics/Image/RequestImage/RequestImage.js b/content/examples_p5/Basics/Image/RequestImage/RequestImage.js index c6b1744d6..4e158f445 100644 --- a/content/examples_p5/Basics/Image/RequestImage/RequestImage.js +++ b/content/examples_p5/Basics/Image/RequestImage/RequestImage.js @@ -22,12 +22,13 @@ var loadStates = new Array(imgCount); var loaderX, loaderY, theta; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); imgW = width/imgCount; // Load images asynchronously for (var i = 0; i < imgCount; i++){ - imageLoader("data/PT_anim"+nf(i, 4)+".gif",i); + imageLoader("PT_anim"+nf(i, 4)+".gif",i); } } diff --git a/content/examples_p5/Basics/Image/Transparency/Transparency.js b/content/examples_p5/Basics/Image/Transparency/Transparency.js index 94756edbc..0b0963e39 100644 --- a/content/examples_p5/Basics/Image/Transparency/Transparency.js +++ b/content/examples_p5/Basics/Image/Transparency/Transparency.js @@ -14,11 +14,12 @@ var offset = 0; var easing = 0.05; function preload() { - img = loadImage("data/moonwalk.jpg"); // Load an image into the program + img = loadImage("moonwalk.jpg"); // Load an image into the program } function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); } function draw() { diff --git a/content/examples_p5/Basics/Input/Clock/Clock.js b/content/examples_p5/Basics/Input/Clock/Clock.js index a376aa804..44bbe70c9 100644 --- a/content/examples_p5/Basics/Input/Clock/Clock.js +++ b/content/examples_p5/Basics/Input/Clock/Clock.js @@ -13,7 +13,8 @@ var hoursRadius; var clockDiameter; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); stroke(255); var radius = min(width, height) / 2; diff --git a/content/examples_p5/Basics/Input/Constrain/Constrain.js b/content/examples_p5/Basics/Input/Constrain/Constrain.js index f61431bb3..d88c52cb5 100644 --- a/content/examples_p5/Basics/Input/Constrain/Constrain.js +++ b/content/examples_p5/Basics/Input/Constrain/Constrain.js @@ -13,7 +13,8 @@ var edge = 100; var inner = edge + radius; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); noStroke(); ellipseMode(RADIUS); rectMode(CORNERS); diff --git a/content/examples_p5/Basics/Input/Easing/Easing.js b/content/examples_p5/Basics/Input/Easing/Easing.js index e14f81e75..d98f300b7 100644 --- a/content/examples_p5/Basics/Input/Easing/Easing.js +++ b/content/examples_p5/Basics/Input/Easing/Easing.js @@ -14,7 +14,8 @@ var y = 0; var easing = 0.05; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); noStroke(); } diff --git a/content/examples_p5/Basics/Input/Keyboard/Keyboard.js b/content/examples_p5/Basics/Input/Keyboard/Keyboard.js index d5054ab83..2911eb2e0 100644 --- a/content/examples_p5/Basics/Input/Keyboard/Keyboard.js +++ b/content/examples_p5/Basics/Input/Keyboard/Keyboard.js @@ -9,7 +9,8 @@ var rectWidth; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); noStroke(); background(0); rectWidth = width/4; diff --git a/content/examples_p5/Basics/Input/KeyboardFunctions/KeyboardFunctions.js b/content/examples_p5/Basics/Input/KeyboardFunctions/KeyboardFunctions.js index 7c10ebcde..bee464c7e 100644 --- a/content/examples_p5/Basics/Input/KeyboardFunctions/KeyboardFunctions.js +++ b/content/examples_p5/Basics/Input/KeyboardFunctions/KeyboardFunctions.js @@ -1,8 +1,3 @@ -// Need these resolved first: -// https://github.com/lmccart/p5.js/issues/537 -// https://github.com/lmccart/p5.js/issues/536 - - // /** // * Keyboard Functions. // * Modified from code by Martin. @@ -14,87 +9,88 @@ // * function that is called when a key is released. // */ -// var maxHeight = 40; -// var minHeight = 20; -// var letterHeight = maxHeight; // Height of the letters -// var letterWidth = 20; // Width of the letter +var maxHeight = 40; +var minHeight = 20; +var letterHeight = maxHeight; // Height of the letters +var letterWidth = 20; // Width of the letter -// var x = -letterWidth; // X position of the letters -// var y = 0; // Y position of the letters +var x = -letterWidth; // X position of the letters +var y = 0; // Y position of the letters -// var newletter; +var newletter; -// var numChars = 26; // There are 26 characters in the alphabet -// var colors = []; +var numChars = 26; // There are 26 characters in the alphabet +var colors = []; -// function setup() -// { -// createCanvas(640, 360); -// noStroke(); -// //colorMode(HSB, numChars); -// background(numChars/2); -// // Set a gray value for each key -// for(var i = 0; i < numChars; i++) { -// colors[i] = color(i, numChars, numChars); -// } +function setup() +{ + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); + noStroke(); + colorMode(HSB, numChars); + background(numChars/2); + // Set a gray value for each key + for(var i = 0; i < numChars; i++) { + colors[i] = color(i, numChars, numChars); + } -// } +} -// function draw() -// { -// if(newletter == true) { -// // Draw the "letter" -// var y_pos; -// if (letterHeight == maxHeight) { -// y_pos = y; -// rect( x, y_pos, letterWidth, letterHeight ); -// } else { -// y_pos = y + minHeight; -// rect( x, y_pos, letterWidth, letterHeight ); -// fill(numChars/2); -// rect( x, y_pos-minHeight, letterWidth, letterHeight ); -// } -// console.log(letterWidth,letterHeight); -// newletter = false; -// println(letterWidth,letterHeight); +function draw() +{ + if(newletter == true) { + // Draw the "letter" + var y_pos; + if (letterHeight == maxHeight) { + y_pos = y; + rect( x, y_pos, letterWidth, letterHeight ); + } else { + y_pos = y + minHeight; + rect( x, y_pos, letterWidth, letterHeight ); + fill(numChars/2); + rect( x, y_pos-minHeight, letterWidth, letterHeight ); + } + console.log(letterWidth,letterHeight); + newletter = false; + println(letterWidth,letterHeight); -// } -// } + } +} -// function keyPressed() { -// console.log(key); -// var keyVal = key.charCodeAt(0); -// println(keyVal); -// // If the key is between 'A'(65) to 'Z' and 'a' to 'z'(122) -// if((keyVal >= 'A'.charCodeAt(0) && keyVal <= 'Z'.charCodeAt(0)) || (keyVal >= 'a'.charCodeAt(0) && keyVal <= 'z'.charCodeAt(0))) { -// var keyIndex = 0; -// if(keyVal <= 'Z'.charCodeAt(0)) { -// keyIndex = keyVal-'A'.charCodeAt(0); -// letterHeight = maxHeight; -// fill(colors[keyVal-'A'.charCodeAt(0)]); -// } else { -// keyIndex = keyVal-'a'.charCodeAt(0); -// letterHeight = minHeight; -// fill(colors[keyVal-'a'.charCodeAt(0)]); -// } -// } else { -// fill(0); -// letterHeight = 10; -// } +function keyTyped() { + console.log(key); + var keyVal = key.charCodeAt(0); + println(keyVal); + // If the key is between 'A'(65) to 'Z' and 'a' to 'z'(122) + if((keyVal >= 'A'.charCodeAt(0) && keyVal <= 'Z'.charCodeAt(0)) || (keyVal >= 'a'.charCodeAt(0) && keyVal <= 'z'.charCodeAt(0))) { + var keyIndex = 0; + if(keyVal <= 'Z'.charCodeAt(0)) { + keyIndex = keyVal-'A'.charCodeAt(0); + letterHeight = maxHeight; + fill(colors[keyVal-'A'.charCodeAt(0)]); + } else { + keyIndex = keyVal-'a'.charCodeAt(0); + letterHeight = minHeight; + fill(colors[keyVal-'a'.charCodeAt(0)]); + } + } else { + fill(0); + letterHeight = 10; + } -// newletter = true; + newletter = true; -// // Update the "letter" position -// x = ( x + letterWidth ); + // Update the "letter" position + x = ( x + letterWidth ); -// // Wrap horizontally -// if (x > width - letterWidth) { -// x = 0; -// y+= maxHeight; -// } + // Wrap horizontally + if (x > width - letterWidth) { + x = 0; + y+= maxHeight; + } -// // Wrap vertically -// if( y > height - letterHeight) { -// y = 0; // reset y to 0 -// } -// } + // Wrap vertically + if( y > height - letterHeight) { + y = 0; // reset y to 0 + } +} diff --git a/content/examples_p5/Basics/Input/Milliseconds/Milliseconds.js b/content/examples_p5/Basics/Input/Milliseconds/Milliseconds.js index 2e6fe7fae..7bfcd27cf 100644 --- a/content/examples_p5/Basics/Input/Milliseconds/Milliseconds.js +++ b/content/examples_p5/Basics/Input/Milliseconds/Milliseconds.js @@ -10,7 +10,8 @@ var scale; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); noStroke(); scale = width/20; } diff --git a/content/examples_p5/Basics/Input/Mouse1D/Mouse1D.js b/content/examples_p5/Basics/Input/Mouse1D/Mouse1D.js index 3c30d2b37..20b77f39a 100644 --- a/content/examples_p5/Basics/Input/Mouse1D/Mouse1D.js +++ b/content/examples_p5/Basics/Input/Mouse1D/Mouse1D.js @@ -7,7 +7,8 @@ */ function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); noStroke(); colorMode(RGB, height, height, height); rectMode(CENTER); diff --git a/content/examples_p5/Basics/Input/Mouse2D/Mouse2D.js b/content/examples_p5/Basics/Input/Mouse2D/Mouse2D.js index b8e2f1a34..ebb9b64a1 100644 --- a/content/examples_p5/Basics/Input/Mouse2D/Mouse2D.js +++ b/content/examples_p5/Basics/Input/Mouse2D/Mouse2D.js @@ -6,7 +6,8 @@ function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); noStroke(); rectMode(CENTER); } diff --git a/content/examples_p5/Basics/Input/MouseFunctions/MouseFunctions.js b/content/examples_p5/Basics/Input/MouseFunctions/MouseFunctions.js index e1160a0d4..f65d563ac 100644 --- a/content/examples_p5/Basics/Input/MouseFunctions/MouseFunctions.js +++ b/content/examples_p5/Basics/Input/MouseFunctions/MouseFunctions.js @@ -14,7 +14,8 @@ var yOffset = 0.0; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); bx = width/2.0; by = height/2.0; rectMode(RADIUS); diff --git a/content/examples_p5/Basics/Input/MousePress/MousePress.js b/content/examples_p5/Basics/Input/MousePress/MousePress.js index 0898b0b31..961c3f57a 100644 --- a/content/examples_p5/Basics/Input/MousePress/MousePress.js +++ b/content/examples_p5/Basics/Input/MousePress/MousePress.js @@ -7,7 +7,8 @@ function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); noSmooth(); fill(126); background(102); diff --git a/content/examples_p5/Basics/Input/MouseSignals/MouseSignals.js b/content/examples_p5/Basics/Input/MouseSignals/MouseSignals.js index 8225af9e6..43889de8d 100644 --- a/content/examples_p5/Basics/Input/MouseSignals/MouseSignals.js +++ b/content/examples_p5/Basics/Input/MouseSignals/MouseSignals.js @@ -13,7 +13,8 @@ var bvals; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); noSmooth(); xvals = []; yvals = []; @@ -50,10 +51,10 @@ function draw() { for(var i=1; i 10) { @@ -84,7 +86,7 @@ function mousePressed() { } // Writing the CSV back to the same file - // saveTable(table, "data/data.csv"); + // saveTable(table, "/data.csv"); // And reloading it loadData(); } diff --git a/content/examples_p5/Topics/Advanced Data/LoadSaveXML/LoadSaveXML.js b/content/examples_p5/Topics/Advanced Data/LoadSaveXML/LoadSaveXML.js index dcf37b970..92618b264 100644 --- a/content/examples_p5/Topics/Advanced Data/LoadSaveXML/LoadSaveXML.js +++ b/content/examples_p5/Topics/Advanced Data/LoadSaveXML/LoadSaveXML.js @@ -31,13 +31,14 @@ var bubbles = []; var xml; function preload() { - xml = loadXML("data/data.xml"); + xml = loadXML("/data.xml"); } function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); loadData(); - loadXML("data/data.xml",test); + loadXML("/data.xml",test); } function test(xml) { @@ -61,7 +62,7 @@ function draw() { function loadData() { // Load XML file - // xml = loadXML("data.xml"); + // xml = loadXML(".xml"); // // Get all the child nodes named "bubble" // XML[] children = xml.getChildren("bubble"); @@ -123,7 +124,7 @@ function mousePressed() { // } // // Save a new XML file - // saveXML(xml,"data/data.xml"); + // saveXML(xml,"/data.xml"); // // reload the new data // loadData(); diff --git a/content/examples_p5/Topics/Advanced Data/XMLYahooWeather/XMLYahooWeather.js b/content/examples_p5/Topics/Advanced Data/XMLYahooWeather/XMLYahooWeather.js index f8d53513e..2801407f4 100644 --- a/content/examples_p5/Topics/Advanced Data/XMLYahooWeather/XMLYahooWeather.js +++ b/content/examples_p5/Topics/Advanced Data/XMLYahooWeather/XMLYahooWeather.js @@ -11,27 +11,29 @@ // We're going to store the temperature var temperature = 0; // We're going to store text about the weather -String weather = ""; +var weather = ""; // The zip code we'll check for -String zip = "10003"; +var zip = "10003"; -PFont font; +var xml; + +function preload() { + var url = "http://xml.weather.yahoo.com/forecastrss?p=" + zip; + // Load the XML document + xml = loadXML(url); + +} function setup() { createCanvas(600, 360); - font = createFont("Merriweather-Light.ttf", 28); - textFont(font); + textFont("Merriweather Light", 28); // The URL for the XML document - String url = "http://xml.weather.yahoo.com/forecastrss?p=" + zip; - - // Load the XML document - XML xml = loadXML(url); // Grab the element we want - XML forecast = xml.getChild("channel/item/yweather:forecast"); + var forecast = xml.getChild("channel/item/yweather:forecast"); // Get the attributes we want temperature = forecast.getInt("high"); diff --git a/content/examples_p5/Topics/Animation/AnimatedSprite/AnimatedSprite.js b/content/examples_p5/Topics/Animation/AnimatedSprite/AnimatedSprite.js index 6cafaea72..39029a78b 100644 --- a/content/examples_p5/Topics/Animation/AnimatedSprite/AnimatedSprite.js +++ b/content/examples_p5/Topics/Animation/AnimatedSprite/AnimatedSprite.js @@ -21,7 +21,8 @@ function preload() { } function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); background(255, 204, 0); frameRate(24); ypos = height * 0.25; diff --git a/content/examples_p5/Topics/Animation/AnimatedSprite/Animation.js b/content/examples_p5/Topics/Animation/AnimatedSprite/Animation.js index 9eb9a3a65..bc54af5f9 100644 --- a/content/examples_p5/Topics/Animation/AnimatedSprite/Animation.js +++ b/content/examples_p5/Topics/Animation/AnimatedSprite/Animation.js @@ -8,7 +8,7 @@ function Animation(imagePrefix, count) { for (var i = 0; i < this.imageCount; i++) { // Use nf() to number format 'i' into four digits - var filename = 'data/' + imagePrefix + nf(i, 4) + ".gif"; + var filename = imagePrefix + nf(i, 4) + ".gif"; this.images[i] = loadImage(filename); } diff --git a/content/examples_p5/Topics/Animation/Sequential/Sequential.js b/content/examples_p5/Topics/Animation/Sequential/Sequential.js index 3dab0f938..a34076e9d 100644 --- a/content/examples_p5/Topics/Animation/Sequential/Sequential.js +++ b/content/examples_p5/Topics/Animation/Sequential/Sequential.js @@ -17,18 +17,18 @@ var currentFrame = 0; var images = []; function preload() { - images[0] = loadImage("data/PT_anim0000.gif"); - images[1] = loadImage("data/PT_anim0001.gif"); - images[2] = loadImage("data/PT_anim0002.gif"); - images[3] = loadImage("data/PT_anim0003.gif"); - images[4] = loadImage("data/PT_anim0004.gif"); - images[5] = loadImage("data/PT_anim0005.gif"); - images[6] = loadImage("data/PT_anim0006.gif"); - images[7] = loadImage("data/PT_anim0007.gif"); - images[8] = loadImage("data/PT_anim0008.gif"); - images[9] = loadImage("data/PT_anim0009.gif"); - images[10] = loadImage("data/PT_anim0010.gif"); - images[11] = loadImage("data/PT_anim0011.gif"); + images[0] = loadImage("PT_anim0000.gif"); + images[1] = loadImage("PT_anim0001.gif"); + images[2] = loadImage("PT_anim0002.gif"); + images[3] = loadImage("PT_anim0003.gif"); + images[4] = loadImage("PT_anim0004.gif"); + images[5] = loadImage("PT_anim0005.gif"); + images[6] = loadImage("PT_anim0006.gif"); + images[7] = loadImage("PT_anim0007.gif"); + images[8] = loadImage("PT_anim0008.gif"); + images[9] = loadImage("PT_anim0009.gif"); + images[10] = loadImage("PT_anim0010.gif"); + images[11] = loadImage("PT_anim0011.gif"); // If you don't want to load each image separately // and you know how many frames you have, you @@ -41,7 +41,8 @@ function preload() { //} } function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); frameRate(24); diff --git a/content/examples_p5/Topics/Cellular Automata/GameOfLife/GameOfLife.js b/content/examples_p5/Topics/Cellular Automata/GameOfLife/GameOfLife.js index 1c95d681e..083afbba8 100644 --- a/content/examples_p5/Topics/Cellular Automata/GameOfLife/GameOfLife.js +++ b/content/examples_p5/Topics/Cellular Automata/GameOfLife/GameOfLife.js @@ -41,7 +41,8 @@ function make2DArray(cols,rows) { } function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); alive = color(0, 200, 0); dead = color(0); // Instantiate arrays @@ -93,7 +94,7 @@ function draw() { } // Create new cells manually on pause - if (pause && mousePressed) { + if (pause && mouseIsPressed) { // Map and avoid out of bound errors var xCellOver = int(map(mouseX, 0, width, 0, width/cellSize)); xCellOver = constrain(xCellOver, 0, width/cellSize-1); @@ -110,7 +111,7 @@ function draw() { fill(alive); // Fill alive color } } - else if (pause && !mousePressed) { // And then save to buffer once mouse goes up + else if (pause && !mouseIsPressed) { // And then save to buffer once mouse goes up // Save cells to buffer (so we opeate with one array keeping the other intact) for (var x=0; x 16.0) { - break; // Bail + // Now we test, as we iterate z = z^2 + cm does z tend towards infinity? + var a = x; + var b = y; + var n = 0; + while (n < maxiterations) { + var aa = a * a; + var bb = b * b; + var twoab = 2.0 * a * b; + a = aa - bb + x; + b = twoab + y; + // Infinty in our finite world is simple, let's just consider it 16 + if (aa + bb > 16.0) { + break; // Bail + } + n++; } - n++; - } - // We color each pixel based on how long it takes to get to infinity - // If we never got there, let's pick the color black - var loc = (i+j*width)*4 - if (n == maxiterations) { - pixels[loc] = 0; - pixels[loc+1] = 0; - pixels[loc+2] = 0; - pixels[loc+3] = 255; - } else { - // Gosh, we could make fancy colors here if we wanted - pixels[loc] = n*16 % 255; - pixels[loc+1] = n*16 % 255; - pixels[loc+2] = n*16 % 255; - pixels[loc+3] = 255; + // We color each pixel based on how long it takes to get to infinity + // If we never got there, let's pick the color black + var loc = (i+j*width)*4 + if (n == maxiterations) { + pixels[loc] = 0; + pixels[loc+1] = 0; + pixels[loc+2] = 0; + pixels[loc+3] = 255; + } else { + // Gosh, we could make fancy colors here if we wanted + pixels[loc] = n*16 % 255; + pixels[loc+1] = n*16 % 255; + pixels[loc+2] = n*16 % 255; + pixels[loc+3] = 255; + } + x += dx; } - x += dx; + y += dy; } - y += dy; -} -updatePixels(); + updatePixels(); } diff --git a/content/examples_p5/Topics/Fractals and L-Systems/PenroseSnowflake/PenroseSnowflake.js b/content/examples_p5/Topics/Fractals and L-Systems/PenroseSnowflake/PenroseSnowflake.js index f6d9e4cda..e74bc95bc 100644 --- a/content/examples_p5/Topics/Fractals and L-Systems/PenroseSnowflake/PenroseSnowflake.js +++ b/content/examples_p5/Topics/Fractals and L-Systems/PenroseSnowflake/PenroseSnowflake.js @@ -8,7 +8,8 @@ var ps; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); stroke(255); noFill(); ps = new PenroseSnowflakeLSystem(); diff --git a/content/examples_p5/Topics/Fractals and L-Systems/PenroseTile/PenroseTile.js b/content/examples_p5/Topics/Fractals and L-Systems/PenroseTile/PenroseTile.js index f0f6aefd8..f4aea6657 100644 --- a/content/examples_p5/Topics/Fractals and L-Systems/PenroseTile/PenroseTile.js +++ b/content/examples_p5/Topics/Fractals and L-Systems/PenroseTile/PenroseTile.js @@ -8,7 +8,8 @@ var ds; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); ds = new PenroseLSystem(); ds.simulate(4); } diff --git a/content/examples_p5/Topics/Fractals and L-Systems/Pentigree/Pentigree.js b/content/examples_p5/Topics/Fractals and L-Systems/Pentigree/Pentigree.js index 669e0f53c..8248a161e 100644 --- a/content/examples_p5/Topics/Fractals and L-Systems/Pentigree/Pentigree.js +++ b/content/examples_p5/Topics/Fractals and L-Systems/Pentigree/Pentigree.js @@ -9,7 +9,8 @@ var ps; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); ps = new PentigreeLSystem(); ps.simulate(3); } diff --git a/content/examples_p5/Topics/Fractals and L-Systems/Tree/Tree.js b/content/examples_p5/Topics/Fractals and L-Systems/Tree/Tree.js index be0922ccf..605874239 100644 --- a/content/examples_p5/Topics/Fractals and L-Systems/Tree/Tree.js +++ b/content/examples_p5/Topics/Fractals and L-Systems/Tree/Tree.js @@ -11,7 +11,8 @@ var theta; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); } function draw() { diff --git a/content/examples_p5/Topics/GUI/Button/Button.js b/content/examples_p5/Topics/GUI/Button/Button.js index 310cfc9d5..bfe82ccf8 100644 --- a/content/examples_p5/Topics/GUI/Button/Button.js +++ b/content/examples_p5/Topics/GUI/Button/Button.js @@ -1,7 +1,7 @@ /** * Button. * - * Click on one of the colored squares in the + * Click on one of the colored shapes in the * center of the image to change the color of * the background. */ @@ -17,7 +17,8 @@ var rectOver = false; var circleOver = false; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); rectColor = color(0); rectHighlight = color(51); circleColor = color(255); diff --git a/content/examples_p5/Topics/GUI/Handles/Handles.js b/content/examples_p5/Topics/GUI/Handles/Handles.js index 8cd6592e9..c13b7d9cf 100644 --- a/content/examples_p5/Topics/GUI/Handles/Handles.js +++ b/content/examples_p5/Topics/GUI/Handles/Handles.js @@ -7,7 +7,8 @@ var handles; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); var num = height/15; handles = []; var hsize = 10; diff --git a/content/examples_p5/Topics/GUI/Rollover/Rollover.js b/content/examples_p5/Topics/GUI/Rollover/Rollover.js index c1b620baf..c42e5bbee 100644 --- a/content/examples_p5/Topics/GUI/Rollover/Rollover.js +++ b/content/examples_p5/Topics/GUI/Rollover/Rollover.js @@ -19,7 +19,8 @@ var rectOver = false; var circleOver = false; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); rectColor = color(0); circleColor = color(255); baseColor = color(102); diff --git a/content/examples_p5/Topics/GUI/Scrollbar/Scrollbar.js b/content/examples_p5/Topics/GUI/Scrollbar/Scrollbar.js index f70278e10..56128a5b6 100644 --- a/content/examples_p5/Topics/GUI/Scrollbar/Scrollbar.js +++ b/content/examples_p5/Topics/GUI/Scrollbar/Scrollbar.js @@ -14,12 +14,13 @@ var img1, img2; // Two images to load function preload() { // Load images - img1 = loadImage("data/seedTop.jpg"); - img2 = loadImage("data/seedBottom.jpg"); + img1 = loadImage("seedTop.jpg"); + img2 = loadImage("seedBottom.jpg"); } function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); noStroke(); hs1 = new HScrollbar(0, height/2-8, width, 16, 16); diff --git a/content/examples_p5/Topics/Image Processing/Blur/Blur.js b/content/examples_p5/Topics/Image Processing/Blur/Blur.js index 2449ac79b..5dbad4bfb 100644 --- a/content/examples_p5/Topics/Image Processing/Blur/Blur.js +++ b/content/examples_p5/Topics/Image Processing/Blur/Blur.js @@ -16,12 +16,13 @@ var kernel = [[ v, v, v ], var img; function preload() { - img = loadImage("data/moon.jpg"); // Load the original image + img = loadImage("moon.jpg"); // Load the original image } function setup() { - createCanvas(640, 360); - devicePixelScaling(false); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); + pixelDensity(1); noLoop(); } diff --git a/content/examples_p5/Topics/Image Processing/Brightness/Brightness.js b/content/examples_p5/Topics/Image Processing/Brightness/Brightness.js index ac7ef600f..5af1796f0 100644 --- a/content/examples_p5/Topics/Image Processing/Brightness/Brightness.js +++ b/content/examples_p5/Topics/Image Processing/Brightness/Brightness.js @@ -12,12 +12,13 @@ var img; function preload() { - img = loadImage("data/moon-wide.jpg"); + img = loadImage("moon-wide.jpg"); } function setup() { - createCanvas(640, 360); - devicePixelScaling(false); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); + pixelDensity(1); frameRate(30); img.loadPixels(); // Only need to load the pixels[] array once, because we're only diff --git a/content/examples_p5/Topics/Image Processing/Convolution/Convolution.js b/content/examples_p5/Topics/Image Processing/Convolution/Convolution.js index 3641b643e..0c96bfe3b 100644 --- a/content/examples_p5/Topics/Image Processing/Convolution/Convolution.js +++ b/content/examples_p5/Topics/Image Processing/Convolution/Convolution.js @@ -20,12 +20,13 @@ var matrix = [ [ -1, -1, -1 ] , function preload() { - img = loadImage("data/moon-wide.jpg"); + img = loadImage("moon-wide.jpg"); } function setup() { - createCanvas(640, 360); - devicePixelScaling(false); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); + pixelDensity(1); } function draw() { @@ -76,7 +77,7 @@ function convolution(x, y, matrix, matrixsize, img) { // Make sure we haven't walked off the edge of the pixel array // It is often good when looking at neighboring pixels to make sure we have not gone off the edge of the pixel array by accident. - loc = constrain(loc, 0, img.pixels.length-1); + loc = constrain(loc, 0, img.pixels.length-3); // Calculate the convolution // We sum all the neighboring pixels multiplied by the values in the convolution matrix. rtotal += img.pixels[loc ] * matrix[i][j]; diff --git a/content/examples_p5/Topics/Image Processing/Convolution/testing.html b/content/examples_p5/Topics/Image Processing/Convolution/testing.html index 09ea2514c..372fe7f65 100644 --- a/content/examples_p5/Topics/Image Processing/Convolution/testing.html +++ b/content/examples_p5/Topics/Image Processing/Convolution/testing.html @@ -1,11 +1,12 @@ - - + + +
    diff --git a/content/examples_p5/Topics/Image Processing/EdgeDetection/EdgeDetection.js b/content/examples_p5/Topics/Image Processing/EdgeDetection/EdgeDetection.js index 05c0adbb1..6f20c9c48 100644 --- a/content/examples_p5/Topics/Image Processing/EdgeDetection/EdgeDetection.js +++ b/content/examples_p5/Topics/Image Processing/EdgeDetection/EdgeDetection.js @@ -17,12 +17,13 @@ var kernel = [[ -1, -1, -1 ], var img; function preload() { - img = loadImage("data/moon.jpg"); // Load the original image + img = loadImage("moon.jpg"); // Load the original image } function setup() { - createCanvas(640, 360); - devicePixelScaling(false); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); + pixelDensity(1); noLoop(); } diff --git a/content/examples_p5/Topics/Image Processing/Histogram/Histogram.js b/content/examples_p5/Topics/Image Processing/Histogram/Histogram.js index 4b8ed9a97..be7cf9eb9 100644 --- a/content/examples_p5/Topics/Image Processing/Histogram/Histogram.js +++ b/content/examples_p5/Topics/Image Processing/Histogram/Histogram.js @@ -16,41 +16,48 @@ // This needs to be resolved: https://github.com/processing/p5.js/issues/563 -// var img; +var img; -// function preload() { -// img = loadImage("data/frontier.jpg"); -// } +function preload() { + img = loadImage("frontier.jpg"); +} -// function setup() { +function setup() { + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); // Load an image from the data directory // Load a different image by modifying the comments - // image(img, 0, 0); - // var hist = []; - // loadPixels(); - // // Calculate the histogram - // for (var i = 0; i < img.width; i++) { - // for (var j = 0; j < img.height; j++) { - // var c = get(i,j); - // var col = color(c[0],c[1],c[2]) - // println(c,col); - // var bright = brightness(col); - // //hist[bright]++; - // break; - // } - // } - - // // Find the largest value in the histogram - // var histMax = max(hist); - - // stroke(255); - // // Draw half of the histogram (skip every second value) - // for (var i = 0; i < img.width; i += 2) { - // // Map i (from 0..img.width) to a location in the histogram (0..255) - // var which = int(map(i, 0, img.width, 0, 255)); - // // Convert the histogram value to a location between - // // the bottom and the top of the picture - // var y = int(map(hist[which], 0, histMax, img.height, 0)); - // line(i, img.height, i, y); - // } -//} + image(img, 0, 0); + var hist = []; + for (var i = 0; i < 256; i++) { + hist[i] = 0; + } + img.loadPixels(); + // Calculate the histogram + for (var i = 0; i < img.width; i++) { + for (var j = 0; j < img.height; j++) { + var index = (i + j * img.width) * 4; + var r = img.pixels[index]; + var g = img.pixels[index+1]; + var b = img.pixels[index+2]; + //println(c,col); + var bright = floor((r+g+b)/3); + hist[bright]++; + //break; + } + } + + // Find the largest value in the histogram + var histMax = max(hist); + + stroke(255); + // Draw half of the histogram (skip every second value) + for (var i = 0; i < img.width; i += 2) { + // Map i (from 0..img.width) to a location in the histogram (0..255) + var which = int(map(i, 0, img.width, 0, 255)); + // Convert the histogram value to a location between + // the bottom and the top of the picture + var y = int(map(hist[which], 0, histMax, img.height, 0)); + line(i, img.height, i, y); + } +} diff --git a/content/examples_p5/Topics/Image Processing/Histogram/testing.html b/content/examples_p5/Topics/Image Processing/Histogram/testing.html index 97bd3fa19..a73776eba 100644 --- a/content/examples_p5/Topics/Image Processing/Histogram/testing.html +++ b/content/examples_p5/Topics/Image Processing/Histogram/testing.html @@ -1,7 +1,7 @@ - - + + diff --git a/content/examples_p5/Topics/Image Processing/LinearImage/LinearImage.js b/content/examples_p5/Topics/Image Processing/LinearImage/LinearImage.js index 347c406b6..6fc66f0f8 100644 --- a/content/examples_p5/Topics/Image Processing/LinearImage/LinearImage.js +++ b/content/examples_p5/Topics/Image Processing/LinearImage/LinearImage.js @@ -10,44 +10,45 @@ // This needs to be resolved: https://github.com/processing/p5.js/issues/478 -// var img; -// var direction = 1; - -// var signal = 0; - -// function preload() { -// img = loadImage("data/sea.jpg"); -// } - -// function setup() { -// createCanvas(640, 360); -// stroke(255); -// img.loadPixels(); -// loadPixels(); -// } - -// function draw() { -// loadPixels(); -// if (signal > img.height-1 || signal < 0) { -// direction = direction * -1; -// } -// if (mouseIsPressed == true) { -// signal = abs(mouseY % img.height); -// } -// else { -// signal += (0.3*direction); -// } - -// if (keyIsPressed == true) { -// set(0, 0, img); -// line(0, signal, img.width, signal); -// } -// else { -// var signalOffset = int(signal)*img.width; -// for (var y = 0; y < img.height; y++) { -// //arrayCopy(img.pixels, signalOffset, pixels, y*width, img.width); -// } -// updatePixels(); -// } -// } +var img; +var direction = 1; + +var signal = 0; + +function preload() { + img = loadImage("sea.jpg"); +} + +function setup() { + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); + stroke(255); + img.loadPixels(); + loadPixels(); +} + +function draw() { + loadPixels(); + if (signal > img.height-1 || signal < 0) { + direction = direction * -1; + } + if (mouseIsPressed == true) { + signal = abs(mouseY % img.height); + } + else { + signal += (0.3*direction); + } + + if (keyIsPressed == true) { + set(0, 0, img); + line(0, signal, img.width, signal); + } + else { + var signalOffset = int(signal)*img.width; + for (var y = 0; y < img.height; y++) { + arrayCopy(img.pixels, signalOffset, pixels, y*width, img.width); + } + updatePixels(); + } +} diff --git a/content/examples_p5/Topics/Image Processing/PixelArray/PixelArray.js b/content/examples_p5/Topics/Image Processing/PixelArray/PixelArray.js index c1071a796..8215fcaf7 100644 --- a/content/examples_p5/Topics/Image Processing/PixelArray/PixelArray.js +++ b/content/examples_p5/Topics/Image Processing/PixelArray/PixelArray.js @@ -15,11 +15,12 @@ var direction = 1; var signal = 0; function preload() { - img = loadImage("data/sea.jpg"); + img = loadImage("sea.jpg"); } function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); noFill(); stroke(255); frameRate(30); diff --git a/content/examples_p5/Topics/Interaction/Follow1/Follow1.js b/content/examples_p5/Topics/Interaction/Follow1/Follow1.js index dade515f9..450c68317 100644 --- a/content/examples_p5/Topics/Interaction/Follow1/Follow1.js +++ b/content/examples_p5/Topics/Interaction/Follow1/Follow1.js @@ -11,7 +11,8 @@ var angle1 = 0.0; var segLength = 50; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); strokeWeight(20.0); stroke(255, 100); } diff --git a/content/examples_p5/Topics/Interaction/Follow2/Follow2.js b/content/examples_p5/Topics/Interaction/Follow2/Follow2.js index 443dbd5a9..239489e3d 100644 --- a/content/examples_p5/Topics/Interaction/Follow2/Follow2.js +++ b/content/examples_p5/Topics/Interaction/Follow2/Follow2.js @@ -12,7 +12,8 @@ var y = [0,0]; var segLength = 50; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); strokeWeight(20.0); stroke(255, 100); } diff --git a/content/examples_p5/Topics/Interaction/Follow3/Follow3.js b/content/examples_p5/Topics/Interaction/Follow3/Follow3.js index c7de627fc..c1a40d068 100644 --- a/content/examples_p5/Topics/Interaction/Follow3/Follow3.js +++ b/content/examples_p5/Topics/Interaction/Follow3/Follow3.js @@ -12,7 +12,8 @@ var y = new Array(20); var segLength = 18; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); strokeWeight(9); stroke(255, 100); for (var i = 0; i < x.length; i++) { diff --git a/content/examples_p5/Topics/Interaction/Reach1/Reach1.js b/content/examples_p5/Topics/Interaction/Reach1/Reach1.js index 943da8172..73c600dad 100644 --- a/content/examples_p5/Topics/Interaction/Reach1/Reach1.js +++ b/content/examples_p5/Topics/Interaction/Reach1/Reach1.js @@ -11,7 +11,8 @@ var segLength = 80; var x, y, x2, y2; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); strokeWeight(20.0); stroke(255, 100); diff --git a/content/examples_p5/Topics/Interaction/Reach2/Reach2.js b/content/examples_p5/Topics/Interaction/Reach2/Reach2.js index 57fcb81e9..301e06c68 100644 --- a/content/examples_p5/Topics/Interaction/Reach2/Reach2.js +++ b/content/examples_p5/Topics/Interaction/Reach2/Reach2.js @@ -14,7 +14,8 @@ var segLength = 26; var targetX, targetY = 0; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); strokeWeight(20.0); stroke(255, 100); for (var i = 0 ; i < x.length; i++) { diff --git a/content/examples_p5/Topics/Interaction/Reach3/Reach3.js b/content/examples_p5/Topics/Interaction/Reach3/Reach3.js index 32e847685..735caed22 100644 --- a/content/examples_p5/Topics/Interaction/Reach3/Reach3.js +++ b/content/examples_p5/Topics/Interaction/Reach3/Reach3.js @@ -19,7 +19,8 @@ var ballXDirection = 1; var ballYDirection = -1; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); strokeWeight(20.0); stroke(255, 100); noFill(); diff --git a/content/examples_p5/Topics/Interaction/Tickle/Tickle.js b/content/examples_p5/Topics/Interaction/Tickle/Tickle.js index 3dd928322..a40efcf6a 100644 --- a/content/examples_p5/Topics/Interaction/Tickle/Tickle.js +++ b/content/examples_p5/Topics/Interaction/Tickle/Tickle.js @@ -13,11 +13,11 @@ var x, y; // X and Y coordinates of text var hr, vr; // horizontal and vertical radius of the text function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); // Create the font - textFont("Georgia"); - textSize(36); + textFont("Source Code Pro", 36); textAlign(CENTER, CENTER); hr = textWidth(message) / 2; diff --git a/content/examples_p5/Topics/Motion/Bounce/Bounce.js b/content/examples_p5/Topics/Motion/Bounce/Bounce.js index 5f1e8b4cf..a656a8d0b 100644 --- a/content/examples_p5/Topics/Motion/Bounce/Bounce.js +++ b/content/examples_p5/Topics/Motion/Bounce/Bounce.js @@ -16,7 +16,8 @@ var ydirection = 1; // Top to Bottom function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); noStroke(); frameRate(30); ellipseMode(RADIUS); diff --git a/content/examples_p5/Topics/Motion/BouncyBubbles/BouncyBubbles.js b/content/examples_p5/Topics/Motion/BouncyBubbles/BouncyBubbles.js index 2145a4563..62c702178 100644 --- a/content/examples_p5/Topics/Motion/BouncyBubbles/BouncyBubbles.js +++ b/content/examples_p5/Topics/Motion/BouncyBubbles/BouncyBubbles.js @@ -13,7 +13,8 @@ var friction = -0.9; var balls = []; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); for (var i = 0; i < numBalls; i++) { balls[i] = new Ball(random(width), random(height), random(30, 70), i, balls); } diff --git a/content/examples_p5/Topics/Motion/Brownian/Brownian.js b/content/examples_p5/Topics/Motion/Brownian/Brownian.js index 42ff4ab66..a461b7178 100644 --- a/content/examples_p5/Topics/Motion/Brownian/Brownian.js +++ b/content/examples_p5/Topics/Motion/Brownian/Brownian.js @@ -13,7 +13,8 @@ var ay = []; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); for(var i = 0; i < num; i++) { ax[i] = width/2; ay[i] = height/2; diff --git a/content/examples_p5/Topics/Motion/CircleCollision/CircleCollision.js b/content/examples_p5/Topics/Motion/CircleCollision/CircleCollision.js index 36d92636d..d07cfa5e7 100644 --- a/content/examples_p5/Topics/Motion/CircleCollision/CircleCollision.js +++ b/content/examples_p5/Topics/Motion/CircleCollision/CircleCollision.js @@ -8,7 +8,8 @@ var balls; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); balls = [ new Ball(100, 400, 20), new Ball(700, 400, 80) diff --git a/content/examples_p5/Topics/Motion/Linear/Linear.js b/content/examples_p5/Topics/Motion/Linear/Linear.js index 3d1b2514e..ae97843ed 100644 --- a/content/examples_p5/Topics/Motion/Linear/Linear.js +++ b/content/examples_p5/Topics/Motion/Linear/Linear.js @@ -10,7 +10,8 @@ var a; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); stroke(255); a = height/2; } diff --git a/content/examples_p5/Topics/Motion/Morph/Morph.js b/content/examples_p5/Topics/Motion/Morph/Morph.js index 427d5a498..bcac639ae 100644 --- a/content/examples_p5/Topics/Motion/Morph/Morph.js +++ b/content/examples_p5/Topics/Motion/Morph/Morph.js @@ -19,7 +19,8 @@ var morph = []; var state = false; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); // Create a circle using vectors pointing from center for (var angle = 0; angle < 360; angle += 9) { diff --git a/content/examples_p5/Topics/Motion/MovingOnCurves/MovingOnCurves.js b/content/examples_p5/Topics/Motion/MovingOnCurves/MovingOnCurves.js index 1413b75e3..9ffe264aa 100644 --- a/content/examples_p5/Topics/Motion/MovingOnCurves/MovingOnCurves.js +++ b/content/examples_p5/Topics/Motion/MovingOnCurves/MovingOnCurves.js @@ -18,7 +18,8 @@ var step = 0.01; // Size of each step along the path var pct = 0.0; // Percentage traveled (0.0 to 1.0) function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); noStroke(); distX = endX - beginX; distY = endY - beginY; diff --git a/content/examples_p5/Topics/Motion/Reflection1/Reflection1.js b/content/examples_p5/Topics/Motion/Reflection1/Reflection1.js index 4cb1cad69..01a58738a 100644 --- a/content/examples_p5/Topics/Motion/Reflection1/Reflection1.js +++ b/content/examples_p5/Topics/Motion/Reflection1/Reflection1.js @@ -24,7 +24,8 @@ var r = 6; var speed = 3.5; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); fill(128); base1 = createVector(0, height-150); diff --git a/content/examples_p5/Topics/Motion/Reflection2/Orb.js b/content/examples_p5/Topics/Motion/Reflection2/Orb.js index a18aca5b4..ed5bedb1e 100644 --- a/content/examples_p5/Topics/Motion/Reflection2/Orb.js +++ b/content/examples_p5/Topics/Motion/Reflection2/Orb.js @@ -7,7 +7,7 @@ function Orb(x, y, r_) { this.r = r_; // A damping of 80% slows it down when it hits the ground this.damping = 0.8; - + this.move = function() { // Move orb @@ -21,15 +21,15 @@ function Orb(x, y, r_) { fill(200); ellipse(this.position.x, this.position.y, this.r*2, this.r*2); } - + // Check boundaries of window this.checkWallCollision = function() { if (this.position.x > width-this.r) { this.position.x = width-this.r; this.velocity.x *= -this.damping; - } + } else if (this.position.x < this.r) { - this.position.x = r; + this.position.x = this.r; this.velocity.x *= -this.damping; } } @@ -44,15 +44,15 @@ function Orb(x, y, r_) { var cosine = cos(groundSegment.rot); var sine = sin(groundSegment.rot); - /* Rotate ground and velocity to allow + /* Rotate ground and velocity to allow orthogonal collision calculations */ var groundXTemp = cosine * deltaX + sine * deltaY; var groundYTemp = cosine * deltaY - sine * deltaX; var velocityXTemp = cosine * this.velocity.x + sine * this.velocity.y; var velocityYTemp = cosine * this.velocity.y - sine * this.velocity.x; - /* Ground collision - check for surface - collision and also that orb is within + /* Ground collision - check for surface + collision and also that orb is within left/rights bounds of ground segment */ if (groundYTemp > -this.r && this.position.x > groundSegment.x1 && @@ -73,4 +73,3 @@ function Orb(x, y, r_) { this.position.y = groundSegment.y + deltaY; } } - diff --git a/content/examples_p5/Topics/Motion/Reflection2/Reflection2.js b/content/examples_p5/Topics/Motion/Reflection2/Reflection2.js index 2caba5a6d..47a9d3895 100644 --- a/content/examples_p5/Topics/Motion/Reflection2/Reflection2.js +++ b/content/examples_p5/Topics/Motion/Reflection2/Reflection2.js @@ -14,7 +14,8 @@ var segments = 40; var ground = new Array(segments); function setup(){ - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); gravity = createVector(0,0.05); // An orb object that will fall and bounce around orb = new Orb(50, 50, 3); diff --git a/content/examples_p5/Topics/Simulate/Chain/Chain.js b/content/examples_p5/Topics/Simulate/Chain/Chain.js index afd037d2a..5d5a198e1 100644 --- a/content/examples_p5/Topics/Simulate/Chain/Chain.js +++ b/content/examples_p5/Topics/Simulate/Chain/Chain.js @@ -13,7 +13,8 @@ var gravity = 9.0; var mass = 2.0; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); fill(255, 126); // Inputs: x, y, mass, gravity s1 = new Spring2D(0.0, width/2, mass, gravity); diff --git a/content/examples_p5/Topics/Simulate/Flocking/Boid.js b/content/examples_p5/Topics/Simulate/Flocking/Boid.js index 3987f804c..b4814cd23 100644 --- a/content/examples_p5/Topics/Simulate/Flocking/Boid.js +++ b/content/examples_p5/Topics/Simulate/Flocking/Boid.js @@ -84,8 +84,8 @@ function Boid(x,y) { this.borders = function() { if (this.position.x < -this.r) this.position.x = width +this.r; if (this.position.y < -this.r) this.position.y = height+this.r; - if (this.position.x > width +this.r) location.x = -this.r; - if (this.position.y > height+this.r) location.y = -this.r; + if (this.position.x > width +this.r) this.position.x = -this.r; + if (this.position.y > height+this.r) this.position.y = -this.r; } // Separation diff --git a/content/examples_p5/Topics/Simulate/Flocking/Flocking.js b/content/examples_p5/Topics/Simulate/Flocking/Flocking.js index a589f0098..9a70b09ff 100644 --- a/content/examples_p5/Topics/Simulate/Flocking/Flocking.js +++ b/content/examples_p5/Topics/Simulate/Flocking/Flocking.js @@ -12,7 +12,8 @@ var flock; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); flock = new Flock(); // Add an initial set of boids into the system for (var i = 0; i < 150; i++) { diff --git a/content/examples_p5/Topics/Simulate/ForcesWithVectors/ForcesWithVectors.js b/content/examples_p5/Topics/Simulate/ForcesWithVectors/ForcesWithVectors.js index 814aeab0e..7c22979b0 100644 --- a/content/examples_p5/Topics/Simulate/ForcesWithVectors/ForcesWithVectors.js +++ b/content/examples_p5/Topics/Simulate/ForcesWithVectors/ForcesWithVectors.js @@ -19,7 +19,8 @@ var movers = []; var liquid; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); reset(); // Create liquid object liquid = new Liquid(0, height/2, width, height/2, 0.1); diff --git a/content/examples_p5/Topics/Simulate/ForcesWithVectors/Liquid.js b/content/examples_p5/Topics/Simulate/ForcesWithVectors/Liquid.js index 6a250f434..b17e05f16 100644 --- a/content/examples_p5/Topics/Simulate/ForcesWithVectors/Liquid.js +++ b/content/examples_p5/Topics/Simulate/ForcesWithVectors/Liquid.js @@ -28,7 +28,7 @@ var Liquid = function(x, y, w, h, c) { var dragMagnitude = this.c * speed * speed; // Direction is inverse of velocity - var dragForce = m.velocity.get(); + var dragForce = m.velocity.copy(); dragForce.mult(-1); // Scale according to magnitude diff --git a/content/examples_p5/Topics/Simulate/MultipleParticleSystems/MultipleParticleSystems.js b/content/examples_p5/Topics/Simulate/MultipleParticleSystems/MultipleParticleSystems.js index 57e6e6a2d..fc2efb41a 100644 --- a/content/examples_p5/Topics/Simulate/MultipleParticleSystems/MultipleParticleSystems.js +++ b/content/examples_p5/Topics/Simulate/MultipleParticleSystems/MultipleParticleSystems.js @@ -13,7 +13,8 @@ var systems = []; function setup() { - createCanvas(640,360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); } function draw() { diff --git a/content/examples_p5/Topics/Simulate/MultipleParticleSystems/Particle.js b/content/examples_p5/Topics/Simulate/MultipleParticleSystems/Particle.js index fcf6953e7..a9cf73b7d 100644 --- a/content/examples_p5/Topics/Simulate/MultipleParticleSystems/Particle.js +++ b/content/examples_p5/Topics/Simulate/MultipleParticleSystems/Particle.js @@ -2,7 +2,7 @@ var Particle = function(position) { this.acceleration = createVector(0, 0.05); this.velocity = createVector(random(-1, 1), random(-2, 0)); - this.position = position.get(); + this.position = position.copy(); this.lifespan = 255.0; this.run = function() { diff --git a/content/examples_p5/Topics/Simulate/MultipleParticleSystems/CrazyParticle.js b/content/examples_p5/Topics/Simulate/MultipleParticleSystems/ParticleCrazy.js similarity index 100% rename from content/examples_p5/Topics/Simulate/MultipleParticleSystems/CrazyParticle.js rename to content/examples_p5/Topics/Simulate/MultipleParticleSystems/ParticleCrazy.js diff --git a/content/examples_p5/Topics/Simulate/MultipleParticleSystems/ParticleSystem.js b/content/examples_p5/Topics/Simulate/MultipleParticleSystems/ParticleSystem.js index b3d8b9333..e14cf2fa2 100644 --- a/content/examples_p5/Topics/Simulate/MultipleParticleSystems/ParticleSystem.js +++ b/content/examples_p5/Topics/Simulate/MultipleParticleSystems/ParticleSystem.js @@ -1,5 +1,5 @@ var ParticleSystem = function(num, position) { - this.origin = position.get(); + this.origin = position.copy(); this.particles = []; for (var i = 0; i < num; i++) { this.particles.push(new Particle(this.origin)); // Add "num" amount of particles to the arraylist diff --git a/content/examples_p5/Topics/Simulate/SimpleParticleSystem/Particle.js b/content/examples_p5/Topics/Simulate/SimpleParticleSystem/Particle.js index 63e705c61..340838019 100644 --- a/content/examples_p5/Topics/Simulate/SimpleParticleSystem/Particle.js +++ b/content/examples_p5/Topics/Simulate/SimpleParticleSystem/Particle.js @@ -2,7 +2,7 @@ var Particle = function(position) { this.acceleration = createVector(0, 0.05); this.velocity = createVector(random(-1, 1), random(-2, 0)); - this.position = position.get(); + this.position = position.copy(); this.lifespan = 255.0; this.run = function() { diff --git a/content/examples_p5/Topics/Simulate/SimpleParticleSystem/ParticleSystem.js b/content/examples_p5/Topics/Simulate/SimpleParticleSystem/ParticleSystem.js index 6b1c5a383..dd8f7e06b 100644 --- a/content/examples_p5/Topics/Simulate/SimpleParticleSystem/ParticleSystem.js +++ b/content/examples_p5/Topics/Simulate/SimpleParticleSystem/ParticleSystem.js @@ -3,7 +3,7 @@ // http://natureofcode.com var ParticleSystem = function(position) { - this.origin = position.get(); + this.origin = position.copy(); this.particles = []; this.addParticle = function() { diff --git a/content/examples_p5/Topics/Simulate/SimpleParticleSystem/SimpleParticleSystem.js b/content/examples_p5/Topics/Simulate/SimpleParticleSystem/SimpleParticleSystem.js index 47dba8e79..33a55c22f 100644 --- a/content/examples_p5/Topics/Simulate/SimpleParticleSystem/SimpleParticleSystem.js +++ b/content/examples_p5/Topics/Simulate/SimpleParticleSystem/SimpleParticleSystem.js @@ -11,7 +11,8 @@ var ps; function setup() { - createCanvas(640,360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); ps = new ParticleSystem(createVector(width/2,50)); } diff --git a/content/examples_p5/Topics/Simulate/SmokeParticleSystem/Particle.js b/content/examples_p5/Topics/Simulate/SmokeParticleSystem/Particle.js index 6eaac279f..d0d2bc703 100644 --- a/content/examples_p5/Topics/Simulate/SmokeParticleSystem/Particle.js +++ b/content/examples_p5/Topics/Simulate/SmokeParticleSystem/Particle.js @@ -5,7 +5,7 @@ var Particle = function(l, img_) { var vx = randomGaussian()*0.3; var vy = randomGaussian()*0.3 - 1.0; this.vel = createVector(vx, vy); - this.pos = l.get(); + this.pos = l.copy(); this.lifespan = 100.0; this.img = img_; diff --git a/content/examples_p5/Topics/Simulate/SmokeParticleSystem/ParticleSystem.js b/content/examples_p5/Topics/Simulate/SmokeParticleSystem/ParticleSystem.js index 77fe3ec1d..59fcc3a07 100644 --- a/content/examples_p5/Topics/Simulate/SmokeParticleSystem/ParticleSystem.js +++ b/content/examples_p5/Topics/Simulate/SmokeParticleSystem/ParticleSystem.js @@ -2,7 +2,7 @@ // An ArrayList is used to manage the list of Particles var ParticleSystem = function(num, v, img_) { - this.origin = v.get(); + this.origin = v.copy(); this.img = img_; this.particles = []; for (var i = 0; i < num; i++) { diff --git a/content/examples_p5/Topics/Simulate/SmokeParticleSystem/SmokeParticleSystem.js b/content/examples_p5/Topics/Simulate/SmokeParticleSystem/SmokeParticleSystem.js index d040a166a..1071c8c34 100644 --- a/content/examples_p5/Topics/Simulate/SmokeParticleSystem/SmokeParticleSystem.js +++ b/content/examples_p5/Topics/Simulate/SmokeParticleSystem/SmokeParticleSystem.js @@ -13,11 +13,12 @@ var ps; function preload() { - img = loadImage("data/texture.png"); + img = loadImage("texture.png"); } function setup() { - createCanvas(640,360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); ps = new ParticleSystem(0,createVector(width/2,height-60),img); } diff --git a/content/examples_p5/Topics/Simulate/Spring/Spring.js b/content/examples_p5/Topics/Simulate/Spring/Spring.js index 3f79913a6..b728d1a1c 100644 --- a/content/examples_p5/Topics/Simulate/Spring/Spring.js +++ b/content/examples_p5/Topics/Simulate/Spring/Spring.js @@ -27,7 +27,8 @@ var f = 0; // Force function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); rectMode(CORNERS); noStroke(); left = width/2 - 100; diff --git a/content/examples_p5/Topics/Simulate/Springs/Springs.js b/content/examples_p5/Topics/Simulate/Springs/Springs.js index 277291981..fec66c4cf 100644 --- a/content/examples_p5/Topics/Simulate/Springs/Springs.js +++ b/content/examples_p5/Topics/Simulate/Springs/Springs.js @@ -11,7 +11,8 @@ var num = 3; var springs = []; function setup() { - createCanvas(640, 360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); noStroke(); springs[0] = new Spring(240, 260, 40, 0.98, 8.0, 0.1, springs, 0); springs[1] = new Spring(320, 210, 120, 0.95, 9.0, 0.1, springs, 1); diff --git a/content/examples_p5/Topics/Vectors/AccelerationWithVectors/AccelerationWithVectors.js b/content/examples_p5/Topics/Vectors/AccelerationWithVectors/AccelerationWithVectors.js index 24eaaaf02..9269c6b21 100644 --- a/content/examples_p5/Topics/Vectors/AccelerationWithVectors/AccelerationWithVectors.js +++ b/content/examples_p5/Topics/Vectors/AccelerationWithVectors/AccelerationWithVectors.js @@ -14,7 +14,8 @@ var mover; function setup() { - createCanvas(640,360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); mover = new Mover(); } diff --git a/content/examples_p5/Topics/Vectors/BouncingBall/BouncingBall.js b/content/examples_p5/Topics/Vectors/BouncingBall/BouncingBall.js index 74c5ce11f..d1dff80e6 100644 --- a/content/examples_p5/Topics/Vectors/BouncingBall/BouncingBall.js +++ b/content/examples_p5/Topics/Vectors/BouncingBall/BouncingBall.js @@ -12,7 +12,8 @@ var velocity; // Velocity of shape var gravity; // Gravity acts at the shape's acceleration function setup() { - createCanvas(640,360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); position = createVector(100,100); velocity = createVector(1.5,2.1); gravity = createVector(0,0.2); diff --git a/content/examples_p5/Topics/Vectors/VectorMath/VectorMath.js b/content/examples_p5/Topics/Vectors/VectorMath/VectorMath.js index 460224193..869c0d35c 100644 --- a/content/examples_p5/Topics/Vectors/VectorMath/VectorMath.js +++ b/content/examples_p5/Topics/Vectors/VectorMath/VectorMath.js @@ -7,7 +7,8 @@ */ function setup() { - createCanvas(640,360); + var canvas = createCanvas(640, 360); + canvas.parent("p5container"); } function draw() { diff --git a/content/examples_p5/testing.html b/content/examples_p5/testing.html index 5d3987279..584d611f9 100644 --- a/content/examples_p5/testing.html +++ b/content/examples_p5/testing.html @@ -1,15 +1,14 @@ - - - - + + + + + - +
    + - - - diff --git a/content/examples_topics.xml b/content/examples_topics.xml index cc8c0f974..35e20f85f 100755 --- a/content/examples_topics.xml +++ b/content/examples_topics.xml @@ -9,44 +9,65 @@ Icosahedra
    - Continuous Lines - Pattern - Pulses + Continuous Lines + Pattern + Pulses - Sequential - Animated Sprite + Sequential + Animated Sprite - Rollover - Button - Handles - Scrollbar + Rollover + Button + Handles + Scrollbar - Linear - Bounce - Bouncy Bubbles - Moving On Curves - Brownian + Linear + Bounce + Bouncy Bubbles + Moving On Curves + Brownian + Circle Collision + Morph + Reflection 1 + Reflection 2 - Tickle - Follow 1 - Follow 2 - Follow 3 - Reach 1 - Reach 2 - Reach 3 + Tickle + Follow 1 + Follow 2 + Follow 3 + Reach 1 + Reach 2 + Reach 3 - Pixel Array - Brightness - Blur - Edge Detection + Pixel Array + Brightness + Blur + Edge Detection + Convolution + Histogram + Linear Image Zoom Explode + + Array List Class + Int List Lottery + Load Save JSON + Load Save Table + Load Save XML + XML Yahoo Weather + + + Load File 1 + Load File 2 + Save File 1 + Save One Frame + Texture Quad Texture Triangle @@ -54,21 +75,29 @@ Texture Cube - Spring - Springs - Chain + Simple Particle System + Multiple Particle Systems + Forces With Vectors + Smoke Particle System + Flocking Soft Body - Flocking - Simple Particle System - Multiple Particle Systems + + + Bouncing Ball + Vector Math + Acceleration With Vectors - Mandelbrot - Tree + Mandelbrot + Tree + Koch + Penrose Snowflake + Penrose Tile + Pentigree - - Wolframs's 1D CA - Conway's Game of Life + + Wolframs's 1D CA + Conway's Game of Life Spore 1 Spore 2 diff --git a/content/gswp_2e/examples.properties b/content/gswp_2e/examples.properties new file mode 100644 index 000000000..e043235e6 --- /dev/null +++ b/content/gswp_2e/examples.properties @@ -0,0 +1,66 @@ +# UTF-8 supported. + +# The name of your examples-package as you want it formatted. +name = Getting Started with Processing, 2nd Edition + +# List of authors. Links can be provided using the syntax [author name](url). +authorList = [Casey Reas](http://reas.com/) and [Ben Fry](http://benfry.com/) + +# A web page for your examples-package, NOT a direct link to where to download it. +url = http://www.processing.org + +# The category of your examples-package, must be one (or many) of the following: +# "3D" "Animation" "Compilations" "Data" +# "Fabrication" "Geometry" "GUI" "Hardware" +# "I/O" "Language" "Math" "Simulation" +# "Sound" "Utilities" "Typography" "Video & Vision" +# +# If a value other than those listed is used, your examples-package will listed as +# "Other". +category = Books + +# A short sentence (or fragment) to summarize the examples-package's function. This will +# be shown from inside the PDE when the examples-package is being installed. Avoid +# repeating the name of your examples-package here. Also, avoid saying anything redundant +# like mentioning that it's an examples-package. This should start with a capitalized +# letter, and end with a period. +sentence = Example code for the book Getting Started with Processing, 2nd Edition. Maker Media, 2015. + +# Additional information suitable for the Processing website. The value of +# 'sentence' always will be prepended, so you should start by writing the +# second sentence here. If your examples-package only works on certain operating systems, +# mention it here. +paragraph = + +# Links in the 'sentence' and 'paragraph' attributes can be inserted using the +# same syntax as for authors. +# That is, [here is a link to Processing](http://processing.org/) + +# A version number that increments once with each release. This is used to +# compare different versions of the same examples-package, and check if an update is +# available. You should think of it as a counter, counting the total number of +# releases you've had. +version = 1 # This must be parsable as an int + +# The version as the user will see it. If blank, the version attribute will be +# used here. +prettyVersion = 1.0 # This is treated as a String + +# The min and max revision of Processing compatible with your examples-package. +# Note that these fields use the revision and not the version of Processing, +# parsable as an int. For example, the revision number for 2.2.1 is 227. +# You can find the revision numbers in the change log: +# https://raw.githubusercontent.com/processing/processing/master/build/shared/revisions.txt +# Only use maxRevision (or minRevision), when your examples-package is known to +# break in a later (or earlier) release. Otherwise, use the default value 0. +minRevision = 0 +maxRevision = 0 + +# The list of modes that the examples-package is compatible with. This basically +# affects when the examples-package is listed in the Examples tree once installed +# (although this does not affect when the examples-package is displayed/greyed-out in +# the Examples Contributions Manager). This is to be provided as a list of fully qualified +# classnames of the mode that the examples-package is compatible with (as can be obtained +# from mode.id in the sketch.properties file). Leaving this blank will assume that +# the examples-package is compatible with all modes. +compatibleModesList = processing.mode.java.JavaMode \ No newline at end of file diff --git a/content/gswp_2e/examples/02_Start/Ex_02_01/Ex_02_01.pde b/content/gswp_2e/examples/02_Start/Ex_02_01/Ex_02_01.pde new file mode 100644 index 000000000..89f8d8254 --- /dev/null +++ b/content/gswp_2e/examples/02_Start/Ex_02_01/Ex_02_01.pde @@ -0,0 +1 @@ +ellipse(50, 50, 80, 80); \ No newline at end of file diff --git a/content/gswp_2e/examples/02_Start/Ex_02_02/Ex_02_02.pde b/content/gswp_2e/examples/02_Start/Ex_02_02/Ex_02_02.pde new file mode 100644 index 000000000..ce7aad50f --- /dev/null +++ b/content/gswp_2e/examples/02_Start/Ex_02_02/Ex_02_02.pde @@ -0,0 +1,12 @@ +void setup() { + size(480, 120); +} + +void draw() { + if (mousePressed) { + fill(0); + } else { + fill(255); + } + ellipse(mouseX, mouseY, 80, 80); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/03_Draw/Ex_03_01/Ex_03_01.pde b/content/gswp_2e/examples/03_Draw/Ex_03_01/Ex_03_01.pde new file mode 100644 index 000000000..19a11c6fa --- /dev/null +++ b/content/gswp_2e/examples/03_Draw/Ex_03_01/Ex_03_01.pde @@ -0,0 +1 @@ +size(800, 600); \ No newline at end of file diff --git a/content/gswp_2e/examples/03_Draw/Ex_03_02/Ex_03_02.pde b/content/gswp_2e/examples/03_Draw/Ex_03_02/Ex_03_02.pde new file mode 100644 index 000000000..57d3c4a76 --- /dev/null +++ b/content/gswp_2e/examples/03_Draw/Ex_03_02/Ex_03_02.pde @@ -0,0 +1,2 @@ +size(480, 120); +point(240, 60); diff --git a/content/gswp_2e/examples/03_Draw/Ex_03_03/Ex_03_03.pde b/content/gswp_2e/examples/03_Draw/Ex_03_03/Ex_03_03.pde new file mode 100644 index 000000000..6c406b97b --- /dev/null +++ b/content/gswp_2e/examples/03_Draw/Ex_03_03/Ex_03_03.pde @@ -0,0 +1,2 @@ +size(480, 120); +line(20, 50, 420, 110); \ No newline at end of file diff --git a/content/gswp_2e/examples/03_Draw/Ex_03_04/Ex_03_04.pde b/content/gswp_2e/examples/03_Draw/Ex_03_04/Ex_03_04.pde new file mode 100644 index 000000000..8a4dcf440 --- /dev/null +++ b/content/gswp_2e/examples/03_Draw/Ex_03_04/Ex_03_04.pde @@ -0,0 +1,4 @@ +size(480, 120); +quad(158, 55, 199, 14, 392, 66, 351, 107); +triangle(347, 54, 392, 9, 392, 66); +triangle(158, 55, 290, 91, 290, 112); \ No newline at end of file diff --git a/content/gswp_2e/examples/03_Draw/Ex_03_05/Ex_03_05.pde b/content/gswp_2e/examples/03_Draw/Ex_03_05/Ex_03_05.pde new file mode 100644 index 000000000..560eb22da --- /dev/null +++ b/content/gswp_2e/examples/03_Draw/Ex_03_05/Ex_03_05.pde @@ -0,0 +1,2 @@ +size(480, 120); +rect(180, 60, 220, 40); \ No newline at end of file diff --git a/content/gswp_2e/examples/03_Draw/Ex_03_06/Ex_03_06.pde b/content/gswp_2e/examples/03_Draw/Ex_03_06/Ex_03_06.pde new file mode 100644 index 000000000..94f68d19b --- /dev/null +++ b/content/gswp_2e/examples/03_Draw/Ex_03_06/Ex_03_06.pde @@ -0,0 +1,4 @@ +size(480, 120); +ellipse(278, -100, 400, 400); +ellipse(120, 100, 110, 110); +ellipse(412, 60, 18, 18); \ No newline at end of file diff --git a/content/gswp_2e/examples/03_Draw/Ex_03_07/Ex_03_07.pde b/content/gswp_2e/examples/03_Draw/Ex_03_07/Ex_03_07.pde new file mode 100644 index 000000000..9aeb4ba51 --- /dev/null +++ b/content/gswp_2e/examples/03_Draw/Ex_03_07/Ex_03_07.pde @@ -0,0 +1,5 @@ +size(480, 120); +arc(90, 60, 80, 80, 0, HALF_PI); +arc(190, 60, 80, 80, 0, PI+HALF_PI); +arc(290, 60, 80, 80, PI, TWO_PI+HALF_PI); +arc(390, 60, 80, 80, QUARTER_PI, PI+QUARTER_PI); \ No newline at end of file diff --git a/content/gswp_2e/examples/03_Draw/Ex_03_08/Ex_03_08.pde b/content/gswp_2e/examples/03_Draw/Ex_03_08/Ex_03_08.pde new file mode 100644 index 000000000..4b1bba418 --- /dev/null +++ b/content/gswp_2e/examples/03_Draw/Ex_03_08/Ex_03_08.pde @@ -0,0 +1,5 @@ +size(480, 120); +arc(90, 60, 80, 80, 0, radians(90)); +arc(190, 60, 80, 80, 0, radians(270)); +arc(290, 60, 80, 80, radians(180), radians(450)); +arc(390, 60, 80, 80, radians(45), radians(225)); \ No newline at end of file diff --git a/content/gswp_2e/examples/03_Draw/Ex_03_09/Ex_03_09.pde b/content/gswp_2e/examples/03_Draw/Ex_03_09/Ex_03_09.pde new file mode 100644 index 000000000..d15e4357d --- /dev/null +++ b/content/gswp_2e/examples/03_Draw/Ex_03_09/Ex_03_09.pde @@ -0,0 +1,5 @@ +size(480, 120); +ellipse(140, 0, 190, 190); +// The rectangle draws on top of the ellipse +// because it comes after in the code +rect(160, 30, 260, 20); \ No newline at end of file diff --git a/content/gswp_2e/examples/03_Draw/Ex_03_10/Ex_03_10.pde b/content/gswp_2e/examples/03_Draw/Ex_03_10/Ex_03_10.pde new file mode 100644 index 000000000..29f01e45d --- /dev/null +++ b/content/gswp_2e/examples/03_Draw/Ex_03_10/Ex_03_10.pde @@ -0,0 +1,5 @@ +size(480, 120); +rect(160, 30, 260, 20); +// The ellipse draws on top of the rectangle +// because it comes after in the code +ellipse(140, 0, 190, 190); \ No newline at end of file diff --git a/content/gswp_2e/examples/03_Draw/Ex_03_11/Ex_03_11.pde b/content/gswp_2e/examples/03_Draw/Ex_03_11/Ex_03_11.pde new file mode 100644 index 000000000..70f73187f --- /dev/null +++ b/content/gswp_2e/examples/03_Draw/Ex_03_11/Ex_03_11.pde @@ -0,0 +1,7 @@ +size(480, 120); +ellipse(75, 60, 90, 90); +strokeWeight(8); // Stroke weight to 8 pixels +ellipse(175, 60, 90, 90); +ellipse(279, 60, 90, 90); +strokeWeight(20); // Stroke weight to 20 pixels +ellipse(389, 60, 90, 90); \ No newline at end of file diff --git a/content/gswp_2e/examples/03_Draw/Ex_03_12/Ex_03_12.pde b/content/gswp_2e/examples/03_Draw/Ex_03_12/Ex_03_12.pde new file mode 100644 index 000000000..ec0c5630c --- /dev/null +++ b/content/gswp_2e/examples/03_Draw/Ex_03_12/Ex_03_12.pde @@ -0,0 +1,9 @@ +size(480, 120); +strokeWeight(24); +line(60, 25, 130, 95); +strokeCap(SQUARE); // Square the line endings +line(160, 25, 230, 95); +strokeCap(PROJECT); // Project the line endings +line(260, 25, 330, 95); +strokeCap(ROUND); // Round the line endings +line(360, 25, 430, 95); \ No newline at end of file diff --git a/content/gswp_2e/examples/03_Draw/Ex_03_13/Ex_03_13.pde b/content/gswp_2e/examples/03_Draw/Ex_03_13/Ex_03_13.pde new file mode 100644 index 000000000..63abc616b --- /dev/null +++ b/content/gswp_2e/examples/03_Draw/Ex_03_13/Ex_03_13.pde @@ -0,0 +1,9 @@ +size(480, 120); +strokeWeight(12); +rect(60, 25, 70, 70); +strokeJoin(ROUND); // Round the stroke corners +rect(160, 25, 70, 70); +strokeJoin(BEVEL); // Bevel the stroke corners +rect(260, 25, 70, 70); +strokeJoin(MITER); // Miter the stroke corners +rect(360, 25, 70, 70); \ No newline at end of file diff --git a/content/gswp_2e/examples/03_Draw/Ex_03_14/Ex_03_14.pde b/content/gswp_2e/examples/03_Draw/Ex_03_14/Ex_03_14.pde new file mode 100644 index 000000000..61d24f415 --- /dev/null +++ b/content/gswp_2e/examples/03_Draw/Ex_03_14/Ex_03_14.pde @@ -0,0 +1,6 @@ +size(480, 120); +rect(120, 60, 80, 80); +ellipse(120, 60, 80, 80); +ellipseMode(CORNER); +rect(280, 20, 80, 80); +ellipse(280, 20, 80, 80); \ No newline at end of file diff --git a/content/gswp_2e/examples/03_Draw/Ex_03_14/Ex_03_14.tif b/content/gswp_2e/examples/03_Draw/Ex_03_14/Ex_03_14.tif new file mode 100644 index 000000000..49ac69212 Binary files /dev/null and b/content/gswp_2e/examples/03_Draw/Ex_03_14/Ex_03_14.tif differ diff --git a/content/gswp_2e/examples/03_Draw/Ex_03_15/Ex_03_15.pde b/content/gswp_2e/examples/03_Draw/Ex_03_15/Ex_03_15.pde new file mode 100644 index 000000000..389c6a198 --- /dev/null +++ b/content/gswp_2e/examples/03_Draw/Ex_03_15/Ex_03_15.pde @@ -0,0 +1,8 @@ +size(480, 120); +background(0); // Black +fill(204); // Light gray +ellipse(132, 82, 200, 200); // Light gray circle +fill(153); // Medium gray +ellipse(228, -16, 200, 200); // Medium gray circle +fill(102); // Dark gray +ellipse(268, 118, 200, 200); // Dark gray circle \ No newline at end of file diff --git a/content/gswp_2e/examples/03_Draw/Ex_03_16/Ex_03_16.pde b/content/gswp_2e/examples/03_Draw/Ex_03_16/Ex_03_16.pde new file mode 100644 index 000000000..861a65b12 --- /dev/null +++ b/content/gswp_2e/examples/03_Draw/Ex_03_16/Ex_03_16.pde @@ -0,0 +1,7 @@ +size(480, 120); +fill(153); // Medium gray +ellipse(132, 82, 200, 200); // Gray circle +noFill(); // Turn off fill +ellipse(228, -16, 200, 200); // Outline circle +noStroke(); // Turn off stroke +ellipse(268, 118, 200, 200); // Doesn't draw! \ No newline at end of file diff --git a/content/gswp_2e/examples/03_Draw/Ex_03_17/Ex_03_17.pde b/content/gswp_2e/examples/03_Draw/Ex_03_17/Ex_03_17.pde new file mode 100644 index 000000000..42c29eb1b --- /dev/null +++ b/content/gswp_2e/examples/03_Draw/Ex_03_17/Ex_03_17.pde @@ -0,0 +1,9 @@ +size(480, 120); +noStroke(); +background(0, 26, 51); // Dark blue color +fill(255, 0, 0); // Red color +ellipse(132, 82, 200, 200); // Red circle +fill(0, 255, 0); // Green color +ellipse(228, -16, 200, 200); // Green circle +fill(0, 0, 255); // Blue color +ellipse(268, 118, 200, 200); // Blue circle diff --git a/content/gswp_2e/examples/03_Draw/Ex_03_18/Ex_03_18.pde b/content/gswp_2e/examples/03_Draw/Ex_03_18/Ex_03_18.pde new file mode 100644 index 000000000..babb6972f --- /dev/null +++ b/content/gswp_2e/examples/03_Draw/Ex_03_18/Ex_03_18.pde @@ -0,0 +1,9 @@ +size(480, 120); +noStroke(); +background(204, 226, 225); // Light blue color +fill(255, 0, 0, 160); // Red color +ellipse(132, 82, 200, 200); // Red circle +fill(0, 255, 0, 160); // Green color +ellipse(228, -16, 200, 200); // Green circle +fill(0, 0, 255, 160); // Blue color +ellipse(268, 118, 200, 200); // Blue circle diff --git a/content/gswp_2e/examples/03_Draw/Ex_03_19/Ex_03_19.pde b/content/gswp_2e/examples/03_Draw/Ex_03_19/Ex_03_19.pde new file mode 100644 index 000000000..24cf73e40 --- /dev/null +++ b/content/gswp_2e/examples/03_Draw/Ex_03_19/Ex_03_19.pde @@ -0,0 +1,11 @@ +size(480, 120); +beginShape(); +fill(153, 176, 180); +vertex(180, 82); +vertex(207, 36); +vertex(214, 63); +vertex(407, 11); +vertex(412, 30); +vertex(219, 82); +vertex(226, 109); +endShape(); \ No newline at end of file diff --git a/content/gswp_2e/examples/03_Draw/Ex_03_20/Ex_03_20.pde b/content/gswp_2e/examples/03_Draw/Ex_03_20/Ex_03_20.pde new file mode 100644 index 000000000..4bd620b4c --- /dev/null +++ b/content/gswp_2e/examples/03_Draw/Ex_03_20/Ex_03_20.pde @@ -0,0 +1,11 @@ +size(480, 120); +beginShape(); +fill(153, 176, 180); +vertex(180, 82); +vertex(207, 36); +vertex(214, 63); +vertex(407, 11); +vertex(412, 30); +vertex(219, 82); +vertex(226, 109); +endShape(CLOSE); \ No newline at end of file diff --git a/content/gswp_2e/examples/03_Draw/Ex_03_21/Ex_03_21.pde b/content/gswp_2e/examples/03_Draw/Ex_03_21/Ex_03_21.pde new file mode 100644 index 000000000..e16008d0f --- /dev/null +++ b/content/gswp_2e/examples/03_Draw/Ex_03_21/Ex_03_21.pde @@ -0,0 +1,33 @@ +size(480, 120); + +// Left creature +fill(153, 176, 180); +beginShape(); +vertex(50, 120); +vertex(100, 90); +vertex(110, 60); +vertex(80, 20); +vertex(210, 60); +vertex(160, 80); +vertex(200, 90); +vertex(140, 100); +vertex(130, 120); +endShape(); +fill(0); +ellipse(155, 60, 8, 8); + +// Right creature +fill(176, 186, 163); +beginShape(); +vertex(370, 120); +vertex(360, 90); +vertex(290, 80); +vertex(340, 70); +vertex(280, 50); +vertex(420, 10); +vertex(390, 50); +vertex(410, 90); +vertex(460, 120); +endShape(); +fill(0); +ellipse(345, 50, 10, 10); \ No newline at end of file diff --git a/content/gswp_2e/examples/04_Variables/Ex_04_01/Ex_04_01.pde b/content/gswp_2e/examples/04_Variables/Ex_04_01/Ex_04_01.pde new file mode 100644 index 000000000..a7eb0405e --- /dev/null +++ b/content/gswp_2e/examples/04_Variables/Ex_04_01/Ex_04_01.pde @@ -0,0 +1,6 @@ +size(480, 120); +int y = 60; +int d = 80; +ellipse(75, y, d, d); // Left +ellipse(175, y, d, d); // Middle +ellipse(275, y, d, d); // Right \ No newline at end of file diff --git a/content/gswp_2e/examples/04_Variables/Ex_04_02/Ex_04_02.pde b/content/gswp_2e/examples/04_Variables/Ex_04_02/Ex_04_02.pde new file mode 100644 index 000000000..f2a97cdc3 --- /dev/null +++ b/content/gswp_2e/examples/04_Variables/Ex_04_02/Ex_04_02.pde @@ -0,0 +1,6 @@ +size(480, 120); +int y = 100; +int d = 130; +ellipse(75, y, d, d); // Left +ellipse(175, y, d, d); // Middle +ellipse(275, y, d, d); // Right \ No newline at end of file diff --git a/content/gswp_2e/examples/04_Variables/Ex_04_03/Ex_04_03.pde b/content/gswp_2e/examples/04_Variables/Ex_04_03/Ex_04_03.pde new file mode 100644 index 000000000..b7eeded9d --- /dev/null +++ b/content/gswp_2e/examples/04_Variables/Ex_04_03/Ex_04_03.pde @@ -0,0 +1,4 @@ +size(480, 120); +line(0, 0, width, height); // Line from (0,0) to (480, 120) +line(width, 0, 0, height); // Line from (480, 0) to (0, 120) +ellipse(width/2, height/2, 60, 60); \ No newline at end of file diff --git a/content/gswp_2e/examples/04_Variables/Ex_04_04/Ex_04_04.pde b/content/gswp_2e/examples/04_Variables/Ex_04_04/Ex_04_04.pde new file mode 100644 index 000000000..0b8f16aae --- /dev/null +++ b/content/gswp_2e/examples/04_Variables/Ex_04_04/Ex_04_04.pde @@ -0,0 +1,9 @@ +size(480, 120); +int x = 25; +int h = 20; +int y = 25; +rect(x, y, 300, h); // Top +x = x + 100; +rect(x, y + h, 300, h); // Middle +x = x - 250; +rect(x, y + h*2, 300, h); // Bottom \ No newline at end of file diff --git a/content/gswp_2e/examples/04_Variables/Ex_04_05/Ex_04_05.pde b/content/gswp_2e/examples/04_Variables/Ex_04_05/Ex_04_05.pde new file mode 100644 index 000000000..0b09ea4d5 --- /dev/null +++ b/content/gswp_2e/examples/04_Variables/Ex_04_05/Ex_04_05.pde @@ -0,0 +1,9 @@ +size(480, 120); +strokeWeight(8); +line(20, 40, 80, 80); +line(80, 40, 140, 80); +line(140, 40, 200, 80); +line(200, 40, 260, 80); +line(260, 40, 320, 80); +line(320, 40, 380, 80); +line(380, 40, 440, 80); \ No newline at end of file diff --git a/content/gswp_2e/examples/04_Variables/Ex_04_06/Ex_04_06.pde b/content/gswp_2e/examples/04_Variables/Ex_04_06/Ex_04_06.pde new file mode 100644 index 000000000..4c504ff0e --- /dev/null +++ b/content/gswp_2e/examples/04_Variables/Ex_04_06/Ex_04_06.pde @@ -0,0 +1,5 @@ +size(480, 120); +strokeWeight(8); +for (int i = 20; i < 400; i += 60) { + line(i, 40, i + 60, 80); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/04_Variables/Ex_04_07/Ex_04_07.pde b/content/gswp_2e/examples/04_Variables/Ex_04_07/Ex_04_07.pde new file mode 100644 index 000000000..346271aff --- /dev/null +++ b/content/gswp_2e/examples/04_Variables/Ex_04_07/Ex_04_07.pde @@ -0,0 +1,5 @@ +size(480, 120); +strokeWeight(2); +for (int i = 20; i < 400; i += 8) { + line(i, 40, i + 60, 80); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/04_Variables/Ex_04_08/Ex_04_08.pde b/content/gswp_2e/examples/04_Variables/Ex_04_08/Ex_04_08.pde new file mode 100644 index 000000000..7af1c71e6 --- /dev/null +++ b/content/gswp_2e/examples/04_Variables/Ex_04_08/Ex_04_08.pde @@ -0,0 +1,5 @@ +size(480, 120); +strokeWeight(2); +for (int i = 20; i < 400; i += 20) { + line(i, 0, i + i/2, 80); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/04_Variables/Ex_04_09/Ex_04_09.pde b/content/gswp_2e/examples/04_Variables/Ex_04_09/Ex_04_09.pde new file mode 100644 index 000000000..ee9d88c07 --- /dev/null +++ b/content/gswp_2e/examples/04_Variables/Ex_04_09/Ex_04_09.pde @@ -0,0 +1,6 @@ +size(480, 120); +strokeWeight(2); +for (int i = 20; i < 400; i += 20) { + line(i, 0, i + i/2, 80); + line(i + i/2, 80, i*1.2, 120); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/04_Variables/Ex_04_10/Ex_04_10.pde b/content/gswp_2e/examples/04_Variables/Ex_04_10/Ex_04_10.pde new file mode 100644 index 000000000..fb093677c --- /dev/null +++ b/content/gswp_2e/examples/04_Variables/Ex_04_10/Ex_04_10.pde @@ -0,0 +1,9 @@ +size(480, 120); +background(0); +noStroke(); +for (int y = 0; y <= height; y += 40) { + for (int x = 0; x <= width; x += 40) { + fill(255, 140); + ellipse(x, y, 40, 40); + } +} \ No newline at end of file diff --git a/content/gswp_2e/examples/04_Variables/Ex_04_11/Ex_04_11.pde b/content/gswp_2e/examples/04_Variables/Ex_04_11/Ex_04_11.pde new file mode 100644 index 000000000..9c9f0dc4a --- /dev/null +++ b/content/gswp_2e/examples/04_Variables/Ex_04_11/Ex_04_11.pde @@ -0,0 +1,11 @@ +size(480, 120); +background(0); +noStroke(); +for (int y = 0; y < height+45; y += 40) { + fill(255, 140); + ellipse(0, y, 40, 40); +} +for (int x = 0; x < width+45; x += 40) { + fill(255, 140); + ellipse(x, 0, 40, 40); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/04_Variables/Ex_04_12/Ex_04_12.pde b/content/gswp_2e/examples/04_Variables/Ex_04_12/Ex_04_12.pde new file mode 100644 index 000000000..e9de5f10b --- /dev/null +++ b/content/gswp_2e/examples/04_Variables/Ex_04_12/Ex_04_12.pde @@ -0,0 +1,11 @@ +size(480, 120); +background(0); +fill(255); +stroke(102); +for (int y = 20; y <= height-20; y += 10) { + for (int x = 20; x <= width-20; x += 10) { + ellipse(x, y, 4, 4); + // Draw a line to the center of the display + line(x, y, 240, 60); + } +} \ No newline at end of file diff --git a/content/gswp_2e/examples/04_Variables/Ex_04_13/Ex_04_13.pde b/content/gswp_2e/examples/04_Variables/Ex_04_13/Ex_04_13.pde new file mode 100644 index 000000000..8c31451f8 --- /dev/null +++ b/content/gswp_2e/examples/04_Variables/Ex_04_13/Ex_04_13.pde @@ -0,0 +1,7 @@ +size(480, 120); +background(0); +for (int y = 32; y <= height; y += 8) { + for (int x = 12; x <= width; x += 15) { + ellipse(x + y, y, 16 - y/10.0, 16 - y/10.0); + } +} \ No newline at end of file diff --git a/content/gswp_2e/examples/05_Response/Ex_05_01/Ex_05_01.pde b/content/gswp_2e/examples/05_Response/Ex_05_01/Ex_05_01.pde new file mode 100644 index 000000000..1e44240e1 --- /dev/null +++ b/content/gswp_2e/examples/05_Response/Ex_05_01/Ex_05_01.pde @@ -0,0 +1,5 @@ +void draw() { + // Displays the frame count to the Console + println("I'm drawing"); + println(frameCount); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/05_Response/Ex_05_02/Ex_05_02.pde b/content/gswp_2e/examples/05_Response/Ex_05_02/Ex_05_02.pde new file mode 100644 index 000000000..23c1033bf --- /dev/null +++ b/content/gswp_2e/examples/05_Response/Ex_05_02/Ex_05_02.pde @@ -0,0 +1,7 @@ +void setup() { + println("I'm starting"); +} + +void draw() { + println("I'm running"); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/05_Response/Ex_05_03/Ex_05_03.pde b/content/gswp_2e/examples/05_Response/Ex_05_03/Ex_05_03.pde new file mode 100644 index 000000000..79e7c9e1f --- /dev/null +++ b/content/gswp_2e/examples/05_Response/Ex_05_03/Ex_05_03.pde @@ -0,0 +1,13 @@ +int x = 280; +int y = -100; +int diameter = 380; + +void setup() { + size(480, 120); + fill(102); +} + +void draw() { + background(204); + ellipse(x, y, diameter, diameter); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/05_Response/Ex_05_04/Ex_05_04.pde b/content/gswp_2e/examples/05_Response/Ex_05_04/Ex_05_04.pde new file mode 100644 index 000000000..5f77add46 --- /dev/null +++ b/content/gswp_2e/examples/05_Response/Ex_05_04/Ex_05_04.pde @@ -0,0 +1,9 @@ +void setup() { + size(480, 120); + fill(0, 102); + noStroke(); +} + +void draw() { + ellipse(mouseX, mouseY, 9, 9); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/05_Response/Ex_05_05/Ex_05_05.pde b/content/gswp_2e/examples/05_Response/Ex_05_05/Ex_05_05.pde new file mode 100644 index 000000000..488dbbc08 --- /dev/null +++ b/content/gswp_2e/examples/05_Response/Ex_05_05/Ex_05_05.pde @@ -0,0 +1,10 @@ +void setup() { + size(480, 120); + fill(0, 102); + noStroke(); +} + +void draw() { + background(204); + ellipse(mouseX, mouseY, 9, 9); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/05_Response/Ex_05_06/Ex_05_06.pde b/content/gswp_2e/examples/05_Response/Ex_05_06/Ex_05_06.pde new file mode 100644 index 000000000..3ed7b2d69 --- /dev/null +++ b/content/gswp_2e/examples/05_Response/Ex_05_06/Ex_05_06.pde @@ -0,0 +1,9 @@ +void setup() { + size(480, 120); + strokeWeight(4); + stroke(0, 102); +} + +void draw() { + line(mouseX, mouseY, pmouseX, pmouseY); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/05_Response/Ex_05_07/Ex_05_07.pde b/content/gswp_2e/examples/05_Response/Ex_05_07/Ex_05_07.pde new file mode 100644 index 000000000..4314d3580 --- /dev/null +++ b/content/gswp_2e/examples/05_Response/Ex_05_07/Ex_05_07.pde @@ -0,0 +1,10 @@ +void setup() { + size(480, 120); + stroke(0, 102); +} + +void draw() { + float weight = dist(mouseX, mouseY, pmouseX, pmouseY); + strokeWeight(weight); + line(mouseX, mouseY, pmouseX, pmouseY); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/05_Response/Ex_05_08/Ex_05_08.pde b/content/gswp_2e/examples/05_Response/Ex_05_08/Ex_05_08.pde new file mode 100644 index 000000000..1df1db1cf --- /dev/null +++ b/content/gswp_2e/examples/05_Response/Ex_05_08/Ex_05_08.pde @@ -0,0 +1,13 @@ +float x; +float easing = 0.01; + +void setup() { + size(220, 120); +} + +void draw() { + float targetX = mouseX; + x += (targetX - x) * easing; + ellipse(x, 40, 12, 12); + println(targetX + " : " + x); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/05_Response/Ex_05_09/Ex_05_09.pde b/content/gswp_2e/examples/05_Response/Ex_05_09/Ex_05_09.pde new file mode 100644 index 000000000..9c7478567 --- /dev/null +++ b/content/gswp_2e/examples/05_Response/Ex_05_09/Ex_05_09.pde @@ -0,0 +1,22 @@ +float x; +float y; +float px; +float py; +float easing = 0.05; + +void setup() { + size(480, 120); + stroke(0, 102); +} + +void draw() { + float targetX = mouseX; + x += (targetX - x) * easing; + float targetY = mouseY; + y += (targetY - y) * easing; + float weight = dist(x, y, px, py); + strokeWeight(weight); + line(x, y, px, py); + py = y; + px = x; +} \ No newline at end of file diff --git a/content/gswp_2e/examples/05_Response/Ex_05_10/Ex_05_10.pde b/content/gswp_2e/examples/05_Response/Ex_05_10/Ex_05_10.pde new file mode 100644 index 000000000..885a4d717 --- /dev/null +++ b/content/gswp_2e/examples/05_Response/Ex_05_10/Ex_05_10.pde @@ -0,0 +1,14 @@ +void setup() { + size(240, 120); + strokeWeight(30); +} + +void draw() { + background(204); + stroke(102); + line(40, 0, 70, height); + if (mousePressed == true) { + stroke(0); + } + line(0, 70, width, 50); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/05_Response/Ex_05_11/Ex_05_11.pde b/content/gswp_2e/examples/05_Response/Ex_05_11/Ex_05_11.pde new file mode 100644 index 000000000..bff4ec79d --- /dev/null +++ b/content/gswp_2e/examples/05_Response/Ex_05_11/Ex_05_11.pde @@ -0,0 +1,16 @@ +void setup() { + size(240, 120); + strokeWeight(30); +} + +void draw() { + background(204); + stroke(102); + line(40, 0, 70, height); + if (mousePressed) { + stroke(0); + } else { + stroke(255); + } + line(0, 70, width, 50); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/05_Response/Ex_05_12/Ex_05_12.pde b/content/gswp_2e/examples/05_Response/Ex_05_12/Ex_05_12.pde new file mode 100644 index 000000000..6b2cd74f1 --- /dev/null +++ b/content/gswp_2e/examples/05_Response/Ex_05_12/Ex_05_12.pde @@ -0,0 +1,18 @@ +void setup() { + size(120, 120); + strokeWeight(30); +} + +void draw() { + background(204); + stroke(102); + line(40, 0, 70, height); + if (mousePressed) { + if (mouseButton == LEFT) { + stroke(255); + } else { + stroke(0); + } + line(0, 70, width, 50); + } +} \ No newline at end of file diff --git a/content/gswp_2e/examples/05_Response/Ex_05_13/Ex_05_13.pde b/content/gswp_2e/examples/05_Response/Ex_05_13/Ex_05_13.pde new file mode 100644 index 000000000..a0158b781 --- /dev/null +++ b/content/gswp_2e/examples/05_Response/Ex_05_13/Ex_05_13.pde @@ -0,0 +1,24 @@ +float x; +int offset = 10; + +void setup() { + size(240, 120); + x = width/2; +} + +void draw() { + background(204); + if (mouseX > x) { + x += 0.5; + offset = -10; + } + if (mouseX < x) { + x -= 0.5; + offset = 10; + } + // Draw arrow left or right depending on "offset" value + line(x, 0, x, height); + line(mouseX, mouseY, mouseX + offset, mouseY - 10); + line(mouseX, mouseY, mouseX + offset, mouseY + 10); + line(mouseX, mouseY, mouseX + offset*3, mouseY); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/05_Response/Ex_05_14/Ex_05_14.pde b/content/gswp_2e/examples/05_Response/Ex_05_14/Ex_05_14.pde new file mode 100644 index 000000000..fc52c671e --- /dev/null +++ b/content/gswp_2e/examples/05_Response/Ex_05_14/Ex_05_14.pde @@ -0,0 +1,20 @@ +int x = 120; +int y = 60; +int radius = 12; + +void setup() { + size(240, 120); + ellipseMode(RADIUS); +} + +void draw() { + background(204); + float d = dist(mouseX, mouseY, x, y); + if (d < radius) { + radius++; + fill(0); + } else { + fill(255); + } + ellipse(x, y, radius, radius); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/05_Response/Ex_05_15/Ex_05_15.pde b/content/gswp_2e/examples/05_Response/Ex_05_15/Ex_05_15.pde new file mode 100644 index 000000000..55f328bec --- /dev/null +++ b/content/gswp_2e/examples/05_Response/Ex_05_15/Ex_05_15.pde @@ -0,0 +1,19 @@ +int x = 80; +int y = 30; +int w = 80; +int h = 60; + +void setup() { + size(240, 120); +} + +void draw() { + background(204); + if ((mouseX > x) && (mouseX < x+w) && + (mouseY > y) && (mouseY < y+h)) { + fill(0); + } else { + fill(255); + } + rect(x, y, w, h); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/05_Response/Ex_05_16/Ex_05_16.pde b/content/gswp_2e/examples/05_Response/Ex_05_16/Ex_05_16.pde new file mode 100644 index 000000000..98f03c807 --- /dev/null +++ b/content/gswp_2e/examples/05_Response/Ex_05_16/Ex_05_16.pde @@ -0,0 +1,11 @@ +void setup() { + size(240, 120); +} + +void draw() { + background(204); + line(20, 20, 220, 100); + if (keyPressed) { + line(220, 20, 20, 100); + } +} \ No newline at end of file diff --git a/content/gswp_2e/examples/05_Response/Ex_05_17/Ex_05_17.pde b/content/gswp_2e/examples/05_Response/Ex_05_17/Ex_05_17.pde new file mode 100644 index 000000000..1624f4eee --- /dev/null +++ b/content/gswp_2e/examples/05_Response/Ex_05_17/Ex_05_17.pde @@ -0,0 +1,10 @@ +void setup() { + size(120, 120); + textSize(64); + textAlign(CENTER); +} + +void draw() { + background(0); + text(key, 60, 80); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/05_Response/Ex_05_18/Ex_05_18.pde b/content/gswp_2e/examples/05_Response/Ex_05_18/Ex_05_18.pde new file mode 100644 index 000000000..df5a3f79e --- /dev/null +++ b/content/gswp_2e/examples/05_Response/Ex_05_18/Ex_05_18.pde @@ -0,0 +1,17 @@ +void setup() { + size(120, 120); +} + +void draw() { + background(204); + if (keyPressed) { + if ((key == 'h') || (key == 'H')) { + line(30, 60, 90, 60); + } + if ((key == 'n') || (key == 'N')) { + line(30, 20, 90, 100); + } + } + line(30, 20, 30, 100); + line(90, 20, 90, 100); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/05_Response/Ex_05_19/Ex_05_19.pde b/content/gswp_2e/examples/05_Response/Ex_05_19/Ex_05_19.pde new file mode 100644 index 000000000..5d694e59e --- /dev/null +++ b/content/gswp_2e/examples/05_Response/Ex_05_19/Ex_05_19.pde @@ -0,0 +1,16 @@ +int x = 215; + +void setup() { + size(480, 120); +} + +void draw() { + if (keyPressed && (key == CODED)) { // If it's a coded key + if (keyCode == LEFT) { // If it's the left arrow + x--; + } else if (keyCode == RIGHT) { // If it's the right arrow + x++; + } + } + rect(x, 45, 50, 50); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/05_Response/Ex_05_20/Ex_05_20.pde b/content/gswp_2e/examples/05_Response/Ex_05_20/Ex_05_20.pde new file mode 100644 index 000000000..03b49a466 --- /dev/null +++ b/content/gswp_2e/examples/05_Response/Ex_05_20/Ex_05_20.pde @@ -0,0 +1,13 @@ +void setup() { + size(240, 120); + strokeWeight(12); +} + +void draw() { + background(204); + stroke(102); + line(mouseX, 0, mouseX, height); // Gray line + stroke(0); + float mx = mouseX/2 + 60; + line(mx, 0, mx, height); // Black line +} \ No newline at end of file diff --git a/content/gswp_2e/examples/05_Response/Ex_05_21/Ex_05_21.pde b/content/gswp_2e/examples/05_Response/Ex_05_21/Ex_05_21.pde new file mode 100644 index 000000000..7faa8af41 --- /dev/null +++ b/content/gswp_2e/examples/05_Response/Ex_05_21/Ex_05_21.pde @@ -0,0 +1,13 @@ +void setup() { + size(240, 120); + strokeWeight(12); +} + +void draw() { + background(204); + stroke(102); + line(mouseX, 0, mouseX, height); // Gray line + stroke(0); + float mx = map(mouseX, 0, width, 60, 180); + line(mx, 0, mx, height); // Black line +} \ No newline at end of file diff --git a/content/gswp_2e/examples/06_Transform/Ex_06_01/Ex_06_01.pde b/content/gswp_2e/examples/06_Transform/Ex_06_01/Ex_06_01.pde new file mode 100644 index 000000000..e9188f23d --- /dev/null +++ b/content/gswp_2e/examples/06_Transform/Ex_06_01/Ex_06_01.pde @@ -0,0 +1,8 @@ +void setup() { + size(120, 120); +} + +void draw() { + translate(mouseX, mouseY); + rect(0, 0, 30, 30); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/06_Transform/Ex_06_02/Ex_06_02.pde b/content/gswp_2e/examples/06_Transform/Ex_06_02/Ex_06_02.pde new file mode 100644 index 000000000..b586aed8c --- /dev/null +++ b/content/gswp_2e/examples/06_Transform/Ex_06_02/Ex_06_02.pde @@ -0,0 +1,10 @@ +void setup() { + size(120, 120); +} + +void draw() { + translate(mouseX, mouseY); + rect(0, 0, 30, 30); + translate(35, 10); + rect(0, 0, 15, 15); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/06_Transform/Ex_06_03/Ex_06_03.pde b/content/gswp_2e/examples/06_Transform/Ex_06_03/Ex_06_03.pde new file mode 100644 index 000000000..bc3b5db9e --- /dev/null +++ b/content/gswp_2e/examples/06_Transform/Ex_06_03/Ex_06_03.pde @@ -0,0 +1,8 @@ +void setup() { + size(120, 120); +} + +void draw() { + rotate(mouseX / 100.0); + rect(40, 30, 160, 20); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/06_Transform/Ex_06_04/Ex_06_04.pde b/content/gswp_2e/examples/06_Transform/Ex_06_04/Ex_06_04.pde new file mode 100644 index 000000000..2c750c81f --- /dev/null +++ b/content/gswp_2e/examples/06_Transform/Ex_06_04/Ex_06_04.pde @@ -0,0 +1,8 @@ +void setup() { + size(120, 120); +} + +void draw() { + rotate(mouseX / 100.0); + rect(-80, -10, 160, 20); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/06_Transform/Ex_06_05/Ex_06_05.pde b/content/gswp_2e/examples/06_Transform/Ex_06_05/Ex_06_05.pde new file mode 100644 index 000000000..b935a606f --- /dev/null +++ b/content/gswp_2e/examples/06_Transform/Ex_06_05/Ex_06_05.pde @@ -0,0 +1,12 @@ +float angle = 0; + +void setup() { + size(120, 120); +} + +void draw() { + translate(mouseX, mouseY); + rotate(angle); + rect(-15, -15, 30, 30); + angle += 0.1; +} \ No newline at end of file diff --git a/content/gswp_2e/examples/06_Transform/Ex_06_06/Ex_06_06.pde b/content/gswp_2e/examples/06_Transform/Ex_06_06/Ex_06_06.pde new file mode 100644 index 000000000..ce087406d --- /dev/null +++ b/content/gswp_2e/examples/06_Transform/Ex_06_06/Ex_06_06.pde @@ -0,0 +1,12 @@ +float angle = 0.0; + +void setup() { + size(120, 120); +} + +void draw() { + rotate(angle); + translate(mouseX, mouseY); + rect(-15, -15, 30, 30); + angle += 0.1; +} \ No newline at end of file diff --git a/content/gswp_2e/examples/06_Transform/Ex_06_07/Ex_06_07.pde b/content/gswp_2e/examples/06_Transform/Ex_06_07/Ex_06_07.pde new file mode 100644 index 000000000..a38199713 --- /dev/null +++ b/content/gswp_2e/examples/06_Transform/Ex_06_07/Ex_06_07.pde @@ -0,0 +1,27 @@ +float angle = 0.0; +float angleDirection = 1; +float speed = 0.005; + +void setup() { + size(120, 120); +} + +void draw() { + background(204); + translate(20, 25); // Move to start position + rotate(angle); + strokeWeight(12); + line(0, 0, 40, 0); + translate(40, 0); // Move to next joint + rotate(angle * 2.0); + strokeWeight(6); + line(0, 0, 30, 0); + translate(30, 0); // Move to next joint + rotate(angle * 2.5); + strokeWeight(3); + line(0, 0, 20, 0); + angle += speed * angleDirection; + if ((angle > QUARTER_PI) || (angle < 0)) { + angleDirection = -angleDirection; + } +} \ No newline at end of file diff --git a/content/gswp_2e/examples/06_Transform/Ex_06_08/Ex_06_08.pde b/content/gswp_2e/examples/06_Transform/Ex_06_08/Ex_06_08.pde new file mode 100644 index 000000000..56392dcaa --- /dev/null +++ b/content/gswp_2e/examples/06_Transform/Ex_06_08/Ex_06_08.pde @@ -0,0 +1,10 @@ + +void setup() { + size(120, 120); +} + +void draw() { + translate(mouseX, mouseY); + scale(mouseX / 60.0); + rect(-15, -15, 30, 30); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/06_Transform/Ex_06_09/Ex_06_09.pde b/content/gswp_2e/examples/06_Transform/Ex_06_09/Ex_06_09.pde new file mode 100644 index 000000000..96de08f31 --- /dev/null +++ b/content/gswp_2e/examples/06_Transform/Ex_06_09/Ex_06_09.pde @@ -0,0 +1,11 @@ +void setup() { + size(120, 120); +} + +void draw() { + translate(mouseX, mouseY); + float scalar = mouseX / 60.0; + scale(scalar); + strokeWeight(1.0 / scalar); + rect(-15, -15, 30, 30); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/06_Transform/Ex_06_10/Ex_06_10.pde b/content/gswp_2e/examples/06_Transform/Ex_06_10/Ex_06_10.pde new file mode 100644 index 000000000..da40b1aac --- /dev/null +++ b/content/gswp_2e/examples/06_Transform/Ex_06_10/Ex_06_10.pde @@ -0,0 +1,12 @@ +void setup() { + size(120, 120); +} + +void draw() { + pushMatrix(); + translate(mouseX, mouseY); + rect(0, 0, 30, 30); + popMatrix(); + translate(35, 10); + rect(0, 0, 15, 15); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/07_Media/Ex_07_01/Ex_07_01.pde b/content/gswp_2e/examples/07_Media/Ex_07_01/Ex_07_01.pde new file mode 100644 index 000000000..6876ec79a --- /dev/null +++ b/content/gswp_2e/examples/07_Media/Ex_07_01/Ex_07_01.pde @@ -0,0 +1,10 @@ +PImage img; + +void setup() { + size(480, 120); + img = loadImage("lunar.jpg"); +} + +void draw() { + image(img, 0, 0); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/07_Media/Ex_07_01/data/lunar.jpg b/content/gswp_2e/examples/07_Media/Ex_07_01/data/lunar.jpg new file mode 100644 index 000000000..f26c67ff8 Binary files /dev/null and b/content/gswp_2e/examples/07_Media/Ex_07_01/data/lunar.jpg differ diff --git a/content/gswp_2e/examples/07_Media/Ex_07_02/Ex_07_02.pde b/content/gswp_2e/examples/07_Media/Ex_07_02/Ex_07_02.pde new file mode 100644 index 000000000..9cfb2f8d0 --- /dev/null +++ b/content/gswp_2e/examples/07_Media/Ex_07_02/Ex_07_02.pde @@ -0,0 +1,14 @@ +PImage img1; +PImage img2; + +void setup() { + size(480, 120); + img1 = loadImage("lunar.jpg"); + img2 = loadImage("capsule.jpg"); +} + +void draw() { + image(img1, -120, 0); + image(img1, 130, 0, 240, 120); + image(img2, 300, 0, 240, 120); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/07_Media/Ex_07_02/data/capsule.jpg b/content/gswp_2e/examples/07_Media/Ex_07_02/data/capsule.jpg new file mode 100644 index 000000000..aeb5a5954 Binary files /dev/null and b/content/gswp_2e/examples/07_Media/Ex_07_02/data/capsule.jpg differ diff --git a/content/gswp_2e/examples/07_Media/Ex_07_02/data/lunar.jpg b/content/gswp_2e/examples/07_Media/Ex_07_02/data/lunar.jpg new file mode 100644 index 000000000..f26c67ff8 Binary files /dev/null and b/content/gswp_2e/examples/07_Media/Ex_07_02/data/lunar.jpg differ diff --git a/content/gswp_2e/examples/07_Media/Ex_07_03/Ex_07_03.pde b/content/gswp_2e/examples/07_Media/Ex_07_03/Ex_07_03.pde new file mode 100644 index 000000000..11e9fa067 --- /dev/null +++ b/content/gswp_2e/examples/07_Media/Ex_07_03/Ex_07_03.pde @@ -0,0 +1,11 @@ +PImage img; + +void setup() { + size(480, 120); + img = loadImage("lunar.jpg"); +} + +void draw() { + background(0); + image(img, 0, 0, mouseX * 2, mouseY * 2); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/07_Media/Ex_07_03/data/lunar.jpg b/content/gswp_2e/examples/07_Media/Ex_07_03/data/lunar.jpg new file mode 100644 index 000000000..f26c67ff8 Binary files /dev/null and b/content/gswp_2e/examples/07_Media/Ex_07_03/data/lunar.jpg differ diff --git a/content/gswp_2e/examples/07_Media/Ex_07_04/Ex_07_04.pde b/content/gswp_2e/examples/07_Media/Ex_07_04/Ex_07_04.pde new file mode 100644 index 000000000..86e47d6a2 --- /dev/null +++ b/content/gswp_2e/examples/07_Media/Ex_07_04/Ex_07_04.pde @@ -0,0 +1,12 @@ +PImage img; + +void setup() { + size(480, 120); + img = loadImage("clouds.gif"); +} + +void draw() { + background(255); + image(img, 0, 0); + image(img, 0, mouseY * -1); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/07_Media/Ex_07_04/data/clouds.gif b/content/gswp_2e/examples/07_Media/Ex_07_04/data/clouds.gif new file mode 100644 index 000000000..ad52b85a1 Binary files /dev/null and b/content/gswp_2e/examples/07_Media/Ex_07_04/data/clouds.gif differ diff --git a/content/gswp_2e/examples/07_Media/Ex_07_05/Ex_07_05.pde b/content/gswp_2e/examples/07_Media/Ex_07_05/Ex_07_05.pde new file mode 100644 index 000000000..2ce5309a8 --- /dev/null +++ b/content/gswp_2e/examples/07_Media/Ex_07_05/Ex_07_05.pde @@ -0,0 +1,12 @@ +PImage img; + +void setup() { + size(480, 120); + img = loadImage("clouds.png"); +} + +void draw() { + background(204); + image(img, 0, 0); + image(img, 0, mouseY * -1); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/07_Media/Ex_07_05/data/clouds.png b/content/gswp_2e/examples/07_Media/Ex_07_05/data/clouds.png new file mode 100644 index 000000000..fc060899a Binary files /dev/null and b/content/gswp_2e/examples/07_Media/Ex_07_05/data/clouds.png differ diff --git a/content/gswp_2e/examples/07_Media/Ex_07_06/Ex_07_06.pde b/content/gswp_2e/examples/07_Media/Ex_07_06/Ex_07_06.pde new file mode 100644 index 000000000..dc884f929 --- /dev/null +++ b/content/gswp_2e/examples/07_Media/Ex_07_06/Ex_07_06.pde @@ -0,0 +1,15 @@ +PFont font; + +void setup() { + size(480, 120); + font = createFont("SourceCodePro-Regular.ttf", 32); + textFont(font); +} + +void draw() { + background(102); + textSize(32); + text("That’s one small step for man...", 25, 60); + textSize(16); + text("That’s one small step for man...", 27, 90); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/07_Media/Ex_07_06/data/SourceCodePro-Regular.ttf b/content/gswp_2e/examples/07_Media/Ex_07_06/data/SourceCodePro-Regular.ttf new file mode 100755 index 000000000..b2cff928e Binary files /dev/null and b/content/gswp_2e/examples/07_Media/Ex_07_06/data/SourceCodePro-Regular.ttf differ diff --git a/content/gswp_2e/examples/07_Media/Ex_07_07/Ex_07_07.pde b/content/gswp_2e/examples/07_Media/Ex_07_07/Ex_07_07.pde new file mode 100644 index 000000000..af0c2d80f --- /dev/null +++ b/content/gswp_2e/examples/07_Media/Ex_07_07/Ex_07_07.pde @@ -0,0 +1,12 @@ +PFont font; + +void setup() { + size(480, 120); + font = createFont("SourceCodePro-Regular.ttf", 24); + textFont(font); +} + +void draw() { + background(102); + text("That’s one small step for man...", 26, 24, 240, 100); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/07_Media/Ex_07_07/data/SourceCodePro-Regular.ttf b/content/gswp_2e/examples/07_Media/Ex_07_07/data/SourceCodePro-Regular.ttf new file mode 100755 index 000000000..b2cff928e Binary files /dev/null and b/content/gswp_2e/examples/07_Media/Ex_07_07/data/SourceCodePro-Regular.ttf differ diff --git a/content/gswp_2e/examples/07_Media/Ex_07_08/Ex_07_08.pde b/content/gswp_2e/examples/07_Media/Ex_07_08/Ex_07_08.pde new file mode 100644 index 000000000..2d60a5783 --- /dev/null +++ b/content/gswp_2e/examples/07_Media/Ex_07_08/Ex_07_08.pde @@ -0,0 +1,13 @@ +PFont font; +String quote = "That’s one small step for man..."; + +void setup() { + size(480, 120); + font = createFont("SourceCodePro-Regular.ttf", 24); + textFont(font); +} + +void draw() { + background(102); + text(quote, 26, 24, 240, 100); +} diff --git a/content/gswp_2e/examples/07_Media/Ex_07_08/data/SourceCodePro-Regular.ttf b/content/gswp_2e/examples/07_Media/Ex_07_08/data/SourceCodePro-Regular.ttf new file mode 100755 index 000000000..b2cff928e Binary files /dev/null and b/content/gswp_2e/examples/07_Media/Ex_07_08/data/SourceCodePro-Regular.ttf differ diff --git a/content/gswp_2e/examples/07_Media/Ex_07_09/Ex_07_09.pde b/content/gswp_2e/examples/07_Media/Ex_07_09/Ex_07_09.pde new file mode 100644 index 000000000..11226c5d1 --- /dev/null +++ b/content/gswp_2e/examples/07_Media/Ex_07_09/Ex_07_09.pde @@ -0,0 +1,12 @@ +PShape network; + +void setup() { + size(480, 120); + network = loadShape("network.svg"); +} + +void draw() { + background(0); + shape(network, 30, 10); + shape(network, 180, 10, 280, 280); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/07_Media/Ex_07_09/data/network.svg b/content/gswp_2e/examples/07_Media/Ex_07_09/data/network.svg new file mode 100644 index 000000000..93d407489 --- /dev/null +++ b/content/gswp_2e/examples/07_Media/Ex_07_09/data/network.svg @@ -0,0 +1,3117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/gswp_2e/examples/07_Media/Ex_07_10/Ex_07_10.pde b/content/gswp_2e/examples/07_Media/Ex_07_10/Ex_07_10.pde new file mode 100644 index 000000000..a2d2010ea --- /dev/null +++ b/content/gswp_2e/examples/07_Media/Ex_07_10/Ex_07_10.pde @@ -0,0 +1,13 @@ +PShape network; + +void setup() { + size(240, 120); + shapeMode(CENTER); + network = loadShape("network.svg"); +} + +void draw() { + background(0); + float diameter = map(mouseX, 0, width, 10, 800); + shape(network, 120, 60, diameter, diameter); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/07_Media/Ex_07_10/data/network.svg b/content/gswp_2e/examples/07_Media/Ex_07_10/data/network.svg new file mode 100644 index 000000000..93d407489 --- /dev/null +++ b/content/gswp_2e/examples/07_Media/Ex_07_10/data/network.svg @@ -0,0 +1,3117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/gswp_2e/examples/07_Media/Ex_07_11/Ex_07_11.pde b/content/gswp_2e/examples/07_Media/Ex_07_11/Ex_07_11.pde new file mode 100644 index 000000000..25c5b60b9 --- /dev/null +++ b/content/gswp_2e/examples/07_Media/Ex_07_11/Ex_07_11.pde @@ -0,0 +1,24 @@ +PShape dino; + +void setup() { + size(480, 120); + dino = createShape(); + dino.beginShape(); + dino.fill(153, 176, 180); + dino.vertex(50, 120); + dino.vertex(100, 90); + dino.vertex(110, 60); + dino.vertex(80, 20); + dino.vertex(210, 60); + dino.vertex(160, 80); + dino.vertex(200, 90); + dino.vertex(140, 100); + dino.vertex(130, 120); + dino.endShape(); +} + +void draw() { + background(204); + translate(mouseX - 120, 0); + shape(dino, 0, 0); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/08_Motion/Ex_08_01/Ex_08_01.pde b/content/gswp_2e/examples/08_Motion/Ex_08_01/Ex_08_01.pde new file mode 100644 index 000000000..b771f4482 --- /dev/null +++ b/content/gswp_2e/examples/08_Motion/Ex_08_01/Ex_08_01.pde @@ -0,0 +1,4 @@ +void draw() { + println(frameRate); +} + diff --git a/content/gswp_2e/examples/08_Motion/Ex_08_02/Ex_08_02.pde b/content/gswp_2e/examples/08_Motion/Ex_08_02/Ex_08_02.pde new file mode 100644 index 000000000..934ad614c --- /dev/null +++ b/content/gswp_2e/examples/08_Motion/Ex_08_02/Ex_08_02.pde @@ -0,0 +1,10 @@ +void setup() { + frameRate(30); // Thirty frames each second + //frameRate(12); // Twelve frames each second + //frameRate(2); // Two frames each second + //frameRate(0.5); // One frame every two seconds +} + +void draw() { + println(frameRate); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/08_Motion/Ex_08_03/Ex_08_03.pde b/content/gswp_2e/examples/08_Motion/Ex_08_03/Ex_08_03.pde new file mode 100644 index 000000000..beccc79cb --- /dev/null +++ b/content/gswp_2e/examples/08_Motion/Ex_08_03/Ex_08_03.pde @@ -0,0 +1,14 @@ +int radius = 40; +float x = -radius; +float speed = 0.5; + +void setup() { + size(240, 120); + ellipseMode(RADIUS); +} + +void draw() { + background(0); + x += speed; // Increase the value of x + arc(x, 60, radius, radius, 0.52, 5.76); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/08_Motion/Ex_08_04/Ex_08_04.pde b/content/gswp_2e/examples/08_Motion/Ex_08_04/Ex_08_04.pde new file mode 100644 index 000000000..056aef265 --- /dev/null +++ b/content/gswp_2e/examples/08_Motion/Ex_08_04/Ex_08_04.pde @@ -0,0 +1,17 @@ +int radius = 40; +float x = -radius; +float speed = 0.5; + +void setup() { + size(240, 120); + ellipseMode(RADIUS); +} + +void draw() { + background(0); + x += speed; // Increase the value of x + if (x > width+radius) { // If the shape is off screen, + x = -radius; // move to the left edge + } + arc(x, 60, radius, radius, 0.52, 5.76); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/08_Motion/Ex_08_05/Ex_08_05.pde b/content/gswp_2e/examples/08_Motion/Ex_08_05/Ex_08_05.pde new file mode 100644 index 000000000..8073e8644 --- /dev/null +++ b/content/gswp_2e/examples/08_Motion/Ex_08_05/Ex_08_05.pde @@ -0,0 +1,22 @@ +int radius = 40; +float x = 110; +float speed = 0.5; +int direction = 1; + +void setup() { + size(240, 120); + ellipseMode(RADIUS); +} + +void draw() { + background(0); + x += speed * direction; + if ((x > width-radius) || (x < radius)) { + direction = -direction; // Flip direction + } + if (direction == 1) { + arc(x, 60, radius, radius, 0.52, 5.76); // Face right + } else { + arc(x, 60, radius, radius, 3.67, 8.9); // Face left + } +} \ No newline at end of file diff --git a/content/gswp_2e/examples/08_Motion/Ex_08_06/Ex_08_06.pde b/content/gswp_2e/examples/08_Motion/Ex_08_06/Ex_08_06.pde new file mode 100644 index 000000000..3e31cdcde --- /dev/null +++ b/content/gswp_2e/examples/08_Motion/Ex_08_06/Ex_08_06.pde @@ -0,0 +1,22 @@ +int startX = 20; // Initial x coordinate +int stopX = 160; // Final x coordinate +int startY = 30; // Initial y coordinate +int stopY = 80; // Final y coordinate +float x = startX; // Current x coordinate +float y = startY; // Current y coordinate +float step = 0.005; // Size of each step (0.0 to 1.0) +float pct = 0.0; // Percentage traveled (0.0 to 1.0) + +void setup() { + size(240, 120); +} + +void draw() { + background(0); + if (pct < 1.0) { + x = startX + ((stopX-startX) * pct); + y = startY + ((stopY-startY) * pct); + pct += step; + } + ellipse(x, y, 20, 20); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/08_Motion/Ex_08_07/Ex_08_07.pde b/content/gswp_2e/examples/08_Motion/Ex_08_07/Ex_08_07.pde new file mode 100644 index 000000000..2a0df21ed --- /dev/null +++ b/content/gswp_2e/examples/08_Motion/Ex_08_07/Ex_08_07.pde @@ -0,0 +1,4 @@ +void draw() { + float r = random(0, mouseX); + println(r); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/08_Motion/Ex_08_08/Ex_08_08.pde b/content/gswp_2e/examples/08_Motion/Ex_08_08/Ex_08_08.pde new file mode 100644 index 000000000..eab30a504 --- /dev/null +++ b/content/gswp_2e/examples/08_Motion/Ex_08_08/Ex_08_08.pde @@ -0,0 +1,13 @@ +void setup() { + size(240, 120); +} + +void draw() { + background(204); + for (int x = 20; x < width; x += 20) { + float mx = mouseX / 10; + float offsetA = random(-mx, mx); + float offsetB = random(-mx, mx); + line(x + offsetA, 20, x - offsetB, 100); + } +} \ No newline at end of file diff --git a/content/gswp_2e/examples/08_Motion/Ex_08_09/Ex_08_09.pde b/content/gswp_2e/examples/08_Motion/Ex_08_09/Ex_08_09.pde new file mode 100644 index 000000000..40cbbf568 --- /dev/null +++ b/content/gswp_2e/examples/08_Motion/Ex_08_09/Ex_08_09.pde @@ -0,0 +1,16 @@ +float speed = 2.5; +int diameter = 20; +float x; +float y; + +void setup() { + size(240, 120); + x = width/2; + y = height/2; +} + +void draw() { + x += random(-speed, speed); + y += random(-speed, speed); + ellipse(x, y, diameter, diameter); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/08_Motion/Ex_08_10/Ex_08_10.pde b/content/gswp_2e/examples/08_Motion/Ex_08_10/Ex_08_10.pde new file mode 100644 index 000000000..c7cc8f09e --- /dev/null +++ b/content/gswp_2e/examples/08_Motion/Ex_08_10/Ex_08_10.pde @@ -0,0 +1,4 @@ +void draw() { + int timer = millis(); + println(timer); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/08_Motion/Ex_08_11/Ex_08_11.pde b/content/gswp_2e/examples/08_Motion/Ex_08_11/Ex_08_11.pde new file mode 100644 index 000000000..2c525b6a5 --- /dev/null +++ b/content/gswp_2e/examples/08_Motion/Ex_08_11/Ex_08_11.pde @@ -0,0 +1,18 @@ +int time1 = 2000; +int time2 = 4000; +float x = 0; + +void setup() { + size(480, 120); +} + +void draw() { + int currentTime = millis(); + background(204); + if (currentTime > time2) { + x -= 0.5; + } else if (currentTime > time1) { + x += 2; + } + ellipse(x, 60, 90, 90); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/08_Motion/Ex_08_12/Ex_08_12.pde b/content/gswp_2e/examples/08_Motion/Ex_08_12/Ex_08_12.pde new file mode 100644 index 000000000..8ff175e97 --- /dev/null +++ b/content/gswp_2e/examples/08_Motion/Ex_08_12/Ex_08_12.pde @@ -0,0 +1,9 @@ +float angle = 0.0; + +void draw() { + float sinval = sin(angle); + println(sinval); + float gray = map(sinval, -1, 1, 0, 255); + background(gray); + angle += 0.1; +} \ No newline at end of file diff --git a/content/gswp_2e/examples/08_Motion/Ex_08_13/Ex_08_13.pde b/content/gswp_2e/examples/08_Motion/Ex_08_13/Ex_08_13.pde new file mode 100644 index 000000000..fde223e27 --- /dev/null +++ b/content/gswp_2e/examples/08_Motion/Ex_08_13/Ex_08_13.pde @@ -0,0 +1,19 @@ +float angle = 0.0; +float offset = 60; +float scalar = 40; +float speed = 0.05; + +void setup() { + size(240, 120); +} + +void draw() { + background(0); + float y1 = offset + sin(angle) * scalar; + float y2 = offset + sin(angle + 0.4) * scalar; + float y3 = offset + sin(angle + 0.8) * scalar; + ellipse( 80, y1, 40, 40); + ellipse(120, y2, 40, 40); + ellipse(160, y3, 40, 40); + angle += speed; +} \ No newline at end of file diff --git a/content/gswp_2e/examples/08_Motion/Ex_08_14/Ex_08_14.pde b/content/gswp_2e/examples/08_Motion/Ex_08_14/Ex_08_14.pde new file mode 100644 index 000000000..31661800a --- /dev/null +++ b/content/gswp_2e/examples/08_Motion/Ex_08_14/Ex_08_14.pde @@ -0,0 +1,15 @@ +float angle = 0.0; +float offset = 60; +float scalar = 30; +float speed = 0.05; + +void setup() { + size(120, 120); +} + +void draw() { + float x = offset + cos(angle) * scalar; + float y = offset + sin(angle) * scalar; + ellipse( x, y, 40, 40); + angle += speed; +} \ No newline at end of file diff --git a/content/gswp_2e/examples/08_Motion/Ex_08_15/Ex_08_15.pde b/content/gswp_2e/examples/08_Motion/Ex_08_15/Ex_08_15.pde new file mode 100644 index 000000000..76b0650a5 --- /dev/null +++ b/content/gswp_2e/examples/08_Motion/Ex_08_15/Ex_08_15.pde @@ -0,0 +1,17 @@ +float angle = 0.0; +float offset = 60; +float scalar = 2; +float speed = 0.05; + +void setup() { + size(120, 120); + fill(0); +} + +void draw() { + float x = offset + cos(angle) * scalar; + float y = offset + sin(angle) * scalar; + ellipse( x, y, 2, 2); + angle += speed; + scalar += speed; +} \ No newline at end of file diff --git a/content/gswp_2e/examples/09_Functions/Ex_09_01/Ex_09_01.pde b/content/gswp_2e/examples/09_Functions/Ex_09_01/Ex_09_01.pde new file mode 100644 index 000000000..4b018f0e0 --- /dev/null +++ b/content/gswp_2e/examples/09_Functions/Ex_09_01/Ex_09_01.pde @@ -0,0 +1,12 @@ +void setup() { + println("Ready to roll!"); + rollDice(20); + rollDice(20); + rollDice(6); + println("Finished."); +} + +void rollDice(int numSides) { + int d = 1 + int(random(numSides)); + println("Rolling... " + d); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/09_Functions/Ex_09_02/Ex_09_02.pde b/content/gswp_2e/examples/09_Functions/Ex_09_02/Ex_09_02.pde new file mode 100644 index 000000000..17f2d8ec4 --- /dev/null +++ b/content/gswp_2e/examples/09_Functions/Ex_09_02/Ex_09_02.pde @@ -0,0 +1,10 @@ +void setup() { + println("Ready to roll!"); + int d1 = 1 + int(random(20)); + println("Rolling... " + d1); + int d2 = 1 + int(random(20)); + println("Rolling... " + d2); + int d3 = 1 + int(random(6)); + println("Rolling... " + d3); + println("Finished."); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/09_Functions/Ex_09_03/Ex_09_03.pde b/content/gswp_2e/examples/09_Functions/Ex_09_03/Ex_09_03.pde new file mode 100644 index 000000000..ae28826ae --- /dev/null +++ b/content/gswp_2e/examples/09_Functions/Ex_09_03/Ex_09_03.pde @@ -0,0 +1,20 @@ +void setup() { + size(480, 120); +} + +void draw() { + background(176, 204, 226); + translate(110, 110); + stroke(138, 138, 125); + strokeWeight(70); + line(0, -35, 0, -65); // Body + noStroke(); + fill(255); + ellipse(-17.5, -65, 35, 35); // Left eye dome + ellipse(17.5, -65, 35, 35); // Right eye dome + arc(0, -65, 70, 70, 0, PI); // Chin + fill(51, 51, 30); + ellipse(-14, -65, 8, 8); // Left eye + ellipse(14, -65, 8, 8); // Right eye + quad(0, -58, 4, -51, 0, -44, -4, -51); // Beak +} \ No newline at end of file diff --git a/content/gswp_2e/examples/09_Functions/Ex_09_04/Ex_09_04.pde b/content/gswp_2e/examples/09_Functions/Ex_09_04/Ex_09_04.pde new file mode 100644 index 000000000..122d5ab68 --- /dev/null +++ b/content/gswp_2e/examples/09_Functions/Ex_09_04/Ex_09_04.pde @@ -0,0 +1,36 @@ +void setup() { + size(480, 120); +} +void draw() { + background(176, 204, 226); + + // Left owl + translate(110, 110); + stroke(138, 138, 125); + strokeWeight(70); + line(0, -35, 0, -65); // Body + noStroke(); + fill(255); + ellipse(-17.5, -65, 35, 35); // Left eye dome + ellipse(17.5, -65, 35, 35); // Right eye dome + arc(0, -65, 70, 70, 0, PI); // Chin + fill(51, 51, 30); + ellipse(-14, -65, 8, 8); // Left eye + ellipse(14, -65, 8, 8); // Right eye + quad(0, -58, 4, -51, 0, -44, -4, -51); // Beak + + // Right owl + translate(70, 0); + stroke(138, 138, 125); + strokeWeight(70); + line(0, -35, 0, -65); // Body + noStroke(); + fill(255); + ellipse(-17.5, -65, 35, 35); // Left eye dome + ellipse(17.5, -65, 35, 35); // Right eye dome + arc(0, -65, 70, 70, 0, PI); // Chin + fill(51, 51, 30); + ellipse(-14, -65, 8, 8); // Left eye + ellipse(14, -65, 8, 8); // Right eye + quad(0, -58, 4, -51, 0, -44, -4, -51); // Beak +} \ No newline at end of file diff --git a/content/gswp_2e/examples/09_Functions/Ex_09_05/Ex_09_05.pde b/content/gswp_2e/examples/09_Functions/Ex_09_05/Ex_09_05.pde new file mode 100644 index 000000000..1b3672eb6 --- /dev/null +++ b/content/gswp_2e/examples/09_Functions/Ex_09_05/Ex_09_05.pde @@ -0,0 +1,27 @@ +void setup() { + size(480, 120); +} + +void draw() { + background(176, 204, 226); + owl(110, 110); + owl(180, 110); +} + +void owl(int x, int y) { + pushMatrix(); + translate(x, y); + stroke(138, 138, 125); + strokeWeight(70); + line(0, -35, 0, -65); // Body + noStroke(); + fill(255); + ellipse(-17.5, -65, 35, 35); // Left eye dome + ellipse(17.5, -65, 35, 35); // Right eye dome + arc(0, -65, 70, 70, 0, PI); // Chin + fill(51, 51, 30); + ellipse(-14, -65, 8, 8); // Left eye + ellipse(14, -65, 8, 8); // Right eye + quad(0, -58, 4, -51, 0, -44, -4, -51); // Beak + popMatrix(); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/09_Functions/Ex_09_06/Ex_09_06.pde b/content/gswp_2e/examples/09_Functions/Ex_09_06/Ex_09_06.pde new file mode 100644 index 000000000..8b42b6c70 --- /dev/null +++ b/content/gswp_2e/examples/09_Functions/Ex_09_06/Ex_09_06.pde @@ -0,0 +1,28 @@ +void setup() { + size(480, 120); +} + +void draw() { + background(176, 204, 226); + for (int x = 35; x < width + 70; x += 70) { + owl(x, 110); + } +} + +void owl(int x, int y) { + pushMatrix(); + translate(x, y); + stroke(138, 138, 125); + strokeWeight(70); + line(0, -35, 0, -65); // Body + noStroke(); + fill(255); + ellipse(-17.5, -65, 35, 35); // Left eye dome + ellipse(17.5, -65, 35, 35); // Right eye dome + arc(0, -65, 70, 70, 0, PI); // Chin + fill(51, 51, 30); + ellipse(-14, -65, 8, 8); // Left eye + ellipse(14, -65, 8, 8); // Right eye + quad(0, -58, 4, -51, 0, -44, -4, -51); // Beak + popMatrix(); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/09_Functions/Ex_09_07/Ex_09_07.pde b/content/gswp_2e/examples/09_Functions/Ex_09_07/Ex_09_07.pde new file mode 100644 index 000000000..694a7dade --- /dev/null +++ b/content/gswp_2e/examples/09_Functions/Ex_09_07/Ex_09_07.pde @@ -0,0 +1,32 @@ +void setup() { + size(480, 120); +} + +void draw() { + background(176, 204, 226); + randomSeed(0); + for (int i = 35; i < width + 40; i += 40) { + int gray = int(random(0, 102)); + float scalar = random(0.25, 1.0); + owl(i, 110, gray, scalar); + } +} + +void owl(int x, int y, int g, float s) { + pushMatrix(); + translate(x, y); + scale(s); // Set the size + stroke(138-g, 138-g, 125-g); // Set the color value + strokeWeight(70); + line(0, -35, 0, -65); // Body + noStroke(); + fill(255); + ellipse(-17.5, -65, 35, 35); // Left eye dome + ellipse(17.5, -65, 35, 35); // Right eye dome + arc(0, -65, 70, 70, 0, PI); // Chin + fill(51, 51, 30); + ellipse(-14, -65, 8, 8); // Left eye + ellipse(14, -65, 8, 8); // Right eye + quad(0, -58, 4, -51, 0, -44, -4, -51); // Beak + popMatrix(); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/09_Functions/Ex_09_08/Ex_09_08.pde b/content/gswp_2e/examples/09_Functions/Ex_09_08/Ex_09_08.pde new file mode 100644 index 000000000..cb55ae255 --- /dev/null +++ b/content/gswp_2e/examples/09_Functions/Ex_09_08/Ex_09_08.pde @@ -0,0 +1,10 @@ +void setup() { + float yourWeight = 132; + float marsWeight = calculateMars(yourWeight); + println(marsWeight); +} + +float calculateMars(float w) { + float newWeight = w * 0.38; + return newWeight; +} \ No newline at end of file diff --git a/content/gswp_2e/examples/10_Objects/Ex_10_01/Ex_10_01.pde b/content/gswp_2e/examples/10_Objects/Ex_10_01/Ex_10_01.pde new file mode 100644 index 000000000..af28b9264 --- /dev/null +++ b/content/gswp_2e/examples/10_Objects/Ex_10_01/Ex_10_01.pde @@ -0,0 +1,36 @@ +JitterBug bug; // Declare object + +void setup() { + size(480, 120); + // Create object and pass in parameters + bug = new JitterBug(width/2, height/2, 20); +} + +void draw() { + bug.move(); + bug.display(); +} + +class JitterBug { + + float x; + float y; + int diameter; + float speed = 2.5; + + JitterBug(float tempX, float tempY, int tempDiameter) { + x = tempX; + y = tempY; + diameter = tempDiameter; + } + + void move() { + x += random(-speed, speed); + y += random(-speed, speed); + } + + void display() { + ellipse(x, y, diameter, diameter); + } + +} \ No newline at end of file diff --git a/content/gswp_2e/examples/10_Objects/Ex_10_02/Ex_10_02.pde b/content/gswp_2e/examples/10_Objects/Ex_10_02/Ex_10_02.pde new file mode 100644 index 000000000..d34f40104 --- /dev/null +++ b/content/gswp_2e/examples/10_Objects/Ex_10_02/Ex_10_02.pde @@ -0,0 +1,15 @@ +JitterBug jit; +JitterBug bug; + +void setup() { + size(480, 120); + jit = new JitterBug(width * 0.33, height/2, 50); + bug = new JitterBug(width * 0.66, height/2, 10); +} + +void draw() { + jit.move(); + jit.display(); + bug.move(); + bug.display(); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/10_Objects/Ex_10_02/JitterBug.pde b/content/gswp_2e/examples/10_Objects/Ex_10_02/JitterBug.pde new file mode 100644 index 000000000..b7d1155f7 --- /dev/null +++ b/content/gswp_2e/examples/10_Objects/Ex_10_02/JitterBug.pde @@ -0,0 +1,23 @@ +class JitterBug { + + float x; + float y; + int diameter; + float speed = 2.5; + + JitterBug(float tempX, float tempY, int tempDiameter) { + x = tempX; + y = tempY; + diameter = tempDiameter; + } + + void move() { + x += random(-speed, speed); + y += random(-speed, speed); + } + + void display() { + ellipse(x, y, diameter, diameter); + } + +} \ No newline at end of file diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_01/Ex_11_01.pde b/content/gswp_2e/examples/11_Arrays/Ex_11_01/Ex_11_01.pde new file mode 100644 index 000000000..a269e0a25 --- /dev/null +++ b/content/gswp_2e/examples/11_Arrays/Ex_11_01/Ex_11_01.pde @@ -0,0 +1,15 @@ +float x1 = -20; +float x2 = 20; + +void setup() { + size(240, 120); + noStroke(); +} + +void draw() { + background(0); + x1 += 0.5; + x2 += 0.5; + arc(x1, 30, 40, 40, 0.52, 5.76); + arc(x2, 90, 40, 40, 0.52, 5.76); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_02/Ex_11_02.pde b/content/gswp_2e/examples/11_Arrays/Ex_11_02/Ex_11_02.pde new file mode 100644 index 000000000..39acf77ad --- /dev/null +++ b/content/gswp_2e/examples/11_Arrays/Ex_11_02/Ex_11_02.pde @@ -0,0 +1,24 @@ +float x1 = -10; +float x2 = 10; +float x3 = 35; +float x4 = 18; +float x5 = 30; + +void setup() { + size(240, 120); + noStroke(); +} + +void draw() { + background(0); + x1 += 0.5; + x2 += 0.5; + x3 += 0.5; + x4 += 0.5; + x5 += 0.5; + arc(x1, 20, 20, 20, 0.52, 5.76); + arc(x2, 40, 20, 20, 0.52, 5.76); + arc(x3, 60, 20, 20, 0.52, 5.76); + arc(x4, 80, 20, 20, 0.52, 5.76); + arc(x5, 100, 20, 20, 0.52, 5.76); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_03/Ex_11_03.pde b/content/gswp_2e/examples/11_Arrays/Ex_11_03/Ex_11_03.pde new file mode 100644 index 000000000..abe98f839 --- /dev/null +++ b/content/gswp_2e/examples/11_Arrays/Ex_11_03/Ex_11_03.pde @@ -0,0 +1,19 @@ +float[] x = new float[3000]; + +void setup() { + size(240, 120); + noStroke(); + fill(255, 200); + for (int i = 0; i < x.length; i++) { + x[i] = random(-1000, 200); + } +} + +void draw() { + background(0); + for (int i = 0; i < x.length; i++) { + x[i] += 0.5; + float y = i * 0.4; + arc(x[i], y, 12, 12, 0.52, 5.76); + } +} \ No newline at end of file diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_04/Ex_11_04.pde b/content/gswp_2e/examples/11_Arrays/Ex_11_04/Ex_11_04.pde new file mode 100644 index 000000000..6b090abfe --- /dev/null +++ b/content/gswp_2e/examples/11_Arrays/Ex_11_04/Ex_11_04.pde @@ -0,0 +1,9 @@ +int[] x; // Declare the array + +void setup() { + size(200, 200); + x = new int[2]; // Create the array + x[0] = 12; // Assign the first value + x[1] = 2; // Assign the second value +} + diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_05/Ex_11_05.pde b/content/gswp_2e/examples/11_Arrays/Ex_11_05/Ex_11_05.pde new file mode 100644 index 000000000..020510562 --- /dev/null +++ b/content/gswp_2e/examples/11_Arrays/Ex_11_05/Ex_11_05.pde @@ -0,0 +1,8 @@ +int[] x = new int[2]; // Declare and create the array + +void setup() { + size(200, 200); + x[0] = 12; // Assign the first value + x[1] = 2; // Assign the second value +} + diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_06/Ex_11_06.pde b/content/gswp_2e/examples/11_Arrays/Ex_11_06/Ex_11_06.pde new file mode 100644 index 000000000..5e5ab5c2f --- /dev/null +++ b/content/gswp_2e/examples/11_Arrays/Ex_11_06/Ex_11_06.pde @@ -0,0 +1,6 @@ +int[] x = { 12, 2 }; // Declare, create, and assign + +void setup() { + size(200, 200); +} + diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_07/Ex_11_07.pde b/content/gswp_2e/examples/11_Arrays/Ex_11_07/Ex_11_07.pde new file mode 100644 index 000000000..2426835eb --- /dev/null +++ b/content/gswp_2e/examples/11_Arrays/Ex_11_07/Ex_11_07.pde @@ -0,0 +1,14 @@ +float[] x = {-20, 20}; + +void setup() { + size(240, 120); + noStroke(); +} + +void draw() { + background(0); + x[0] += 0.5; // Increase the first element + x[1] += 0.5; // Increase the second element + arc(x[0], 30, 40, 40, 0.52, 5.76); + arc(x[1], 90, 40, 40, 0.52, 5.76); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_08/Ex_11_08.pde b/content/gswp_2e/examples/11_Arrays/Ex_11_08/Ex_11_08.pde new file mode 100644 index 000000000..d49bf2c85 --- /dev/null +++ b/content/gswp_2e/examples/11_Arrays/Ex_11_08/Ex_11_08.pde @@ -0,0 +1,16 @@ +float[] gray; + +void setup() { + size(240, 120); + gray = new float[width]; + for (int i = 0; i < gray.length; i++) { + gray[i] = random(0, 255); + } +} + +void draw() { + for (int i = 0; i < gray.length; i++) { + stroke(gray[i]); + line(i, 0, i, height); + } +} \ No newline at end of file diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_09/Ex_11_09.pde b/content/gswp_2e/examples/11_Arrays/Ex_11_09/Ex_11_09.pde new file mode 100644 index 000000000..3d07aa631 --- /dev/null +++ b/content/gswp_2e/examples/11_Arrays/Ex_11_09/Ex_11_09.pde @@ -0,0 +1,23 @@ +int num = 60; +int[] x = new int[num]; +int[] y = new int[num]; + +void setup() { + size(240, 120); + noStroke(); +} + +void draw() { + background(0); + // Copy array values from back to front + for (int i = x.length-1; i > 0; i--) { + x[i] = x[i-1]; + y[i] = y[i-1]; + } + x[0] = mouseX; // Set the first element + y[0] = mouseY; // Set the first element + for (int i = 0; i < x.length; i++) { + fill(i * 4); + ellipse(x[i], y[i], 40, 40); + } +} \ No newline at end of file diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_10/Ex_11_10.pde b/content/gswp_2e/examples/11_Arrays/Ex_11_10/Ex_11_10.pde new file mode 100644 index 000000000..e3bcd79f5 --- /dev/null +++ b/content/gswp_2e/examples/11_Arrays/Ex_11_10/Ex_11_10.pde @@ -0,0 +1,18 @@ +JitterBug[] bugs = new JitterBug[33]; + +void setup() { + size(240, 120); + for (int i = 0; i < bugs.length; i++) { + float x = random(width); + float y = random(height); + int r = i + 2; + bugs[i] = new JitterBug(x, y, r); + } +} + +void draw() { + for (int i = 0; i < bugs.length; i++) { + bugs[i].move(); + bugs[i].display(); + } +} \ No newline at end of file diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_10/JitterBug.pde b/content/gswp_2e/examples/11_Arrays/Ex_11_10/JitterBug.pde new file mode 100644 index 000000000..25fb83ac0 --- /dev/null +++ b/content/gswp_2e/examples/11_Arrays/Ex_11_10/JitterBug.pde @@ -0,0 +1,22 @@ +class JitterBug { + + float x; + float y; + int diameter; + float speed = 2.5; + + JitterBug(float tempX, float tempY, int tempDiameter) { + x = tempX; + y = tempY; + diameter = tempDiameter; + } + + void move() { + x += random(-speed, speed); + y += random(-speed, speed); + } + + void display() { + ellipse(x, y, diameter, diameter); + } +} \ No newline at end of file diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_11/Ex_11_11.pde b/content/gswp_2e/examples/11_Arrays/Ex_11_11/Ex_11_11.pde new file mode 100644 index 000000000..39ceda336 --- /dev/null +++ b/content/gswp_2e/examples/11_Arrays/Ex_11_11/Ex_11_11.pde @@ -0,0 +1,18 @@ +JitterBug[] bugs = new JitterBug[33]; + +void setup() { + size(240, 120); + for (int i = 0; i < bugs.length; i++) { + float x = random(width); + float y = random(height); + int r = i + 2; + bugs[i] = new JitterBug(x, y, r); + } +} + +void draw() { + for (JitterBug b : bugs) { + b.move(); + b.display(); + } +} \ No newline at end of file diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_11/JitterBug.pde b/content/gswp_2e/examples/11_Arrays/Ex_11_11/JitterBug.pde new file mode 100644 index 000000000..25fb83ac0 --- /dev/null +++ b/content/gswp_2e/examples/11_Arrays/Ex_11_11/JitterBug.pde @@ -0,0 +1,22 @@ +class JitterBug { + + float x; + float y; + int diameter; + float speed = 2.5; + + JitterBug(float tempX, float tempY, int tempDiameter) { + x = tempX; + y = tempY; + diameter = tempDiameter; + } + + void move() { + x += random(-speed, speed); + y += random(-speed, speed); + } + + void display() { + ellipse(x, y, diameter, diameter); + } +} \ No newline at end of file diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0000.png b/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0000.png new file mode 100644 index 000000000..0df04ecc1 Binary files /dev/null and b/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0000.png differ diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0001.png b/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0001.png new file mode 100644 index 000000000..161b6a9fa Binary files /dev/null and b/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0001.png differ diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0002.png b/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0002.png new file mode 100644 index 000000000..3c68633a4 Binary files /dev/null and b/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0002.png differ diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0003.png b/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0003.png new file mode 100644 index 000000000..355215669 Binary files /dev/null and b/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0003.png differ diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0004.png b/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0004.png new file mode 100644 index 000000000..0cc95c58a Binary files /dev/null and b/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0004.png differ diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0005.png b/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0005.png new file mode 100644 index 000000000..a7ae8ec85 Binary files /dev/null and b/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0005.png differ diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0006.png b/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0006.png new file mode 100644 index 000000000..0d2f1c6e3 Binary files /dev/null and b/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0006.png differ diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0007.png b/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0007.png new file mode 100644 index 000000000..83b4dbda7 Binary files /dev/null and b/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0007.png differ diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0008.png b/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0008.png new file mode 100644 index 000000000..bd6ad0498 Binary files /dev/null and b/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0008.png differ diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0009.png b/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0009.png new file mode 100644 index 000000000..a83862b6a Binary files /dev/null and b/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0009.png differ diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0010.png b/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0010.png new file mode 100644 index 000000000..ded05d01c Binary files /dev/null and b/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0010.png differ diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0011.png b/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0011.png new file mode 100644 index 000000000..ccf7bb615 Binary files /dev/null and b/content/gswp_2e/examples/11_Arrays/Ex_11_11/data/frame-0011.png differ diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_12/Ex_11_12.pde b/content/gswp_2e/examples/11_Arrays/Ex_11_12/Ex_11_12.pde new file mode 100644 index 000000000..725665f50 --- /dev/null +++ b/content/gswp_2e/examples/11_Arrays/Ex_11_12/Ex_11_12.pde @@ -0,0 +1,20 @@ +int numFrames = 12; // The number of frames +PImage[] images = new PImage[numFrames]; // Make the array +int currentFrame = 0; + +void setup() { + size(240, 120); + for (int i = 0; i < images.length; i++) { + String imageName = "frame-" + nf(i, 4) + ".png"; + images[i] = loadImage(imageName); // Load each image + } + frameRate(24); +} + +void draw() { + image(images[currentFrame], 0, 0); + currentFrame++; // Next frame + if (currentFrame >= images.length) { + currentFrame = 0; // Return to first frame + } +} \ No newline at end of file diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0000.png b/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0000.png new file mode 100644 index 000000000..0df04ecc1 Binary files /dev/null and b/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0000.png differ diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0001.png b/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0001.png new file mode 100644 index 000000000..161b6a9fa Binary files /dev/null and b/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0001.png differ diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0002.png b/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0002.png new file mode 100644 index 000000000..3c68633a4 Binary files /dev/null and b/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0002.png differ diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0003.png b/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0003.png new file mode 100644 index 000000000..355215669 Binary files /dev/null and b/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0003.png differ diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0004.png b/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0004.png new file mode 100644 index 000000000..0cc95c58a Binary files /dev/null and b/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0004.png differ diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0005.png b/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0005.png new file mode 100644 index 000000000..a7ae8ec85 Binary files /dev/null and b/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0005.png differ diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0006.png b/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0006.png new file mode 100644 index 000000000..0d2f1c6e3 Binary files /dev/null and b/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0006.png differ diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0007.png b/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0007.png new file mode 100644 index 000000000..83b4dbda7 Binary files /dev/null and b/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0007.png differ diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0008.png b/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0008.png new file mode 100644 index 000000000..bd6ad0498 Binary files /dev/null and b/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0008.png differ diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0009.png b/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0009.png new file mode 100644 index 000000000..a83862b6a Binary files /dev/null and b/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0009.png differ diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0010.png b/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0010.png new file mode 100644 index 000000000..ded05d01c Binary files /dev/null and b/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0010.png differ diff --git a/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0011.png b/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0011.png new file mode 100644 index 000000000..ccf7bb615 Binary files /dev/null and b/content/gswp_2e/examples/11_Arrays/Ex_11_12/data/frame-0011.png differ diff --git a/content/gswp_2e/examples/12_Data/Ex_12_01/Ex_12_01.pde b/content/gswp_2e/examples/12_Data/Ex_12_01/Ex_12_01.pde new file mode 100644 index 000000000..dd7aaf405 --- /dev/null +++ b/content/gswp_2e/examples/12_Data/Ex_12_01/Ex_12_01.pde @@ -0,0 +1,15 @@ +Table stats; + +void setup() { + stats = loadTable("ortiz.csv"); + for (int i = 0; i < stats.getRowCount(); i++) { + // Gets an integer from row i, column 0 in the file + int year = stats.getInt(i, 0); + // Gets the integer from row i, column 1 + int homeRuns = stats.getInt(i, 1); + int rbi = stats.getInt(i, 2); + // Read a number that includes decimal points + float average = stats.getFloat(i, 3); + println(year, homeRuns, rbi, average); + } +} \ No newline at end of file diff --git a/content/gswp_2e/examples/12_Data/Ex_12_01/data/ortiz.csv b/content/gswp_2e/examples/12_Data/Ex_12_01/data/ortiz.csv new file mode 100644 index 000000000..8c02dfca3 --- /dev/null +++ b/content/gswp_2e/examples/12_Data/Ex_12_01/data/ortiz.csv @@ -0,0 +1,18 @@ +1997,1,6,0.327 +1998,9,46,0.277 +1999,0,0,0 +2000,10,63,0.282 +2001,18,48,0.234 +2002,20,75,0.272 +2003,31,101,0.288 +2004,41,139,0.301 +2005,47,148,0.3 +2006,54,137,0.287 +2007,35,117,0.332 +2008,23,89,0.264 +2009,28,99,0.238 +2010,32,102,0.27 +2011,29,96,0.309 +2012,23,60,0.318 +2013,30,103,0.309 +2014,35,104,0.263 \ No newline at end of file diff --git a/content/gswp_2e/examples/12_Data/Ex_12_02/Ex_12_02.pde b/content/gswp_2e/examples/12_Data/Ex_12_02/Ex_12_02.pde new file mode 100644 index 000000000..eb364db98 --- /dev/null +++ b/content/gswp_2e/examples/12_Data/Ex_12_02/Ex_12_02.pde @@ -0,0 +1,33 @@ +int[] homeRuns; + +void setup() { + size(480, 120); + Table stats = loadTable("ortiz.csv"); + int rowCount = stats.getRowCount(); + homeRuns = new int[rowCount]; + for (int i = 0; i < homeRuns.length; i++) { + homeRuns[i] = stats.getInt(i, 1); + } +} + +void draw() { + background(204); + // Draw background grid for data + stroke(255); + line(20, 100, 20, 20); + line(20, 100, 460, 100); + for (int i = 0; i < homeRuns.length; i++) { + float x = map(i, 0, homeRuns.length-1, 20, 460); + line(x, 20, x, 100); + } + // Draw lines based on home run data + noFill(); + stroke(204, 51, 0); + beginShape(); + for (int i = 0; i < homeRuns.length; i++) { + float x = map(i, 0, homeRuns.length-1, 20, 460); + float y = map(homeRuns[i], 0, 60, 100, 20); + vertex(x, y); + } + endShape(); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/12_Data/Ex_12_02/data/ortiz.csv b/content/gswp_2e/examples/12_Data/Ex_12_02/data/ortiz.csv new file mode 100644 index 000000000..8c02dfca3 --- /dev/null +++ b/content/gswp_2e/examples/12_Data/Ex_12_02/data/ortiz.csv @@ -0,0 +1,18 @@ +1997,1,6,0.327 +1998,9,46,0.277 +1999,0,0,0 +2000,10,63,0.282 +2001,18,48,0.234 +2002,20,75,0.272 +2003,31,101,0.288 +2004,41,139,0.301 +2005,47,148,0.3 +2006,54,137,0.287 +2007,35,117,0.332 +2008,23,89,0.264 +2009,28,99,0.238 +2010,32,102,0.27 +2011,29,96,0.309 +2012,23,60,0.318 +2013,30,103,0.309 +2014,35,104,0.263 \ No newline at end of file diff --git a/content/gswp_2e/examples/12_Data/Ex_12_03/Ex_12_03.pde b/content/gswp_2e/examples/12_Data/Ex_12_03/Ex_12_03.pde new file mode 100644 index 000000000..5b95033f9 --- /dev/null +++ b/content/gswp_2e/examples/12_Data/Ex_12_03/Ex_12_03.pde @@ -0,0 +1,26 @@ +Table cities; + +void setup() { + size(240, 120); + cities = loadTable("cities.csv", "header"); + stroke(255); +} + +void draw() { + background(0, 26, 51); + float xoffset = map(mouseX, 0, width, -width*3, -width); + translate(xoffset, -300); + scale(10); + strokeWeight(0.1); + for (int i = 0; i < cities.getRowCount(); i++) { + float latitude = cities.getFloat(i, "lat"); + float longitude = cities.getFloat(i, "lng"); + setXY(latitude, longitude); + } +} + +void setXY(float lat, float lng) { + float x = map(lng, -180, 180, 0, width); + float y = map(lat, 90, -90, 0, height); + point(x, y); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/12_Data/Ex_12_03/data/cities.csv b/content/gswp_2e/examples/12_Data/Ex_12_03/data/cities.csv new file mode 100644 index 000000000..281e1cf5b --- /dev/null +++ b/content/gswp_2e/examples/12_Data/Ex_12_03/data/cities.csv @@ -0,0 +1,29471 @@ +zip,state,city,lat,lng +35004,AL,Acmar,33.584132,-86.51557 +35005,AL,Adamsville,33.588437,-86.959727 +35006,AL,Adger,33.434277,-87.167455 +35007,AL,Keystone,33.236868,-86.812861 +35010,AL,New Site,32.941445,-85.951086 +35014,AL,Alpine,33.331165,-86.208934 +35016,AL,Arab,34.328339,-86.489638 +35019,AL,Baileyton,34.268298,-86.621299 +35020,AL,Bessemer,33.409002,-86.947547 +35023,AL,Hueytown,33.414625,-86.999607 +35031,AL,Blountsville,34.092937,-86.568628 +35033,AL,Bremen,33.973664,-87.004281 +35034,AL,Brent,32.93567,-87.211387 +35035,AL,Brierfield,33.042747,-86.951672 +35040,AL,Calera,33.1098,-86.755987 +35042,AL,Centreville,32.950324,-87.11924 +35043,AL,Chelsea,33.371582,-86.614132 +35044,AL,Coosa Pines,33.266928,-86.337622 +35045,AL,Clanton,32.835532,-86.642472 +35049,AL,Cleveland,33.992106,-86.559355 +35051,AL,Columbiana,33.176964,-86.616145 +35053,AL,Crane Hill,34.082117,-87.048395 +35054,AL,Cropwell,33.506448,-86.280026 +35055,AL,Cullman,34.176146,-86.829777 +35061,AL,Dolomite,33.465424,-86.956435 +35062,AL,Dora,33.734947,-87.040148 +35063,AL,Empire,33.825589,-87.016139 +35064,AL,Fairfield,33.473494,-86.918262 +35068,AL,Coalburg,33.611283,-86.813614 +35071,AL,Gardendale,33.71891,-86.822481 +35072,AL,Goodwater,33.074642,-86.078149 +35073,AL,Alden,33.63356,-86.948221 +35077,AL,Hanceville,34.051569,-86.784844 +35078,AL,Harpersville,33.36746,-86.429441 +35079,AL,Hayden,33.885806,-86.81767 +35080,AL,Helena,33.316978,-86.813786 +35083,AL,Holly Pond,34.190085,-86.617441 +35085,AL,Jemison,32.980539,-86.718052 +35087,AL,Joppa,34.283739,-86.551939 +35089,AL,Kellyton,32.979068,-86.048397 +35091,AL,Kimberly,33.768355,-86.808417 +35094,AL,Leeds,33.528333,-86.574824 +35096,AL,Lincoln,33.605913,-86.111152 +35098,AL,Logan,34.184079,-87.038115 +35111,AL,Mc Calla,33.284546,-87.102379 +35114,AL,Maylene,33.231694,-86.872745 +35115,AL,Montevallo,33.124765,-86.862228 +35116,AL,Morris,33.739172,-86.772551 +35117,AL,Mount Olive,33.67678,-86.87171 +35118,AL,Sylvan Springs,33.540696,-87.043998 +35120,AL,Odenville,33.675611,-86.408952 +35121,AL,Oneonta,33.925858,-86.474118 +35124,AL,Indian Springs,33.31046,-86.806176 +35125,AL,Pell City,33.597889,-86.343151 +35126,AL,Dixiana,33.708131,-86.656542 +35127,AL,Pleasant Grove,33.488336,-86.976586 +35130,AL,Quinton,33.656065,-87.10066 +35131,AL,Ragland,33.736677,-86.1619 +35133,AL,Remlap,33.846204,-86.641662 +35135,AL,Riverside,33.608832,-86.198341 +35136,AL,Rockford,32.877957,-86.240006 +35143,AL,Shelby,33.078483,-86.553606 +35146,AL,Springville,33.738647,-86.439407 +35147,AL,Sterrett,33.446103,-86.491732 +35148,AL,Sumiton,33.768005,-87.044545 +35150,AL,Sylacauga,33.171675,-86.271257 +35160,AL,Talladega,33.435445,-86.113352 +35171,AL,Thorsby,32.923755,-86.746724 +35172,AL,Trafford,33.819038,-86.743414 +35173,AL,Trussville,33.633932,-86.598068 +35175,AL,Union Grove,34.409345,-86.462793 +35176,AL,Vandiver,33.480704,-86.501278 +35178,AL,Vincent,33.401049,-86.399425 +35179,AL,Vinemont,34.262121,-86.912512 +35180,AL,Warrior,33.852862,-86.819849 +35183,AL,Weogufka,33.02381,-86.304203 +35184,AL,West Blocton,33.142431,-87.13694 +35186,AL,Wilsonville,33.229255,-86.529894 +35188,AL,Woodstock,33.169808,-87.163469 +35203,AL,Birmingham,33.520994,-86.806626 +35204,AL,Birmingham,33.51795,-86.837198 +35205,AL,Birmingham,33.495144,-86.805937 +35206,AL,Birmingham,33.567797,-86.719854 +35207,AL,Birmingham,33.559383,-86.815344 +35208,AL,Birmingham,33.497658,-86.879884 +35209,AL,Homewood,33.469624,-86.806738 +35210,AL,Irondale,33.532797,-86.685697 +35211,AL,Birmingham,33.481565,-86.85904 +35212,AL,Birmingham,33.540883,-86.749524 +35213,AL,Crestline Height,33.508195,-86.742108 +35214,AL,Birmingham,33.555445,-86.886989 +35215,AL,Center Point,33.635447,-86.693197 +35216,AL,Vestavia Hills,33.41531,-86.790425 +35217,AL,Birmingham,33.5887,-86.764995 +35218,AL,Birmingham,33.505972,-86.892993 +35221,AL,Birmingham,33.452316,-86.893493 +35222,AL,Birmingham,33.521859,-86.766579 +35223,AL,Mountain Brook,33.488726,-86.736584 +35224,AL,Birmingham,33.519126,-86.934193 +35226,AL,Bluff Park,33.403675,-86.831257 +35228,AL,Midfield,33.462446,-86.914703 +35233,AL,Birmingham,33.506161,-86.800257 +35234,AL,Birmingham,33.53775,-86.80685 +35235,AL,Center Point,33.618045,-86.661051 +35242,AL,Shoal Creek,33.401559,-86.705511 +35243,AL,Cahaba Heights,33.446053,-86.743676 +35244,AL,Hoover,33.371776,-86.776381 +35401,AL,Tuscaloosa,33.196891,-87.562666 +35404,AL,Holt,33.210914,-87.488079 +35405,AL,Tuscaloosa,33.161704,-87.514435 +35406,AL,Tuscaloosa,33.272174,-87.536035 +35441,AL,Stewart,32.872354,-87.708558 +35442,AL,Aliceville,33.122813,-88.166689 +35443,AL,Boligee,32.774646,-88.026652 +35444,AL,Brookwood,33.277523,-87.309025 +35446,AL,Buhl,33.249448,-87.718886 +35447,AL,Carrollton,33.248506,-88.132122 +35452,AL,Coker,33.252612,-87.636528 +35453,AL,Cottondale,33.176667,-87.387051 +35456,AL,Duncanville,33.082815,-87.494977 +35457,AL,Echola,33.316559,-87.807202 +35458,AL,Elrod,33.343678,-87.801429 +35459,AL,Emelle,32.754963,-88.305747 +35460,AL,Epes,32.763371,-88.161443 +35461,AL,Ethelsville,33.386816,-88.221987 +35462,AL,Eutaw,32.888871,-87.930297 +35463,AL,Fosters,33.135859,-87.735688 +35464,AL,Gainesville,32.908364,-88.271558 +35466,AL,Gordo,33.346917,-87.900504 +35469,AL,Knoxville,32.982423,-87.791855 +35470,AL,Coatopa,32.588509,-88.173592 +35474,AL,Cypress,32.978853,-87.615134 +35476,AL,Northport,33.283425,-87.591441 +35480,AL,Ralph,33.062868,-87.744984 +35481,AL,Reform,33.395945,-88.020277 +35490,AL,Vance,33.17498,-87.257362 +35501,AL,Jasper,33.871672,-87.249144 +35540,AL,Addison,34.205571,-87.194766 +35541,AL,Arley,34.063234,-87.182761 +35542,AL,Bankston,33.70083,-87.68965 +35543,AL,Bear Creek,34.213469,-87.686083 +35544,AL,Beaverton,33.942877,-88.01567 +35546,AL,Berry,33.694485,-87.622563 +35548,AL,Brilliant,34.037702,-87.756315 +35549,AL,Carbon Hill,33.909252,-87.540328 +35550,AL,Cordova,33.768033,-87.18406 +35552,AL,Detroit,34.010874,-88.16063 +35553,AL,Double Springs,34.138682,-87.397431 +35554,AL,Eldridge,33.931546,-87.619397 +35555,AL,Fayette,33.697397,-87.834647 +35563,AL,Guin,33.967624,-87.90238 +35564,AL,Hackleburg,34.267803,-87.860762 +35565,AL,Haleyville,34.231423,-87.593811 +35570,AL,Hamilton,34.153413,-88.008521 +35571,AL,Hodges,34.341664,-87.959023 +35572,AL,Houston,34.118042,-87.26183 +35574,AL,Kennedy,33.574964,-88.05172 +35575,AL,Lynn,34.052984,-87.539814 +35576,AL,Millport,33.54013,-88.200003 +35578,AL,Nauvoo,33.929859,-87.432449 +35579,AL,Oakman,33.700174,-87.368574 +35580,AL,Parrish,33.721307,-87.265773 +35581,AL,Phil Campbell,34.347018,-87.715431 +35582,AL,Red Bay,34.451259,-88.112914 +35585,AL,Spruce Pine,34.384796,-87.712149 +35586,AL,Sulligent,33.8549,-88.150774 +35587,AL,Townley,33.84702,-87.437248 +35592,AL,Vernon,33.761285,-88.097919 +35593,AL,Vina,34.37116,-88.077422 +35594,AL,Winfield,33.930256,-87.79716 +35601,AL,Decatur,34.589599,-86.98868 +35603,AL,Decatur,34.548417,-87.000389 +35610,AL,Anderson,34.951777,-87.272327 +35611,AL,Athens,34.803604,-86.970733 +35616,AL,Cherokee,34.744188,-87.972445 +35618,AL,Courtland,34.671866,-87.314255 +35619,AL,Danville,34.452189,-87.053187 +35620,AL,Elkmont,34.915241,-86.910452 +35621,AL,Eva,34.347778,-86.704427 +35622,AL,Falkville,34.347653,-86.913086 +35630,AL,Florence,34.830547,-87.655985 +35633,AL,Florence,34.882471,-87.739778 +35640,AL,Hartselle,34.448206,-86.924235 +35643,AL,Hillsboro,34.64763,-87.180379 +35645,AL,Killen,34.901632,-87.508185 +35646,AL,Leighton,34.710982,-87.522133 +35647,AL,Lester,34.918364,-87.143396 +35648,AL,Lexington,34.955924,-87.393519 +35650,AL,Moulton,34.505836,-87.222385 +35651,AL,Mount Hope,34.462969,-87.451453 +35652,AL,Rogersville,34.849544,-87.323671 +35653,AL,Russellville,34.506568,-87.725726 +35660,AL,Sheffield,34.757829,-87.697057 +35661,AL,Muscle Shoals,34.756136,-87.630443 +35670,AL,Somerville,34.499548,-86.800931 +35671,AL,Tanner,34.713037,-86.989152 +35672,AL,Town Creek,34.649138,-87.426195 +35673,AL,Trinity,34.591771,-87.09127 +35674,AL,Tuscumbia,34.687432,-87.683259 +35677,AL,Waterloo,34.93568,-87.962412 +35739,AL,Ardmore,34.980447,-86.834612 +35740,AL,Bridgeport,34.944638,-85.727681 +35741,AL,Brownsboro,34.716733,-86.468703 +35744,AL,Dutton,34.604558,-85.906729 +35745,AL,Estillfork,34.913017,-86.171571 +35746,AL,Fackler,34.82589,-85.984648 +35747,AL,Grant,34.495902,-86.259041 +35748,AL,Gurley,34.713964,-86.394028 +35749,AL,Harvest,34.82732,-86.749929 +35750,AL,Hazel Green,34.949627,-86.593484 +35751,AL,Hollytree,34.798979,-86.233627 +35752,AL,Hollywood,34.730428,-85.953173 +35754,AL,Laceys Spring,34.499647,-86.612869 +35755,AL,Langston,34.497831,-86.10563 +35758,AL,Triana,34.713409,-86.750951 +35759,AL,Meridianville,34.861779,-86.578879 +35760,AL,New Hope,34.549445,-86.3961 +35761,AL,New Market,34.899991,-86.448742 +35763,AL,Big Cove,34.612859,-86.466577 +35764,AL,Paint Rock,34.667122,-86.332562 +35765,AL,Pisgah,34.688601,-85.803044 +35766,AL,Princeton,34.840217,-86.250068 +35768,AL,Hytop,34.67227,-86.051336 +35771,AL,Section,34.543275,-85.994002 +35772,AL,Stevenson,34.876885,-85.850803 +35773,AL,Toney,34.911644,-86.699951 +35774,AL,Trenton,34.740065,-86.291264 +35775,AL,Valhermoso Sprin,34.538145,-86.678 +35776,AL,Woodville,34.668927,-86.22961 +35801,AL,Huntsville,34.726866,-86.567318 +35802,AL,Huntsville,34.667922,-86.560347 +35803,AL,Huntsville,34.620506,-86.55096 +35805,AL,Huntsville,34.705943,-86.616493 +35806,AL,Huntsville,34.744765,-86.670411 +35808,AL,Huntsville,34.684525,-86.653821 +35810,AL,Huntsville,34.778378,-86.609063 +35811,AL,Huntsville,34.778949,-86.543786 +35816,AL,Huntsville,34.738864,-86.624948 +35824,AL,Huntsville,34.658321,-86.729486 +35901,AL,Southside,33.997248,-86.010279 +35903,AL,Hokes Bluff,33.997057,-85.928724 +35904,AL,Gadsden,34.021694,-86.049479 +35905,AL,Glencoe,33.956787,-85.927586 +35950,AL,Albertville,34.273859,-86.206447 +35952,AL,Snead,34.042916,-86.350879 +35953,AL,Ashville,33.837366,-86.255167 +35954,AL,Attalla,34.029597,-86.096717 +35957,AL,Boaz,34.173686,-86.148003 +35958,AL,Bryant,34.945026,-85.632445 +35959,AL,Cedar Bluff,34.241662,-85.602567 +35960,AL,Centre,34.111592,-85.609229 +35961,AL,Collinsville,34.267957,-85.861969 +35962,AL,Crossville,34.258784,-86.030575 +35963,AL,Dawson,34.356838,-85.929161 +35966,AL,Flat Rock,34.807598,-85.708372 +35967,AL,Fort Payne,34.436792,-85.712394 +35971,AL,Fyffe,34.437284,-85.928849 +35972,AL,Gallant,33.997586,-86.234606 +35973,AL,Gaylesville,34.357324,-85.558893 +35974,AL,Geraldine,34.343864,-86.040393 +35975,AL,Groveoak,34.435874,-86.040023 +35976,AL,Guntersville,34.32193,-86.305463 +35978,AL,Henagar,34.618604,-85.727381 +35979,AL,Higdon,34.873247,-85.622507 +35980,AL,Horton,34.190033,-86.317318 +35981,AL,Ider,34.735059,-85.641577 +35983,AL,Leesburg,34.191083,-85.77051 +35984,AL,Mentone,34.587236,-85.577728 +35986,AL,Rainsville,34.498884,-85.844605 +35987,AL,Steele,33.941679,-86.228929 +35988,AL,Sylvania,34.558962,-85.792128 +35989,AL,Valley Head,34.5697,-85.627208 +36003,AL,Autaugaville,32.462462,-86.714938 +36004,AL,Eufaula,31.786701,-85.239657 +36005,AL,Banks,31.836792,-85.799844 +36006,AL,Billingsley,32.610578,-86.716301 +36009,AL,Brantley,31.570963,-86.274343 +36010,AL,Brundidge,31.701324,-85.817668 +36013,AL,Cecil,32.300891,-86.011241 +36016,AL,Clayton,31.887413,-85.450932 +36017,AL,Clio,31.68521,-85.590419 +36022,AL,Deatsville,32.613405,-86.338211 +36024,AL,Eclectic,32.65419,-86.031614 +36025,AL,Elmore,32.545378,-86.316134 +36026,AL,Equality,32.813908,-86.105064 +36027,AL,Eufaula,31.905063,-85.165605 +36028,AL,Dozier,31.506614,-86.366315 +36029,AL,Fitzpatrick,32.151607,-85.888329 +36030,AL,Forest Home,31.85318,-86.786377 +36031,AL,Fort Davis,32.28945,-85.700688 +36032,AL,Fort Deposit,31.995979,-86.576142 +36033,AL,Georgiana,31.628662,-86.733965 +36034,AL,Glenwood,31.664143,-86.170972 +36035,AL,Goshen,31.82497,-86.104851 +36036,AL,Grady,32.019397,-86.129246 +36037,AL,Greenville,31.810036,-86.622919 +36038,AL,Gantt,31.416909,-86.419836 +36039,AL,Hardaway,32.312939,-85.883837 +36040,AL,Hayneville,32.195707,-86.654994 +36041,AL,Highland Home,31.928292,-86.297111 +36042,AL,Honoraville,31.878397,-86.398064 +36043,AL,Hope Hull,32.224256,-86.393189 +36046,AL,Lapine,31.985423,-86.278534 +36047,AL,Letohatchee,32.086199,-86.488013 +36048,AL,Louisville,31.794262,-85.558062 +36049,AL,Luverne,31.70739,-86.256601 +36051,AL,Marbury,32.639373,-86.510138 +36052,AL,Mathews,32.128288,-86.041262 +36053,AL,Midway,32.09552,-85.531523 +36054,AL,Millbrook,32.499485,-86.364125 +36061,AL,Perote,32.003459,-85.74773 +36064,AL,Pike Road,32.335705,-86.09589 +36066,AL,Prattville,32.478695,-86.42997 +36067,AL,Prattville,32.471501,-86.483072 +36069,AL,Ramer,32.067745,-86.246329 +36071,AL,Rutledge,31.755867,-86.348464 +36075,AL,Shorter,32.383585,-85.91616 +36078,AL,Tallassee,32.550997,-85.89781 +36080,AL,Titus,32.690019,-86.239334 +36081,AL,Troy,31.794471,-85.965493 +36083,AL,Tuskegee,32.431623,-85.68606 +36088,AL,Tuskegee Institu,32.417699,-85.714848 +36089,AL,Union Springs,32.166252,-85.678746 +36091,AL,Verbena,32.759565,-86.543753 +36092,AL,Wetumpka,32.54509,-86.188039 +36104,AL,Montgomery,32.373037,-86.308129 +36105,AL,Montgomery,32.32573,-86.310449 +36106,AL,Montgomery,32.354268,-86.267278 +36107,AL,Montgomery,32.380405,-86.279885 +36108,AL,Montgomery,32.341682,-86.352904 +36109,AL,Montgomery,32.383443,-86.243394 +36110,AL,Montgomery,32.421686,-86.274997 +36111,AL,Montgomery,32.337363,-86.271543 +36113,AL,Maxwell A F B,32.388133,-86.355848 +36115,AL,Gunter Afs,32.406814,-86.247327 +36116,AL,Montgomery,32.312943,-86.242056 +36117,AL,Montgomery,32.373568,-86.183299 +36201,AL,Anniston,33.653896,-85.838152 +36203,AL,Oxford,33.596829,-85.83347 +36205,AL,Fort Mc Clellan,33.710168,-85.801467 +36206,AL,Anniston,33.719124,-85.838904 +36250,AL,Alexandria,33.780785,-85.892447 +36251,AL,Ashland,33.247363,-85.828976 +36255,AL,Cragford,33.217148,-85.710797 +36256,AL,Daviston,33.033471,-85.753831 +36258,AL,Delta,33.457303,-85.679279 +36260,AL,Eastaboga,33.603132,-85.96075 +36262,AL,Fruithurst,33.771732,-85.43814 +36263,AL,Graham,33.462976,-85.334034 +36264,AL,Heflin,33.611515,-85.588471 +36265,AL,Jacksonville,33.830966,-85.77518 +36266,AL,Lineville,33.328613,-85.734609 +36267,AL,Millerville,33.158959,-85.969001 +36268,AL,Munford,33.540987,-85.936322 +36269,AL,Muscadine,33.752913,-85.378907 +36270,AL,Newell,33.440172,-85.505925 +36271,AL,Ohatchee,33.778779,-86.025357 +36272,AL,Piedmont,33.838946,-85.645997 +36273,AL,Ranburne,33.561627,-85.378604 +36274,AL,Rock Mills,33.156443,-85.357854 +36276,AL,Wadley,33.149192,-85.551344 +36277,AL,Weaver,33.756286,-85.810666 +36278,AL,Wedowee,33.301854,-85.473737 +36279,AL,Wellington,33.863843,-85.915325 +36280,AL,Woodland,33.355453,-85.353768 +36301,AL,Taylor,31.202888,-85.418036 +36303,AL,Napier Field,31.255239,-85.412462 +36310,AL,Abbeville,31.575479,-85.279044 +36311,AL,Ariton,31.582996,-85.707716 +36312,AL,Ashford,31.1888,-85.253488 +36314,AL,Black,31.01318,-85.745634 +36316,AL,Chancellor,31.173379,-85.910897 +36317,AL,Clopton,31.602843,-85.482308 +36318,AL,Coffee Springs,31.138758,-85.918224 +36319,AL,Columbia,31.335235,-85.145488 +36320,AL,Cottonwood,31.098934,-85.375665 +36322,AL,Daleville,31.281091,-85.730473 +36323,AL,Elba,31.41373,-86.077728 +36330,AL,Enterprise,31.340789,-85.842111 +36340,AL,Geneva,31.041445,-85.884748 +36343,AL,Gordon,31.10019,-85.123412 +36344,AL,Hartford,31.08598,-85.719204 +36345,AL,Headland,31.353406,-85.332277 +36346,AL,Jack,31.552392,-86.043083 +36349,AL,Malvern,31.157528,-85.522327 +36350,AL,Midland City,31.36716,-85.513033 +36351,AL,New Brockton,31.36898,-85.940386 +36352,AL,Newton,31.331064,-85.599229 +36353,AL,Newville,31.440295,-85.328741 +36360,AL,Ozark,31.439069,-85.643629 +36362,AL,Fort Rucker,31.348011,-85.721374 +36370,AL,Pansey,31.131778,-85.238549 +36373,AL,Shorterville,31.625627,-85.14584 +36374,AL,Skipperville,31.551588,-85.549578 +36375,AL,Slocomb,31.095558,-85.582954 +36376,AL,Webb,31.265618,-85.254385 +36401,AL,Evergreen,31.458009,-86.925771 +36419,AL,Allen,31.624266,-87.66746 +36420,AL,Andalusia,31.297142,-86.490468 +36425,AL,Beatrice,31.727324,-87.171912 +36426,AL,East Brewton,31.118926,-87.067325 +36432,AL,Castleberry,31.326113,-87.026754 +36435,AL,Coy,31.888851,-87.392558 +36436,AL,Dickinson,31.717167,-87.656929 +36441,AL,Flomaton,31.040233,-87.266365 +36442,AL,Florala,31.017194,-86.338528 +36444,AL,Franklin,31.723815,-87.441237 +36445,AL,Frisco City,31.423478,-87.381744 +36446,AL,Fulton,31.790947,-87.708065 +36451,AL,Grove Hill,31.675502,-87.763571 +36453,AL,Kinston,31.262118,-86.069532 +36454,AL,Lenox,31.327261,-87.19671 +36456,AL,Mc Kenzie,31.54495,-86.735615 +36460,AL,Monroeville,31.51533,-87.340993 +36467,AL,Opp,31.279861,-86.257105 +36471,AL,Peterman,31.589953,-87.259984 +36473,AL,Range,31.30169,-87.319739 +36474,AL,Red Level,31.439931,-86.61209 +36475,AL,Repton,31.425569,-87.172039 +36477,AL,Samson,31.104918,-86.067416 +36480,AL,Uriah,31.313467,-87.570518 +36481,AL,Vredenburgh,31.73443,-87.416184 +36482,AL,Whatley,31.639453,-87.656502 +36483,AL,Wing,31.148127,-86.56119 +36502,AL,Atmore,31.057245,-87.487347 +36505,AL,Axis,31.006817,-88.04274 +36507,AL,Bay Minette,30.86354,-87.76444 +36509,AL,Bayou La Batre,30.407983,-88.250697 +36510,AL,Bigbee,31.589072,-88.165294 +36511,AL,Bon Secour,30.328883,-87.721355 +36515,AL,Carlton,31.322449,-87.837793 +36518,AL,Chatom,31.487638,-88.269887 +36521,AL,Chunchula,30.991178,-88.131126 +36522,AL,Citronelle,31.042533,-88.254949 +36523,AL,Coden,30.418834,-88.168276 +36524,AL,Coffeeville,31.78428,-88.071542 +36525,AL,Creola,30.901267,-88.017414 +36526,AL,Daphne,30.61972,-87.889522 +36527,AL,Spanish Fort,30.695852,-87.88668 +36528,AL,Dauphin Island,30.252057,-88.109644 +36529,AL,Deer Park,31.184892,-88.32731 +36530,AL,Elberta,30.394239,-87.58896 +36532,AL,Fairhope,30.50116,-87.883546 +36535,AL,Foley,30.400664,-87.685737 +36538,AL,Frankville,31.64684,-88.133185 +36539,AL,Fruitdale,31.348843,-88.376597 +36540,AL,Gainestown,31.425822,-87.682176 +36541,AL,Grand Bay,30.498288,-88.32825 +36542,AL,Fort Morgan,30.268954,-87.712795 +36544,AL,Irvington,30.480241,-88.239563 +36545,AL,Jackson,31.513098,-87.867192 +36548,AL,Leroy,31.491021,-87.968672 +36549,AL,Lillian,30.39724,-87.474452 +36550,AL,Little River,31.22459,-87.754796 +36551,AL,Loxley,30.617964,-87.75624 +36553,AL,Mc Intosh,31.236108,-88.051102 +36555,AL,Magnolia Springs,30.394497,-87.785781 +36558,AL,Millry,31.626871,-88.355872 +36560,AL,Mount Vernon,31.097375,-88.035044 +36561,AL,Orange Beach,30.290596,-87.555888 +36562,AL,Perdido,30.98058,-87.628374 +36567,AL,Robertsdale,30.561608,-87.637268 +36569,AL,Saint Stephens,31.533028,-88.052094 +36570,AL,Salitpa,31.654667,-87.959618 +36571,AL,Saraland,30.833197,-88.093387 +36572,AL,Satsuma,30.851628,-88.053312 +36574,AL,Seminole,30.504806,-87.465938 +36575,AL,Semmes,30.754408,-88.266705 +36576,AL,Silverhill,30.522237,-87.745676 +36579,AL,Stockton,31.01293,-87.863323 +36580,AL,Summerdale,30.475225,-87.699183 +36582,AL,Theodore,30.544374,-88.180748 +36583,AL,Tibbie,31.373742,-88.266828 +36584,AL,Vinegar Bend,31.25841,-88.386466 +36585,AL,Wagarville,31.410205,-88.070519 +36586,AL,Walker Springs,31.626166,-87.835355 +36587,AL,Wilmer,30.813745,-88.333196 +36602,AL,Mobile,30.688828,-88.045308 +36603,AL,Mobile,30.692141,-88.05622 +36604,AL,Mobile,30.681963,-88.067804 +36605,AL,Mobile,30.634117,-88.084646 +36606,AL,Mobile,30.672899,-88.100909 +36607,AL,Mobile,30.697486,-88.1029 +36608,AL,Mobile,30.69636,-88.187784 +36609,AL,Mobile,30.660527,-88.161806 +36610,AL,Prichard,30.737846,-88.083761 +36611,AL,Chickasaw,30.766821,-88.084973 +36612,AL,Mobile,30.751844,-88.11311 +36613,AL,Eight Mile,30.795074,-88.182311 +36615,AL,Brookley Field,30.631199,-88.068871 +36617,AL,Mobile,30.714522,-88.091796 +36618,AL,Mobile,30.732178,-88.175753 +36619,AL,Mobile,30.592803,-88.194645 +36693,AL,Mobile,30.631076,-88.158843 +36695,AL,Mobile,30.647431,-88.229245 +36701,AL,Selma,32.419719,-87.024527 +36703,AL,Selma,32.415553,-87.013546 +36720,AL,Alberta,32.144889,-87.342503 +36722,AL,Arlington,32.066784,-87.559691 +36726,AL,Camden,32.004732,-87.295049 +36727,AL,Campbell,31.963512,-88.006072 +36728,AL,Catherine,32.182,-87.483623 +36732,AL,Demopolis,32.490792,-87.839669 +36736,AL,Dixons Mills,32.067209,-87.745356 +36738,AL,Faunsdale,32.423259,-87.618079 +36740,AL,Forkland,32.644661,-87.881676 +36742,AL,Gallion,32.529771,-87.698542 +36744,AL,Greensboro,32.716721,-87.590494 +36748,AL,Linden,32.305343,-87.795358 +36749,AL,Jones,32.608515,-86.889266 +36750,AL,Maplesville,32.804507,-86.871704 +36751,AL,Lower Peach Tree,31.850365,-87.568224 +36752,AL,Burkville,32.300292,-86.609868 +36754,AL,Magnolia,32.141931,-87.699815 +36756,AL,Marion,32.646301,-87.331437 +36758,AL,Plantersville,32.617608,-86.947531 +36759,AL,Marion Junction,32.426589,-87.270181 +36761,AL,Boys Ranch,32.095387,-86.92497 +36762,AL,Morvin,31.967305,-87.972897 +36765,AL,Newbern,32.551465,-87.561472 +36767,AL,Orrville,32.294859,-87.221368 +36768,AL,Pine Apple,31.926522,-87.004667 +36769,AL,Pine Hill,31.973546,-87.577086 +36771,AL,Prairie,32.084762,-87.448723 +36773,AL,Safford,32.300242,-87.369345 +36775,AL,Sardis,32.284358,-86.991959 +36776,AL,Sawyerville,32.757796,-87.740201 +36779,AL,Sprott,32.654376,-87.141599 +36782,AL,Sweet Water,32.077272,-87.922755 +36783,AL,Thomaston,32.253776,-87.597438 +36784,AL,Thomasville,31.906728,-87.759842 +36785,AL,Benton,32.281924,-86.859867 +36786,AL,Uniontown,32.446966,-87.493398 +36790,AL,Stanton,32.709631,-86.886848 +36792,AL,Randolph,32.888834,-86.90701 +36793,AL,Lawley,32.864558,-86.956708 +36801,AL,Opelika,32.627771,-85.358629 +36830,AL,Auburn,32.602043,-85.489001 +36850,AL,Camp Hill,32.782749,-85.64738 +36852,AL,Cusseta,32.803194,-85.215791 +36853,AL,Dadeville,32.82239,-85.770395 +36854,AL,Valley,32.811349,-85.174911 +36855,AL,Five Points,33.042408,-85.324264 +36858,AL,Hatchechubbee,32.284531,-85.302882 +36860,AL,Hurtsboro,32.245429,-85.395903 +36861,AL,Jacksons Gap,32.879698,-85.848662 +36862,AL,Lafayette,32.925237,-85.442563 +36863,AL,Lanett,32.861609,-85.21608 +36866,AL,Notasulga,32.543727,-85.68707 +36867,AL,Phenix City,32.407816,-85.095082 +36869,AL,Phenix City,32.470647,-85.018118 +36871,AL,Pittsview,32.173346,-85.131248 +36874,AL,Salem,32.621157,-85.183966 +36875,AL,Seale,32.305339,-85.167733 +36877,AL,Smiths,32.520072,-85.100027 +36879,AL,Waverly,32.763167,-85.514372 +36904,AL,Butler,32.082906,-88.206391 +36907,AL,Cuba,32.410973,-88.361083 +36908,AL,Gilbertown,31.866602,-88.326514 +36910,AL,Jachin,32.244174,-88.233356 +36912,AL,Lisman,32.217722,-88.323419 +36915,AL,Needham,32.012165,-88.345798 +36916,AL,Pennington,32.226245,-88.0931 +36919,AL,Silas,31.766754,-88.309149 +36921,AL,Toxey,31.93153,-88.31794 +36922,AL,Ward,32.334063,-88.297114 +36925,AL,York,32.472765,-88.268304 +98791,AK,98791,51.938901,-176.310048 +99501,AK,Anchorage,61.211571,-149.876077 +99502,AK,Anchorage,61.096163,-150.093943 +99503,AK,Anchorage,61.189953,-149.893844 +99504,AK,Anchorage,61.203696,-149.74467 +99505,AK,Fort Richardson,61.275256,-149.675454 +99506,AK,Elmendorf Afb,61.251531,-149.812667 +99507,AK,Anchorage,61.153543,-149.828912 +99508,AK,Anchorage,61.205959,-149.810085 +99515,AK,Anchorage,61.119381,-149.897401 +99516,AK,Anchorage,61.10541,-149.779998 +99517,AK,Anchorage,61.190136,-149.936111 +99518,AK,Anchorage,61.154862,-149.886571 +99549,AK,Port Heiden,56.964333,-158.566367 +99551,AK,Akiachak,60.891854,-161.39233 +99552,AK,Akiak,60.890632,-161.199325 +99553,AK,Akutan,54.143012,-165.785368 +99554,AK,Alakanuk,62.746967,-164.60228 +99555,AK,Aleknagik,59.269688,-158.619882 +99556,AK,Nikolaevsk,59.788818,-151.732933 +99557,AK,Chuathbaluk,61.691648,-157.758502 +99558,AK,Anvik,62.830913,-160.130441 +99559,AK,Atmautluak,60.832389,-161.824053 +99561,AK,Chefornak,60.153746,-164.210294 +99563,AK,Chevak,61.583982,-164.776457 +99564,AK,Chignik,56.301639,-158.415696 +99565,AK,Chignik Lagoon,56.251277,-158.673528 +99567,AK,Chugiak,61.409802,-149.453736 +99568,AK,Clam Gulch,60.201603,-151.422628 +99569,AK,Clarks Point,58.84921,-158.451241 +99571,AK,Nelson Lagoon,55.610952,-161.942941 +99572,AK,Cooper Landing,60.476692,-149.823514 +99573,AK,Copper Center,61.91581,-144.97793 +99574,AK,Chenega Bay,60.102558,-147.943316 +99575,AK,Crooked Creek,61.818072,-158.002483 +99576,AK,Koliganek,59.059279,-158.973533 +99577,AK,Eagle River,61.311357,-149.508515 +99578,AK,Eek,60.215058,-162.032341 +99579,AK,Egegik,58.206174,-157.342202 +99580,AK,Ekwok,59.362792,-157.478211 +99581,AK,Emmonak,62.827404,-164.131298 +99583,AK,False Pass,54.841028,-163.436845 +99585,AK,Marshall,61.837087,-161.7394 +99586,AK,Slana,62.654744,-143.568393 +99588,AK,Glennallen,62.103895,-145.661684 +99589,AK,Goodnews Bay,59.085008,-161.587146 +99590,AK,Grayling,63.372013,-159.404907 +99591,AK,Saint George Isl,56.60324,-169.547257 +99602,AK,Holy Cross,62.192584,-159.825092 +99603,AK,Port Graham,59.665495,-151.462644 +99604,AK,Hooper Bay,61.537157,-165.891045 +99606,AK,Kokhanok,59.564836,-155.462556 +99607,AK,Kalskag,61.541006,-160.3261 +99610,AK,Kasilof,60.316365,-151.28958 +99611,AK,Kenai,60.614467,-151.254556 +99612,AK,King Cove,55.062848,-162.305561 +99613,AK,Igiugig,58.724264,-156.641603 +99614,AK,Kipnuk,59.923204,-164.101013 +99615,AK,Akhiok,57.781967,-152.500169 +99620,AK,Kotlik,63.029471,-163.554153 +99621,AK,Kwethluk,60.771814,-161.38849 +99622,AK,Kwigillingok,59.881022,-162.984938 +99625,AK,Levelock,59.371395,-154.976815 +99626,AK,Lower Kalskag,61.51377,-160.359966 +99627,AK,Mc Grath,62.967153,-155.585153 +99628,AK,Manokotak,59.009559,-158.989699 +99630,AK,Mekoryuk,60.365679,-166.283583 +99631,AK,Moose Pass,60.85852,-149.255911 +99632,AK,Mountain Village,62.158913,-163.883822 +99633,AK,Naknek,58.885699,-156.705405 +99634,AK,Napakiak,60.663758,-161.738144 +99636,AK,New Stuyahok,59.593533,-157.297205 +99638,AK,Nikolski,52.988337,-168.788427 +99639,AK,Ninilchik,60.010833,-151.639604 +99640,AK,Nondalton,60.030837,-154.731675 +99645,AK,Butte,61.613814,-149.065323 +99647,AK,Pedro Bay,59.92238,-153.821856 +99648,AK,Perryville,55.945289,-159.259333 +99649,AK,Pilot Point,57.595193,-157.449272 +99650,AK,Pilot Station,61.946159,-162.874716 +99651,AK,Platinum,58.63364,-162.043201 +99653,AK,Port Alsworth,60.636416,-154.433803 +99654,AK,Wasilla,61.592349,-149.395875 +99655,AK,Quinhagak,59.738057,-161.874938 +99656,AK,Red Devil,61.735389,-157.195969 +99657,AK,Russian Mission,61.591302,-161.558413 +99658,AK,Saint Marys,62.054106,-163.205263 +99659,AK,Saint Michael,63.47759,-162.109141 +99660,AK,Saint Paul Islan,57.178697,-170.293408 +99661,AK,Sand Point,55.319236,-160.491435 +99662,AK,Scammon Bay,61.845019,-165.581945 +99664,AK,Seward,60.132874,-149.39849 +99665,AK,Shageluk,62.661092,-159.52816 +99668,AK,Sleetmute,61.634555,-157.118284 +99669,AK,Soldotna,60.481778,-151.13582 +99670,AK,South Naknek,58.736221,-156.850289 +99671,AK,Stebbins,63.478468,-162.227355 +99672,AK,Sterling,60.520373,-150.849792 +99676,AK,Talkeetna,62.260516,-150.110097 +99679,AK,Tuluksak,61.108848,-160.938924 +99681,AK,Tununak,60.539322,-165.097464 +99682,AK,Tyonek,61.117929,-151.348495 +99683,AK,Trapper Creek,61.441361,-150.284455 +99684,AK,Unalakleet,63.883478,-160.788365 +99685,AK,Unalaska,53.887114,-166.519855 +99686,AK,Valdez,60.895044,-146.195628 +99687,AK,Wasilla,61.578032,-149.533003 +99688,AK,Willow,61.771511,-150.188891 +99689,AK,Yakutat,59.620211,-139.778858 +99691,AK,Nikolai,63.001603,-154.381247 +99692,AK,Dutch Harbor,53.362757,-167.510656 +99701,AK,Coldfoot,64.840238,-147.710431 +99702,AK,Eielson Afb,64.67352,-147.08051 +99703,AK,Fort Wainwright,64.828303,-147.655673 +99704,AK,Clear,64.418121,-149.139885 +99705,AK,North Pole,64.78049,-147.369353 +99709,AK,Fairbanks,64.85437,-147.846917 +99712,AK,Fairbanks,64.910879,-147.510479 +99714,AK,Salcha,64.50905,-146.952974 +99720,AK,Allakaket,66.543197,-152.712155 +99721,AK,Anaktuvuk Pass,68.11878,-151.679005 +99722,AK,Arctic Village,68.077395,-145.423115 +99723,AK,Barrow,71.234637,-156.817409 +99724,AK,Beaver,66.33883,-147.279803 +99726,AK,Bettles Field,67.100495,-151.062414 +99727,AK,Buckland,65.981052,-161.131676 +99729,AK,Cantwell,63.395458,-148.89735 +99730,AK,Central,65.468058,-144.74886 +99733,AK,Circle,65.824542,-144.08262 +99734,AK,Prudhoe Bay,70.070057,-148.559636 +99736,AK,Deering,66.062265,-162.711951 +99737,AK,Dot Lake,64.005426,-145.613611 +99739,AK,Elim,64.621662,-162.260371 +99740,AK,Fort Yukon,66.520744,-145.306439 +99741,AK,Galena,64.760784,-156.797701 +99742,AK,Gambell,63.776555,-171.701685 +99743,AK,Healy,63.917123,-149.011128 +99744,AK,Anderson,64.300693,-149.1718 +99745,AK,Hughes,66.038246,-154.26443 +99746,AK,Huslia,65.689918,-156.291976 +99747,AK,Kaktovik,70.042889,-143.631329 +99748,AK,Kaltag,64.330452,-158.724251 +99749,AK,Kiana,67.18026,-158.152204 +99750,AK,Kivalina,67.665859,-163.733617 +99751,AK,Kobuk,66.912253,-157.066864 +99752,AK,Kotzebue,66.846459,-162.126493 +99753,AK,Koyuk,64.931668,-161.149957 +99755,AK,Denali National,63.516075,-149.539532 +99756,AK,Manley Hot Sprin,65.02058,-150.573267 +99757,AK,Lake Minchumina,63.903884,-152.430081 +99758,AK,Minto,65.058399,-149.691186 +99759,AK,Point Lay,69.705626,-162.906148 +99760,AK,Nenana,64.557656,-149.086744 +99761,AK,Noatak,66.97553,-160.509453 +99762,AK,Golovin,64.505775,-165.310667 +99763,AK,Noorvik,66.836353,-161.044132 +99765,AK,Nulato,64.778024,-157.991353 +99766,AK,Point Hope,68.312058,-166.72618 +99767,AK,Rampart,65.383627,-150.011201 +99768,AK,Ruby,64.720062,-155.503872 +99769,AK,Savoonga,63.679737,-170.470908 +99770,AK,Selawik,65.713537,-158.534287 +99771,AK,Shaktoolik,64.375498,-161.174589 +99772,AK,Shishmaref,66.230562,-166.137276 +99773,AK,Shungnak,66.958141,-157.613496 +99774,AK,Stevens Village,65.995894,-149.118286 +99777,AK,Tanana,65.156483,-152.103747 +99778,AK,Teller,65.240164,-166.3833 +99780,AK,Border,63.435022,-142.523046 +99781,AK,Venetie,67.010446,-146.413723 +99782,AK,Wainwright,70.620064,-160.012532 +99783,AK,Wales,65.688212,-168.520521 +99784,AK,White Mountain,64.702791,-163.42185 +99785,AK,Brevig Mission,65.334187,-166.478578 +99786,AK,Ambler,67.46951,-156.455652 +99788,AK,Chalkyitsik,66.719,-143.638121 +99789,AK,Nuiqsut,70.192737,-150.997119 +99801,AK,Juneau,58.362767,-134.529429 +99820,AK,Angoon,57.569832,-134.371052 +99824,AK,Douglas,58.275597,-134.395041 +99826,AK,Gustavus,58.42835,-135.761542 +99827,AK,Haines,59.251886,-135.542032 +99829,AK,Hoonah,58.032237,-135.558435 +99833,AK,Petersburg,56.827134,-133.160683 +99835,AK,Sitka,57.051436,-135.316569 +99840,AK,Skagway,59.468471,-135.301794 +99901,AK,Ketchikan,55.372028,-131.683175 +99919,AK,Thorne Bay,55.66086,-132.513815 +99921,AK,Craig,55.47317,-133.117081 +99922,AK,Hydaburg,55.137406,-132.633175 +99923,AK,Hyder,55.925867,-130.124915 +99925,AK,Klawock,55.552611,-133.055503 +99926,AK,Metlakatla,55.121491,-131.579001 +99927,AK,Point Baker,56.307858,-133.376372 +99929,AK,Wrangell,56.433524,-132.352918 +99950,AK,Ketchikan,55.942471,-133.18479 +85003,AZ,Phoenix,33.451095,-112.077428 +85004,AZ,Phoenix,33.455708,-112.068584 +85006,AZ,Phoenix,33.465016,-112.047357 +85007,AZ,Phoenix,33.452298,-112.089326 +85008,AZ,Phoenix,33.466457,-111.998381 +85009,AZ,Phoenix,33.456373,-112.128368 +85012,AZ,Phoenix,33.509744,-112.067816 +85013,AZ,Phoenix,33.508493,-112.082657 +85014,AZ,Phoenix,33.510263,-112.05557 +85015,AZ,Phoenix,33.508164,-112.101064 +85016,AZ,Phoenix,33.502117,-112.030496 +85017,AZ,Phoenix,33.515263,-112.121232 +85018,AZ,Phoenix,33.495796,-111.988259 +85019,AZ,Phoenix,33.512284,-112.141681 +85020,AZ,Phoenix,33.562281,-112.055888 +85021,AZ,Phoenix,33.559965,-112.092686 +85022,AZ,Phoenix,33.631513,-112.052008 +85023,AZ,Phoenix,33.632383,-112.111838 +85024,AZ,Phoenix,33.661664,-112.036956 +85027,AZ,New River Stage,33.667157,-112.102723 +85028,AZ,Phoenix,33.585115,-112.008724 +85029,AZ,Phoenix,33.596133,-112.119913 +85031,AZ,Phoenix,33.493909,-112.16963 +85032,AZ,Phoenix,33.623807,-112.004369 +85033,AZ,Phoenix,33.494426,-112.213185 +85034,AZ,Phoenix,33.441251,-112.042135 +85035,AZ,Phoenix,33.472353,-112.183177 +85037,AZ,Phoenix,33.491278,-112.246763 +85039,AZ,Phoenix,33.495362,-112.288573 +85040,AZ,Phoenix,33.390475,-112.03126 +85041,AZ,Phoenix,33.388882,-112.095437 +85043,AZ,Phoenix,33.449056,-112.197245 +85044,AZ,Phoenix,33.329124,-111.9943 +85051,AZ,Phoenix,33.559113,-112.133168 +85201,AZ,Mesa,33.43174,-111.846931 +85202,AZ,Mesa,33.385095,-111.872429 +85203,AZ,Mesa,33.436952,-111.805697 +85204,AZ,Mesa,33.399168,-111.789554 +85205,AZ,Mesa,33.43685,-111.712939 +85206,AZ,Mesa,33.402603,-111.724223 +85207,AZ,Mesa,33.432073,-111.64256 +85208,AZ,Mesa,33.398416,-111.651297 +85210,AZ,Mesa,33.38867,-111.842757 +85213,AZ,Mesa,33.436688,-111.773114 +85219,AZ,Gold Canyon,33.360787,-111.51331 +85220,AZ,Apache Junction,33.415211,-111.571818 +85222,AZ,Eleven Mile Corn,32.892667,-111.756093 +85224,AZ,Chandler,33.330091,-111.863156 +85225,AZ,Chandler,33.310505,-111.823881 +85226,AZ,Chandler,33.30917,-111.919827 +85228,AZ,Coolidge,32.957399,-111.534378 +85231,AZ,Eloy,32.750929,-111.583275 +85232,AZ,Florence,32.996881,-111.361234 +85234,AZ,Gilbert,33.352746,-111.780876 +85236,AZ,Higley,33.302382,-111.696926 +85237,AZ,Kearny,33.059443,-110.91227 +85239,AZ,Mobile,32.987379,-112.075228 +85240,AZ,Williams Afb,33.310289,-111.668801 +85242,AZ,Arizona Boys Ran,33.238577,-111.643596 +85247,AZ,Sacaton,33.097699,-111.775162 +85248,AZ,Sun Lakes,33.223056,-111.866899 +85249,AZ,Chandler,33.241384,-111.774486 +85250,AZ,Scottsdale,33.521767,-111.904926 +85251,AZ,Scottsdale,33.493559,-111.916697 +85253,AZ,Paradise Valley,33.549439,-111.956546 +85254,AZ,Scottsdale,33.616476,-111.955422 +85255,AZ,Scottsdale,33.696801,-111.889213 +85256,AZ,Scottsdale,33.485793,-111.85333 +85257,AZ,Scottsdale,33.46693,-111.915129 +85258,AZ,Scottsdale,33.564747,-111.893067 +85259,AZ,Scottsdale,33.587943,-111.840438 +85260,AZ,Scottsdale,33.601323,-111.88671 +85262,AZ,Scottsdale,33.77524,-111.779135 +85264,AZ,Fort Mcdowell,33.611807,-111.68062 +85268,AZ,Fountain Hills,33.608489,-111.723685 +85272,AZ,Stanfield,32.882321,-111.965987 +85273,AZ,Superior,33.288716,-111.09846 +85281,AZ,Tempe,33.422675,-111.926144 +85282,AZ,Tempe,33.391669,-111.924896 +85283,AZ,Tempe,33.366524,-111.93122 +85284,AZ,Tempe,33.336302,-111.919696 +85292,AZ,Winkelman,33.00572,-110.772682 +85301,AZ,Glendale,33.531122,-112.176703 +85302,AZ,Glendale,33.567487,-112.175289 +85303,AZ,Glendale,33.526215,-112.214937 +85304,AZ,Glendale,33.594289,-112.174575 +85305,AZ,Glendale,33.529103,-112.248232 +85306,AZ,Glendale,33.623882,-112.177563 +85307,AZ,Luke Afb,33.534879,-112.326735 +85308,AZ,Glendale,33.653924,-112.169391 +85309,AZ,Luke Afb,33.539993,-112.356186 +85310,AZ,Glendale,33.704726,-112.164131 +85321,AZ,Why,32.373485,-112.858681 +85322,AZ,Arlington,33.313317,-112.789058 +85323,AZ,Avondale,33.432114,-112.343754 +85324,AZ,Rock Springs,34.073197,-112.130956 +85326,AZ,Buckeye,33.38896,-112.607728 +85328,AZ,Cibola,33.614886,-114.512204 +85331,AZ,Cave Creek,33.821896,-112.015106 +85332,AZ,Congress,34.176425,-112.76801 +85333,AZ,Dateland,32.867886,-113.463126 +85335,AZ,El Mirage,33.608153,-112.324147 +85337,AZ,Gila Bend,32.93059,-112.746832 +85338,AZ,Goodyear,33.436809,-112.383385 +85339,AZ,Laveen,33.343572,-112.171618 +85340,AZ,Litchfield Park,33.494127,-112.380497 +85342,AZ,Morristown,33.772993,-112.548331 +85343,AZ,Palo Verde,33.34848,-112.646662 +85344,AZ,Empire Landing,34.0254,-114.266342 +85345,AZ,Peoria,33.576135,-112.234424 +85347,AZ,Roll,32.936635,-113.564287 +85348,AZ,Salome,33.748141,-113.571459 +85350,AZ,Somerton,32.563398,-114.7127 +85351,AZ,Sun City,33.606104,-112.279701 +85353,AZ,Tolleson,33.434686,-112.277444 +85354,AZ,Tonopah,33.422797,-112.952785 +85355,AZ,Waddell,33.567285,-112.43869 +85356,AZ,Wellton,32.749251,-114.176616 +85361,AZ,Wittmann,33.726425,-112.446578 +85362,AZ,Yarnell,34.414076,-112.62166 +85363,AZ,Youngtown,33.590751,-112.301305 +85364,AZ,Yuma,32.701507,-114.642362 +85365,AZ,Yuma Proving Gro,32.671352,-114.548633 +85373,AZ,Sun City,33.658756,-112.321397 +85374,AZ,Surprise,33.630028,-112.33143 +85375,AZ,Sun City West,33.662576,-112.255434 +85381,AZ,Peoria,33.604761,-112.223723 +85382,AZ,Peoria,33.63083,-112.207177 +85390,AZ,Wickenburg,33.911282,-112.738973 +85501,AZ,Globe,33.402426,-110.789247 +85530,AZ,Bylas,33.126549,-110.11702 +85533,AZ,Clifton,33.132343,-109.246199 +85534,AZ,Franklin,32.793976,-109.129575 +85535,AZ,Eden,33.028629,-109.953682 +85539,AZ,Miami,33.431928,-110.881182 +85540,AZ,Morenci,33.043593,-109.311517 +85541,AZ,Payson,34.219779,-111.287774 +85542,AZ,Peridot,33.478874,-110.37252 +85543,AZ,Pima,32.909661,-109.856009 +85544,AZ,Strawberry,34.390915,-111.473483 +85545,AZ,Roosevelt,33.635753,-110.974884 +85546,AZ,Safford,32.829491,-109.626641 +85550,AZ,San Carlos,33.310643,-110.395323 +85552,AZ,Thatcher,32.819902,-109.730245 +85602,AZ,Benson,31.98826,-110.294113 +85603,AZ,Bisbee,31.408557,-109.911736 +85606,AZ,Cochise,32.097891,-109.92393 +85607,AZ,Douglas,31.35111,-109.544698 +85610,AZ,Elfrida,31.713891,-109.619277 +85611,AZ,Elgin,31.66002,-110.611403 +85613,AZ,Fort Huachuca,31.558735,-110.344131 +85614,AZ,Green Valley,31.854271,-111.000253 +85615,AZ,Hereford,31.403545,-110.204728 +85616,AZ,Huachuca City,31.663896,-110.333414 +85617,AZ,Mc Neal,31.502969,-109.630971 +85618,AZ,Mammoth,32.723875,-110.643961 +85621,AZ,Nogales,31.376969,-110.943508 +85623,AZ,Oracle,32.600506,-110.796126 +85624,AZ,Patagonia,31.535317,-110.696774 +85625,AZ,Pearce,31.966608,-109.795032 +85629,AZ,Sahuarita,31.945169,-111.000154 +85630,AZ,Saint David,31.897251,-110.215377 +85631,AZ,San Manuel,32.695831,-110.656788 +85632,AZ,Portal,32.208167,-109.367152 +85634,AZ,Pisinemo,32.031572,-111.922207 +85635,AZ,Sierra Vista,31.536467,-110.266565 +85637,AZ,Sonoita,31.866154,-110.724418 +85638,AZ,Tombstone,31.721598,-110.058449 +85640,AZ,Amado,31.594194,-111.039693 +85641,AZ,Vail,32.035926,-110.88375 +85643,AZ,Willcox,32.372977,-109.863111 +85645,AZ,Amado,31.643759,-111.072233 +85653,AZ,Marana,32.404749,-111.273621 +85701,AZ,Tucson,32.213873,-110.969445 +85704,AZ,Casas Adobes,32.329175,-110.984593 +85705,AZ,Tucson,32.269088,-110.984536 +85706,AZ,Tucson,32.139172,-110.945127 +85708,AZ,Tucson,32.179989,-110.869283 +85710,AZ,Tucson,32.213813,-110.824046 +85711,AZ,Tucson,32.212729,-110.882892 +85712,AZ,Tucson,32.250043,-110.886919 +85713,AZ,Tucson,32.194065,-110.973896 +85714,AZ,Tucson,32.170657,-110.971891 +85715,AZ,Tucson,32.269213,-110.834837 +85716,AZ,Tucson,32.246815,-110.922176 +85718,AZ,Tucson,32.311154,-110.917882 +85719,AZ,Tucson,32.247426,-110.949142 +85730,AZ,Tucson,32.180951,-110.81904 +85735,AZ,Tucson,32.057796,-111.260758 +85736,AZ,Tucson,31.667909,-111.317842 +85737,AZ,Oro Valley,32.431679,-110.954463 +85741,AZ,Tucson,32.347215,-111.041873 +85743,AZ,Tucson,32.33655,-111.177071 +85745,AZ,Tucson,32.243359,-111.017907 +85746,AZ,Tucson,32.142244,-111.050569 +85747,AZ,Tucson,32.071142,-110.667337 +85748,AZ,Tucson,32.214981,-110.775765 +85749,AZ,Tucson,32.273285,-110.765829 +85901,AZ,Show Low,34.060117,-110.054633 +85920,AZ,Alpine,33.827878,-109.12829 +85922,AZ,Blue,33.651245,-109.06849 +85924,AZ,Concho,34.445787,-109.674096 +85925,AZ,Eagar,33.954571,-109.246933 +85928,AZ,Heber,34.4163,-110.568647 +85929,AZ,Lakeside,34.166224,-109.986878 +85935,AZ,Pinetop,34.117459,-109.919668 +85936,AZ,Saint Johns,34.501008,-109.379617 +85937,AZ,Snowflake,34.495859,-110.080742 +85938,AZ,Springerville,34.119333,-109.304066 +86001,AZ,Flagstaff,35.185911,-111.661979 +86004,AZ,Flagstaff,35.225736,-111.574109 +86021,AZ,Colorado City,36.976266,-112.952427 +86022,AZ,Fredonia,36.904397,-112.497864 +86025,AZ,Holbrook,34.908451,-110.143412 +86030,AZ,Hotevilla,36.211141,-110.566107 +86033,AZ,Kayenta,36.688327,-110.265229 +86034,AZ,Keams Canyon,35.808206,-110.284461 +86035,AZ,Leupp,35.336528,-110.992651 +86036,AZ,Marble Canyon,36.956943,-111.558166 +86038,AZ,Mormon Lake,34.916896,-111.454914 +86039,AZ,Kykotsmovi Villa,35.579084,-110.368805 +86040,AZ,Greenehaven,36.896625,-111.43847 +86042,AZ,Polacca,35.811812,-110.51114 +86043,AZ,Second Mesa,35.903782,-110.6472 +86044,AZ,Tonalea,35.934555,-110.882042 +86045,AZ,Tuba City,36.103729,-111.268566 +86046,AZ,Williams,35.543398,-112.17075 +86047,AZ,Winslow,35.16078,-110.511382 +86053,AZ,Kaibito,36.484798,-111.136973 +86054,AZ,Shonto,36.61594,-110.647743 +86301,AZ,Prescott,34.629909,-113.022459 +86303,AZ,Groom Creek,34.558577,-112.473459 +86314,AZ,Prescott Valley,34.601934,-112.326378 +86320,AZ,Ash Fork,35.214998,-112.502681 +86321,AZ,Bagdad,34.578484,-113.175535 +86322,AZ,Camp Verde,34.569733,-111.855131 +86323,AZ,Chino Valley,34.775739,-112.473099 +86324,AZ,Clarkdale,34.747793,-112.033417 +86325,AZ,Cornville,34.725593,-111.908556 +86326,AZ,Cottonwood,34.705547,-112.009099 +86327,AZ,Dewey,34.536753,-112.256665 +86332,AZ,Kirkland,34.454149,-112.896641 +86333,AZ,Mayer,34.365535,-112.129551 +86334,AZ,Paulden,35.03129,-112.544105 +86335,AZ,Rimrock,34.63799,-111.784222 +86336,AZ,Sedona,34.826645,-111.750627 +86337,AZ,Seligman,35.321246,-112.954805 +86343,AZ,Crown King,34.224062,-112.333971 +86401,AZ,Kingman,35.258379,-114.05689 +86403,AZ,Desert Hills,34.492879,-114.308083 +86412,AZ,Hualapai,35.540732,-113.295324 +86430,AZ,Bullhead City,35.014832,-114.588816 +86432,AZ,Littlefield,36.866524,-113.913693 +86434,AZ,Peach Springs,35.537795,-113.420199 +86435,AZ,Supai,36.224157,-112.693212 +86436,AZ,Topock,34.778388,-114.481666 +86440,AZ,Mohave Valley,34.892942,-114.595115 +86441,AZ,Dolan Springs,35.774789,-114.547771 +86442,AZ,Bullhead City,35.106001,-114.594737 +86444,AZ,Meadview,35.813733,-114.327696 +86502,AZ,Chambers,35.143044,-109.37389 +86503,AZ,Chinle,36.130367,-109.603693 +86505,AZ,Ganado,35.651844,-109.283168 +86507,AZ,Lukachukai,36.418111,-109.244614 +86509,AZ,Navajo,34.817202,-109.396217 +86510,AZ,Pinon,36.100243,-110.221077 +86514,AZ,Teec Nos Pos,36.779694,-109.359039 +86535,AZ,Dennehotso,36.777286,-109.861001 +86538,AZ,Many Farms,36.408259,-109.634021 +86556,AZ,Tsaile,36.307075,-109.217627 +71601,AR,North Cedar,34.215405,-91.995812 +71602,AR,Dollarway,34.257001,-92.089718 +71603,AR,Pine Bluff,34.189745,-92.044786 +71630,AR,Arkansas City,33.614328,-91.232529 +71631,AR,Banks,33.549665,-92.260386 +71635,AR,North,33.152369,-91.959152 +71638,AR,Dermott,33.524054,-91.439391 +71639,AR,Dumas,33.892102,-91.486056 +71640,AR,Eudora,33.12135,-91.271552 +71642,AR,Fountain Hill,33.342951,-91.835627 +71643,AR,Gould,34.034503,-91.576798 +71644,AR,Tamo,34.030484,-91.67082 +71646,AR,Hamburg,33.2058,-91.802265 +71647,AR,Ingalls,33.422207,-92.127714 +71651,AR,Jersey,33.388914,-92.296613 +71652,AR,Kingsland,33.86002,-92.301415 +71653,AR,Lake Village,33.327408,-91.282487 +71654,AR,Mc Gehee,33.62971,-91.392781 +71655,AR,Monticello,33.624951,-91.794845 +71658,AR,Montrose,33.307516,-91.522776 +71660,AR,New Edinburg,33.758846,-92.193909 +71661,AR,Parkdale,33.121267,-91.542793 +71662,AR,Pickens,33.807923,-91.39157 +71663,AR,Portland,33.231773,-91.513935 +71665,AR,Rison,33.945325,-92.118762 +71666,AR,Rohwer,33.616003,-91.205124 +71667,AR,Star City,33.940528,-91.865343 +71670,AR,Reed,33.67479,-91.520287 +71671,AR,Warren,33.613983,-92.077824 +71674,AR,Watson,33.890737,-91.281455 +71675,AR,Wilmar,33.621296,-91.925697 +71676,AR,Wilmot,33.057557,-91.572283 +71677,AR,Winchester,33.752039,-91.543059 +71678,AR,Yorktown,34.017166,-91.796472 +71701,AR,East Camden,33.575866,-92.833386 +71720,AR,Bearden,33.729797,-92.61802 +71722,AR,Bluff City,33.698191,-93.186811 +71725,AR,Carthage,34.063625,-92.62623 +71726,AR,Reader,33.700148,-93.018716 +71730,AR,El Dorado,33.20735,-92.662856 +71740,AR,Emerson,33.089054,-93.198699 +71742,AR,Fordyce,33.817648,-92.422475 +71743,AR,Gurdon,33.912493,-93.141691 +71744,AR,Hampton,33.537613,-92.52951 +71745,AR,Harrell,33.510865,-92.391243 +71747,AR,Huttig,33.045888,-92.194153 +71748,AR,Ivan,33.902984,-92.439406 +71749,AR,Junction City,33.043965,-92.684254 +71751,AR,Louann,33.411744,-92.782759 +71752,AR,Mc Neil,33.36222,-93.193006 +71753,AR,Magnolia,33.264678,-93.239153 +71758,AR,Mount Holly,33.308534,-92.944265 +71759,AR,Norphlet,33.309619,-92.657619 +71762,AR,Smackover,33.339831,-92.74425 +71763,AR,Manning,33.902989,-92.810984 +71764,AR,Stephens,33.455044,-93.021391 +71765,AR,Strong,33.119526,-92.362104 +71766,AR,Thornton,33.767694,-92.468299 +71767,AR,Tinsman,33.643436,-92.382192 +71769,AR,Village,33.281849,-93.046404 +71770,AR,Waldo,33.360017,-93.294915 +71801,AR,Perrytown,33.656645,-93.590305 +71822,AR,Ashdown,33.678711,-94.135102 +71825,AR,Blevins,33.875468,-93.536035 +71826,AR,Bradley,33.106963,-93.627496 +71827,AR,Buckner,33.375323,-93.446998 +71828,AR,Cale,33.616403,-93.26497 +71831,AR,Columbus,33.745108,-93.85588 +71832,AR,De Queen,34.044206,-94.338559 +71833,AR,Dierks,34.13232,-94.015243 +71834,AR,Doddridge,33.105448,-93.954307 +71835,AR,Emmet,33.692896,-93.423242 +71836,AR,Foreman,33.71759,-94.388108 +71837,AR,Fouke,33.302476,-93.900953 +71838,AR,Fulton,33.629876,-93.808562 +71839,AR,Garland City,33.335161,-93.731624 +71841,AR,Gillham,34.157003,-94.316497 +71842,AR,Horatio,33.939221,-94.295942 +71845,AR,Lewisville,33.373603,-93.595258 +71846,AR,Lockesburg,33.930553,-94.127588 +71847,AR,Mc Caskill,33.923042,-93.626605 +71851,AR,Mineral Springs,33.863852,-93.918828 +71852,AR,Nashville,33.957646,-93.870709 +71853,AR,Ogden,33.585706,-94.027826 +71855,AR,Ozan,33.902775,-93.771443 +71857,AR,Prescott,33.804029,-93.372544 +71858,AR,Rosston,33.561693,-93.303891 +71859,AR,Saratoga,33.759883,-93.876723 +71860,AR,Stamps,33.356877,-93.501307 +71861,AR,Taylor,33.107957,-93.446019 +71862,AR,Washington,33.754596,-93.673529 +71864,AR,Willisville,33.484731,-93.31212 +71865,AR,Wilton,33.734794,-94.135746 +71866,AR,Winthrop,33.858321,-94.395174 +71901,AR,Lake Catherine,34.501475,-93.026024 +71909,AR,Hot Springs Vill,34.65862,-93.006386 +71913,AR,Lake Hamilton,34.473304,-93.109177 +71921,AR,Amity,34.259362,-93.420551 +71922,AR,Antoine,34.028296,-93.437169 +71923,AR,Arkadelphia,34.11525,-93.068989 +71929,AR,Bismarck,34.311033,-93.187236 +71931,AR,Blakely,34.703957,-93.063509 +71933,AR,Bonnerdale,34.349751,-93.319415 +71935,AR,Caddo Gap,34.397579,-93.586376 +71937,AR,Cove,34.419159,-94.39234 +71940,AR,Delight,34.023772,-93.524666 +71941,AR,Donaldson,34.221221,-92.909384 +71942,AR,Friendship,34.241225,-92.980393 +71943,AR,Glenwood,34.319207,-93.555881 +71944,AR,Grannis,34.237021,-94.3255 +71945,AR,Hatfield,34.487703,-94.371397 +71949,AR,Jessieville,34.693729,-93.196318 +71950,AR,Kirby,34.255153,-93.616716 +71952,AR,Langley,34.314035,-93.850942 +71953,AR,Mena,34.581435,-94.220984 +71956,AR,Buckville,34.577182,-93.160041 +71957,AR,Mount Ida,34.561194,-93.574904 +71958,AR,Murfreesboro,34.101734,-93.710903 +71959,AR,Newhope,34.227347,-93.890487 +71960,AR,Norman,34.459633,-93.674304 +71961,AR,Oden,34.611292,-93.821103 +71962,AR,Okolona,34.055138,-93.289679 +71964,AR,Pearcy,34.435092,-93.242015 +71965,AR,Pencil Bluff,34.639946,-93.742947 +71968,AR,Royal,34.515049,-93.289734 +71969,AR,Sims,34.646181,-93.674071 +71970,AR,Story,34.668695,-93.537587 +71971,AR,Umpire,34.292129,-94.031377 +71972,AR,Vandervoort,34.379535,-94.369788 +71973,AR,Wickes,34.308806,-94.340257 +72001,AR,Adona,35.046956,-92.903325 +72002,AR,Alexander,34.631266,-92.472673 +72003,AR,Almyra,34.41459,-91.430992 +72004,AR,Altheimer,34.306168,-91.828916 +72005,AR,Amagon,35.561559,-91.079636 +72006,AR,Augusta,35.278806,-91.352653 +72007,AR,Austin,35.028369,-91.959398 +72010,AR,Bald Knob,35.311331,-91.550197 +72011,AR,Bauxite,34.545537,-92.360531 +72012,AR,Beebe,35.093743,-91.907449 +72013,AR,Bee Branch,35.423367,-92.408523 +72014,AR,Beedeville,35.420267,-91.106371 +72015,AR,Benton,34.580087,-92.595241 +72016,AR,Bigelow,34.984659,-92.630842 +72017,AR,Biscoe,34.833706,-91.490028 +72020,AR,Bradford,35.427655,-91.518973 +72021,AR,Brinkley,34.878124,-91.188596 +72022,AR,Bryant,34.606786,-92.492015 +72023,AR,Cabot,34.945724,-92.031771 +72024,AR,Carlisle,34.793291,-91.745929 +72025,AR,Casa,35.032168,-93.047005 +72026,AR,Casscoe,34.473625,-91.324798 +72027,AR,Center Ridge,35.398063,-92.558167 +72028,AR,Choctaw,35.523528,-92.426412 +72029,AR,Clarendon,34.660138,-91.256426 +72030,AR,Cleveland,35.358328,-92.712821 +72031,AR,Clinton,35.604537,-92.475825 +72032,AR,Conway,35.084199,-92.423574 +72036,AR,Cotton Plant,35.017827,-91.229043 +72038,AR,Crocketts Bluff,34.425272,-91.232079 +72039,AR,Twin Groves,35.291042,-92.432952 +72040,AR,Des Arc,34.97507,-91.511342 +72041,AR,De Valls Bluff,34.744704,-91.498218 +72042,AR,De Witt,34.285312,-91.333627 +72044,AR,Edgemont,35.623006,-92.199471 +72045,AR,El Paso,35.114176,-92.090076 +72046,AR,England,34.557458,-91.948422 +72047,AR,Enola,35.208705,-92.212328 +72048,AR,Ethel,34.243525,-91.139839 +72051,AR,Fox,35.768208,-92.304266 +72052,AR,Garner,35.130305,-91.742884 +72055,AR,Gillett,34.121838,-91.380048 +72057,AR,Grapevine,34.130893,-92.310944 +72058,AR,Greenbrier,35.229547,-92.357792 +72060,AR,Griffithville,35.114383,-91.624234 +72061,AR,Guy,35.318487,-92.331539 +72063,AR,Hattieville,35.290713,-92.778317 +72064,AR,Hazen,34.783833,-91.576699 +72065,AR,Hensley,34.591133,-92.214019 +72066,AR,Hickory Plains,34.978642,-91.750844 +72067,AR,Greers Ferry,35.549812,-92.182284 +72068,AR,Higginson,35.188254,-91.71828 +72069,AR,Holly Grove,34.599294,-91.184376 +72070,AR,Houston,35.036209,-92.691319 +72072,AR,Humnoke,34.541896,-91.756616 +72073,AR,Humphrey,34.403387,-91.67896 +72076,AR,Gravel Ridge,34.881985,-92.130435 +72079,AR,Jefferson,34.355285,-92.148574 +72080,AR,Jerusalem,35.37975,-92.813886 +72081,AR,Judsonia,35.324954,-91.649087 +72082,AR,Kensett,35.229939,-91.669672 +72083,AR,Keo,34.604072,-92.007844 +72084,AR,Leola,34.185605,-92.597865 +72086,AR,Lonoke,34.783162,-91.921367 +72087,AR,Lonsdale,34.556203,-92.834034 +72101,AR,Mc Crory,35.247292,-91.179327 +72102,AR,Mc Rae,35.11322,-91.821551 +72103,AR,Shannon Hills,34.621756,-92.384618 +72104,AR,Malvern,34.355715,-92.829162 +72105,AR,Jones Mills,34.453624,-92.861975 +72106,AR,Mayflower,34.966853,-92.400102 +72110,AR,Morrilton,35.169227,-92.735436 +72111,AR,Mount Vernon,35.260613,-92.137334 +72112,AR,Newport,35.598823,-91.257064 +72113,AR,Maumelle,34.849085,-92.405892 +72114,AR,North Little Roc,34.766974,-92.265376 +72116,AR,Sherwood,34.807629,-92.237359 +72117,AR,North Little Roc,34.776305,-92.194604 +72118,AR,Camp Joseph T Ro,34.821598,-92.307875 +72120,AR,North Little Roc,34.859292,-92.214169 +72121,AR,Pangburn,35.421583,-91.795971 +72122,AR,Paron,34.785289,-92.748176 +72125,AR,Perry,35.042732,-92.787976 +72126,AR,Perryville,34.970096,-92.847171 +72127,AR,Plumerville,35.157466,-92.620435 +72128,AR,Poyen,34.350828,-92.599037 +72129,AR,Prattsville,34.307865,-92.513105 +72130,AR,Prim,35.685733,-92.134596 +72131,AR,Quitman,35.404988,-92.133334 +72132,AR,Redfield,34.452647,-92.17579 +72133,AR,Reydell,34.143281,-91.550395 +72134,AR,Roe,34.628592,-91.377058 +72135,AR,Roland,34.88287,-92.519152 +72136,AR,Romance,35.215462,-92.06985 +72137,AR,Rose Bud,35.321447,-92.061988 +72140,AR,Saint Charles,34.335296,-91.16808 +72141,AR,Scotland,35.507956,-92.586652 +72142,AR,Scott,34.694215,-92.11566 +72143,AR,Georgetown,35.253512,-91.762931 +72150,AR,Sheridan,34.316527,-92.365713 +72152,AR,Sherrill,34.358148,-91.993285 +72153,AR,Shirley,35.573259,-92.29751 +72156,AR,Solgohachia,35.270056,-92.675387 +72157,AR,Springfield,35.274879,-92.54567 +72160,AR,Stuttgart,34.485358,-91.548742 +72165,AR,Thida,35.553556,-91.461823 +72166,AR,Tichnor,34.089311,-91.243684 +72167,AR,Traskwood,34.450791,-92.654734 +72168,AR,Tucker,34.441442,-91.916265 +72170,AR,Ulm,34.579938,-91.51343 +72173,AR,Vilonia,35.071895,-92.183235 +72175,AR,Wabbaseka,34.393552,-91.754948 +72176,AR,Ward,34.95316,-91.900383 +72179,AR,Wilburn,35.454547,-91.907248 +72181,AR,Wooster,35.197308,-92.450998 +72182,AR,Wright,34.437656,-92.06308 +72201,AR,Little Rock,34.748342,-92.281939 +72202,AR,Little Rock,34.736322,-92.274067 +72204,AR,Little Rock,34.726904,-92.344041 +72205,AR,Little Rock,34.750971,-92.345512 +72206,AR,Little Rock,34.683599,-92.277606 +72207,AR,Little Rock,34.772121,-92.356481 +72208,AR,Ferndale,34.781575,-92.585581 +72209,AR,Little Rock,34.672509,-92.352919 +72210,AR,Little Rock,34.707625,-92.465981 +72211,AR,Little Rock,34.758819,-92.431485 +72212,AR,Little Rock,34.787076,-92.422232 +72301,AR,West Memphis,35.148442,-90.17792 +72310,AR,Armorel,35.942843,-89.758118 +72311,AR,Aubrey,34.702727,-90.911331 +72313,AR,Bassett,35.513808,-90.192155 +72314,AR,Birdeye,35.409571,-90.67074 +72315,AR,Blytheville A F,35.934482,-89.922497 +72320,AR,Brickeys,34.854814,-90.537738 +72321,AR,Burdette,35.814769,-89.942312 +72324,AR,Cherry Valley,35.399122,-90.761329 +72326,AR,Colt,35.096062,-90.787204 +72327,AR,Crawfordsville,35.211873,-90.335107 +72328,AR,Crumrod,34.216167,-90.949535 +72329,AR,Driver,35.559714,-89.960526 +72330,AR,Dyess,35.595394,-90.215716 +72331,AR,Earle,35.27989,-90.450261 +72332,AR,Edmondson,35.022309,-90.328672 +72333,AR,Elaine,34.308668,-90.873485 +72335,AR,Forrest City,35.009129,-90.788572 +72338,AR,Frenchmans Bayou,35.478419,-90.055933 +72339,AR,Gilmore,35.386408,-90.264664 +72340,AR,Goodwin,34.959149,-90.983518 +72341,AR,Haynes,34.883752,-90.766621 +72342,AR,Helena,34.532491,-90.629784 +72346,AR,Heth,35.097335,-90.458554 +72347,AR,Hickory Ridge,35.399457,-90.982283 +72348,AR,Hughes,34.945416,-90.474142 +72350,AR,Joiner,35.505239,-90.14779 +72351,AR,Keiser,35.678626,-90.096171 +72354,AR,Lepanto,35.606909,-90.335883 +72355,AR,Lexa,34.672694,-90.78532 +72358,AR,Luxora,35.760786,-89.92204 +72360,AR,Marianna,34.775929,-90.77852 +72364,AR,Marion,35.2077,-90.198908 +72365,AR,Marked Tree,35.534933,-90.419387 +72366,AR,Marvell,34.548541,-90.941322 +72367,AR,Mellwood,34.220032,-91.008589 +72368,AR,Moro,34.802953,-91.006026 +72369,AR,Oneida,34.405267,-90.826045 +72370,AR,Osceola,35.701864,-89.979764 +72372,AR,Palestine,34.966346,-90.904929 +72373,AR,Parkin,35.258557,-90.556417 +72374,AR,Poplar Grove,34.539397,-90.881274 +72376,AR,Proctor,35.083396,-90.255026 +72379,AR,Snow Lake,34.066466,-91.007083 +72381,AR,Tomato,35.806666,-89.787092 +72384,AR,Turrell,35.296936,-90.262979 +72386,AR,Tyronza,35.486477,-90.351944 +72390,AR,West Helena,34.549635,-90.654531 +72392,AR,Wheatley,34.920703,-91.108645 +72394,AR,Widener,35.059167,-90.629313 +72395,AR,Wilson,35.566004,-90.042749 +72396,AR,Wynne,35.233036,-90.79303 +72397,AR,Fair Oaks,35.236817,-91.014304 +72401,AR,Jonesboro,35.833016,-90.696526 +72410,AR,Alicia,35.942327,-91.081003 +72411,AR,Bay,35.74559,-90.550658 +72412,AR,Beech Grove,36.183172,-90.618084 +72413,AR,Biggers,36.342978,-90.784467 +72414,AR,Black Oak,35.835851,-90.354227 +72415,AR,Black Rock,36.114874,-91.117629 +72416,AR,Bono,35.908592,-90.784753 +72417,AR,Brookland,35.91647,-90.576228 +72419,AR,Caraway,35.758951,-90.335797 +72421,AR,Cash,35.830145,-90.941007 +72422,AR,Corning,36.415532,-90.58702 +72424,AR,Datto,36.389685,-90.723117 +72425,AR,Delaplaine,36.199485,-90.734482 +72426,AR,Dell,35.850118,-90.035449 +72428,AR,Etowah,35.714707,-90.218172 +72429,AR,Fisher,35.513956,-90.955001 +72430,AR,Greenway,36.334766,-90.225257 +72432,AR,Harrisburg,35.572222,-90.703752 +72433,AR,Hoxie,36.032573,-90.971504 +72434,AR,Imboden,36.19763,-91.185442 +72435,AR,Knobel,36.317647,-90.599048 +72436,AR,Lafe,36.21547,-90.506973 +72437,AR,Lake City,35.81715,-90.442327 +72438,AR,Leachville,35.933216,-90.195488 +72440,AR,Lynn,36.016639,-91.254588 +72441,AR,Mc Dougal,36.379909,-90.394093 +72442,AR,Roseland,35.874885,-90.180252 +72443,AR,Marmaduke,36.195117,-90.38368 +72444,AR,Maynard,36.438563,-90.874921 +72445,AR,Minturn,35.976096,-91.033704 +72447,AR,Monette,35.900168,-90.343658 +72449,AR,O Kean,36.179672,-90.824069 +72450,AR,Paragould,36.060033,-90.525093 +72453,AR,Peach Orchard,36.283045,-90.670217 +72454,AR,Piggott,36.386993,-90.19261 +72455,AR,Pocahontas,36.282876,-90.996782 +72456,AR,Pollard,36.431725,-90.275123 +72457,AR,Portia,36.080699,-91.068004 +72458,AR,Powhatan,36.080044,-91.148214 +72459,AR,Ravenden,36.202863,-91.25934 +72460,AR,Ravenden Springs,36.310384,-91.209433 +72461,AR,Rector,36.267177,-90.270201 +72464,AR,Saint Francis,36.454771,-90.144991 +72465,AR,Sedgwick,35.985965,-90.880099 +72466,AR,Smithville,36.090815,-91.274456 +72467,AR,State University,35.914894,-90.454245 +72469,AR,Calamine,35.972622,-91.375398 +72470,AR,Success,36.453615,-90.728128 +72471,AR,Swifton,35.827366,-91.126358 +72472,AR,Payneway,35.668914,-90.518738 +72473,AR,Tuckerman,35.730678,-91.200347 +72476,AR,College City,36.077814,-90.952809 +72478,AR,Warm Springs,36.467531,-91.038707 +72479,AR,Weiner,35.629052,-90.928928 +72482,AR,Williford,36.245335,-91.379226 +72501,AR,Batesville,35.782614,-91.63519 +72512,AR,Horseshoe Bend,36.202502,-91.755334 +72513,AR,Agnos,36.219732,-91.610746 +72515,AR,Bexar,36.306103,-91.985998 +72516,AR,Boswell,36.01084,-92.044307 +72517,AR,Brockwell,36.135755,-91.951308 +72519,AR,Jordan,36.144771,-92.145494 +72520,AR,Camp,36.402531,-91.726166 +72521,AR,Cave City,35.951684,-91.544432 +72522,AR,Charlotte,35.833393,-91.396217 +72523,AR,Concord,35.641355,-91.833339 +72524,AR,Cord,35.81844,-91.337455 +72526,AR,Cushman,35.869663,-91.776455 +72527,AR,Desha,35.731524,-91.678287 +72528,AR,Dolph,36.222878,-92.11766 +72529,AR,Cherokee Village,36.30114,-91.528075 +72530,AR,Drasco,35.661606,-91.939818 +72531,AR,Elizabeth,36.323776,-92.093366 +72532,AR,Evening Shade,36.085532,-91.598014 +72533,AR,Fifty Six,35.991958,-92.218169 +72534,AR,Floral,35.602337,-91.734101 +72536,AR,Franklin,36.129093,-91.809592 +72537,AR,Gamaliel,36.461794,-92.228447 +72538,AR,Gepp,36.436443,-92.099507 +72539,AR,Glencoe,36.288962,-91.769483 +72540,AR,Guion,35.960135,-91.934287 +72542,AR,Hardy,36.322746,-91.411027 +72543,AR,Heber Springs,35.510278,-92.039211 +72544,AR,Henderson,36.356829,-92.269253 +72546,AR,Ida,35.594326,-91.930081 +72550,AR,Locust Grove,35.717705,-91.741443 +72553,AR,Magness,35.710062,-91.485041 +72554,AR,Mammoth Spring,36.407648,-91.575712 +72555,AR,Marcella,35.749654,-91.941891 +72556,AR,Zion,36.059958,-91.905196 +72557,AR,Moko,36.468902,-91.858663 +72560,AR,Hanover,35.865769,-92.114762 +72561,AR,Mount Pleasant,35.975909,-91.785013 +72562,AR,Newark,35.71183,-91.439395 +72564,AR,Oil Trough,35.613147,-91.470305 +72565,AR,Oxford,36.211408,-91.925849 +72566,AR,Pineville,36.167704,-92.107299 +72567,AR,Pleasant Grove,35.842349,-91.931905 +72568,AR,Pleasant Plains,35.589301,-91.632043 +72569,AR,Poughkeepsie,36.071526,-91.451575 +72571,AR,Rosie,35.663816,-91.534003 +72572,AR,Saffell,35.917957,-91.297753 +72573,AR,Sage,36.042476,-91.824569 +72575,AR,Salado,35.703493,-91.597924 +72576,AR,Byron,36.365401,-91.836321 +72577,AR,Sidney,35.991554,-91.634593 +72578,AR,Sturkie,36.463869,-91.989917 +72579,AR,Sulphur Rock,35.754466,-91.507333 +72581,AR,Tumbling Shoals,35.546985,-91.970359 +72583,AR,Viola,36.392429,-91.993198 +72584,AR,Violet Hill,36.162966,-91.847064 +72585,AR,Wideman,36.198739,-92.001796 +72587,AR,Wiseman,36.228022,-91.849499 +72601,AR,Harrison,36.241707,-93.106162 +72610,AR,Alco,35.894511,-92.380753 +72611,AR,Alpena,36.299768,-93.2792 +72612,AR,Bass,35.892225,-92.999832 +72616,AR,Berryville,36.351908,-93.558725 +72617,AR,Big Flat,36.006824,-92.391681 +72618,AR,Bruno,36.124617,-92.763651 +72619,AR,Bull Shoals,36.370958,-92.593765 +72623,AR,Clarkridge,36.443311,-92.35159 +72624,AR,Compton,36.097941,-93.309903 +72626,AR,Cotter,36.280378,-92.532787 +72628,AR,Deer,35.852982,-93.317388 +72629,AR,Dennard,35.725236,-92.557456 +72632,AR,Eureka Springs,36.417465,-93.737915 +72633,AR,Everton,36.153366,-92.914989 +72634,AR,Flippin,36.268219,-92.577995 +72635,AR,Gassville,36.317525,-92.473637 +72638,AR,Green Forest,36.322408,-93.405875 +72639,AR,Harriet,35.974187,-92.50055 +72640,AR,Hasty,36.015229,-93.045966 +72641,AR,Jasper,36.003798,-93.204771 +72642,AR,Lakeview,36.397308,-92.504416 +72644,AR,Lead Hill,36.430886,-92.930194 +72645,AR,Leslie,35.82716,-92.566293 +72648,AR,Dogpatch,36.095121,-93.144822 +72650,AR,Marshall,35.926697,-92.640203 +72651,AR,Midway,36.290454,-92.431398 +72653,AR,Mountain Home,36.331153,-92.375337 +72655,AR,Mount Judea,35.834674,-93.082391 +72657,AR,Timbo,35.896338,-92.252536 +72658,AR,Norfork,36.206571,-92.273011 +72660,AR,Oak Grove,36.461347,-93.432129 +72661,AR,Oakland,36.444227,-92.583187 +72662,AR,Omaha,36.46123,-93.188753 +72663,AR,Onia,35.940339,-92.345859 +72666,AR,Parthenon,35.940836,-93.267776 +72668,AR,Peel,36.444374,-92.776143 +72669,AR,Pindall,36.067479,-92.886409 +72670,AR,Ponca,36.066225,-93.401985 +72675,AR,Saint Joe,35.987707,-92.792828 +72679,AR,Tilly,35.6976,-92.844209 +72680,AR,Newnata,35.855318,-92.337929 +72682,AR,Valley Springs,36.146823,-92.979937 +72683,AR,Vendor,35.948062,-93.100815 +72685,AR,Western Grove,36.082994,-92.971649 +72686,AR,Witts Springs,35.785514,-92.815518 +72687,AR,Yellville,36.225322,-92.724472 +72701,AR,Fayetteville,36.052045,-94.153395 +72703,AR,Fayetteville,36.099183,-94.17163 +72712,AR,Bentonville,36.357703,-94.22242 +72714,AR,Bella Vista,36.465086,-94.251969 +72716,AR,Wal-Mart Inc,36.326554,-94.181483 +72717,AR,Canehill,35.910992,-94.3862 +72718,AR,Cave Springs,36.266771,-94.207836 +72719,AR,Centerton,36.366993,-94.30891 +72721,AR,Combs,35.848297,-93.825218 +72722,AR,Decatur,36.334749,-94.453411 +72727,AR,Elkins,36.017719,-94.007323 +72729,AR,Evansville,35.819345,-94.478936 +72730,AR,Farmington,36.043635,-94.253871 +72732,AR,Garfield,36.428817,-93.951197 +72733,AR,Gateway,36.485751,-93.935016 +72734,AR,Gentry,36.26516,-94.475131 +72735,AR,Goshen,36.107523,-93.987262 +72736,AR,Gravette,36.415513,-94.477862 +72738,AR,Hindsville,36.142206,-93.863339 +72739,AR,Hiwasse,36.441589,-94.338993 +72740,AR,Huntsville,36.104348,-93.727893 +72742,AR,Kingston,36.04845,-93.504357 +72744,AR,Lincoln,35.956931,-94.42724 +72745,AR,Lowell,36.243318,-94.082725 +72747,AR,Maysville,36.401062,-94.581278 +72749,AR,Morrow,35.85373,-94.425793 +72751,AR,Pea Ridge,36.453884,-94.118026 +72752,AR,Pettigrew,35.834562,-93.618079 +72753,AR,Prairie Grove,35.991809,-94.316861 +72756,AR,Rogers,36.336316,-94.114784 +72760,AR,Saint Paul,35.849576,-93.734743 +72761,AR,Siloam Springs,36.179969,-94.528036 +72762,AR,Springdale,36.183521,-94.176216 +72764,AR,Bethel Heights,36.177918,-94.104682 +72768,AR,Sulphur Springs,36.479434,-94.452069 +72769,AR,Summers,36.013827,-94.500027 +72773,AR,Wesley,35.957264,-93.911478 +72774,AR,West Fork,35.908153,-94.230375 +72776,AR,Witter,35.935583,-93.621 +72801,AR,Russellville,35.284208,-93.131476 +72820,AR,Alix,35.430767,-93.726416 +72821,AR,Altus,35.404873,-93.811494 +72823,AR,Atkins,35.244948,-92.950696 +72824,AR,Belleville,35.103762,-93.451817 +72826,AR,Blue Mountain,35.130386,-93.716797 +72827,AR,Bluffton,34.901635,-93.591946 +72828,AR,Briggsville,34.916065,-93.515748 +72830,AR,Clarksville,35.490763,-93.491056 +72832,AR,Coal Hill,35.437117,-93.67203 +72833,AR,Danville,35.049541,-93.392933 +72834,AR,Dardanelle,35.195507,-93.187316 +72835,AR,Delaware,35.278005,-93.346152 +72837,AR,Dover,35.407356,-93.135526 +72838,AR,Gravelly,34.888123,-93.680249 +72839,AR,Hagarville,35.523291,-93.344256 +72840,AR,Hartman,35.443583,-93.614196 +72841,AR,Harvey,34.867912,-93.752538 +72842,AR,Waveland,35.111845,-93.576719 +72843,AR,Hector,35.40574,-92.965559 +72845,AR,Knoxville,35.374897,-93.361797 +72846,AR,Lamar,35.434868,-93.355157 +72847,AR,London,35.337017,-93.238907 +72851,AR,New Blaine,35.318912,-93.44457 +72852,AR,Oark,35.709454,-93.558531 +72853,AR,Ola,35.03091,-93.21356 +72854,AR,Ozone,35.657478,-93.43111 +72855,AR,Paris,35.294149,-93.726469 +72856,AR,Pelsor,35.691158,-93.016088 +72857,AR,Plainview,34.966793,-93.309897 +72858,AR,Pottsville,35.239785,-93.056386 +72860,AR,Rover,34.947522,-93.401728 +72863,AR,Scranton,35.330816,-93.539362 +72865,AR,Subiaco,35.31346,-93.63869 +72901,AR,Fort Smith,35.365272,-94.411035 +72903,AR,Fort Smith,35.342673,-94.378361 +72904,AR,Fort Smith,35.405122,-94.38723 +72905,AR,Fort Chaffee,35.297366,-94.340521 +72916,AR,Fort Smith,35.250175,-94.370308 +72921,AR,Alma,35.500043,-94.207337 +72923,AR,Barling,35.332963,-94.308226 +72924,AR,Bates,34.909295,-94.393155 +72926,AR,Boles,34.765363,-94.062864 +72927,AR,Booneville,35.136385,-93.927433 +72928,AR,Branch,35.297055,-93.94537 +72930,AR,Cecil,35.434176,-93.942932 +72932,AR,Cedarville,35.590231,-94.344618 +72933,AR,Charleston,35.311502,-94.03368 +72934,AR,Chester,35.689776,-94.202026 +72936,AR,Greenwood,35.195476,-94.253027 +72937,AR,Hackett,35.194476,-94.398328 +72938,AR,Hartford,35.022233,-94.381876 +72940,AR,Huntington,35.096267,-94.331283 +72941,AR,Central City,35.337513,-94.165637 +72943,AR,Magazine,35.15873,-93.800336 +72944,AR,Mansfield,35.0432,-94.22036 +72946,AR,Mountainburg,35.570027,-94.109094 +72947,AR,Mulberry,35.517246,-93.988505 +72948,AR,Natural Dam,35.674259,-94.412377 +72949,AR,Ozark,35.524645,-93.837423 +72950,AR,Parks,34.800333,-93.950913 +72951,AR,Ratcliff,35.276032,-93.842149 +72952,AR,Rudy,35.539805,-94.237376 +72955,AR,Uniontown,35.574822,-94.43487 +72956,AR,Van Buren,35.453989,-94.327762 +72958,AR,Waldron,34.902642,-94.077243 +72959,AR,Winslow,35.831206,-94.118657 +75502,AR,Texarkana,33.432644,-94.011281 +90001,CA,Los Angeles,33.973093,-118.247896 +90002,CA,Los Angeles,33.94969,-118.246213 +90003,CA,Los Angeles,33.965335,-118.272739 +90004,CA,Los Angeles,34.076163,-118.302863 +90005,CA,Los Angeles,34.058508,-118.301197 +90006,CA,Los Angeles,34.049323,-118.291687 +90007,CA,Los Angeles,34.029442,-118.287095 +90008,CA,Los Angeles,34.011643,-118.341123 +90010,CA,Los Angeles,34.060633,-118.302664 +90011,CA,Los Angeles,34.007856,-118.258189 +90012,CA,Los Angeles,34.061396,-118.238479 +90013,CA,Los Angeles,34.044841,-118.243366 +90014,CA,Los Angeles,34.044272,-118.250937 +90015,CA,Los Angeles,34.043439,-118.271613 +90016,CA,Los Angeles,34.029826,-118.352787 +90017,CA,Los Angeles,34.055864,-118.266582 +90018,CA,Los Angeles,34.028972,-118.315173 +90019,CA,Los Angeles,34.048158,-118.33426 +90020,CA,Los Angeles,34.066535,-118.302211 +90021,CA,Los Angeles,34.033303,-118.244698 +90022,CA,East Los Angeles,34.023638,-118.155319 +90023,CA,Los Angeles,34.024478,-118.197498 +90024,CA,Los Angeles,34.063691,-118.440796 +90025,CA,Los Angeles,34.044662,-118.448717 +90026,CA,Los Angeles,34.076629,-118.264641 +90027,CA,Los Angeles,34.104031,-118.292516 +90028,CA,Los Angeles,34.100549,-118.325363 +90029,CA,Los Angeles,34.089982,-118.294393 +90031,CA,Los Angeles,34.078349,-118.211279 +90032,CA,Los Angeles,34.081785,-118.175323 +90033,CA,Los Angeles,34.048676,-118.208442 +90034,CA,Los Angeles,34.028977,-118.400482 +90035,CA,Los Angeles,34.053096,-118.380615 +90036,CA,Los Angeles,34.069888,-118.349175 +90037,CA,Los Angeles,34.002982,-118.286284 +90038,CA,Los Angeles,34.089769,-118.321489 +90039,CA,Los Angeles,34.112089,-118.259428 +90040,CA,City Of Commerce,33.99471,-118.151352 +90041,CA,Los Angeles,34.133932,-118.208205 +90042,CA,Los Angeles,34.114527,-118.192902 +90043,CA,Los Angeles,33.987099,-118.33211 +90044,CA,Los Angeles,33.955089,-118.290119 +90045,CA,Los Angeles,33.963075,-118.394128 +90046,CA,Cole,34.09743,-118.357979 +90047,CA,Los Angeles,33.956896,-118.307304 +90048,CA,Los Angeles,34.073656,-118.371969 +90049,CA,Los Angeles,34.066,-118.473967 +90056,CA,Los Angeles,33.985329,-118.370703 +90057,CA,Los Angeles,34.062172,-118.276262 +90058,CA,Vernon,33.997344,-118.235365 +90059,CA,Los Angeles,33.929331,-118.24628 +90061,CA,Los Angeles,33.924493,-118.271638 +90062,CA,Los Angeles,34.00324,-118.307277 +90063,CA,Hazard,34.044017,-118.185432 +90064,CA,Los Angeles,34.035279,-118.425911 +90065,CA,Los Angeles,34.107307,-118.226637 +90066,CA,Los Angeles,34.002956,-118.429769 +90067,CA,Los Angeles,34.055146,-118.409479 +90068,CA,Los Angeles,34.115625,-118.330476 +90069,CA,West Hollywood,34.090573,-118.378753 +90071,CA,Los Angeles,34.052043,-118.257127 +90077,CA,Los Angeles,34.111245,-118.450155 +90201,CA,Bell Gardens,33.969177,-118.17205 +90210,CA,Beverly Hills,34.090107,-118.406477 +90211,CA,Beverly Hills,34.065217,-118.383007 +90212,CA,Beverly Hills,34.061855,-118.399544 +90220,CA,Rancho Dominguez,33.890654,-118.239044 +90221,CA,East Rancho Domi,33.897324,-118.203724 +90222,CA,Rosewood,33.911535,-118.234034 +90230,CA,Culver City,33.994927,-118.399115 +90232,CA,Culver City,34.016809,-118.397332 +90240,CA,Downey,33.958135,-118.117381 +90241,CA,Downey,33.941612,-118.13062 +90242,CA,Downey,33.921789,-118.139465 +90245,CA,El Segundo,33.924275,-118.411924 +90247,CA,Gardena,33.892463,-118.296122 +90248,CA,Gardena,33.874506,-118.289312 +90249,CA,Gardena,33.899762,-118.319854 +90250,CA,Holly Park,33.913214,-118.346978 +90254,CA,Hermosa Beach,33.864309,-118.395511 +90255,CA,Huntington Park,33.976879,-118.216053 +90260,CA,Lawndale,33.887908,-118.351014 +90262,CA,Lynwood,33.924076,-118.201289 +90265,CA,Malibu,34.040184,-118.735149 +90266,CA,Manhattan Beach,33.889594,-118.399562 +90270,CA,Maywood,33.988992,-118.187685 +90272,CA,Pacific Palisade,34.054097,-118.536874 +90274,CA,Palos Verdes Est,33.770094,-118.374763 +90277,CA,Redondo Beach,33.830656,-118.383221 +90278,CA,Redondo Beach,33.870654,-118.371459 +90280,CA,South Gate,33.94617,-118.201349 +90290,CA,Topanga,34.10759,-118.602268 +90291,CA,Venice,33.993772,-118.463463 +90292,CA,Marina Del Rey,33.977876,-118.452475 +90293,CA,Playa Del Rey,33.957745,-118.437314 +90301,CA,Inglewood,33.955048,-118.355575 +90302,CA,Inglewood,33.974496,-118.354805 +90303,CA,Inglewood,33.937691,-118.332058 +90304,CA,Lennox,33.938514,-118.355562 +90305,CA,Inglewood,33.958304,-118.32585 +90401,CA,Santa Monica,34.017628,-118.490708 +90402,CA,Santa Monica,34.034875,-118.503011 +90403,CA,Santa Monica,34.028658,-118.49241 +90404,CA,Santa Monica,34.026828,-118.4733 +90405,CA,Santa Monica,34.01001,-118.471708 +90501,CA,Torrance,33.826817,-118.31183 +90502,CA,Torrance,33.828555,-118.292039 +90503,CA,Torrance,33.839709,-118.354236 +90504,CA,Torrance,33.870815,-118.329517 +90505,CA,Torrance,33.810635,-118.350733 +90506,CA,Torrance,33.885367,-118.329543 +90601,CA,Whittier,34.001119,-118.037139 +90602,CA,Whittier,33.96931,-118.033703 +90603,CA,Whittier,33.943199,-117.992685 +90604,CA,Whittier,33.929931,-118.012075 +90605,CA,Whittier,33.941338,-118.035568 +90606,CA,Los Nietos,33.977019,-118.065639 +90620,CA,Buena Park,33.840607,-118.011359 +90621,CA,Buena Park,33.873136,-117.994257 +90623,CA,Cerritos,33.849017,-118.040618 +90630,CA,Cypress,33.818613,-118.038696 +90631,CA,La Habra Heights,33.932173,-117.949703 +90638,CA,La Mirada,33.906681,-118.010081 +90640,CA,Montebello,34.013342,-118.112986 +90650,CA,Norwalk,33.90564,-118.081767 +90660,CA,Pico Rivera,33.98857,-118.088269 +90670,CA,Santa Fe Springs,33.946407,-118.083801 +90680,CA,Stanton,33.803029,-117.994709 +90701,CA,Cerritos,33.866568,-118.068046 +90704,CA,Avalon,33.331963,-118.343706 +90706,CA,Bellflower,33.886676,-118.126527 +90710,CA,Harbor City,33.797006,-118.299114 +90712,CA,Lakewood,33.851201,-118.145727 +90713,CA,Lakewood,33.847302,-118.111464 +90715,CA,Lakewood,33.840453,-118.076707 +90716,CA,Hawaiian Gardens,33.82958,-118.072964 +90717,CA,Rancho Palos Ver,33.793339,-118.31693 +90720,CA,Rossmoor,33.795291,-118.069891 +90723,CA,Paramount,33.896867,-118.163152 +90731,CA,San Pedro,33.733894,-118.291425 +90732,CA,Rancho Palos Ver,33.744947,-118.310597 +90740,CA,Seal Beach,33.760971,-118.08428 +90744,CA,Wilmington,33.785475,-118.264451 +90745,CA,Carson,33.822968,-118.268352 +90746,CA,Carson,33.858444,-118.255449 +90802,CA,Long Beach,33.770553,-118.182025 +90803,CA,Long Beach,33.761932,-118.134073 +90804,CA,Signal Hill,33.782993,-118.155187 +90805,CA,Long Beach,33.863457,-118.180102 +90806,CA,Signal Hill,33.799319,-118.187443 +90807,CA,Signal Hill,33.830712,-118.18092 +90808,CA,Long Beach,33.824145,-118.110299 +90810,CA,Carson,33.810985,-118.215006 +90813,CA,Long Beach,33.78202,-118.183488 +90814,CA,Long Beach,33.771576,-118.147988 +90815,CA,Long Beach,33.793908,-118.119249 +90822,CA,Long Beach,33.744415,-118.239257 +91001,CA,Altadena,34.191187,-118.13919 +91006,CA,Arcadia,34.132389,-118.026374 +91007,CA,Arcadia,34.124271,-118.051483 +91010,CA,Bradbury,34.137445,-117.967005 +91011,CA,Flintridge,34.209282,-118.199008 +91016,CA,Monrovia,34.143959,-118.001376 +91020,CA,Montrose,34.211425,-118.230529 +91024,CA,Sierra Madre,34.165101,-118.051916 +91030,CA,South Pasadena,34.110939,-118.154696 +91040,CA,Shadow Hills,34.261025,-118.321359 +91042,CA,Tujunga,34.254389,-118.284856 +91101,CA,Pasadena,34.146762,-118.139119 +91103,CA,Pasadena,34.166906,-118.155119 +91104,CA,Pasadena,34.167776,-118.12609 +91105,CA,Pasadena,34.135455,-118.163577 +91106,CA,Pasadena,34.143527,-118.126647 +91107,CA,Pasadena,34.150997,-118.088905 +91108,CA,San Marino,34.120698,-118.111745 +91201,CA,Glendale,34.171606,-118.289892 +91202,CA,Glendale,34.165235,-118.265649 +91203,CA,Glendale,34.151718,-118.263614 +91204,CA,Glendale,34.137871,-118.259947 +91205,CA,Glendale,34.137798,-118.24245 +91206,CA,Glendale,34.155605,-118.232217 +91207,CA,Glendale,34.164856,-118.245086 +91208,CA,Glendale,34.19212,-118.234966 +91214,CA,La Crescenta,34.231619,-118.245687 +91301,CA,Oak Park,34.157163,-118.75718 +91302,CA,Calabasas,34.141854,-118.664103 +91303,CA,Canoga Park,34.199257,-118.59828 +91304,CA,Canoga Park,34.219671,-118.611059 +91306,CA,Winnetka,34.2092,-118.57492 +91307,CA,West Hills,34.196343,-118.638892 +91311,CA,Chatsworth,34.258253,-118.591357 +91316,CA,Encino,34.165479,-118.517542 +91320,CA,Newbury Park,34.177393,-118.935798 +91321,CA,Newhall,34.379519,-118.523005 +91324,CA,Northridge,34.236743,-118.546595 +91325,CA,Northridge,34.235332,-118.51884 +91326,CA,Porter Ranch,34.274191,-118.541235 +91330,CA,California State,34.23805,-118.528634 +91331,CA,Arleta,34.258081,-118.420692 +91335,CA,Reseda,34.200663,-118.539071 +91340,CA,San Fernando,34.287509,-118.435242 +91342,CA,Sylmar,34.30538,-118.432181 +91343,CA,North Hills,34.236636,-118.47582 +91344,CA,Granada Hills,34.277068,-118.4992 +91345,CA,Mission Hills,34.261873,-118.458659 +91350,CA,Agua Dulce,34.459742,-118.488955 +91351,CA,Canyon Country,34.426203,-118.449011 +91352,CA,Sun Valley,34.220907,-118.369853 +91354,CA,Valencia,34.446608,-118.537437 +91355,CA,Valencia,34.398456,-118.55352 +91356,CA,Tarzana,34.16708,-118.541354 +91360,CA,Thousand Oaks,34.209179,-118.873908 +91361,CA,Westlake Village,34.147233,-118.83832 +91362,CA,Westlake Village,34.191884,-118.830601 +91364,CA,Woodland Hills,34.155652,-118.600019 +91367,CA,Woodland Hills,34.176689,-118.615891 +91381,CA,Newhall,34.381067,-118.582134 +91384,CA,Castaic,34.482695,-118.62537 +91401,CA,Van Nuys,34.180152,-118.432375 +91402,CA,Panorama City,34.226158,-118.447009 +91403,CA,Sherman Oaks,34.151407,-118.460325 +91405,CA,Van Nuys,34.200068,-118.445636 +91406,CA,Van Nuys,34.200568,-118.486821 +91411,CA,Van Nuys,34.178133,-118.457396 +91423,CA,Sherman Oaks,34.152565,-118.432208 +91436,CA,Encino,34.15098,-118.488238 +91501,CA,Burbank,34.186238,-118.300898 +91502,CA,Burbank,34.174487,-118.305912 +91504,CA,Burbank,34.200097,-118.326401 +91505,CA,Burbank,34.168998,-118.344175 +91506,CA,Burbank,34.171746,-118.323148 +91601,CA,North Hollywood,34.16867,-118.371274 +91602,CA,Toluca Lake,34.151095,-118.367606 +91604,CA,Studio City,34.143025,-118.391311 +91605,CA,North Hollywood,34.205747,-118.400069 +91606,CA,North Hollywood,34.187182,-118.386538 +91607,CA,Valley Village,34.167217,-118.398905 +91701,CA,Alta Loma,34.133922,-117.599149 +91702,CA,Azusa,34.12476,-117.903083 +91706,CA,Irwindale,34.084245,-117.969539 +91709,CA,Chino Hills,33.979735,-117.730791 +91710,CA,Chino,34.012532,-117.684401 +91711,CA,Claremont,34.109167,-117.718293 +91719,CA,Corona,33.861839,-117.531916 +91720,CA,Corona,33.876995,-117.594288 +91722,CA,Covina,34.097162,-117.906544 +91723,CA,Covina,34.08596,-117.884285 +91724,CA,Covina,34.093752,-117.855982 +91730,CA,Rancho Cucamonga,34.107039,-117.59408 +91731,CA,El Monte,34.079142,-118.037108 +91732,CA,El Monte,34.070533,-118.01492 +91733,CA,South El Monte,34.055676,-118.044381 +91737,CA,Alta Loma,34.144883,-117.579295 +91739,CA,Etiwanda,34.119873,-117.519329 +91740,CA,Glendora,34.128663,-117.855155 +91744,CA,Industry,34.029428,-117.934098 +91745,CA,Hacienda Heights,33.997741,-117.965205 +91746,CA,Bassett,34.050963,-117.980026 +91748,CA,Rowland Heights,33.981777,-117.896946 +91750,CA,La Verne,34.115905,-117.77077 +91752,CA,Mira Loma,33.993845,-117.523574 +91754,CA,Monterey Park,34.053409,-118.127144 +91759,CA,Mt Baldy,34.218082,-117.580219 +91760,CA,Norco,33.927983,-117.557866 +91761,CA,Ontario,34.031647,-117.618662 +91762,CA,Ontario,34.058415,-117.66647 +91763,CA,Montclair,34.073298,-117.698669 +91764,CA,Ontario,34.076308,-117.625402 +91765,CA,Diamond Bar,34.006585,-117.809822 +91766,CA,Phillips Ranch,34.043268,-117.752086 +91767,CA,Pomona,34.081187,-117.736171 +91768,CA,Pomona,34.066168,-117.776312 +91770,CA,Rosemead,34.065767,-118.08529 +91773,CA,San Dimas,34.102263,-117.81694 +91775,CA,San Gabriel,34.115486,-118.085658 +91776,CA,San Gabriel,34.089027,-118.095471 +91780,CA,Temple City,34.101586,-118.053652 +91786,CA,Upland,34.114432,-117.658336 +91789,CA,Diamond Bar,34.016625,-117.857828 +91790,CA,West Covina,34.067336,-117.936643 +91791,CA,West Covina,34.065267,-117.897767 +91792,CA,West Covina,34.022852,-117.897459 +91801,CA,Alhambra,34.091436,-118.129288 +91803,CA,Alhambra,34.074514,-118.143354 +91901,CA,Alpine,32.828161,-116.754328 +91902,CA,Bonita,32.667143,-117.022065 +91905,CA,Boulevard,32.671934,-116.319982 +91906,CA,Campo,32.660491,-116.490459 +91910,CA,Chula Vista,32.637139,-117.06756 +91911,CA,Chula Vista,32.608428,-117.056459 +91913,CA,Chula Vista,32.651296,-116.985237 +91914,CA,Chula Vista,32.65875,-116.96517 +91915,CA,Chula Vista,32.631513,-116.940807 +91916,CA,Descanso,32.872971,-116.602732 +91917,CA,Dulzura,32.615172,-116.728523 +91932,CA,Imperial Beach,32.578289,-117.11478 +91934,CA,Jacumba,32.624934,-116.195184 +91935,CA,Jamul,32.716289,-116.832332 +91941,CA,La Mesa,32.760431,-117.011541 +91942,CA,La Mesa,32.783506,-117.018879 +91945,CA,Lemon Grove,32.73323,-117.032646 +91950,CA,National City,32.674916,-117.089747 +91962,CA,Pine Valley,32.835047,-116.512733 +91963,CA,Potrero,32.620477,-116.603748 +91977,CA,Spring Valley,32.724014,-116.997644 +91978,CA,Spring Valley,32.732892,-116.959551 +91980,CA,Tecate,32.592205,-116.606397 +92003,CA,Bonsall,33.294033,-117.18969 +92004,CA,Borrego Springs,33.238649,-116.351394 +92007,CA,Cardiff By The S,33.025265,-117.274371 +92008,CA,Carlsbad,33.160241,-117.324998 +92009,CA,Carlsbad,33.095407,-117.261888 +92014,CA,Del Mar,32.971474,-117.237314 +92019,CA,El Cajon,32.777726,-116.919055 +92020,CA,El Cajon,32.792765,-116.966504 +92021,CA,El Cajon,32.817847,-116.922336 +92024,CA,Encinitas,33.053469,-117.26891 +92025,CA,Escondido,33.110117,-117.069987 +92026,CA,Escondido,33.160513,-117.097808 +92027,CA,Escondido,33.138824,-117.051966 +92028,CA,Fallbrook,33.369015,-117.228952 +92029,CA,Escondido,33.089497,-117.112793 +92036,CA,Julian,33.053355,-116.565812 +92037,CA,La Jolla,32.845488,-117.25208 +92040,CA,Lakeside,32.856181,-116.920089 +92054,CA,Oceanside,33.20723,-117.357294 +92055,CA,Marine Corp Base,33.327929,-117.409452 +92056,CA,Oceanside,33.196784,-117.283089 +92057,CA,Oceanside,33.240654,-117.302484 +92059,CA,Pala,33.377662,-117.071725 +92061,CA,Pauma Valley,33.306285,-116.959552 +92064,CA,Poway,32.975619,-117.040223 +92065,CA,Ramona,33.029349,-116.853548 +92066,CA,Ranchita,33.24055,-116.539121 +92068,CA,San Luis Rey,33.294367,-117.306403 +92069,CA,San Marcos,33.144386,-117.169716 +92070,CA,Santa Ysabel,33.147579,-116.69635 +92071,CA,Santee,32.848636,-116.986154 +92075,CA,Solana Beach,32.993739,-117.2598 +92082,CA,Valley Center,33.249046,-117.012232 +92083,CA,Vista,33.187296,-117.245854 +92084,CA,Vista,33.213118,-117.224285 +92086,CA,Warner Springs,33.303666,-116.721385 +92101,CA,San Diego,32.71852,-117.159316 +92102,CA,San Diego,32.713893,-117.121858 +92103,CA,San Diego,32.746638,-117.163552 +92104,CA,San Diego,32.745425,-117.127189 +92105,CA,San Diego,32.7423,-117.094681 +92106,CA,San Diego,32.72725,-117.226829 +92107,CA,San Diego,32.742531,-117.243307 +92108,CA,San Diego,32.778327,-117.133525 +92109,CA,San Diego,32.796923,-117.240534 +92110,CA,San Diego,32.763476,-117.202847 +92111,CA,San Diego,32.797185,-117.17081 +92113,CA,San Diego,32.697047,-117.115257 +92114,CA,San Diego,32.705923,-117.05235 +92115,CA,San Diego,32.760742,-117.072056 +92116,CA,San Diego,32.762446,-117.124166 +92117,CA,San Diego,32.823948,-117.196536 +92118,CA,Coronado,32.68069,-117.169823 +92119,CA,San Diego,32.803587,-117.026065 +92120,CA,San Diego,32.79581,-117.070708 +92121,CA,San Diego,32.891894,-117.203503 +92122,CA,San Diego,32.857736,-117.211507 +92123,CA,San Diego,32.797297,-117.139248 +92124,CA,San Diego,32.820113,-117.098613 +92126,CA,San Diego,32.916136,-117.140227 +92127,CA,San Diego,33.027854,-117.085596 +92128,CA,San Diego,33.00666,-117.068982 +92129,CA,San Diego,32.965185,-117.121308 +92130,CA,San Diego,32.955533,-117.225201 +92131,CA,San Diego,32.912343,-117.089758 +92135,CA,San Diego,32.702482,-117.19202 +92136,CA,San Diego,32.681585,-117.124678 +92139,CA,San Diego,32.680612,-117.047375 +92145,CA,San Diego,32.870365,-117.116518 +92154,CA,San Diego,32.575276,-117.070725 +92155,CA,San Diego,32.676144,-117.160335 +92173,CA,San Ysidro,32.562567,-117.042976 +92201,CA,Chiriaco Summit,33.721899,-116.235729 +92210,CA,Indian Wells,33.716334,-116.338129 +92220,CA,Banning,33.92816,-116.889928 +92223,CA,Beaumont,33.950429,-116.970079 +92225,CA,Lost Lake,33.605715,-114.597131 +92227,CA,Brawley,32.979181,-115.529613 +92230,CA,Cabazon,33.908583,-116.773948 +92231,CA,Calexico,32.683227,-115.502815 +92233,CA,Calipatria,33.166956,-115.511402 +92234,CA,Cathedral City,33.809839,-116.466497 +92236,CA,Coachella,33.674965,-116.177231 +92239,CA,Eagle Mountain,33.604941,-115.052603 +92240,CA,Desert Hot Sprin,33.904973,-116.366222 +92242,CA,Big River,34.149142,-114.33928 +92243,CA,El Centro,32.789332,-115.566508 +92249,CA,Heber,32.698918,-115.428281 +92250,CA,Holtville,32.810387,-115.377456 +92251,CA,Imperial,32.846954,-115.572984 +92252,CA,Joshua Tree,34.150163,-116.303763 +92253,CA,La Quinta,33.668474,-116.308081 +92256,CA,Morongo Valley,34.060646,-116.565641 +92257,CA,Niland,33.378373,-115.696455 +92260,CA,Palm City,33.730842,-116.366442 +92262,CA,Palm Springs,33.841406,-116.53466 +92264,CA,Palm Springs,33.801828,-116.516958 +92267,CA,Parker Dam,34.297977,-114.155969 +92270,CA,Rancho Mirage,33.764284,-116.422451 +92272,CA,Blythe,33.951256,-116.495855 +92274,CA,Salton City,33.543418,-116.11584 +92276,CA,Thousand Palms,33.808158,-116.371305 +92277,CA,Twentynine Palms,34.145509,-116.060133 +92278,CA,Twentynine Palms,34.237969,-116.06041 +92280,CA,Vidal,34.156109,-114.565602 +92281,CA,Westmorland,33.041058,-115.630723 +92282,CA,White Water,33.927591,-116.693154 +92283,CA,Felicity,32.832922,-114.636634 +92284,CA,Yucca Valley,34.155936,-116.431313 +92301,CA,Adelanto,34.584128,-117.424189 +92304,CA,Amboy,34.599012,-115.774907 +92305,CA,Angelus Oaks,34.153149,-116.948482 +92307,CA,Apple Valley,34.529081,-117.2132 +92308,CA,Apple Valley,34.469814,-117.192684 +92309,CA,Baker,35.360573,-116.063754 +92310,CA,Fort Irwin,35.40148,-116.644759 +92311,CA,Barstow,34.89145,-117.038702 +92314,CA,Big Bear City,34.242233,-116.920412 +92316,CA,Bloomington,34.066198,-117.399295 +92320,CA,Calimesa,33.994586,-117.04304 +92324,CA,Grand Terrace,34.057964,-117.318577 +92327,CA,Daggett,34.86677,-116.887555 +92328,CA,Death Valley,36.467165,-116.893682 +92332,CA,Essex,34.560626,-115.280344 +92335,CA,Fontana,34.079351,-117.455114 +92336,CA,Fontana,34.117276,-117.437759 +92338,CA,Ludlow,34.901779,-116.386202 +92339,CA,Forest Falls,34.08805,-116.914147 +92342,CA,Helendale,34.749859,-117.33666 +92345,CA,Hesperia,34.422215,-117.302527 +92346,CA,East Highland,34.126969,-117.208717 +92347,CA,Hinkley,34.92788,-117.180867 +92351,CA,Kelso,34.9678,-115.577574 +92354,CA,Loma Linda,34.052833,-117.251286 +92356,CA,Lucerne Valley,34.44695,-116.918857 +92358,CA,Lytle Creek,34.255755,-117.518613 +92359,CA,Mentone,34.077372,-117.112581 +92363,CA,Needles,34.782369,-114.587134 +92364,CA,Nipton,35.46761,-115.481436 +92365,CA,Newberry Springs,34.885001,-116.746373 +92368,CA,Oro Grande,34.617832,-117.332733 +92371,CA,Phelan,34.444901,-117.519604 +92372,CA,Pinon Hills,34.442937,-117.640262 +92373,CA,Redlands,34.039659,-117.180352 +92374,CA,Redlands,34.064989,-117.167182 +92376,CA,Rialto,34.113155,-117.377133 +92384,CA,Shoshone,35.899239,-116.264476 +92389,CA,Tecopa,35.897925,-115.829824 +92392,CA,Spring Valley La,34.503917,-117.319235 +92394,CA,George Afb,34.577325,-117.363516 +92397,CA,Wrightwood,34.362839,-117.6249 +92399,CA,Yucaipa,34.028197,-117.048925 +92401,CA,San Bernardino,34.110521,-117.289753 +92404,CA,San Bernardino,34.142577,-117.260572 +92405,CA,Muscoy,34.144101,-117.310765 +92407,CA,San Bernardino,34.20928,-117.293697 +92408,CA,San Bernardino,34.083127,-117.271059 +92409,CA,San Bernardino,34.103685,-117.241291 +92410,CA,San Bernardino,34.107729,-117.296789 +92411,CA,San Bernardino,34.121414,-117.317158 +92501,CA,Riverside,33.9924,-117.369421 +92503,CA,Riverside,33.920808,-117.458862 +92504,CA,Riverside,33.931458,-117.411948 +92505,CA,Riverside,33.922769,-117.486687 +92506,CA,Riverside,33.945485,-117.375696 +92507,CA,Riverside,33.976086,-117.338874 +92508,CA,Riverside,33.889676,-117.304264 +92509,CA,Rubidoux,33.997355,-117.444896 +92530,CA,Lake Elsinore,33.659816,-117.348535 +92532,CA,Lake Elsinore,33.651662,-117.271278 +92536,CA,Aguanga,33.447306,-116.799693 +92539,CA,Anza,33.568812,-116.71355 +92543,CA,Hemet,33.741613,-116.972974 +92544,CA,Hemet,33.738978,-116.924306 +92545,CA,Hemet,33.739857,-117.015078 +92548,CA,Homeland,33.74528,-117.111845 +92549,CA,Idyllwild,33.730433,-116.710665 +92553,CA,Moreno Valley,33.915719,-117.235066 +92555,CA,Moreno Valley,33.937659,-117.185105 +92557,CA,Moreno Valley,33.955257,-117.245682 +92561,CA,Mountain Center,33.531667,-116.581954 +92562,CA,Murrieta,33.563071,-117.273838 +92563,CA,Murrieta,33.56903,-117.178298 +92567,CA,Lakeview,33.807712,-117.118704 +92570,CA,Mead Valley,33.797535,-117.280005 +92571,CA,Perris,33.810979,-117.217968 +92582,CA,San Jacinto,33.788281,-116.981911 +92583,CA,Gilman Hot Sprin,33.78604,-116.955201 +92584,CA,Menifee,33.664744,-117.1743 +92585,CA,Romoland,33.744518,-117.171899 +92586,CA,Sun City,33.704373,-117.196942 +92587,CA,Canyon Lake,33.688756,-117.252653 +92590,CA,Temecula,33.490269,-117.182437 +92591,CA,Temecula,33.521687,-117.128571 +92592,CA,Temecula,33.498314,-117.095774 +92595,CA,Wildomar,33.602115,-117.263953 +92596,CA,Winchester,33.624269,-117.088518 +92610,CA,Foothill Ranch,33.666822,-117.664995 +92621,CA,Brea,33.922897,-117.886742 +92624,CA,Capistrano Beach,33.459115,-117.662657 +92625,CA,Corona Del Mar,33.602066,-117.874331 +92626,CA,Costa Mesa,33.677711,-117.909623 +92627,CA,Costa Mesa,33.647793,-117.917667 +92629,CA,Monarch Bay,33.476964,-117.700483 +92630,CA,Lake Forest,33.640015,-117.68819 +92631,CA,Fullerton,33.880519,-117.89157 +92632,CA,Fullerton,33.865848,-117.928376 +92633,CA,Fullerton,33.873913,-117.961043 +92635,CA,Fullerton,33.901181,-117.927801 +92640,CA,Garden Grove,33.785826,-117.92906 +92641,CA,Garden Grove,33.786651,-117.975526 +92643,CA,Garden Grove,33.762641,-117.930193 +92644,CA,Garden Grove,33.765532,-117.96935 +92645,CA,Garden Grove,33.78324,-118.02639 +92646,CA,Huntington Beach,33.668448,-117.967771 +92647,CA,Huntington Beach,33.721018,-118.003035 +92648,CA,Huntington Beach,33.674577,-117.999012 +92649,CA,Huntington Beach,33.719111,-118.045142 +92651,CA,Laguna Niguel,33.542927,-117.772351 +92653,CA,Laguna Hills,33.60028,-117.70854 +92655,CA,Midway City,33.744794,-117.983539 +92656,CA,Aliso Viejo,33.572367,-117.708906 +92657,CA,Newport Beach,33.596382,-117.855317 +92660,CA,Newport Beach,33.630027,-117.8757 +92661,CA,Newport Beach,33.604429,-117.906237 +92662,CA,Newport Beach,33.606459,-117.891732 +92663,CA,Newport Beach,33.623084,-117.92788 +92665,CA,Orange,33.83096,-117.844903 +92666,CA,Orange,33.785258,-117.845461 +92667,CA,Villa Park,33.81036,-117.828421 +92668,CA,Orange,33.786481,-117.87532 +92669,CA,Orange,33.791672,-117.800285 +92670,CA,Placentia,33.880323,-117.859837 +92672,CA,San Clemente,33.430809,-117.610139 +92675,CA,Mission Viejo,33.511714,-117.657409 +92677,CA,Laguna Niguel,33.522871,-117.705154 +92679,CA,Coto De Caza,33.634576,-117.577709 +92680,CA,Tustin,33.73713,-117.819193 +92683,CA,Westminster,33.752756,-117.991312 +92686,CA,Yorba Linda,33.888361,-117.799619 +92687,CA,Yorba Linda,33.88238,-117.731162 +92688,CA,Rancho Santa Mar,33.651822,-117.588388 +92691,CA,Mission Viejo,33.617155,-117.664119 +92692,CA,Mission Viejo,33.610872,-117.64245 +92701,CA,Santa Ana,33.75016,-117.857665 +92703,CA,Santa Ana,33.746613,-117.899589 +92704,CA,Santa Ana,33.726513,-117.904683 +92705,CA,Cowan Heights,33.74866,-117.768902 +92706,CA,Santa Ana,33.764434,-117.881791 +92707,CA,Santa Ana Height,33.715938,-117.870346 +92708,CA,Fountain Valley,33.710762,-117.952318 +92709,CA,El Toro Marine C,33.681287,-117.715018 +92714,CA,Irvine,33.68764,-117.798928 +92715,CA,Irvine,33.650884,-117.821251 +92718,CA,Irvine,33.658179,-117.711476 +92720,CA,Irvine,33.707495,-117.765533 +92801,CA,Anaheim,33.842679,-117.954035 +92802,CA,Anaheim,33.806909,-117.92219 +92804,CA,Anaheim,33.81908,-117.974985 +92805,CA,Anaheim,33.835332,-117.906263 +92806,CA,Anaheim,33.837344,-117.875928 +92807,CA,Anaheim,33.851583,-117.787657 +92808,CA,Anaheim,33.857569,-117.748445 +93001,CA,San Buenaventura,34.290531,-119.28882 +93003,CA,San Buenaventura,34.270568,-119.2214 +93004,CA,San Buenaventura,34.278091,-119.168727 +93010,CA,Camarillo,34.231328,-119.046361 +93012,CA,Camarillo,34.22179,-118.986648 +93013,CA,Carpinteria,34.403589,-119.518257 +93015,CA,Bardsdale,34.402557,-118.904071 +93021,CA,Moorpark,34.278421,-118.877139 +93022,CA,Oak View,34.402021,-119.298168 +93023,CA,Ojai,34.44512,-119.256477 +93030,CA,Oxnard,34.214142,-119.174952 +93033,CA,Oxnard,34.168505,-119.171732 +93035,CA,Oxnard,34.182177,-119.215975 +93041,CA,Port Hueneme,34.162572,-119.197317 +93042,CA,Point Mugu Nawc,34.123432,-119.09931 +93043,CA,Port Hueneme Cbc,34.16212,-119.206008 +93060,CA,Santa Paula,34.354718,-119.071328 +93063,CA,Santa Susana,34.279202,-118.699229 +93065,CA,Simi Valley,34.265589,-118.765349 +93066,CA,Somis,34.279753,-119.011537 +93067,CA,Summerland,34.424541,-119.596016 +93101,CA,Santa Barbara,34.419668,-119.70782 +93103,CA,Santa Barbara,34.429065,-119.683275 +93105,CA,Santa Barbara,34.436915,-119.728538 +93108,CA,Montecito,34.434258,-119.64255 +93109,CA,Santa Barbara,34.403848,-119.7194 +93110,CA,Santa Barbara,34.441814,-119.764668 +93111,CA,Santa Barbara,34.445262,-119.802509 +93117,CA,Goleta,34.429631,-119.861245 +93202,CA,Armona,36.309459,-119.705279 +93203,CA,Arvin,35.196629,-118.8336 +93204,CA,Avenal,35.987667,-120.122716 +93205,CA,Bodfish,35.587046,-118.484656 +93206,CA,Buttonwillow,35.403268,-119.465926 +93207,CA,California Hot S,35.892422,-118.646317 +93210,CA,Coalinga,36.162435,-120.348928 +93212,CA,Corcoran,36.086455,-119.560665 +93214,CA,Cuyama,34.933694,-119.661339 +93215,CA,Delano,35.771511,-119.24594 +93217,CA,Di Giorgio,35.247604,-118.846755 +93219,CA,Earlimart,35.854195,-119.253406 +93221,CA,Exeter,36.304055,-119.12928 +93223,CA,Farmersville,36.300169,-119.205357 +93224,CA,Fellows,35.202579,-119.564757 +93225,CA,Frazier Park,34.826463,-119.035488 +93226,CA,Glennville,35.737677,-118.71693 +93230,CA,Hanford,36.331419,-119.649094 +93234,CA,Huron,36.237144,-120.101964 +93235,CA,Ivanhoe,36.385622,-119.218884 +93238,CA,Kernville,35.755005,-118.404723 +93239,CA,Kettleman City,36.021501,-119.964361 +93240,CA,Mountain Mesa,35.617889,-118.441256 +93241,CA,Lamont,35.257059,-118.912419 +93242,CA,Laton,36.437834,-119.715565 +93243,CA,Gorman,34.828862,-118.879126 +93244,CA,Lemoncove,36.396084,-119.004986 +93245,CA,Lemoore Naval Ai,36.309535,-119.831017 +93247,CA,Lindsay,36.209551,-119.088427 +93249,CA,Lost Hills,35.613111,-119.721573 +93250,CA,Mc Farland,35.675779,-119.227156 +93251,CA,Mc Kittrick,35.303097,-119.636627 +93252,CA,Maricopa,35.038353,-119.407661 +93254,CA,New Cuyama,34.996709,-119.823806 +93255,CA,Onyx,35.713584,-118.190227 +93256,CA,Pixley,35.955286,-119.256427 +93257,CA,Porterville,36.068636,-119.031549 +93260,CA,Posey,35.813496,-118.664286 +93262,CA,Giant Forest,36.573878,-118.772271 +93263,CA,Shafter,35.496994,-119.280075 +93265,CA,Springville,36.136314,-118.796059 +93266,CA,Stratford,36.178976,-119.823564 +93267,CA,Strathmore,36.147237,-119.079163 +93268,CA,Taft,35.148164,-119.455674 +93270,CA,Terra Bella,35.95698,-119.031239 +93271,CA,Three Rivers,36.437686,-118.88754 +93272,CA,Tipton,36.054567,-119.30781 +93274,CA,Tulare,36.202155,-119.33802 +93276,CA,Tupman,35.288547,-119.341994 +93277,CA,Visalia,36.311379,-119.306471 +93280,CA,Pond,35.593375,-119.344728 +93283,CA,Weldon,35.639076,-118.285856 +93285,CA,Wofford Heights,35.724556,-118.455877 +93286,CA,Woodlake,36.431334,-119.091764 +93287,CA,Woody,35.70681,-118.843872 +93291,CA,Visalia,36.355108,-119.301029 +93301,CA,Bakersfield,35.386611,-119.017063 +93304,CA,Bakersfield,35.339581,-119.021793 +93305,CA,College Heights,35.387772,-118.982042 +93306,CA,Bakersfield,35.386697,-118.939104 +93307,CA,Bakersfield,35.327484,-118.983851 +93308,CA,Bakersfield,35.424395,-119.043319 +93309,CA,Bakersfield,35.33839,-119.062713 +93311,CA,Bakersfield,35.303891,-119.105647 +93312,CA,Greenacres,35.382082,-119.15014 +93313,CA,Bakersfield,35.297391,-119.050936 +93401,CA,San Luis Obispo,35.263453,-120.650933 +93402,CA,Los Osos,35.317203,-120.833261 +93405,CA,San Luis Obispo,35.290058,-120.681724 +93420,CA,Halcyon,35.11449,-120.57289 +93422,CA,Atascadero,35.475439,-120.663838 +93426,CA,Bradley,35.809255,-120.972793 +93427,CA,Buellton,34.62093,-120.192233 +93428,CA,Cambria,35.556568,-121.084029 +93430,CA,Cayucos,35.444606,-120.890791 +93431,CA,Cholame,35.543847,-120.194827 +93432,CA,Creston,35.491543,-120.554238 +93433,CA,Grover Beach,35.120969,-120.617348 +93434,CA,Guadalupe,34.959989,-120.570329 +93436,CA,Lompoc,34.658349,-120.450605 +93437,CA,Lompoc,34.753215,-120.517096 +93442,CA,Morro Bay,35.37953,-120.844745 +93444,CA,Nipomo,35.029806,-120.489413 +93445,CA,Oceano,35.10187,-120.608044 +93446,CA,Adelaide,35.635248,-120.670676 +93449,CA,Shell Beach,35.149212,-120.651788 +93450,CA,San Ardo,35.985685,-120.861191 +93451,CA,Parkfield,35.753209,-120.696532 +93452,CA,San Simeon,35.666815,-121.144033 +93453,CA,California Valle,35.341254,-120.3202 +93454,CA,Santa Maria,34.954538,-120.43245 +93455,CA,Orcutt,34.879786,-120.429128 +93460,CA,Santa Ynez,34.623966,-120.071332 +93461,CA,Shandon,35.651273,-120.372047 +93463,CA,Ballard,34.609931,-120.129286 +93465,CA,Templeton,35.555082,-120.710737 +93501,CA,Mojave,35.047767,-118.173475 +93505,CA,California City,35.127783,-117.965142 +93510,CA,Acton,34.483541,-118.195929 +93512,CA,Benton,37.798099,-118.498526 +93513,CA,Big Pine,37.167857,-118.291597 +93514,CA,Toms Place,37.386301,-118.44156 +93516,CA,Boron,35.003748,-117.662921 +93517,CA,Bridgeport,38.256601,-119.208025 +93518,CA,Havilah,35.356798,-118.410264 +93519,CA,Cantil,35.282558,-117.993868 +93523,CA,North Edwards,34.930507,-117.915384 +93526,CA,Independence,36.839578,-118.204808 +93527,CA,Pearsonville,35.674498,-117.834844 +93528,CA,Johannesburg,35.370655,-117.637325 +93529,CA,June Lake,37.777324,-119.082492 +93531,CA,Keene,35.237502,-118.607563 +93532,CA,Elizabeth Lake,34.668297,-118.444719 +93534,CA,Lancaster,34.690888,-118.149129 +93535,CA,Hi Vista,34.684751,-118.063245 +93536,CA,Quartz Hill,34.673619,-118.213336 +93541,CA,Lee Vining,37.988988,-119.123413 +93543,CA,Juniper Hills,34.547372,-117.957405 +93544,CA,Crystalaire,34.495914,-117.798841 +93545,CA,Lone Pine,36.579781,-118.057824 +93546,CA,Crowley Lake,37.642361,-118.976383 +93550,CA,Lake Los Angeles,34.571483,-118.061306 +93551,CA,Leona Valley,34.601404,-118.181207 +93553,CA,Juniper Hills,34.491124,-117.902893 +93554,CA,Randsburg,35.352176,-117.726396 +93555,CA,China Lake Nwc,35.631376,-117.679733 +93560,CA,Willow Springs,34.863117,-118.19636 +93561,CA,Bear Valley Spri,35.129776,-118.522227 +93562,CA,Argus,35.760817,-117.382992 +93563,CA,Valyermo,34.339014,-117.8271 +93601,CA,Ahwahnee,37.407631,-119.723251 +93602,CA,Auberry,37.072635,-119.457202 +93604,CA,Bass Lake,37.324359,-119.556839 +93608,CA,Cantua Creek,36.492123,-120.335252 +93609,CA,Caruthers,36.535847,-119.844581 +93610,CA,Chowchilla,37.101371,-120.269077 +93612,CA,Clovis,36.823146,-119.689757 +93614,CA,Coarsegold,37.221378,-119.745545 +93615,CA,Cutler,36.524266,-119.287023 +93616,CA,Del Rey,36.654306,-119.59291 +93618,CA,Dinuba,36.534931,-119.39087 +93620,CA,Dos Palos,37.00253,-120.633348 +93621,CA,Dunlap,36.744635,-119.089931 +93622,CA,Firebaugh,36.8651,-120.470048 +93623,CA,Fish Camp,37.51692,-119.642005 +93625,CA,Fowler,36.628153,-119.671025 +93626,CA,Friant,37.002416,-119.696501 +93627,CA,Helm,36.499231,-120.093598 +93630,CA,Kerman,36.730576,-120.072444 +93631,CA,Kingsburg,36.508047,-119.543298 +93633,CA,Kings Canyon Nat,36.780601,-119.068201 +93635,CA,Los Banos,37.06266,-120.854387 +93637,CA,Madera,36.94026,-120.081966 +93638,CA,Madera,36.968726,-120.012778 +93640,CA,Mendota,36.742365,-120.409287 +93641,CA,Miramonte,36.68938,-119.047718 +93643,CA,North Fork,37.212531,-119.514324 +93644,CA,Oakhurst,37.347561,-119.644854 +93645,CA,O Neals,37.086874,-119.745369 +93646,CA,Orange Cove,36.624283,-119.313502 +93647,CA,Orosi,36.546368,-119.281522 +93648,CA,Parlier,36.610265,-119.537482 +93650,CA,Pinedale,36.841107,-119.800359 +93651,CA,Prather,36.993799,-119.526771 +93652,CA,Raisin,36.598928,-119.903158 +93653,CA,Raymond,37.27898,-119.876567 +93654,CA,Reedley,36.604406,-119.437785 +93656,CA,Riverdale,36.429525,-119.871953 +93657,CA,Sanger,36.7243,-119.547796 +93660,CA,San Joaquin,36.605869,-120.188934 +93662,CA,Selma,36.569524,-119.617026 +93664,CA,Shaver Lake,37.139695,-119.273031 +93667,CA,Tollhouse,36.99434,-119.391415 +93668,CA,Tranquillity,36.658376,-120.261655 +93669,CA,Wishon,37.281028,-119.557014 +93675,CA,Squaw Valley,36.707146,-119.181449 +93701,CA,Fresno,36.748727,-119.786705 +93702,CA,Fresno,36.739954,-119.753215 +93703,CA,Fresno,36.768445,-119.759401 +93704,CA,Fig Garden Villa,36.798781,-119.799745 +93705,CA,Fresno,36.786285,-119.828617 +93706,CA,Easton,36.700589,-119.820408 +93710,CA,Fresno,36.823643,-119.76205 +93711,CA,Fresno,36.830297,-119.831896 +93720,CA,Fresno,36.857944,-119.765522 +93721,CA,Fresno,36.737714,-119.784273 +93722,CA,Fresno,36.791779,-119.880119 +93725,CA,Calwa,36.675312,-119.742477 +93726,CA,Fresno,36.794943,-119.760445 +93727,CA,Fresno,36.752796,-119.706055 +93728,CA,Fresno,36.758095,-119.811314 +93901,CA,Salinas,36.667693,-121.659589 +93905,CA,Salinas,36.681143,-121.617606 +93906,CA,Salinas,36.710339,-121.643805 +93907,CA,Prunedale,36.765385,-121.665588 +93908,CA,Salinas,36.601122,-121.672861 +93920,CA,Big Sur,36.245798,-121.700897 +93923,CA,Carmel,36.545693,-121.894875 +93924,CA,Carmel Valley,36.478709,-121.724356 +93925,CA,Chualar,36.595042,-121.431964 +93926,CA,Gonzales,36.490038,-121.410347 +93927,CA,Greenfield,36.320178,-121.24507 +93930,CA,King City,36.202776,-121.127329 +93932,CA,Lockwood,35.989287,-121.205946 +93933,CA,Marina,36.684922,-121.793383 +93940,CA,Del Rey Oaks,36.595642,-121.8848 +93941,CA,Fort Ord,36.644627,-121.804999 +93950,CA,Pacific Grove,36.616737,-121.921957 +93953,CA,Pebble Beach,36.590735,-121.942044 +93955,CA,Sand City,36.609208,-121.835724 +93960,CA,Soledad,36.41964,-121.324286 +94002,CA,Belmont,37.517433,-122.292671 +94005,CA,Brisbane,37.681104,-122.400118 +94010,CA,Hillsborough,37.575884,-122.362952 +94014,CA,Colma,37.698187,-122.452679 +94015,CA,Daly City,37.678696,-122.478015 +94019,CA,Half Moon Bay,37.479057,-122.445929 +94020,CA,La Honda,37.272285,-122.293889 +94021,CA,Loma Mar,37.254437,-122.281996 +94022,CA,Los Altos,37.381432,-122.125754 +94024,CA,Los Altos,37.354745,-122.086205 +94025,CA,West Menlo Park,37.453401,-122.179136 +94027,CA,Atherton,37.456255,-122.200198 +94028,CA,Ladera,37.378859,-122.208131 +94030,CA,Millbrae,37.600382,-122.401985 +94035,CA,Moffett Field,37.41001,-122.051944 +94038,CA,Moss Beach,37.531039,-122.50683 +94040,CA,Mountain View,37.385532,-122.087983 +94041,CA,Mountain View,37.389347,-122.078341 +94043,CA,Mountain View,37.405567,-122.077468 +94044,CA,Pacifica,37.619559,-122.481607 +94060,CA,Pescadero,37.206518,-122.364876 +94061,CA,Redwood City,37.464661,-122.230406 +94062,CA,Woodside,37.452119,-122.255879 +94063,CA,Redwood City,37.481544,-122.209134 +94065,CA,Redwood City,37.533128,-122.248564 +94066,CA,San Bruno,37.624742,-122.429021 +94070,CA,San Carlos,37.496859,-122.267356 +94074,CA,San Gregorio,37.325513,-122.355552 +94080,CA,South San Franci,37.65382,-122.4347 +94086,CA,Sunnyvale,37.376407,-122.023771 +94087,CA,Sunnyvale,37.350214,-122.034859 +94089,CA,Sunnyvale,37.398255,-122.000637 +94102,CA,San Francisco,37.781334,-122.416728 +94103,CA,San Francisco,37.77254,-122.414664 +94104,CA,San Francisco,37.791487,-122.401826 +94105,CA,San Francisco,37.786427,-122.389229 +94107,CA,San Francisco,37.762147,-122.397099 +94108,CA,San Francisco,37.792931,-122.40791 +94109,CA,San Francisco,37.791687,-122.418579 +94110,CA,San Francisco,37.750858,-122.415344 +94111,CA,San Francisco,37.797376,-122.400147 +94112,CA,San Francisco,37.71954,-122.441081 +94114,CA,San Francisco,37.758716,-122.432977 +94115,CA,San Francisco,37.785607,-122.435835 +94116,CA,San Francisco,37.744144,-122.486296 +94117,CA,San Francisco,37.771234,-122.441272 +94118,CA,San Francisco,37.781174,-122.461414 +94121,CA,San Francisco,37.778616,-122.489178 +94122,CA,San Francisco,37.759326,-122.483647 +94123,CA,San Francisco,37.799865,-122.434163 +94124,CA,San Francisco,37.730888,-122.388649 +94127,CA,San Francisco,37.735385,-122.457116 +94129,CA,San Francisco,37.800507,-122.464958 +94130,CA,San Francisco,37.823128,-122.369319 +94131,CA,San Francisco,37.745032,-122.438335 +94132,CA,San Francisco,37.721118,-122.47545 +94133,CA,San Francisco,37.800175,-122.409081 +94134,CA,San Francisco,37.718968,-122.409577 +94301,CA,Palo Alto,37.444324,-122.149685 +94303,CA,East Palo Alto,37.455641,-122.131902 +94304,CA,Palo Alto,37.433424,-122.184234 +94305,CA,Stanford,37.423573,-122.161867 +94306,CA,Palo Alto,37.418009,-122.127375 +94401,CA,Russian River,37.572271,-122.320262 +94402,CA,San Mateo,37.550685,-122.32762 +94403,CA,San Mateo,37.539495,-122.299796 +94404,CA,Foster City,37.551614,-122.263577 +94501,CA,Coast Guard Isla,37.764783,-122.260516 +94507,CA,Alamo,37.853695,-122.022868 +94508,CA,Angwin,38.576906,-122.447732 +94509,CA,Antioch,37.993917,-121.808906 +94510,CA,Benicia,38.068459,-122.161392 +94512,CA,Birds Landing,38.150402,-121.844318 +94513,CA,Brentwood,37.932415,-121.689427 +94514,CA,Byron,37.902616,-121.602211 +94515,CA,Calistoga,38.582305,-122.581384 +94517,CA,Clayton,37.915442,-121.909967 +94518,CA,Concord,37.950434,-122.026296 +94519,CA,Concord,37.984082,-122.011948 +94520,CA,Concord,37.982259,-122.036178 +94521,CA,Concord,37.957503,-121.974955 +94523,CA,Pleasant Hill,37.954002,-122.07371 +94525,CA,Crockett,38.051865,-122.217659 +94526,CA,Danville,37.813985,-121.96598 +94528,CA,Diablo,37.83883,-121.960951 +94530,CA,El Cerrito,37.915633,-122.298521 +94533,CA,Fairfield,38.267084,-122.03565 +94535,CA,Travis Afb,38.274313,-121.946317 +94536,CA,Fremont,37.560493,-121.999935 +94538,CA,Fremont,37.530815,-121.971215 +94539,CA,Fremont,37.517579,-121.928733 +94541,CA,Hayward,37.674048,-122.089418 +94542,CA,Hayward,37.658566,-122.047236 +94544,CA,Hayward,37.637443,-122.067029 +94545,CA,Hayward,37.633245,-122.0971 +94546,CA,Castro Valley,37.701527,-122.078183 +94547,CA,Hercules,38.006649,-122.263702 +94548,CA,Knightsen,37.9818,-121.672149 +94549,CA,Lafayette,37.896105,-122.11194 +94550,CA,Livermore,37.68299,-121.762983 +94552,CA,Castro Valley,37.713107,-122.038113 +94553,CA,Pacheco,37.993246,-122.111693 +94555,CA,Fremont,37.573458,-122.046925 +94556,CA,Moraga,37.843653,-122.124185 +94558,CA,Spanish Flat,38.328137,-122.305518 +94559,CA,Napa,38.290362,-122.284086 +94560,CA,Newark,37.536812,-122.031956 +94561,CA,Oakley,37.994034,-121.703623 +94563,CA,Orinda,37.878659,-122.172848 +94564,CA,Pinole,37.996903,-122.287477 +94565,CA,Shore Acres,38.016887,-121.908178 +94566,CA,Pleasanton,37.665804,-121.8755 +94567,CA,Pope Valley,38.678192,-122.472244 +94568,CA,Dublin,37.716597,-121.922589 +94569,CA,Port Costa,38.046013,-122.186649 +94571,CA,Rio Vista,38.163734,-121.701635 +94572,CA,Rodeo,38.03069,-122.258139 +94574,CA,Saint Helena,38.513776,-122.461921 +94577,CA,San Leandro,37.720467,-122.158705 +94578,CA,San Leandro,37.702377,-122.123969 +94579,CA,San Leandro,37.689209,-122.150659 +94580,CA,San Lorenzo,37.678671,-122.129547 +94583,CA,San Ramon,37.756188,-121.952224 +94585,CA,Suisun City,38.240834,-122.042003 +94586,CA,Sunol,37.609403,-121.898636 +94587,CA,Union City,37.589458,-122.049702 +94588,CA,Pleasanton,37.687311,-121.8957 +94589,CA,American Canyon,38.148345,-122.249333 +94590,CA,Vallejo,38.105302,-122.247367 +94591,CA,Vallejo,38.09853,-122.212354 +94592,CA,Mare Island,38.094654,-122.27273 +94595,CA,Walnut Creek,37.875317,-122.070259 +94596,CA,Walnut Creek,37.905279,-122.054909 +94598,CA,Walnut Creek,37.919424,-122.025879 +94599,CA,Yountville,38.403813,-122.358506 +94601,CA,Oakland,37.780595,-122.216587 +94602,CA,Oakland,37.801133,-122.210368 +94603,CA,Oakland,37.740239,-122.171017 +94605,CA,Oakland,37.764132,-122.163326 +94606,CA,Oakland,37.79565,-122.24292 +94607,CA,Oakland,37.807084,-122.285051 +94608,CA,Emeryville,37.836466,-122.280363 +94609,CA,Oakland,37.836096,-122.26367 +94610,CA,Oakland,37.812636,-122.244322 +94611,CA,Piedmont,37.828157,-122.22683 +94612,CA,Oakland,37.808473,-122.266774 +94613,CA,Oakland,37.782427,-122.181585 +94618,CA,Piedmont,37.84368,-122.24191 +94619,CA,Oakland,37.787786,-122.18838 +94621,CA,Oakland,37.758924,-122.185335 +94702,CA,Berkeley,37.865611,-122.285126 +94703,CA,Berkeley,37.863028,-122.274914 +94704,CA,Berkeley,37.866428,-122.257048 +94705,CA,Berkeley,37.85711,-122.249964 +94706,CA,Albany,37.890045,-122.295394 +94707,CA,Kensington,37.893118,-122.276517 +94708,CA,Kensington,37.890829,-122.25976 +94709,CA,Berkeley,37.878397,-122.265461 +94710,CA,Berkeley,37.869603,-122.295929 +94801,CA,Richmond,37.940039,-122.36201 +94803,CA,El Sobrante,37.969287,-122.290092 +94804,CA,Richmond,37.926523,-122.33421 +94805,CA,Richmond,37.941719,-122.323756 +94806,CA,San Pablo,37.972374,-122.336929 +94901,CA,San Rafael,37.969144,-122.510502 +94903,CA,Civic Center,38.015044,-122.54521 +94904,CA,Kentfield,37.950599,-122.535501 +94920,CA,Belvedere,37.889885,-122.472627 +94922,CA,Bodega,38.339264,-122.951364 +94923,CA,Bodega Bay,38.330921,-123.037308 +94924,CA,Bolinas,37.907875,-122.694655 +94925,CA,Corte Madera,37.922256,-122.513202 +94928,CA,Rohnert Park,38.347027,-122.69408 +94930,CA,Fairfax,37.988289,-122.593711 +94931,CA,Cotati,38.325918,-122.704831 +94933,CA,Forest Knolls,38.012178,-122.69074 +94937,CA,Inverness,38.083514,-122.856774 +94938,CA,Lagunitas,38.013929,-122.701576 +94939,CA,Larkspur,37.936743,-122.536202 +94940,CA,Marshall,38.176221,-122.890011 +94941,CA,Mill Valley,37.895757,-122.533885 +94945,CA,Novato,38.1163,-122.571416 +94946,CA,Nicasio,38.054622,-122.696402 +94947,CA,Novato,38.097258,-122.583691 +94949,CA,Novato,38.061837,-122.540408 +94951,CA,Penngrove,38.315948,-122.671772 +94952,CA,Petaluma,38.240349,-122.677727 +94954,CA,Petaluma,38.250739,-122.615536 +94956,CA,Point Reyes Stat,38.064794,-122.81621 +94960,CA,San Anselmo,37.984579,-122.571062 +94963,CA,San Geronimo,38.017155,-122.67784 +94965,CA,Sausalito,37.860147,-122.494555 +94970,CA,Stinson Beach,37.901992,-122.639305 +94972,CA,Valley Ford,38.315729,-122.924457 +94973,CA,Woodacre,38.006933,-122.638247 +95002,CA,Alviso,37.427659,-121.968597 +95003,CA,Aptos,36.978477,-121.891979 +95004,CA,Aromas,36.878522,-121.639781 +95005,CA,Ben Lomond,37.086183,-122.083869 +95006,CA,Boulder Creek,37.149934,-122.133053 +95008,CA,Campbell,37.280007,-121.95539 +95010,CA,Capitola,36.977359,-121.952145 +95012,CA,Castroville,36.77142,-121.747368 +95013,CA,Coyote,37.216721,-121.746021 +95014,CA,Monte Vista,37.317363,-122.038604 +95017,CA,Davenport,37.06306,-122.225735 +95018,CA,Felton,37.063124,-122.062162 +95019,CA,Freedom,36.936483,-121.776761 +95020,CA,Gilroy,37.016005,-121.57825 +95023,CA,Hollister,36.848404,-121.387101 +95030,CA,Monte Sereno,37.211677,-121.978684 +95032,CA,Los Gatos,37.231571,-121.950088 +95035,CA,Milpitas,37.436491,-121.892885 +95037,CA,Morgan Hill,37.129171,-121.64636 +95043,CA,Paicines,36.49478,-121.032853 +95045,CA,San Juan Bautist,36.849856,-121.532721 +95046,CA,San Martin,37.091118,-121.599901 +95050,CA,Santa Clara,37.34732,-121.954079 +95051,CA,Santa Clara,37.346992,-121.983848 +95054,CA,Santa Clara,37.394673,-121.95394 +95060,CA,Scotts Valley,36.982946,-122.043612 +95062,CA,Santa Cruz,36.972101,-121.988055 +95064,CA,Santa Cruz,36.995851,-122.057803 +95065,CA,Santa Cruz,37.003319,-121.982557 +95066,CA,Scotts Valley,37.057841,-122.014961 +95070,CA,Saratoga,37.272871,-122.018238 +95073,CA,Soquel,37.003525,-121.950255 +95076,CA,La Selva Beach,36.920515,-121.763437 +95110,CA,San Jose,37.32966,-121.890299 +95111,CA,San Jose,37.282276,-121.824038 +95112,CA,San Jose,37.341388,-121.880414 +95113,CA,San Jose,37.335188,-121.887227 +95116,CA,San Jose,37.351342,-121.850221 +95117,CA,San Jose,37.308896,-121.962126 +95118,CA,San Jose,37.256162,-121.889845 +95119,CA,San Jose,37.230135,-121.790067 +95120,CA,San Jose,37.217538,-121.861547 +95121,CA,San Jose,37.30593,-121.811939 +95122,CA,San Jose,37.329313,-121.833949 +95123,CA,San Jose,37.244594,-121.830502 +95124,CA,San Jose,37.256844,-121.920831 +95125,CA,San Jose,37.296187,-121.895476 +95126,CA,San Jose,37.322482,-121.917398 +95127,CA,San Jose,37.3664,-121.819516 +95128,CA,San Jose,37.314657,-121.934364 +95129,CA,San Jose,37.306537,-122.000494 +95130,CA,San Jose,37.288628,-121.979182 +95131,CA,San Jose,37.386368,-121.879977 +95132,CA,San Jose,37.40408,-121.860336 +95133,CA,San Jose,37.372875,-121.855959 +95134,CA,San Jose,37.413999,-121.943399 +95135,CA,San Jose,37.297539,-121.757228 +95136,CA,San Jose,37.268423,-121.847625 +95138,CA,San Jose,37.246259,-121.778641 +95139,CA,San Jose,37.225162,-121.766867 +95140,CA,Mount Hamilton,37.316087,-121.639948 +95141,CA,San Jose,37.169912,-121.755808 +95148,CA,San Jose,37.329765,-121.792111 +95202,CA,Stockton,37.960632,-121.287087 +95203,CA,Stockton,37.956515,-121.307688 +95204,CA,Stockton,37.974302,-121.315364 +95205,CA,Stockton,37.960986,-121.259241 +95206,CA,Stockton,37.931643,-121.287169 +95207,CA,Stockton,38.002025,-121.32056 +95209,CA,Stockton,38.033105,-121.343292 +95210,CA,Stockton,38.024997,-121.297229 +95211,CA,Univ Of The Paci,37.980364,-121.310336 +95212,CA,Stockton,38.034428,-121.246018 +95215,CA,Stockton,37.968545,-121.215295 +95219,CA,Stockton,38.010233,-121.363712 +95220,CA,Acampo,38.200413,-121.218576 +95222,CA,Angels Camp,38.064011,-120.55437 +95223,CA,Bear Valley,38.24175,-120.342231 +95228,CA,Copperopolis,37.937246,-120.638374 +95230,CA,Farmington,37.944771,-120.852343 +95231,CA,French Camp,37.877982,-121.282704 +95232,CA,Glencoe,38.351557,-120.594546 +95236,CA,Linden,38.021869,-121.074442 +95237,CA,Lockeford,38.162436,-121.135611 +95240,CA,Lodi,38.123579,-121.263034 +95242,CA,Lodi,38.132989,-121.311814 +95245,CA,Mokelumne Hill,38.328918,-120.567705 +95246,CA,Mountain Ranch,38.220363,-120.548137 +95247,CA,Murphys,38.126896,-120.461772 +95249,CA,San Andreas,38.186732,-120.668703 +95251,CA,Vallecito,38.101472,-120.467879 +95252,CA,Valley Springs,38.154355,-120.859742 +95255,CA,West Point,38.406201,-120.515862 +95257,CA,Wilseyville,38.384566,-120.442356 +95258,CA,Woodbridge,38.155124,-121.308632 +95301,CA,Atwater,37.353154,-120.600837 +95303,CA,Ballico,37.452455,-120.700152 +95306,CA,Catheys Valley,37.441409,-120.069017 +95307,CA,Ceres,37.588097,-120.949936 +95309,CA,Chinese Camp,37.856829,-120.406673 +95310,CA,Columbia,38.03975,-120.405552 +95311,CA,Coulterville,37.738642,-119.985813 +95313,CA,Crows Landing,37.438956,-121.019893 +95315,CA,Delhi,37.428629,-120.775489 +95316,CA,Denair,37.538419,-120.796474 +95317,CA,El Nido,37.13452,-120.483235 +95320,CA,Escalon,37.804428,-120.990044 +95321,CA,Groveland,37.840899,-120.191809 +95322,CA,Gustine,37.242456,-121.003965 +95323,CA,Hickman,37.619989,-120.71722 +95324,CA,Hilmar,37.408377,-120.856144 +95325,CA,Hornitos,37.492226,-120.226443 +95326,CA,Hughson,37.594364,-120.865281 +95327,CA,Jamestown,37.906544,-120.494567 +95329,CA,La Grange,37.678915,-120.358131 +95330,CA,Lathrop,37.820897,-121.282652 +95333,CA,Le Grand,37.234175,-120.251737 +95334,CA,Livingston,37.376168,-120.716156 +95335,CA,Cold Springs,38.20336,-120.001159 +95336,CA,Manteca,37.80875,-121.21856 +95338,CA,Mariposa,37.503918,-119.892496 +95340,CA,Red Top,37.300724,-120.461668 +95345,CA,Midpines,37.571009,-119.946548 +95346,CA,Mi Wuk Village,38.105576,-120.131762 +95348,CA,Merced,37.326964,-120.500897 +95350,CA,Modesto,37.674649,-121.011303 +95351,CA,Modesto,37.625022,-121.006033 +95354,CA,Modesto,37.644526,-120.968323 +95355,CA,Modesto,37.673515,-120.954658 +95356,CA,Modesto,37.699431,-121.027051 +95360,CA,Newman,37.317591,-121.025943 +95361,CA,Knights Ferry,37.775323,-120.849474 +95363,CA,Patterson,37.490592,-121.140732 +95364,CA,Pinecrest,38.341062,-119.865195 +95366,CA,Ripon,37.753286,-121.122909 +95367,CA,Riverbank,37.732809,-120.943019 +95368,CA,Salida,37.70713,-121.090484 +95369,CA,Snelling,37.514359,-120.481615 +95370,CA,Sonora,37.995692,-120.338498 +95372,CA,Soulsbyville,37.992794,-120.259892 +95374,CA,Stevinson,37.32575,-120.869856 +95376,CA,Tracy,37.742116,-121.419723 +95379,CA,Tuolumne,37.971339,-120.237496 +95380,CA,Turlock,37.503605,-120.850511 +95383,CA,Twain Harte,38.044722,-120.2155 +95386,CA,Waterford,37.650988,-120.753862 +95388,CA,Winton,37.39233,-120.6132 +95401,CA,Santa Rosa,38.443123,-122.751722 +95403,CA,Santa Rosa,38.477273,-122.748528 +95404,CA,Santa Rosa,38.449556,-122.689524 +95405,CA,Santa Rosa,38.438279,-122.66988 +95407,CA,Santa Rosa,38.410462,-122.727896 +95409,CA,Santa Rosa,38.461242,-122.642125 +95410,CA,Albion,39.215934,-123.721366 +95411,CA,95411,40.161039,-123.610187 +95412,CA,Annapolis,38.714485,-123.314214 +95414,CA,95414,40.290394,-123.649246 +95415,CA,Boonville,39.035007,-123.401954 +95417,CA,Branscomb,39.700531,-123.554982 +95420,CA,Caspar,39.365102,-123.798489 +95421,CA,Cazadero,38.566335,-123.182896 +95422,CA,Clearlake,38.957138,-122.636089 +95423,CA,Clearlake Oaks,39.034838,-122.66873 +95425,CA,Cloverdale,38.799396,-123.011725 +95427,CA,Comptche,39.249919,-123.585652 +95428,CA,Covelo,39.801864,-123.215015 +95429,CA,Dos Rios,39.709298,-123.298294 +95432,CA,Elk,39.160402,-123.723961 +95436,CA,Forestville,38.489442,-122.896683 +95437,CA,Fort Bragg,39.437452,-123.78835 +95439,CA,Fulton,38.494732,-122.77608 +95440,CA,95440,40.101665,-123.842409 +95441,CA,Geyserville,38.700398,-122.888921 +95442,CA,Glen Ellen,38.362538,-122.521002 +95443,CA,Glenhaven,38.99008,-122.522035 +95444,CA,Graton,38.434971,-122.866766 +95445,CA,Gualala,38.803619,-123.553975 +95446,CA,Guerneville,38.509573,-122.994416 +95448,CA,Healdsburg,38.61553,-122.856529 +95449,CA,Hopland,38.972056,-123.116956 +95450,CA,Jenner,38.474093,-123.135379 +95451,CA,Kelseyville,38.946164,-122.781707 +95452,CA,Kenwood,38.416794,-122.554679 +95453,CA,Lakeport,39.055147,-122.915082 +95454,CA,Laytonville,39.667811,-123.486862 +95455,CA,95455,39.851774,-123.618247 +95456,CA,Littleriver,39.271042,-123.753089 +95457,CA,Lower Lake,38.860682,-122.575426 +95458,CA,Lucerne,39.083393,-122.785125 +95459,CA,Manchester,38.992088,-123.670962 +95460,CA,Mendocino,39.323212,-123.78846 +95461,CA,Middletown,38.782504,-122.64352 +95462,CA,Russian River Md,38.462668,-123.00447 +95464,CA,Nice,39.122341,-122.842409 +95465,CA,Occidental,38.396911,-122.988194 +95466,CA,Philo,39.120005,-123.538218 +95467,CA,95467,39.962583,-123.814656 +95468,CA,Point Arena,38.915264,-123.660756 +95469,CA,Potter Valley,39.329639,-123.104181 +95470,CA,Redwood Valley,39.269446,-123.213289 +95472,CA,Freestone,38.391543,-122.838503 +95476,CA,Sonoma,38.295659,-122.472843 +95482,CA,Ukiah,39.151917,-123.200692 +95485,CA,Upper Lake,39.160829,-122.896114 +95488,CA,Westport,39.644059,-123.76426 +95489,CA,95489,40.038453,-124.032628 +95490,CA,Willits,39.411426,-123.350271 +95492,CA,Windsor,38.543182,-122.804375 +95493,CA,Witter Springs,39.182118,-122.97105 +95494,CA,Yorkville,38.908945,-123.233867 +95495,CA,95495,40.203331,-123.381217 +95497,CA,The Sea Ranch,38.725627,-123.467486 +95501,CA,Eureka,40.776237,-124.155892 +95521,CA,Mc Kinleyville,40.904901,-124.081069 +95524,CA,Bayside,40.822381,-124.027305 +95525,CA,Blue Lake,40.928701,-123.896696 +95526,CA,Ruth,40.468566,-123.549351 +95527,CA,Burnt Ranch,40.772238,-123.461248 +95528,CA,Carlotta,40.507027,-123.974287 +95531,CA,Crescent City,41.785402,-124.178448 +95536,CA,Ferndale,40.574488,-124.252268 +95540,CA,Fortuna,40.584931,-124.140654 +95543,CA,Gasquet,41.862768,-123.912467 +95546,CA,Hoopa,41.105937,-123.692754 +95547,CA,Hydesville,40.549576,-124.084489 +95548,CA,Klamath,41.542075,-124.033907 +95549,CA,Kneeland,40.71262,-123.946421 +95550,CA,Korbel,40.824369,-123.859413 +95551,CA,Loleta,40.6531,-124.228826 +95552,CA,Mad River,40.352352,-123.413994 +95554,CA,Myers Flat,40.194758,-123.822713 +95555,CA,Orick,41.30724,-124.050319 +95556,CA,Orleans,41.318092,-123.529564 +95558,CA,Petrolia,40.300558,-124.251236 +95560,CA,Redway,40.110081,-123.844194 +95562,CA,Rio Dell,40.495147,-124.104386 +95563,CA,Salyer,40.89095,-123.547833 +95564,CA,Samoa,40.803712,-124.193571 +95565,CA,Scotia,40.454665,-124.039074 +95567,CA,Smith River,41.936218,-124.166115 +95568,CA,Somes Bar,41.43304,-123.475928 +95569,CA,Redcrest,40.406458,-123.94205 +95570,CA,Westhaven,41.087949,-124.101253 +95573,CA,Willow Creek,40.938894,-123.631062 +95603,CA,Auburn,38.928311,-121.084347 +95605,CA,Bryte,38.592424,-121.526377 +95606,CA,Brooks,38.739277,-122.133391 +95607,CA,Capay,38.696964,-122.100993 +95608,CA,Carmichael,38.628393,-121.328683 +95610,CA,Citrus Heights,38.694571,-121.269211 +95612,CA,Clarksburg,38.395963,-121.556853 +95614,CA,Cool,38.903633,-120.972963 +95615,CA,Courtland,38.305756,-121.554297 +95616,CA,Davis,38.554817,-121.748495 +95618,CA,El Macero,38.542151,-121.676722 +95619,CA,Diamond Springs,38.66302,-120.836071 +95620,CA,Liberty Farms,38.458691,-121.815825 +95621,CA,Citrus Heights,38.695155,-121.307501 +95624,CA,Elk Grove,38.412744,-121.359914 +95626,CA,Elverta,38.716424,-121.431038 +95627,CA,Esparto,38.694191,-122.021391 +95628,CA,Fair Oaks,38.655408,-121.261065 +95629,CA,Fiddletown,38.53141,-120.715926 +95630,CA,El Dorado Hills,38.687885,-121.140927 +95631,CA,Foresthill,39.00229,-120.861127 +95632,CA,Galt,38.269846,-121.29383 +95633,CA,Garden Valley,38.866495,-120.856672 +95634,CA,Georgetown,38.919892,-120.793388 +95635,CA,Greenwood,38.936234,-120.916589 +95636,CA,Grizzly Flats,38.628665,-120.542508 +95637,CA,Guinda,38.816568,-122.189659 +95638,CA,Herald,38.31282,-121.158898 +95640,CA,Ione,38.351882,-120.943265 +95641,CA,Isleton,38.155392,-121.604858 +95642,CA,Jackson,38.357514,-120.754877 +95643,CA,Kelsey,38.797636,-120.824056 +95645,CA,Knights Landing,38.822032,-121.720003 +95648,CA,Lincoln,38.904035,-121.295541 +95650,CA,Loomis,38.80711,-121.169826 +95651,CA,Lotus,38.801712,-120.928864 +95652,CA,Mcclellan Afb,38.655416,-121.40311 +95653,CA,Madison,38.680164,-121.972129 +95655,CA,Mather Afb,38.549224,-121.282394 +95658,CA,Newcastle,38.872467,-121.142616 +95659,CA,Trowbridge,38.882726,-121.553043 +95660,CA,North Highlands,38.68855,-121.374913 +95661,CA,Roseville,38.734612,-121.233968 +95662,CA,Orangevale,38.682384,-121.222902 +95663,CA,Penryn,38.856654,-121.179149 +95664,CA,Pilot Hill,38.826312,-121.029765 +95665,CA,Pine Grove,38.396783,-120.643713 +95666,CA,Pioneer,38.460271,-120.531815 +95667,CA,Placerville,38.719479,-120.804564 +95668,CA,Pleasant Grove,38.787773,-121.507967 +95669,CA,Plymouth,38.48811,-120.870258 +95670,CA,Gold River,38.601897,-121.289434 +95672,CA,Rescue,38.719353,-120.994526 +95673,CA,Rio Linda,38.689311,-121.445152 +95674,CA,Rio Oso,38.960998,-121.505305 +95677,CA,Rocklin,38.791898,-121.243406 +95678,CA,Roseville,38.750895,-121.302801 +95679,CA,Rumsey,38.8762,-122.253738 +95681,CA,Sheridan,38.99153,-121.362062 +95682,CA,Cameron Park,38.665616,-120.975925 +95683,CA,Rancho Murieta,38.507475,-121.094089 +95684,CA,Somerset,38.607414,-120.666306 +95685,CA,Sutter Creek,38.418569,-120.785454 +95687,CA,Vacaville,38.341915,-121.962285 +95688,CA,Vacaville,38.3812,-121.989912 +95689,CA,Volcano,38.477319,-120.617761 +95690,CA,Walnut Grove,38.236362,-121.524849 +95691,CA,West Sacramento,38.567979,-121.539671 +95692,CA,Wheatland,39.019197,-121.422126 +95693,CA,Wilton,38.412069,-121.225656 +95694,CA,Winters,38.529462,-121.974544 +95695,CA,Woodland,38.674294,-121.77932 +95698,CA,Zamora,38.799896,-121.90654 +95701,CA,Alta,39.228032,-120.773165 +95703,CA,Applegate,38.995487,-120.990511 +95709,CA,Camino,38.744938,-120.671979 +95713,CA,Iowa Hill,39.076936,-120.960163 +95714,CA,Dutch Flat,39.197788,-120.826224 +95715,CA,Emigrant Gap,39.286907,-120.662902 +95717,CA,Gold Run,39.175102,-120.856909 +95720,CA,Kyburz,38.780036,-120.25529 +95721,CA,Echo Lake,38.810254,-120.070498 +95722,CA,Meadow Vista,39.003101,-121.029155 +95724,CA,Norden,39.319566,-120.400876 +95726,CA,Pacific House,38.745581,-120.585114 +95728,CA,Soda Springs,39.338467,-120.465493 +95735,CA,Twin Bridges,38.808615,-120.128851 +95742,CA,Rancho Cordova,38.604313,-121.204019 +95758,CA,Elk Grove,38.404238,-121.430706 +95814,CA,Sacramento,38.579792,-121.489404 +95815,CA,Sacramento,38.613303,-121.443543 +95816,CA,Sacramento,38.572788,-121.46753 +95817,CA,Sacramento,38.549785,-121.458324 +95818,CA,Sacramento,38.556778,-121.492884 +95819,CA,Sacramento,38.568293,-121.436634 +95820,CA,Sacramento,38.534694,-121.445139 +95821,CA,Sacramento,38.623889,-121.383807 +95822,CA,Sacramento,38.509139,-121.493541 +95823,CA,Sacramento,38.479711,-121.443846 +95824,CA,Sacramento,38.517843,-121.441883 +95825,CA,Sacramento,38.589226,-121.405677 +95826,CA,Sacramento,38.553868,-121.369265 +95827,CA,Sacramento,38.56623,-121.328593 +95828,CA,Sacramento,38.483718,-121.401504 +95829,CA,Sacramento,38.472564,-121.346631 +95830,CA,Sacramento,38.476556,-121.281453 +95831,CA,Sacramento,38.496226,-121.529661 +95832,CA,Sacramento,38.475387,-121.482967 +95833,CA,Sacramento,38.616993,-121.494487 +95834,CA,Sacramento,38.633418,-121.492052 +95835,CA,Sacramento,38.662595,-121.483444 +95836,CA,Sacramento,38.707346,-121.532259 +95837,CA,Sacramento,38.681726,-121.60297 +95838,CA,Sacramento,38.640566,-121.44396 +95841,CA,Sacramento,38.662699,-121.340608 +95842,CA,Sacramento,38.687385,-121.35046 +95864,CA,Sacramento,38.587768,-121.376889 +95901,CA,Marysville,39.141653,-121.522467 +95910,CA,Alleghany,39.512698,-120.727176 +95912,CA,Arbuckle,39.013787,-122.027405 +95914,CA,Bangor,39.424862,-121.350499 +95915,CA,Belden,39.921746,-121.325924 +95916,CA,Berry Creek,39.638394,-121.385467 +95917,CA,Biggs,39.414918,-121.695873 +95918,CA,Browns Valley,39.284428,-121.346482 +95919,CA,Brownsville,39.452534,-121.261179 +95920,CA,Butte City,39.456348,-121.978046 +95922,CA,Camptonville,39.450784,-121.023066 +95923,CA,Canyondam,40.207958,-121.156324 +95926,CA,Cohasset,39.756466,-121.851806 +95928,CA,Chico,39.729523,-121.81555 +95932,CA,Colusa,39.21311,-122.011563 +95934,CA,Crescent Mills,40.081915,-120.881993 +95935,CA,Dobbins,39.371469,-121.234386 +95936,CA,Downieville,39.570265,-120.677767 +95937,CA,Dunnigan,38.893671,-121.996577 +95938,CA,Durham,39.641599,-121.791983 +95939,CA,Elk Creek,39.598914,-122.557244 +95941,CA,Forbestown,39.541712,-121.213443 +95942,CA,Butte Meadows,40.129931,-121.500205 +95943,CA,Glenn,39.606871,-122.038443 +95944,CA,Goodyears Bar,39.572891,-120.820698 +95945,CA,Grass Valley,39.207617,-121.037401 +95946,CA,Penn Valley,39.218778,-121.193519 +95947,CA,Greenville,40.142404,-120.927299 +95948,CA,Gridley,39.358855,-121.689777 +95949,CA,Grass Valley,39.1029,-121.069357 +95953,CA,Live Oak,39.266904,-121.66393 +95954,CA,Magalia,39.831728,-121.597455 +95955,CA,Maxwell,39.292494,-122.195161 +95956,CA,Meadow Valley,39.918488,-121.05629 +95957,CA,Meridian,39.116812,-121.88138 +95959,CA,Nevada City,39.275395,-121.019634 +95960,CA,North San Juan,39.354037,-121.13498 +95961,CA,Olivehurst,39.089483,-121.550059 +95962,CA,Oregon House,39.314388,-121.209229 +95963,CA,Orland,39.744578,-122.157885 +95965,CA,Pulga,39.532967,-121.578396 +95966,CA,Oroville,39.491448,-121.502029 +95968,CA,Palermo,39.436148,-121.545389 +95969,CA,Paradise,39.759804,-121.603097 +95970,CA,Princeton,39.428313,-122.030181 +95971,CA,Quincy,39.940504,-120.928493 +95972,CA,Rackerby,39.4059,-121.336192 +95975,CA,Rough And Ready,39.228585,-121.150856 +95977,CA,Smartville,39.204305,-121.266716 +95979,CA,Stonyford,39.333652,-122.517811 +95981,CA,La Porte,39.604136,-121.074566 +95982,CA,Sutter,39.168114,-121.756527 +95983,CA,Taylorsville,40.064911,-120.801797 +95984,CA,Twain,40.002769,-121.150729 +95987,CA,Williams,39.148855,-122.162375 +95988,CA,Willows,39.523751,-122.199204 +95991,CA,Yuba City,39.128619,-121.621599 +95993,CA,Yuba City,39.128193,-121.655168 +96001,CA,Redding,40.560493,-122.411627 +96002,CA,Redding,40.548586,-122.333932 +96003,CA,Redding,40.627751,-122.352962 +96006,CA,Adin,41.21751,-120.943193 +96007,CA,Anderson,40.457432,-122.328218 +96008,CA,Bella Vista,40.740945,-122.07245 +96010,CA,Big Bar,40.74796,-123.229006 +96013,CA,Burney,40.894927,-121.655036 +96014,CA,Callahan,41.383257,-122.764046 +96015,CA,Canby,41.466358,-120.921769 +96016,CA,Cassel,40.907832,-121.524497 +96019,CA,Shasta Lake,40.680262,-122.365395 +96020,CA,Chester,40.297457,-121.227338 +96021,CA,Corning,39.929566,-122.195991 +96022,CA,Cottonwood,40.369072,-122.337463 +96024,CA,Douglas City,40.634151,-122.923867 +96025,CA,Dunsmuir,41.212439,-122.273397 +96027,CA,Sawyers Bar,41.468303,-122.914189 +96028,CA,Fall River Mills,41.03931,-121.460562 +96031,CA,Forks Of Salmon,41.256978,-123.09781 +96032,CA,Fort Jones,41.617027,-122.883207 +96033,CA,French Gulch,40.703517,-122.622868 +96034,CA,Gazelle,41.510485,-122.537122 +96035,CA,Gerber,40.042997,-122.164937 +96038,CA,Grenada,41.612512,-122.525829 +96039,CA,Happy Camp,41.801802,-123.388045 +96040,CA,Hat Creek,40.767673,-121.463687 +96041,CA,Hayfork,40.550431,-123.163416 +96044,CA,Hornbrook,41.907738,-122.526528 +96045,CA,Horse Creek,41.833732,-123.013919 +96047,CA,Igo,40.431795,-122.654023 +96048,CA,Helena,40.768187,-123.062671 +96050,CA,Klamath River,41.863699,-122.819693 +96051,CA,Lakehead,40.958775,-122.359281 +96052,CA,Lewiston,40.745986,-122.842591 +96055,CA,Los Molinos,40.049735,-122.099175 +96056,CA,Mcarthur,41.111407,-121.214896 +96057,CA,Mccloud,41.252108,-122.13562 +96058,CA,Macdoel,41.883028,-121.944472 +96059,CA,Manton,40.433125,-121.836521 +96062,CA,Millville,40.565316,-122.111088 +96063,CA,Mineral,40.328826,-121.524807 +96064,CA,Montague,41.724294,-122.463799 +96065,CA,Montgomery Creek,40.912378,-121.923313 +96067,CA,Mount Shasta,41.317435,-122.324017 +96069,CA,Oak Run,40.68631,-122.040932 +96071,CA,Old Station,40.62557,-121.458476 +96073,CA,Palo Cedro,40.576661,-122.239805 +96075,CA,Paynes Creek,40.351415,-121.764952 +96076,CA,Wildwood,40.316528,-122.918013 +96080,CA,Red Bluff,40.179535,-122.238281 +96085,CA,Scott Bar,41.77364,-122.988183 +96086,CA,Seiad Valley,41.886589,-123.243762 +96087,CA,Shasta,40.610896,-122.49685 +96088,CA,Shingletown,40.504959,-121.885668 +96091,CA,Trinity Center,41.061548,-122.723919 +96093,CA,Weaverville,40.731701,-122.935303 +96094,CA,Edgewood,41.439466,-122.384803 +96096,CA,Whitmore,40.65255,-121.877076 +96097,CA,Yreka,41.720558,-122.637604 +96101,CA,Alturas,41.476742,-120.545584 +96103,CA,Cromberg,39.784745,-120.627397 +96104,CA,Cedarville,41.475871,-120.151551 +96105,CA,Chilcoot,39.805683,-120.175212 +96106,CA,Clio,39.74326,-120.560458 +96107,CA,Coleville,38.502903,-119.482784 +96108,CA,Davis Creek,41.862555,-120.323549 +96109,CA,Doyle,40.000799,-120.107693 +96111,CA,Floriston,39.445746,-120.025421 +96112,CA,Fort Bidwell,41.864441,-120.161983 +96113,CA,Herlong,40.148492,-120.171271 +96114,CA,Janesville,40.296325,-120.50982 +96115,CA,Lake City,41.668208,-120.181424 +96117,CA,Litchfield,40.362788,-120.253975 +96118,CA,Loyalton,39.662974,-120.229662 +96120,CA,Hope Valley,38.76473,-119.807275 +96121,CA,Milford,40.182763,-120.389508 +96122,CA,Portola,39.810883,-120.466858 +96123,CA,Ravendale,40.831705,-120.16001 +96124,CA,Calpine,39.651699,-120.4442 +96125,CA,Sierra City,39.559248,-120.624135 +96126,CA,Sierraville,39.594294,-120.347789 +96128,CA,Standish,40.350863,-120.406847 +96130,CA,Susanville,40.398282,-120.646442 +96132,CA,Termo,40.946667,-120.517378 +96133,CA,Topaz,38.64151,-119.512164 +96134,CA,Tulelake,41.931621,-121.434688 +96135,CA,Vinton,39.720719,-120.204994 +96136,CA,Wendel,40.346233,-120.352156 +96137,CA,Peninsula Villag,40.270359,-121.109224 +96140,CA,Carnelian Bay,39.231937,-120.075328 +96141,CA,Homewood,39.078157,-120.179035 +96142,CA,Tahoma,39.064406,-120.135747 +96143,CA,Kings Beach,39.240119,-120.023287 +96145,CA,Tahoe City,39.180618,-120.144532 +96148,CA,Tahoe Vista,39.24475,-120.052128 +96150,CA,South Lake Tahoe,38.916976,-119.986469 +96161,CA,Truckee,39.338546,-120.172942 +96162,CA,Truckee,39.319321,-120.295031 +80002,CO,Arvada,39.794533,-105.098402 +80003,CO,Arvada,39.828572,-105.065549 +80004,CO,Arvada,39.814066,-105.11771 +80005,CO,Arvada,39.842189,-105.109719 +80010,CO,Aurora,39.736788,-104.864618 +80011,CO,Aurora,39.737809,-104.815233 +80012,CO,Aurora,39.698672,-104.837693 +80013,CO,Aurora,39.657457,-104.784566 +80014,CO,Aurora,39.666171,-104.834954 +80015,CO,Aurora,39.62552,-104.787438 +80016,CO,Aurora,39.618713,-104.741734 +80017,CO,Aurora,39.694827,-104.788093 +80018,CO,Aurora,39.710179,-104.707102 +80019,CO,Aurora,39.765608,-104.706906 +80020,CO,Broomfield,39.924513,-105.060902 +80021,CO,Westminster,39.875996,-105.102837 +80022,CO,Commerce City,39.825875,-104.911349 +80026,CO,Lafayette,39.997964,-105.096346 +80027,CO,Louisville,39.978942,-105.145557 +80030,CO,Westminster,39.854238,-105.037086 +80033,CO,Wheat Ridge,39.774036,-105.096195 +80045,CO,Aurora,39.748014,-104.837954 +80101,CO,Agate,39.420256,-103.984575 +80102,CO,Bennett,39.725398,-104.427284 +80103,CO,Byers,39.698454,-104.201872 +80104,CO,Castle Rock,39.39256,-104.860187 +80105,CO,Deer Trail,39.593121,-104.068003 +80106,CO,Elbert,39.096892,-104.574631 +80107,CO,Elizabeth,39.383618,-104.591961 +80110,CO,Cherry Hills Vil,39.646027,-104.990022 +80111,CO,Cherry Hills Vil,39.610327,-104.882832 +80112,CO,Englewood,39.58051,-104.901115 +80116,CO,Franktown,39.372841,-104.725569 +80117,CO,Kiowa,39.323972,-104.452263 +80118,CO,Larkspur,39.201079,-104.854587 +80120,CO,Littleton,39.599426,-105.0044 +80121,CO,Greenwood Villag,39.605835,-104.957285 +80122,CO,Littleton,39.581418,-104.955673 +80123,CO,Bow Mar,39.596854,-105.07766 +80124,CO,Littleton,39.55061,-104.897204 +80125,CO,Littleton,39.484466,-105.056098 +80126,CO,Highlands Ranch,39.55134,-104.963751 +80127,CO,Littleton,39.591968,-105.132811 +80132,CO,Monument,39.100726,-104.85416 +80133,CO,Palmer Lake,39.120498,-104.914795 +80134,CO,Parker,39.505466,-104.734904 +80135,CO,Deckers,39.330109,-105.008305 +80136,CO,Strasburg,39.781359,-104.268258 +80137,CO,Watkins,39.762317,-104.583391 +80202,CO,Denver,39.749107,-104.994591 +80203,CO,Denver,39.731285,-104.981111 +80204,CO,Denver,39.734022,-105.025854 +80205,CO,Denver,39.758993,-104.966141 +80206,CO,Denver,39.733109,-104.9524 +80207,CO,Denver,39.758425,-104.91771 +80209,CO,Denver,39.707437,-104.968587 +80210,CO,Denver,39.679003,-104.963124 +80211,CO,Denver,39.766515,-105.020377 +80212,CO,Mountain View,39.772396,-105.046979 +80214,CO,Edgewater,39.746931,-105.062036 +80215,CO,Lakewood,39.744033,-105.102329 +80216,CO,Denver,39.783469,-104.966946 +80218,CO,Denver,39.732747,-104.971652 +80219,CO,Denver,39.695624,-105.034134 +80220,CO,Denver,39.7312,-104.912866 +80221,CO,Federal Heights,39.840562,-105.007985 +80222,CO,Glendale,39.682803,-104.927992 +80223,CO,Denver,39.700239,-105.002799 +80224,CO,Denver,39.687995,-104.910778 +80226,CO,Lakewood,39.712186,-105.066703 +80227,CO,Denver,39.666746,-105.085359 +80228,CO,Lakewood,39.696898,-105.143009 +80229,CO,Thornton,39.860998,-104.961749 +80231,CO,Denver,39.679324,-104.884326 +80232,CO,Lakewood,39.697282,-105.094524 +80233,CO,Northglenn,39.901222,-104.958257 +80234,CO,Northglenn,39.905479,-105.004474 +80235,CO,Denver,39.647175,-105.079466 +80236,CO,Denver,39.653535,-105.037595 +80237,CO,Denver,39.64314,-104.89866 +80239,CO,Denver,39.787757,-104.828837 +80241,CO,Northglenn,39.927792,-104.941809 +80249,CO,Denver,39.778264,-104.75565 +80301,CO,Boulder,40.049733,-105.21426 +80302,CO,Boulder,40.017235,-105.285131 +80303,CO,Boulder,39.991381,-105.239178 +80304,CO,Boulder,40.037482,-105.277073 +80401,CO,Golden,39.730548,-105.191528 +80403,CO,Golden,39.823219,-105.282516 +80421,CO,Bailey,39.448233,-105.469282 +80422,CO,Black Hawk,39.801105,-105.503991 +80423,CO,Bond,39.869119,-106.676273 +80428,CO,Clark,40.726783,-106.921482 +80429,CO,Climax,39.298804,-106.258027 +80430,CO,Coalmont,40.538252,-106.532134 +80433,CO,Conifer,39.519735,-105.316873 +80435,CO,Keystone,39.574827,-106.057345 +80439,CO,Evergreen,39.637405,-105.340248 +80440,CO,Fairplay,39.225617,-105.999416 +80441,CO,Foxton,39.372056,-105.24815 +80446,CO,Granby,40.012834,-105.889916 +80447,CO,Grand Lake,40.228862,-105.860488 +80452,CO,Idaho Springs,39.740192,-105.598261 +80455,CO,Jamestown,40.10056,-105.418971 +80456,CO,Jefferson,39.300926,-105.78633 +80459,CO,Kremmling,40.063224,-106.395472 +80461,CO,Leadville,39.249742,-106.301545 +80463,CO,Mc Coy,39.913377,-106.730906 +80465,CO,Morrison,39.612452,-105.174641 +80466,CO,Nederland,39.970259,-105.481265 +80467,CO,Oak Creek,40.256733,-106.929621 +80468,CO,Parshall,40.053765,-106.225492 +80470,CO,Pine,39.46667,-105.374116 +80471,CO,Pinecliffe,39.942898,-105.354004 +80474,CO,Rollinsville,39.910757,-105.472596 +80479,CO,Toponas,40.119601,-106.908172 +80480,CO,Walden,40.709978,-106.276728 +80481,CO,Ward,40.072572,-105.508023 +80487,CO,Steamboat Spring,40.474124,-106.8457 +80501,CO,Longmont,40.177921,-105.10095 +80503,CO,Longmont,40.15588,-105.162432 +80504,CO,Longmont,40.130615,-104.950446 +80510,CO,Allenspark,40.226775,-105.520064 +80512,CO,Bellvue,40.626528,-105.260977 +80513,CO,Berthoud,40.299333,-105.105459 +80514,CO,Dacono,40.08361,-104.929705 +80515,CO,Drake,40.443257,-105.296925 +80516,CO,Erie,40.059746,-105.068583 +80517,CO,Estes Park,40.365761,-105.514163 +80521,CO,Fort Collins,40.581293,-105.103884 +80524,CO,Fort Collins,40.59865,-105.05811 +80525,CO,Fort Collins,40.538354,-105.054715 +80526,CO,Fort Collins,40.547294,-105.107646 +80534,CO,Johnstown,40.335526,-104.923558 +80535,CO,Laporte,40.634683,-105.148757 +80536,CO,Virginia Dale,40.779878,-105.367745 +80537,CO,Loveland,40.384917,-105.09164 +80538,CO,Loveland,40.426239,-105.089985 +80540,CO,Lyons,40.235715,-105.323071 +80543,CO,Milliken,40.310656,-104.876137 +80545,CO,Red Feather Lake,40.796451,-105.624455 +80549,CO,Wellington,40.725525,-105.031844 +80550,CO,Windsor,40.483663,-104.899442 +80601,CO,Lochbui,39.980553,-104.810278 +80610,CO,Ault,40.593772,-104.735629 +80611,CO,Briggsdale,40.639192,-104.28707 +80612,CO,Carr,40.866551,-104.885865 +80615,CO,Eaton,40.527272,-104.714559 +80620,CO,Evans,40.380255,-104.697095 +80621,CO,Wattenburg,40.078876,-104.865639 +80622,CO,Galeton,40.515034,-104.597254 +80624,CO,Gill,40.469586,-104.499995 +80631,CO,Garden City,40.413968,-104.704756 +80634,CO,Greeley,40.410947,-104.754113 +80640,CO,Henderson,39.898304,-104.871834 +80642,CO,Hudson,40.060555,-104.653208 +80643,CO,Keenesburg,40.095847,-104.446366 +80644,CO,Kersey,40.396305,-104.528768 +80645,CO,La Salle,40.321138,-104.726784 +80648,CO,Nunn,40.726483,-104.785012 +80649,CO,Orchard,40.363946,-104.097325 +80650,CO,Pierce,40.635911,-104.763764 +80651,CO,Platteville,40.213121,-104.802776 +80652,CO,Roggen,40.207445,-104.315747 +80653,CO,Weldona,40.368093,-103.967755 +80654,CO,Hoyt,40.205651,-104.052814 +80701,CO,Fort Morgan,40.254084,-103.803119 +80720,CO,Akron,40.180315,-103.225885 +80721,CO,Amherst,40.682386,-102.170567 +80722,CO,Atwood,40.517432,-103.039301 +80723,CO,Brush,40.260255,-103.62788 +80726,CO,Crook,40.874743,-102.847174 +80727,CO,Eckley,40.113775,-102.482776 +80728,CO,Fleming,40.637019,-102.868821 +80729,CO,Grover,40.871635,-104.234613 +80731,CO,Haxtun,40.640587,-102.605175 +80733,CO,Hillrose,40.307186,-103.541816 +80734,CO,Holyoke,40.582542,-102.282545 +80735,CO,Hale,39.733147,-102.211563 +80736,CO,Iliff,40.769174,-103.096808 +80737,CO,Julesburg,40.97083,-102.257501 +80740,CO,Lindon,39.830849,-103.314471 +80741,CO,Willard,40.511548,-103.34471 +80742,CO,New Raymer,40.685079,-103.838982 +80743,CO,Otis,40.202989,-102.939219 +80744,CO,Ovid,40.945865,-102.387396 +80745,CO,Padroni,40.954911,-103.358163 +80747,CO,Peetz,40.95195,-103.116606 +80749,CO,Sedgwick,40.910317,-102.529122 +80750,CO,Snyder,40.330655,-103.597134 +80751,CO,Sterling,40.63062,-103.221183 +80754,CO,Stoneham,40.686994,-103.638687 +80755,CO,Vernon,39.933127,-102.319343 +80757,CO,Last Chance,39.938105,-103.578033 +80758,CO,Laird,40.104917,-102.233751 +80759,CO,Yuma,40.130063,-102.707174 +80801,CO,Anton,39.686527,-103.434296 +80802,CO,Arapahoe,38.841716,-102.19401 +80804,CO,Arriba,39.30253,-103.270968 +80805,CO,Bethune,39.344771,-102.428142 +80807,CO,Burlington,39.310649,-102.258281 +80808,CO,Calhan,38.964773,-104.355274 +80809,CO,North Pole,38.921314,-104.993684 +80810,CO,Cheyenne Wells,38.819762,-102.358173 +80812,CO,Cope,39.746227,-102.988098 +80814,CO,Divide,38.957622,-105.19937 +80815,CO,Flagler,39.312654,-103.062395 +80816,CO,Florissant,38.827669,-105.226106 +80817,CO,Fountain,38.699563,-104.700469 +80818,CO,Genoa,39.338328,-103.460689 +80820,CO,Guffey,38.814584,-105.57835 +80821,CO,Hugo,39.084318,-103.498971 +80822,CO,Joes,39.672771,-102.615134 +80823,CO,Karval,38.71194,-103.500613 +80824,CO,Kirk,39.617072,-102.477554 +80825,CO,Kit Carson,38.803984,-102.819842 +80827,CO,Lake George,39.034233,-105.434654 +80828,CO,Limon,39.27126,-103.685572 +80829,CO,Manitou Springs,38.854994,-104.905839 +80830,CO,Matheson,39.132044,-103.913165 +80831,CO,Peyton,38.954097,-104.54722 +80832,CO,Ramah,39.073571,-104.124733 +80833,CO,Rush,38.764248,-104.024065 +80834,CO,Seibert,39.318329,-102.882184 +80835,CO,Simla,39.146457,-104.086236 +80836,CO,Stratton,39.308733,-102.597928 +80840,CO,United States Ai,38.990448,-104.860139 +80861,CO,Vona,39.323564,-102.739287 +80863,CO,Woodland Park,38.996929,-105.062292 +80864,CO,Yoder,38.775252,-104.218353 +80903,CO,Colorado Springs,38.838832,-104.814466 +80904,CO,Colorado Springs,38.853318,-104.859513 +80905,CO,Colorado Springs,38.837692,-104.836997 +80906,CO,Colorado Springs,38.790164,-104.819893 +80907,CO,Colorado Springs,38.876001,-104.817034 +80908,CO,Colorado Springs,39.023745,-104.693331 +80909,CO,Colorado Springs,38.852038,-104.773483 +80910,CO,Colorado Springs,38.815164,-104.770299 +80911,CO,Colorado Springs,38.745665,-104.722322 +80913,CO,Fort Carson,38.741967,-104.782218 +80914,CO,Cheyenne Mtn Afb,38.784241,-104.719052 +80915,CO,Colorado Springs,38.855845,-104.713422 +80916,CO,Colorado Springs,38.807619,-104.74034 +80917,CO,Colorado Springs,38.886027,-104.739904 +80918,CO,Colorado Springs,38.912924,-104.773444 +80919,CO,Colorado Springs,38.926795,-104.84642 +80920,CO,Colorado Springs,38.949732,-104.766951 +80921,CO,Colorado Springs,39.048674,-104.814042 +80922,CO,Colorado Springs,38.90503,-104.698161 +80925,CO,Colorado Springs,38.731329,-104.660087 +80926,CO,Colorado Springs,38.698073,-104.85051 +80928,CO,Colorado Springs,38.623261,-104.457043 +80929,CO,Colorado Springs,38.796837,-104.607857 +80930,CO,Colorado Springs,38.828926,-104.526924 +81001,CO,Pueblo,38.287876,-104.584828 +81003,CO,Pueblo,38.284277,-104.62337 +81004,CO,Pueblo,38.244063,-104.627829 +81005,CO,Pueblo,38.235157,-104.660031 +81006,CO,Pueblo,38.24465,-104.531834 +81007,CO,Pueblo West,38.319975,-104.743264 +81008,CO,Pueblo,38.313251,-104.628433 +81020,CO,Aguilar,37.393304,-104.676926 +81021,CO,Arlington,38.40677,-103.369741 +81022,CO,North Avondale,38.211603,-104.359686 +81023,CO,Beulah,38.083712,-104.97245 +81025,CO,Boone,38.264614,-104.25851 +81026,CO,Brandon,38.485133,-102.781906 +81027,CO,Branson,37.051775,-103.874115 +81028,CO,Bristol,38.133184,-102.342642 +81029,CO,Campo,37.119547,-102.546423 +81036,CO,Chivington,38.444141,-102.50536 +81039,CO,Fowler,38.123071,-104.029908 +81040,CO,Farisita,37.763753,-105.237397 +81041,CO,Granada,38.054485,-102.32712 +81043,CO,Hartman,38.145291,-102.186609 +81044,CO,Caddoa,38.107347,-102.933145 +81045,CO,Haswell,38.447431,-103.150543 +81047,CO,Holly,38.0205,-102.141466 +81049,CO,Villegreen,37.331189,-103.358348 +81050,CO,Timpas,37.991552,-103.549068 +81052,CO,Lamar,38.084136,-102.619195 +81054,CO,Deora,38.065514,-103.208492 +81055,CO,Cuchara,37.498292,-105.012994 +81057,CO,Mc Clave,38.150484,-102.816934 +81058,CO,Manzanola,38.110861,-103.876602 +81059,CO,Delhi,37.478533,-104.13074 +81062,CO,Olney Springs,38.201877,-103.941033 +81063,CO,Ordway,38.209546,-103.800277 +81064,CO,Utleyville,37.355885,-102.893106 +81067,CO,Rocky Ford,38.049016,-103.725143 +81069,CO,Rye,37.937145,-104.886257 +81071,CO,Towner,38.462172,-102.295367 +81073,CO,Springfield,37.406727,-102.617322 +81076,CO,Sugar City,38.244368,-103.655557 +81080,CO,81080,38.438391,-102.108268 +81081,CO,Trinchera,37.075662,-104.118354 +81082,CO,Jansen,37.175475,-104.500715 +81084,CO,Lycan,37.57476,-102.320128 +81087,CO,Vilas,37.373043,-102.44374 +81089,CO,Farista,37.638159,-104.804301 +81090,CO,Walsh,37.352057,-102.253716 +81091,CO,Weston,37.170211,-104.824749 +81092,CO,Wiley,38.158978,-102.714734 +81101,CO,Alamosa,37.470274,-105.878602 +81120,CO,Antonito,37.085473,-106.037946 +81121,CO,Arboles,37.101633,-107.390749 +81122,CO,Bayfield,37.260328,-107.613728 +81123,CO,Blanca,37.431702,-105.517784 +81125,CO,Center,37.734295,-106.090628 +81130,CO,Creede,37.816367,-106.927679 +81132,CO,La Garita,37.671346,-106.350502 +81133,CO,Fort Garland,37.426978,-105.404879 +81136,CO,Hooper,37.723203,-105.871193 +81137,CO,Ignacio,37.126412,-107.639465 +81140,CO,La Jara,37.290726,-106.005427 +81143,CO,Moffat,38.045195,-105.841051 +81144,CO,Monte Vista,37.573095,-106.140833 +81146,CO,Mosca,37.635796,-105.806866 +81147,CO,Pagosa Springs,37.252345,-107.038497 +81149,CO,Saguache,38.09775,-106.187592 +81150,CO,San Acacio,37.201347,-105.439949 +81151,CO,Sanford,37.208724,-105.928588 +81152,CO,Mesita,37.05057,-105.575625 +81153,CO,San Pablo,37.134872,-105.346196 +81154,CO,South Fork,37.67248,-106.612451 +81155,CO,Villa Grove,38.2952,-106.110183 +81201,CO,Salida,38.525909,-105.997818 +81210,CO,Almont,38.64997,-106.627099 +81211,CO,Buena Vista,38.838003,-106.147121 +81212,CO,Canon City,38.445074,-105.217829 +81220,CO,Cimarron,38.387633,-107.482366 +81224,CO,Crested Butte,38.869081,-106.961899 +81226,CO,Florence,38.385016,-105.123233 +81228,CO,Granite,39.095294,-106.311417 +81230,CO,Gunnison,38.551056,-106.931013 +81233,CO,Howard,38.388519,-105.747124 +81235,CO,Lake City,37.986769,-107.302037 +81236,CO,Nathrop,38.710343,-106.116576 +81239,CO,Parlin,38.508762,-106.677995 +81240,CO,Penrose,38.433622,-105.011325 +81241,CO,Pitkin,38.608542,-106.516774 +81243,CO,Powderhorn,38.282165,-107.108449 +81250,CO,81250,38.395556,-105.531825 +81251,CO,Twin Lakes,39.090231,-106.435079 +81252,CO,Westcliffe,38.123023,-105.433154 +81253,CO,Wetmore,38.189857,-105.106441 +81301,CO,Durango,37.287388,-107.861684 +81320,CO,Cahone,37.69163,-108.579442 +81321,CO,Cortez,37.354949,-108.583726 +81323,CO,Dolores,37.466571,-108.471748 +81324,CO,Dove Creek,37.763199,-108.918147 +81325,CO,Egnar,37.934448,-108.929889 +81326,CO,Hesperus,37.165368,-108.121917 +81327,CO,Lewis,37.47101,-108.61891 +81328,CO,Mancos,37.347133,-108.298242 +81331,CO,Pleasant View,37.588763,-108.809487 +81334,CO,Towaoc,37.208408,-108.719993 +81335,CO,Yellow Jacket,37.499526,-108.785167 +81401,CO,Montrose,38.46783,-107.875182 +81410,CO,Austin,38.797544,-107.97384 +81411,CO,Bedrock,38.384352,-108.953224 +81413,CO,Cedaredge,38.911878,-107.926786 +81415,CO,Crawford,38.69408,-107.614864 +81416,CO,Delta,38.734891,-108.060421 +81418,CO,Eckert,38.844982,-107.962452 +81419,CO,Hotchkiss,38.812417,-107.747173 +81422,CO,Naturita,38.222559,-108.572836 +81423,CO,Norwood,38.110406,-108.284472 +81424,CO,Nucla,38.268219,-108.547644 +81425,CO,Olathe,38.597575,-107.992118 +81426,CO,Ophir,37.856197,-107.851961 +81427,CO,Ouray,38.02576,-107.67261 +81428,CO,Paonia,38.864978,-107.598483 +81430,CO,Placerville,38.008759,-108.024775 +81431,CO,Redvale,38.186452,-108.389536 +81432,CO,Ridgway,38.138074,-107.753341 +81433,CO,Silverton,37.808995,-107.666686 +81434,CO,Somerset,38.946801,-107.378145 +81435,CO,Telluride,37.940028,-107.821371 +81501,CO,Grand Junction,39.078326,-108.545692 +81503,CO,Grand Junction,39.056777,-108.575609 +81504,CO,Fruitvale,39.083136,-108.489094 +81505,CO,Grand Junction,39.107097,-108.596834 +81506,CO,Grand Junction,39.103209,-108.54911 +81520,CO,Clifton,39.0805,-108.449628 +81521,CO,Fruita,39.163656,-108.721757 +81522,CO,Gateway,38.915136,-108.791344 +81524,CO,Loma,39.227896,-108.814902 +81525,CO,Mack,39.255367,-108.929597 +81526,CO,Palisade,39.103178,-108.367977 +81527,CO,Whitewater,38.974422,-108.399042 +81601,CO,Glenwood Springs,39.529607,-107.325188 +81610,CO,Dinosaur,40.256609,-108.965184 +81611,CO,Aspen,39.195139,-106.823593 +81621,CO,Basalt,39.353466,-106.998752 +81623,CO,Marble,39.385431,-107.171012 +81624,CO,Collbran,39.245267,-107.924945 +81625,CO,Craig,40.522351,-107.561458 +81630,CO,De Beque,39.311764,-108.230405 +81631,CO,Eagle,39.634138,-106.75884 +81633,CO,Elk Springs,40.414588,-108.419729 +81635,CO,Battlement Mesa,39.440729,-108.038038 +81637,CO,Gypsum,39.661848,-106.967083 +81638,CO,Hamilton,40.32504,-107.584089 +81639,CO,Hayden,40.494487,-107.257055 +81640,CO,Maybell,40.650649,-108.272264 +81641,CO,Meeker,40.038726,-107.892498 +81642,CO,Meredith,39.335348,-106.67823 +81643,CO,Mesa,39.161161,-108.104401 +81647,CO,New Castle,39.570922,-107.542758 +81648,CO,Rangely,40.082844,-108.799148 +81650,CO,Rifle,39.549073,-107.789804 +81652,CO,Silt,39.541464,-107.657411 +81653,CO,Slater,40.947985,-107.497178 +81654,CO,Snowmass,39.250059,-106.950839 +81657,CO,Vail,39.623793,-106.463454 +6001,CT,Avon,41.790498,-72.865323 +6002,CT,Bloomfield,41.831647,-72.72493 +6010,CT,Bristol,41.682293,-72.930193 +6013,CT,Burlington,41.757296,-72.944386 +6016,CT,Windsorville,41.911405,-72.543667 +6018,CT,Canaan,42.024821,-73.323177 +6019,CT,Canton,41.838401,-72.898731 +6020,CT,Canton Center,41.871586,-72.905847 +6021,CT,Colebrook,42.028217,-73.104069 +6022,CT,Collinsville,41.851319,-72.92827 +6023,CT,East Berlin,41.61277,-72.719007 +6024,CT,East Canaan,42.011686,-73.278462 +6026,CT,East Granby,41.932215,-72.745889 +6027,CT,East Hartland,42.001617,-72.924213 +6029,CT,Ellington,41.911417,-72.462599 +6031,CT,Falls Village,41.95784,-73.351659 +6032,CT,Farmington,41.72839,-72.841476 +6033,CT,Glastonbury,41.707329,-72.572705 +6035,CT,Granby,41.960227,-72.799377 +6037,CT,Berlin,41.620826,-72.770482 +6039,CT,Lakeville,41.951631,-73.43766 +6040,CT,Manchester,41.777732,-72.52444 +6043,CT,Bolton,41.768888,-72.43958 +6051,CT,New Britain,41.666683,-72.772208 +6052,CT,New Britain,41.658792,-72.798858 +6053,CT,New Britain,41.686667,-72.790835 +6057,CT,New Hartford,41.846797,-73.010369 +6058,CT,Norfolk,41.985386,-73.199197 +6059,CT,North Canton,41.923516,-72.90414 +6060,CT,North Granby,42.021925,-72.840938 +6062,CT,Plainville,41.672653,-72.864373 +6063,CT,Pleasant Valley,41.924873,-72.982675 +6065,CT,Riverton,41.961395,-73.025469 +6066,CT,Vernon Rockville,41.850073,-72.464855 +6067,CT,Rocky Hill,41.658295,-72.663197 +6068,CT,Salisbury,42.001452,-73.421492 +6069,CT,Sharon,41.871446,-73.457758 +6070,CT,Simsbury,41.873712,-72.821267 +6071,CT,Somers,41.997813,-72.458266 +6073,CT,South Glastonbur,41.660682,-72.554308 +6074,CT,South Windsor,41.834081,-72.557585 +6076,CT,Stafford Springs,41.966127,-72.289857 +6078,CT,Suffield,41.990029,-72.641997 +6081,CT,Tariffville,41.907715,-72.767786 +6082,CT,Enfield,41.989016,-72.565218 +6084,CT,Tolland,41.869647,-72.371789 +6085,CT,Unionville,41.747711,-72.887406 +6088,CT,East Windsor,41.9099,-72.602945 +6089,CT,Weatogue,41.837152,-72.825254 +6090,CT,West Granby,41.965509,-72.855496 +6092,CT,West Simsbury,41.871797,-72.857749 +6093,CT,West Suffield,42.011464,-72.736232 +6095,CT,Windsor,41.856122,-72.663893 +6096,CT,Windsor Locks,41.926078,-72.645762 +6098,CT,Winsted,41.925214,-73.066341 +6103,CT,Hartford,41.767196,-72.675966 +6105,CT,Hartford,41.769116,-72.701006 +6106,CT,Hartford,41.749841,-72.694734 +6107,CT,W Hartford,41.755553,-72.75322 +6108,CT,East Hartford,41.780291,-72.618014 +6109,CT,Wethersfield,41.701332,-72.676308 +6110,CT,W Hartford,41.732566,-72.733691 +6111,CT,Maple Hill,41.686402,-72.729747 +6112,CT,Hartford,41.79053,-72.69641 +6114,CT,Hartford,41.740293,-72.680726 +6117,CT,W Hartford,41.790021,-72.745689 +6118,CT,East Hartford,41.747211,-72.610265 +6119,CT,W Hartford,41.762765,-72.726799 +6120,CT,Hartford,41.78596,-72.675807 +6226,CT,Willimantic,41.714918,-72.213396 +6231,CT,Amston,41.628969,-72.364601 +6232,CT,Andover,41.733215,-72.376719 +6234,CT,Brooklyn,41.780747,-71.954129 +6235,CT,Chaplin,41.802584,-72.137197 +6237,CT,Columbia,41.697274,-72.30717 +6238,CT,Coventry,41.782195,-72.333249 +6239,CT,Danielson,41.798246,-71.880703 +6241,CT,Dayville,41.854045,-71.868342 +6242,CT,Eastford,41.877104,-72.089451 +6243,CT,East Killingly,41.848756,-71.798534 +6247,CT,Hampton,41.761668,-72.067979 +6248,CT,Hebron,41.684161,-72.398553 +6249,CT,Lebanon,41.632988,-72.244035 +6250,CT,Mansfield Center,41.769814,-72.201112 +6254,CT,North Franklin,41.616141,-72.142544 +6255,CT,North Grosvenord,41.987878,-71.902734 +6256,CT,North Windham,41.745144,-72.160106 +6259,CT,Pomfret Center,41.869683,-71.98201 +6260,CT,Putnam,41.91853,-71.896804 +6262,CT,Quinebaug,42.021747,-71.939137 +6264,CT,Scotland,41.689849,-72.078263 +6266,CT,South Windham,41.667724,-72.168112 +6268,CT,Storrs Mansfield,41.805364,-72.257172 +6277,CT,Thompson,41.980285,-71.837587 +6278,CT,Warrenville,41.86434,-72.15873 +6279,CT,West Willington,41.873996,-72.272774 +6280,CT,Windham,41.702652,-72.15261 +6281,CT,Woodstock,41.960218,-72.004027 +6282,CT,Woodstock Valley,41.915296,-72.09366 +6320,CT,New London,41.350718,-72.106245 +6330,CT,Baltic,41.62629,-72.077499 +6331,CT,Canterbury,41.684403,-72.000985 +6333,CT,East Lyme,41.366806,-72.232987 +6334,CT,Bozrah,41.546515,-72.171078 +6335,CT,Gales Ferry,41.42852,-72.06719 +6336,CT,Gilman,41.58117,-72.126623 +6339,CT,Ledyard,41.44014,-71.995626 +6340,CT,Groton,41.357171,-72.057947 +6349,CT,Groton,41.397648,-72.090058 +6351,CT,Jewett City,41.605182,-71.980759 +6353,CT,Montville,41.445331,-72.126476 +6354,CT,Moosup,41.721031,-71.884962 +6355,CT,Mystic,41.361626,-71.977364 +6357,CT,Niantic,41.3253,-72.210819 +6359,CT,North Stonington,41.453113,-71.872701 +6360,CT,Norwich,41.537055,-72.08494 +6365,CT,Preston,41.522061,-72.021079 +6370,CT,Oakdale,41.470573,-72.190358 +6371,CT,Old Lyme,41.334745,-72.308562 +6374,CT,Plainfield,41.67753,-71.921968 +6375,CT,Quaker Hill,41.40324,-72.11722 +6377,CT,Sterling,41.715629,-71.819588 +6378,CT,Stonington,41.366437,-71.915544 +6379,CT,Pawcatuck,41.373475,-71.847761 +6380,CT,Taftville,41.565263,-72.052877 +6382,CT,Uncasville,41.462168,-72.112556 +6384,CT,Voluntown,41.583053,-71.855002 +6385,CT,Waterford,41.346853,-72.145816 +6401,CT,Ansonia,41.342712,-73.074211 +6403,CT,Beacon Falls,41.436917,-73.059656 +6405,CT,Branford,41.279991,-72.810643 +6409,CT,Centerbrook,41.34743,-72.41731 +6410,CT,Cheshire,41.505473,-72.908127 +6412,CT,Chester,41.404903,-72.464293 +6413,CT,Clinton,41.29117,-72.527973 +6415,CT,Colchester,41.566198,-72.344123 +6416,CT,Cromwell,41.61049,-72.666317 +6417,CT,Deep River,41.376478,-72.448568 +6418,CT,Derby,41.322858,-73.080035 +6419,CT,Killingworth,41.369622,-72.571192 +6420,CT,Salem,41.496627,-72.272454 +6422,CT,Durham,41.464951,-72.68752 +6423,CT,East Haddam,41.469575,-72.405876 +6424,CT,East Hampton,41.576058,-72.509345 +6426,CT,Essex,41.354944,-72.396504 +6430,CT,Fairfield,41.166442,-73.257109 +6432,CT,Fairfield,41.201651,-73.235408 +6437,CT,Guilford,41.31537,-72.69679 +6438,CT,Haddam,41.462718,-72.504988 +6441,CT,Higganum,41.468246,-72.575143 +6442,CT,Ivoryton,41.342101,-72.440387 +6443,CT,Madison,41.309019,-72.615254 +6447,CT,Marlborough,41.641226,-72.460871 +6450,CT,Meriden,41.533396,-72.799734 +6455,CT,Middlefield,41.516789,-72.718624 +6457,CT,Middletown,41.556895,-72.665225 +6460,CT,Milford,41.217466,-73.054948 +6468,CT,Monroe,41.331171,-73.224333 +6469,CT,Moodus,41.507807,-72.441879 +6470,CT,Newtown,41.393095,-73.316744 +6471,CT,North Branford,41.327985,-72.776034 +6472,CT,Northford,41.396219,-72.780909 +6473,CT,North Haven,41.382156,-72.85852 +6475,CT,Old Saybrook,41.291297,-72.385022 +6477,CT,Orange,41.281527,-73.028725 +6478,CT,Oxford,41.420237,-73.12961 +6479,CT,Plantsville,41.579747,-72.899031 +6480,CT,Portland,41.585223,-72.612797 +6481,CT,Rockfall,41.534094,-72.699674 +6482,CT,Sandy Hook,41.408706,-73.248522 +6483,CT,Seymour,41.386209,-73.081745 +6484,CT,Shelton,41.304689,-73.129439 +6488,CT,Southbury,41.476695,-73.224077 +6489,CT,Southington,41.605221,-72.872681 +6490,CT,Southport,41.14527,-73.290205 +6492,CT,Wallingford,41.459997,-72.822179 +6497,CT,Stratford,41.2044,-73.135594 +6498,CT,Westbrook,41.292662,-72.456313 +6510,CT,New Haven,41.308701,-72.92706 +6511,CT,New Haven,41.318364,-72.931771 +6512,CT,East Haven,41.280522,-72.874144 +6513,CT,East Haven,41.314215,-72.882554 +6514,CT,Hamden,41.361987,-72.93613 +6515,CT,New Haven,41.329301,-72.966445 +6516,CT,West Haven,41.270079,-72.963842 +6517,CT,Hamden,41.348393,-72.911678 +6518,CT,Hamden,41.409664,-72.911001 +6519,CT,New Haven,41.296284,-72.937307 +6524,CT,Bethany,41.426194,-73.000704 +6525,CT,Woodbridge,41.351668,-73.013902 +6604,CT,Bridgeport,41.179574,-73.201859 +6605,CT,Bridgeport,41.166796,-73.216251 +6606,CT,Bridgeport,41.20907,-73.208619 +6607,CT,Bridgeport,41.178382,-73.165048 +6608,CT,Bridgeport,41.189466,-73.181141 +6610,CT,Bridgeport,41.200508,-73.168771 +6611,CT,Trumbull,41.25641,-73.211063 +6612,CT,Easton,41.252328,-73.287108 +6702,CT,Waterbury,41.556568,-73.038545 +6704,CT,Waterbury,41.575435,-73.031805 +6705,CT,Waterbury,41.550328,-72.996268 +6706,CT,Waterbury,41.536261,-73.03064 +6708,CT,Waterbury,41.551102,-73.064495 +6710,CT,Waterbury,41.567503,-73.046821 +6712,CT,Prospect,41.502198,-72.978803 +6716,CT,Wolcott,41.596995,-72.982799 +6750,CT,Bantam,41.721483,-73.252028 +6751,CT,Bethlehem,41.638683,-73.209098 +6752,CT,Bridgewater,41.528684,-73.360936 +6754,CT,Warren,41.770084,-73.367472 +6755,CT,Gaylordsville,41.648635,-73.483524 +6756,CT,Goshen,41.833452,-73.242876 +6757,CT,Kent,41.731619,-73.458345 +6758,CT,Lakeside,41.69001,-73.238235 +6759,CT,Litchfield,41.754069,-73.200011 +6762,CT,Middlebury,41.534277,-73.11307 +6763,CT,Morris,41.688121,-73.176509 +6770,CT,Naugatuck,41.492039,-73.049342 +6776,CT,New Milford,41.581745,-73.412752 +6777,CT,New Preston Marb,41.689373,-73.349296 +6778,CT,Northfield,41.707382,-73.132079 +6779,CT,Oakville,41.590932,-73.087311 +6782,CT,Plymouth,41.661121,-73.044887 +6783,CT,Roxbury,41.5509,-73.299346 +6784,CT,Sherman,41.571366,-73.494694 +6785,CT,South Kent,41.695051,-73.469023 +6786,CT,Terryville,41.676197,-73.009214 +6787,CT,Thomaston,41.678643,-73.088557 +6790,CT,Torrington,41.813065,-73.115579 +6791,CT,Harwinton,41.770145,-73.072819 +6793,CT,Washington Depot,41.634595,-73.293518 +6794,CT,Washington Depot,41.655924,-73.327352 +6795,CT,Watertown,41.605654,-73.122122 +6796,CT,West Cornwall,41.868888,-73.331271 +6798,CT,Woodbury,41.552061,-73.208264 +6801,CT,Bethel,41.381298,-73.400827 +6804,CT,Brookfield,41.46504,-73.397986 +6807,CT,Cos Cob,41.052952,-73.593498 +6810,CT,Danbury,41.391663,-73.453165 +6811,CT,Danbury,41.423983,-73.471587 +6812,CT,New Fairfield,41.472999,-73.497784 +6820,CT,Darien,41.076759,-73.485254 +6830,CT,Byram,41.030238,-73.630047 +6831,CT,Greenwich,41.054885,-73.659405 +6840,CT,New Canaan,41.151024,-73.494356 +6850,CT,Norwalk,41.12222,-73.435827 +6851,CT,Norwalk,41.132346,-73.405802 +6853,CT,Norwalk,41.070243,-73.439667 +6854,CT,Norwalk,41.095722,-73.428485 +6855,CT,Norwalk,41.101382,-73.401119 +6870,CT,Old Greenwich,41.035437,-73.567253 +6877,CT,Ridgefield,41.297683,-73.497268 +6878,CT,Riverside,41.037998,-73.581136 +6880,CT,Westport,41.143433,-73.349579 +6883,CT,Weston,41.219499,-73.371474 +6896,CT,West Redding,41.306915,-73.3935 +6897,CT,Wilton,41.201761,-73.438323 +6901,CT,Stamford,41.053083,-73.539039 +6902,CT,Stamford,41.052552,-73.537428 +6903,CT,Stamford,41.135235,-73.568356 +6905,CT,Ridgeway,41.082576,-73.543757 +6906,CT,Stamford,41.069218,-73.523563 +6907,CT,Stamford,41.094206,-73.520297 +19701,DE,Bear,39.610187,-75.674729 +19702,DE,Newark,39.634869,-75.699339 +19703,DE,Claymont,39.804432,-75.46494 +19707,DE,Hockessin,39.77604,-75.688873 +19709,DE,Middletown,39.481535,-75.683183 +19711,DE,Newark,39.701129,-75.737534 +19713,DE,Newark,39.669881,-75.715101 +19720,DE,Manor,39.67703,-75.589938 +19734,DE,Townsend,39.381882,-75.683368 +19801,DE,Wilmington,39.737752,-75.549658 +19802,DE,Wilmington,39.75638,-75.534041 +19803,DE,Talleyville,39.793236,-75.531076 +19804,DE,Newport,39.720854,-75.612815 +19805,DE,Wilmington,39.743375,-75.582724 +19806,DE,Wilmington,39.757076,-75.563503 +19807,DE,Greenville,39.782206,-75.607205 +19808,DE,Marshallton,39.734737,-75.663891 +19809,DE,Edgemoor,39.771913,-75.494592 +19810,DE,Edgemoor,39.819377,-75.505999 +19901,DE,Dover,39.156639,-75.535983 +19902,DE,Dover Afb,39.120246,-75.478966 +19930,DE,Bethany Beach,38.531009,-75.067396 +19931,DE,Bethel,38.568517,-75.624298 +19933,DE,Bridgeville,38.736628,-75.608768 +19934,DE,Camden Wyoming,39.099099,-75.596559 +19938,DE,Clayton,39.256395,-75.690361 +19939,DE,Dagsboro,38.559559,-75.21133 +19940,DE,Delmar,38.476955,-75.575887 +19941,DE,Ellendale,38.805737,-75.405588 +19943,DE,Felton,39.022538,-75.582906 +19945,DE,Frankford,38.51767,-75.200633 +19946,DE,Frederica,39.034188,-75.454458 +19947,DE,Georgetown,38.679006,-75.393198 +19950,DE,Greenwood,38.817519,-75.593547 +19951,DE,Harbeson,38.672294,-75.223621 +19952,DE,Harrington,38.924031,-75.584268 +19953,DE,Hartly,39.15421,-75.693476 +19954,DE,Houston,38.91143,-75.506354 +19956,DE,Laurel,38.553695,-75.563052 +19958,DE,Lewes,38.738149,-75.174702 +19960,DE,Lincoln,38.86128,-75.399961 +19962,DE,Magnolia,39.07353,-75.508321 +19963,DE,Milford,38.921801,-75.429877 +19964,DE,Marydel,39.099794,-75.728661 +19966,DE,Long Neck,38.593436,-75.255547 +19967,DE,Millville,38.558946,-75.107762 +19968,DE,Milton,38.768687,-75.295298 +19970,DE,Millville,38.555528,-75.096518 +19971,DE,Dewey Beach,38.714715,-75.107346 +19973,DE,Seaford,38.640358,-75.604122 +19975,DE,Selbyville,38.465357,-75.157325 +19977,DE,Smyrna,39.293379,-75.600832 +19979,DE,Viola,39.041872,-75.572605 +20001,DC,Washington,38.912217,-77.017691 +20002,DC,Washington,38.902365,-76.990055 +20003,DC,Washington,38.882941,-76.989539 +20004,DC,Washington,38.892955,-77.026303 +20005,DC,Washington,38.906731,-77.031236 +20006,DC,Washington,38.896444,-77.044701 +20007,DC,Washington,38.914365,-77.074042 +20008,DC,Washington,38.936282,-77.059936 +20009,DC,Washington,38.920202,-77.037504 +20010,DC,Washington,38.93272,-77.032183 +20011,DC,Washington,38.951786,-77.020251 +20012,DC,Washington,38.975712,-77.028248 +20015,DC,Washington,38.965768,-77.067961 +20016,DC,Washington,38.938117,-77.086037 +20017,DC,Washington,38.936723,-76.994038 +20018,DC,Washington,38.927724,-76.976159 +20019,DC,Washington,38.890237,-76.937588 +20020,DC,Washington,38.860039,-76.974187 +20024,DC,Washington,38.875939,-77.016028 +20032,DC,Washington,38.833843,-76.999549 +20036,DC,Washington,38.908704,-77.041434 +20037,DC,Washington,38.901446,-77.050448 +20301,DC,Pentagon,38.891019,-77.038196 +20336,DC,Washington,38.839473,-77.014827 +32008,FL,Branford,29.939472,-82.899288 +32009,FL,Bryceville,30.419274,-81.972397 +32011,FL,Callahan,30.551958,-81.814465 +32013,FL,Day,30.149666,-83.285052 +32033,FL,Elkton,29.788243,-81.46199 +32034,FL,Amelia Island,30.635388,-81.468829 +32038,FL,Fort White,29.92073,-82.687938 +32040,FL,Glen Saint Mary,30.286058,-82.204056 +32043,FL,Green Cove Sprin,30.00425,-81.726182 +32044,FL,Hampton,29.857511,-82.148347 +32046,FL,Hilliard,30.688367,-81.93453 +32052,FL,Jasper,30.502914,-82.932186 +32053,FL,Jennings,30.548243,-83.134971 +32054,FL,Lake Butler,30.003485,-82.382796 +32055,FL,Lake City,30.165239,-82.659888 +32058,FL,Lawtey,30.047164,-82.105544 +32059,FL,Lee,30.397863,-83.284392 +32060,FL,Boys Ranch,30.286622,-83.024994 +32061,FL,Lulu,30.07544,-82.538481 +32062,FL,Mc Alpin,30.150899,-82.966182 +32063,FL,Macclenny,30.273671,-82.132475 +32065,FL,Orange Park,30.138233,-81.774199 +32066,FL,Mayo,30.039979,-83.146208 +32068,FL,Middleburg,30.083984,-81.864476 +32071,FL,O Brien,30.038114,-82.93005 +32073,FL,Orange Park,30.16369,-81.72907 +32082,FL,Ponte Vedra Beac,30.215326,-81.386383 +32083,FL,Raiford,30.070379,-82.20012 +32084,FL,Saint Augustine,29.880457,-81.298367 +32086,FL,Saint Augustine,29.828514,-81.323734 +32087,FL,Sanderson,30.302536,-82.337741 +32091,FL,Starke,29.958299,-82.118518 +32092,FL,Saint Augustine,29.947511,-81.526379 +32094,FL,Wellborn,30.179624,-82.850532 +32095,FL,Saint Augustine,29.905726,-81.347626 +32096,FL,White Springs,30.338749,-82.776453 +32097,FL,Yulee,30.622225,-81.590603 +32102,FL,Astor,29.165031,-81.539929 +32110,FL,Bunnell,29.45616,-81.324431 +32112,FL,Crescent City,29.445438,-81.557909 +32113,FL,Citra,29.39182,-82.106222 +32114,FL,Daytona Beach,29.201168,-81.037071 +32117,FL,Holly Hill,29.236006,-81.054698 +32118,FL,Daytona Beach,29.221874,-81.009469 +32119,FL,Dunlawton,29.152526,-81.022142 +32124,FL,Port Orange,29.122456,-81.106746 +32127,FL,Port Orange,29.1124,-80.988351 +32130,FL,De Leon Springs,29.116592,-81.348762 +32131,FL,East Palatka,29.660861,-81.587879 +32132,FL,Edgewater,28.981801,-80.910344 +32134,FL,Salt Springs,29.279554,-81.887757 +32136,FL,Flagler Beach,29.474978,-81.130288 +32137,FL,Palm Coast,29.556515,-81.21899 +32139,FL,Georgetown,29.403315,-81.629783 +32140,FL,Florahome,29.758105,-81.862224 +32141,FL,Edgewater,28.945481,-80.896869 +32145,FL,Hastings,29.705147,-81.490908 +32148,FL,Interlachen,29.627001,-81.889432 +32159,FL,Lady Lake,28.929939,-81.925598 +32168,FL,New Smyrna Beach,29.024672,-80.958436 +32169,FL,New Smyrna Beach,29.017196,-80.888463 +32174,FL,Ormond Beach,29.283305,-81.088216 +32176,FL,Ormond Beach,29.322192,-81.058432 +32177,FL,Palatka,29.657748,-81.659452 +32179,FL,Ocklawaha,29.064308,-81.88569 +32180,FL,Pierson,29.222596,-81.43533 +32181,FL,Pomona Park,29.502106,-81.630739 +32187,FL,San Mateo,29.588827,-81.5921 +32189,FL,Satsuma,29.559354,-81.640596 +32190,FL,Seville,29.320084,-81.527894 +32195,FL,Weirsdale,28.978182,-81.893168 +32202,FL,Jacksonville,30.329882,-81.651672 +32204,FL,Jacksonville,30.318899,-81.685445 +32205,FL,Jacksonville,30.317236,-81.722034 +32206,FL,Jacksonville,30.351073,-81.648769 +32207,FL,Jacksonville,30.290766,-81.63205 +32208,FL,Jacksonville,30.393664,-81.688939 +32209,FL,Jacksonville,30.35841,-81.691974 +32210,FL,Jacksonville,30.268743,-81.747312 +32211,FL,Jacksonville,30.348034,-81.588248 +32212,FL,Jacksonville N A,30.220905,-81.68848 +32215,FL,Cecil Field Nas,30.23295,-81.663142 +32216,FL,Jacksonville,30.293907,-81.547387 +32217,FL,Jacksonville,30.240678,-81.616956 +32218,FL,Jacksonville,30.45067,-81.662631 +32219,FL,Jacksonville,30.403365,-81.763451 +32220,FL,Jacksonville,30.329003,-81.817572 +32221,FL,Jacksonville,30.283707,-81.820231 +32222,FL,Jacksonville,30.229176,-81.813081 +32223,FL,Jacksonville,30.154817,-81.629961 +32224,FL,Jacksonville,30.303076,-81.440427 +32225,FL,Jacksonville,30.350968,-81.506092 +32226,FL,Jacksonville,30.473485,-81.544808 +32227,FL,Jacksonville Bea,30.388275,-81.405424 +32233,FL,Atlantic Beach,30.348258,-81.415866 +32234,FL,Baldwin,30.229562,-81.978345 +32244,FL,Jacksonville,30.223137,-81.75558 +32250,FL,Jacksonville Bea,30.28319,-81.406243 +32256,FL,Jacksonville,30.221356,-81.557139 +32257,FL,Jacksonville,30.192703,-81.605042 +32258,FL,Jacksonville,30.145944,-81.573864 +32259,FL,Jacksonville,30.095578,-81.621701 +32266,FL,Neptune Beach,30.31548,-81.405123 +32301,FL,Tallahassee,30.428563,-84.259337 +32303,FL,Tallahassee,30.487433,-84.318946 +32304,FL,Tallahassee,30.447752,-84.321132 +32306,FL,Tallahassee,30.442152,-84.295594 +32308,FL,Tallahassee,30.507725,-84.206903 +32310,FL,Tallahassee,30.399125,-84.3298 +32311,FL,Tallahassee,30.415625,-84.186995 +32312,FL,Tallahassee,30.518474,-84.262708 +32320,FL,Apalachicola,29.725465,-85.006264 +32321,FL,Bristol,30.422279,-84.946558 +32322,FL,Carrabelle,29.869205,-84.635845 +32324,FL,Chattahoochee,30.683394,-84.828044 +32327,FL,Crawfordville,30.210831,-84.320479 +32328,FL,Saint George Isl,29.733906,-84.8701 +32331,FL,Greenville,30.451199,-83.647397 +32333,FL,Havana,30.609242,-84.41434 +32334,FL,Hosford,30.363875,-84.805433 +32336,FL,Lamont,30.365341,-83.900266 +32340,FL,Madison,30.480209,-83.406678 +32344,FL,Monticello,30.519681,-83.892454 +32346,FL,Panacea,30.015322,-84.391212 +32347,FL,Perry,30.097489,-83.585021 +32350,FL,Pinetta,30.599703,-83.340463 +32351,FL,Quincy,30.586675,-84.60945 +32356,FL,Salem,29.823815,-83.385828 +32358,FL,Sopchoppy,30.071353,-84.454877 +32359,FL,Steinhatchee,29.673871,-83.372332 +32401,FL,Panama City,30.160624,-85.649403 +32403,FL,Panama City,30.058252,-85.576225 +32404,FL,Panama City,30.165291,-85.576264 +32405,FL,Panama City,30.194949,-85.672686 +32407,FL,Panama City Beac,30.194623,-85.791984 +32408,FL,Panama City Beac,30.160859,-85.763628 +32409,FL,Southport,30.310679,-85.644536 +32413,FL,Panama City Beac,30.245835,-85.904946 +32420,FL,Alford,30.714106,-85.34838 +32421,FL,Altha,30.531882,-85.17043 +32423,FL,Bascom,30.951365,-85.09722 +32424,FL,Blountstown,30.4394,-85.062022 +32425,FL,Bonifay,30.846369,-85.689962 +32426,FL,Campbellton,30.95629,-85.376596 +32427,FL,Caryville,30.796878,-85.799787 +32428,FL,Chipley,30.710658,-85.548646 +32430,FL,Clarksville,30.356834,-85.189806 +32431,FL,Cottondale,30.800359,-85.384672 +32433,FL,De Funiak Spring,30.751783,-86.138006 +32437,FL,Ebro,30.435181,-85.888066 +32438,FL,Fountain,30.475327,-85.429272 +32439,FL,Freeport,30.489596,-86.168441 +32440,FL,Graceville,30.942601,-85.513622 +32442,FL,Grand Ridge,30.714831,-85.020954 +32443,FL,Greenwood,30.852506,-85.15549 +32444,FL,Lynn Haven,30.236165,-85.646658 +32445,FL,Malone,30.960245,-85.163874 +32446,FL,Marianna,30.758587,-85.229367 +32449,FL,Kinard,30.263241,-85.206467 +32455,FL,Ponce De Leon,30.704146,-85.954633 +32456,FL,Port Saint Joe,29.83539,-85.298787 +32459,FL,Santa Rosa Beach,30.365883,-86.245809 +32460,FL,Sneads,30.727619,-84.933655 +32462,FL,Vernon,30.62668,-85.755286 +32464,FL,Westville,30.874689,-85.912973 +32465,FL,Wewahitchka,30.093255,-85.20483 +32466,FL,Youngstown,30.326913,-85.516881 +32501,FL,Pensacola,30.422282,-87.224763 +32503,FL,Pensacola,30.456406,-87.210432 +32504,FL,Pensacola,30.487299,-87.187242 +32505,FL,Pensacola,30.448069,-87.258937 +32506,FL,Pensacola,30.412912,-87.309185 +32507,FL,Pensacola,30.373707,-87.312558 +32508,FL,Pensacola,30.351063,-87.274945 +32514,FL,Pensacola,30.524148,-87.216723 +32526,FL,Pensacola,30.475593,-87.317925 +32531,FL,Baker,30.831569,-86.677015 +32533,FL,Cantonment,30.614253,-87.325052 +32534,FL,Pensacola,30.530065,-87.279324 +32535,FL,Century,30.968742,-87.321582 +32536,FL,Crestview,30.77061,-86.553678 +32541,FL,Sandestin,30.397198,-86.484903 +32542,FL,Eglin A F B,30.479409,-86.615958 +32547,FL,Fort Walton Beac,30.447297,-86.627487 +32548,FL,Fort Walton Beac,30.415262,-86.621479 +32561,FL,Gulf Breeze,30.3847,-87.043875 +32564,FL,Holt,30.72522,-86.704638 +32565,FL,Jay,30.898488,-87.133237 +32566,FL,Navarre,30.590261,-86.937102 +32567,FL,Laurel Hill,30.95236,-86.400323 +32568,FL,Walnut Hill,30.870043,-87.449628 +32569,FL,Mary Esther,30.412186,-86.712719 +32570,FL,Milton,30.660413,-87.047278 +32571,FL,Pace,30.616173,-87.15033 +32578,FL,Niceville,30.495771,-86.41446 +32579,FL,Shalimar,30.445565,-86.571724 +32580,FL,Valparaiso,30.509197,-86.500914 +32583,FL,Milton,30.576058,-87.066273 +32601,FL,Gainesville,29.645029,-82.310046 +32603,FL,Gainesville,29.651484,-82.349286 +32605,FL,Gainesville,29.678458,-82.36794 +32606,FL,Gainesville,29.695393,-82.402324 +32607,FL,Gainesville,29.645618,-82.403252 +32608,FL,Gainesville,29.613204,-82.387282 +32609,FL,Gainesville,29.70053,-82.308032 +32611,FL,Gainesville,29.644148,-82.35092 +32615,FL,Santa Fe,29.796996,-82.480531 +32617,FL,Anthony,29.304785,-82.126157 +32618,FL,Archer,29.559738,-82.51084 +32619,FL,Bell,29.78373,-82.871106 +32620,FL,32620,29.050444,-82.04621 +32621,FL,Bronson,29.460952,-82.635644 +32622,FL,Brooker,29.919028,-82.295634 +32625,FL,Cedar Key,29.171006,-83.016793 +32626,FL,Chiefland,29.483243,-82.880896 +32629,FL,32629,28.910801,-82.60677 +32630,FL,32630,29.063564,-82.433118 +32631,FL,Earleton,29.722159,-82.113762 +32636,FL,32636,28.742508,-82.290401 +32640,FL,Hawthorne,29.573998,-82.105625 +32642,FL,32642,28.926371,-82.392516 +32643,FL,High Springs,29.841022,-82.615628 +32646,FL,32646,28.785839,-82.593623 +32648,FL,Horseshoe Beach,29.48689,-83.261587 +32649,FL,32649,29.076034,-82.661343 +32650,FL,32650,28.851002,-82.320713 +32652,FL,32652,28.80514,-82.343647 +32656,FL,Keystone Heights,29.797579,-81.989885 +32661,FL,32661,28.824661,-82.528448 +32665,FL,32665,28.911886,-82.501478 +32666,FL,Melrose,29.732456,-82.027863 +32667,FL,Micanopy,29.526029,-82.279698 +32668,FL,Morriston,29.28126,-82.491668 +32669,FL,Newberry,29.660906,-82.585188 +32670,FL,32670,29.216545,-82.111182 +32671,FL,32671,29.166825,-82.090654 +32672,FL,32672,29.109572,-82.012052 +32673,FL,32673,28.991755,-82.231082 +32674,FL,32674,29.161336,-82.172984 +32675,FL,32675,29.209198,-82.231943 +32676,FL,32676,29.078026,-82.18804 +32680,FL,Old Town,29.624558,-83.057393 +32684,FL,32684,28.920137,-82.037814 +32686,FL,Reddick,29.375352,-82.243995 +32688,FL,32688,29.226185,-82.043715 +32691,FL,32691,28.999563,-82.046434 +32693,FL,Trenton,29.626375,-82.809345 +32694,FL,Waldo,29.787096,-82.160791 +32696,FL,Williston,29.397737,-82.485601 +32698,FL,32698,29.022103,-82.728163 +32701,FL,Altamonte Spring,28.662728,-81.371908 +32702,FL,Altoona,29.021935,-81.632322 +32703,FL,Hunt Club,28.661865,-81.485149 +32707,FL,Casselberry,28.661671,-81.312215 +32708,FL,Winter Springs,28.683097,-81.281367 +32709,FL,Christmas,28.546244,-81.01157 +32712,FL,Apopka,28.711976,-81.513615 +32713,FL,Debary,28.884573,-81.306506 +32714,FL,Forest City,28.664983,-81.408533 +32720,FL,Deland,29.02659,-81.334853 +32724,FL,Deland,29.04225,-81.286341 +32725,FL,Deltona,28.898897,-81.247307 +32726,FL,Eustis,28.857686,-81.64513 +32730,FL,Fern Park,28.651161,-81.341837 +32732,FL,Geneva,28.750299,-81.11137 +32735,FL,Grand Island,28.886552,-81.739093 +32738,FL,Deltona,28.909311,-81.192171 +32744,FL,Lake Helen,28.980567,-81.233367 +32746,FL,Heathrow,28.752352,-81.338075 +32750,FL,Longwood,28.711994,-81.355238 +32751,FL,Eatonville,28.631284,-81.354598 +32754,FL,Mims,28.697383,-80.866278 +32757,FL,Mount Dora,28.792787,-81.645593 +32759,FL,Oak Hill,28.869985,-80.855063 +32763,FL,Orange City,28.945291,-81.299524 +32764,FL,Osteen,28.842617,-81.156224 +32765,FL,Oviedo,28.651256,-81.206593 +32766,FL,Chuluota,28.640634,-81.118237 +32767,FL,Paisley,28.999323,-81.503009 +32771,FL,Sanford,28.801307,-81.285044 +32773,FL,Sanford,28.764385,-81.282042 +32776,FL,Sorrento,28.803519,-81.532317 +32778,FL,Tavares,28.801027,-81.73405 +32779,FL,Springs Plaza,28.703978,-81.422767 +32780,FL,Titusville,28.569712,-80.819141 +32784,FL,Dona Vista,28.931443,-81.671653 +32789,FL,Winter Park,28.597824,-81.353436 +32792,FL,Aloma,28.60779,-81.302112 +32796,FL,Titusville,28.627078,-80.842915 +32798,FL,Zellwood,28.71944,-81.576174 +32801,FL,Orlando,28.539882,-81.372668 +32803,FL,Orlando,28.555897,-81.353462 +32804,FL,Fairvilla,28.576547,-81.391955 +32805,FL,Orlando,28.5302,-81.404516 +32806,FL,Orlando,28.513958,-81.356968 +32807,FL,Azalea Park,28.544924,-81.305274 +32808,FL,Pine Hills,28.580463,-81.44758 +32809,FL,Pine Castle,28.461916,-81.381751 +32810,FL,Lockhart,28.622183,-81.425852 +32811,FL,Orlo Vista,28.516082,-81.442014 +32812,FL,Orlando,28.49981,-81.328816 +32813,FL,Naval Training C,28.570467,-81.328966 +32815,FL,Kennedy Space Ce,28.498821,-80.58248 +32817,FL,Union Park,28.590251,-81.253537 +32818,FL,Orlando,28.580147,-81.484618 +32819,FL,Sand Lake,28.467258,-81.452484 +32820,FL,Union Park,28.578256,-81.110628 +32821,FL,Orlando,28.395724,-81.466602 +32822,FL,Ventura,28.504765,-81.293874 +32824,FL,Orlando,28.393157,-81.362187 +32825,FL,Orlando,28.546865,-81.257081 +32826,FL,Orlando,28.582601,-81.190705 +32827,FL,Orlando,28.43168,-81.342979 +32828,FL,Orlando,28.552297,-81.179489 +32829,FL,Orlando,28.484877,-81.260778 +32830,FL,Lake Buena Vista,28.369378,-81.519034 +32831,FL,Orlando,28.488229,-81.191768 +32832,FL,Orlando,28.377428,-81.188807 +32833,FL,Union Park,28.531797,-81.098129 +32835,FL,Orlando,28.528885,-81.478663 +32836,FL,Orlando,28.460842,-81.49564 +32837,FL,Orlando,28.394861,-81.417882 +32839,FL,Orlando,28.487102,-81.408162 +32901,FL,Melbourne,28.069132,-80.620015 +32903,FL,Indialantic,28.109059,-80.578718 +32904,FL,Melbourne Villag,28.073177,-80.668577 +32905,FL,Palm Bay,28.014605,-80.599087 +32907,FL,Palm Bay,28.016849,-80.673889 +32908,FL,Palm Bay,27.981636,-80.689426 +32909,FL,Palm Bay,27.96936,-80.647327 +32920,FL,Cape Canaveral,28.39034,-80.604267 +32922,FL,Cocoa,28.367183,-80.746455 +32925,FL,Patrick A F B,28.259896,-80.607126 +32926,FL,Cocoa,28.390987,-80.786969 +32927,FL,Port Saint John,28.46844,-80.791114 +32931,FL,Cocoa Beach,28.332451,-80.612066 +32934,FL,Eau Gallie,28.136822,-80.691683 +32935,FL,Melbourne,28.138385,-80.652353 +32937,FL,Indian Harbor Be,28.178571,-80.598671 +32940,FL,Melbourne,28.206136,-80.684959 +32948,FL,Fellsmere,27.764273,-80.601947 +32951,FL,Melbourne Beach,28.021923,-80.538936 +32952,FL,Merritt Island,28.328607,-80.67818 +32953,FL,Merritt Island,28.391234,-80.695865 +32955,FL,Rockledge,28.313441,-80.73193 +32958,FL,Sebastian,27.790082,-80.478432 +32960,FL,Vero Beach,27.632985,-80.403075 +32962,FL,Vero Beach,27.588486,-80.392251 +32963,FL,Indian River Sho,27.653623,-80.360916 +32966,FL,Vero Beach,27.637214,-80.47939 +32967,FL,Vero Beach,27.697223,-80.441617 +32968,FL,Vero Beach,27.59993,-80.438223 +32976,FL,Barefoot Bay,27.878146,-80.516051 +33004,FL,Dania,26.047557,-80.144728 +33009,FL,Hallandale,25.985019,-80.140737 +33010,FL,Hialeah,25.832536,-80.280801 +33012,FL,Hialeah,25.865395,-80.3059 +33013,FL,Hialeah,25.859351,-80.272533 +33014,FL,Hialeah,25.896349,-80.306255 +33015,FL,Hialeah,25.938841,-80.316545 +33016,FL,Hialeah,25.880262,-80.33681 +33019,FL,Hollywood,26.007011,-80.121931 +33020,FL,Hollywood,26.016091,-80.15166 +33021,FL,Hollywood,26.021836,-80.189085 +33023,FL,Miramar,25.987516,-80.216035 +33024,FL,Pembroke Pines,26.024273,-80.240183 +33025,FL,Hollywood,25.992061,-80.271236 +33026,FL,Hollywood,26.022927,-80.297441 +33027,FL,Hollywood,25.997449,-80.32484 +33028,FL,Hollywood,26.024804,-80.330797 +33029,FL,Pembroke Pines,26.01375,-80.428407 +33030,FL,Homestead,25.476639,-80.483853 +33031,FL,Homestead,25.532314,-80.507463 +33032,FL,Princeton,25.521191,-80.40918 +33033,FL,Homestead,25.490576,-80.438014 +33034,FL,Florida City,25.396332,-80.548438 +33035,FL,Homestead,25.457338,-80.457153 +33036,FL,Islamorada,24.923331,-80.629953 +33037,FL,Ocean Reef,25.140214,-80.406084 +33039,FL,Homestead Air Fo,25.499088,-80.390513 +33040,FL,Naval Air Statio,24.565313,-81.762179 +33042,FL,Summerland Key,24.655322,-81.493564 +33043,FL,Big Pine Key,24.679996,-81.362029 +33050,FL,Marathon,24.727919,-81.038581 +33054,FL,Opa Locka,25.909662,-80.247004 +33055,FL,Carol City,25.944076,-80.277291 +33056,FL,Carol City,25.946906,-80.248059 +33060,FL,Pompano Beach,26.231529,-80.12346 +33062,FL,Pompano Beach,26.234314,-80.094133 +33063,FL,Margate,26.249221,-80.211483 +33064,FL,Lighthouse Point,26.278698,-80.112439 +33065,FL,Coral Springs,26.271403,-80.255578 +33066,FL,Margate,26.254237,-80.177878 +33067,FL,North Coral Spri,26.305134,-80.22188 +33068,FL,Pompano Beach,26.216021,-80.22054 +33069,FL,Pompano Beach,26.228817,-80.163486 +33070,FL,Tavernier,25.010788,-80.521816 +33071,FL,Pompano Beach,26.243515,-80.260085 +33073,FL,Pompano Beach,26.299693,-80.180966 +33076,FL,Pompano Beach,26.291902,-80.248086 +33122,FL,Miami,25.7911,-80.320733 +33125,FL,Miami,25.782547,-80.234118 +33126,FL,Miami,25.776255,-80.291932 +33127,FL,Miami,25.814344,-80.205121 +33128,FL,Miami,25.775612,-80.208858 +33129,FL,Miami,25.755926,-80.201301 +33130,FL,Miami,25.767197,-80.205888 +33131,FL,Miami,25.762852,-80.189506 +33132,FL,Miami,25.786712,-80.179996 +33133,FL,Coral Gables,25.732251,-80.243639 +33134,FL,Coral Gables,25.755582,-80.269576 +33135,FL,Miami,25.766391,-80.231746 +33136,FL,Miami,25.786385,-80.204232 +33137,FL,Miami,25.815648,-80.189663 +33138,FL,Miami Shores,25.850208,-80.18526 +33139,FL,Carl Fisher,25.785179,-80.136378 +33140,FL,Miami,25.819505,-80.127921 +33141,FL,North Bay Villag,25.852384,-80.133578 +33142,FL,Miami,25.812966,-80.232023 +33143,FL,South Miami,25.700252,-80.301408 +33144,FL,Miami,25.762563,-80.309631 +33145,FL,Coral Gables,25.752648,-80.235134 +33146,FL,Coral Gables,25.720089,-80.274649 +33147,FL,Miami,25.850675,-80.236558 +33149,FL,Key Biscayne,25.692104,-80.162475 +33150,FL,Miami,25.851214,-80.206968 +33154,FL,Bal Harbour,25.879094,-80.127055 +33155,FL,Miami,25.7392,-80.31032 +33156,FL,Kendall,25.66767,-80.308535 +33157,FL,Perrine,25.604384,-80.352473 +33158,FL,Miami,25.636433,-80.318703 +33160,FL,North Miami Beac,25.936086,-80.135141 +33161,FL,North Miami,25.893806,-80.182034 +33162,FL,North Miami Beac,25.92807,-80.177238 +33165,FL,Olympia Heights,25.735353,-80.359084 +33166,FL,Miami Springs,25.817473,-80.29902 +33167,FL,Miami,25.885605,-80.229168 +33168,FL,Miami,25.890232,-80.210106 +33169,FL,Miami,25.944083,-80.21436 +33170,FL,Quail Heights,25.558847,-80.3981 +33172,FL,Miami,25.773523,-80.357232 +33173,FL,Miami,25.699242,-80.361824 +33174,FL,Miami,25.762779,-80.361128 +33175,FL,Olympia Heights,25.733677,-80.408226 +33176,FL,Miami,25.657449,-80.362667 +33177,FL,Quail Heights,25.593255,-80.39377 +33178,FL,Miami,25.814079,-80.354925 +33179,FL,Miami,25.957095,-80.181382 +33180,FL,Ojus,25.961902,-80.139447 +33181,FL,North Miami Beac,25.896548,-80.160329 +33182,FL,Miami,25.787678,-80.416643 +33183,FL,Miami,25.699977,-80.412969 +33184,FL,Miami,25.757382,-80.402997 +33185,FL,Olympia Heights,25.718082,-80.437366 +33186,FL,Miami,25.669437,-80.408501 +33187,FL,Quail Heights,25.597112,-80.47137 +33189,FL,Quail Heights,25.57431,-80.350851 +33190,FL,Quail Heights,25.560935,-80.35381 +33193,FL,Miami,25.696365,-80.440087 +33196,FL,Miami,25.661502,-80.441031 +33301,FL,Fort Lauderdale,26.121561,-80.128778 +33304,FL,Oakland Park,26.137908,-80.125283 +33305,FL,Oakland Park,26.153115,-80.127768 +33306,FL,Oakland Park,26.165091,-80.112572 +33308,FL,Oakland Park,26.187883,-80.107674 +33309,FL,Fort Lauderdale,26.181698,-80.174624 +33311,FL,Fort Lauderdale,26.142104,-80.172786 +33312,FL,Fort Lauderdale,26.096819,-80.181038 +33313,FL,City Of Sunrise,26.151145,-80.223142 +33314,FL,Davie,26.068199,-80.225034 +33315,FL,Fort Lauderdale,26.098885,-80.15408 +33316,FL,Fort Lauderdale,26.104193,-80.125951 +33317,FL,Plantation,26.113536,-80.224272 +33319,FL,Tamarac,26.181153,-80.225413 +33321,FL,Tamarac,26.212072,-80.264356 +33322,FL,Sunrise,26.151923,-80.271954 +33323,FL,Sunrise,26.164641,-80.307583 +33324,FL,Plantation,26.113639,-80.271019 +33325,FL,Davie,26.10862,-80.321952 +33326,FL,Davie,26.114338,-80.369941 +33327,FL,Fort Lauderdale,26.097291,-80.40645 +33328,FL,Davie,26.060708,-80.272022 +33330,FL,Davie,26.055479,-80.312907 +33331,FL,Davie,26.044366,-80.364533 +33332,FL,Davie,26.054436,-80.41299 +33334,FL,Oakland Park,26.181514,-80.135511 +33351,FL,Tamarac,26.177148,-80.273376 +33388,FL,Fort Lauderdale,26.117586,-80.250587 +33401,FL,West Palm Beach,26.713956,-80.065874 +33403,FL,Lake Park,26.803187,-80.073078 +33404,FL,Riviera Beach,26.781343,-80.06852 +33405,FL,West Palm Beach,26.669968,-80.058234 +33406,FL,Glen Ridge,26.655582,-80.093026 +33407,FL,West Palm Beach,26.749154,-80.072492 +33408,FL,North Palm Beach,26.828854,-80.060334 +33409,FL,Haverhill,26.713218,-80.096347 +33410,FL,Palm Beach Garde,26.844373,-80.087304 +33411,FL,Royal Palm Beach,26.700539,-80.209898 +33412,FL,West Palm Beach,26.805526,-80.248203 +33413,FL,West Palm Beach,26.67616,-80.140474 +33414,FL,West Palm Beach,26.662707,-80.25299 +33415,FL,Haverhill,26.655722,-80.127966 +33417,FL,Haverhill,26.713006,-80.124764 +33418,FL,Palm Beach Garde,26.838977,-80.132533 +33426,FL,Boynton Beach,26.51747,-80.083427 +33428,FL,Boca Raton,26.344605,-80.210942 +33430,FL,Belle Glade,26.684289,-80.672392 +33431,FL,Boca Raton,26.379929,-80.097488 +33432,FL,Boca Raton,26.34619,-80.084421 +33433,FL,Boca Raton,26.346409,-80.156399 +33434,FL,Boca Raton,26.383909,-80.174858 +33435,FL,Briny Breezes,26.529161,-80.06424 +33436,FL,Village Of Golf,26.526862,-80.106423 +33437,FL,Boynton Beach,26.531187,-80.141812 +33438,FL,Canal Point,26.859279,-80.629931 +33440,FL,Clewiston,26.717171,-80.949249 +33441,FL,Deerfield Beach,26.309556,-80.099173 +33442,FL,Deerfield Beach,26.312365,-80.141242 +33444,FL,Delray Beach,26.456445,-80.079321 +33445,FL,Delray Beach,26.456359,-80.105397 +33446,FL,Delray Beach,26.451717,-80.158016 +33455,FL,Hobe Sound,27.081306,-80.150851 +33458,FL,Jupiter,26.933938,-80.120091 +33460,FL,Lake Worth,26.618207,-80.055996 +33461,FL,Lake Worth,26.62316,-80.094573 +33462,FL,Lantana,26.576766,-80.077264 +33463,FL,Greenacres,26.609609,-80.130503 +33467,FL,Lake Worth,26.610366,-80.168299 +33469,FL,Tequesta,26.966066,-80.100161 +33470,FL,Loxahatchee,26.738295,-80.276007 +33471,FL,Moore Haven,26.832749,-81.218776 +33476,FL,Pahokee,26.814199,-80.662897 +33477,FL,Jupiter,26.921701,-80.077034 +33478,FL,Jupiter,26.921242,-80.214388 +33480,FL,Palm Beach,26.72065,-80.038825 +33483,FL,Delray Beach,26.45457,-80.065637 +33484,FL,Delray Beach,26.454272,-80.13459 +33486,FL,Boca Raton,26.348099,-80.110418 +33487,FL,Highland Beach,26.409142,-80.089072 +33493,FL,South Bay,26.670126,-80.731214 +33496,FL,Boca Raton,26.402975,-80.181287 +33498,FL,Boca Raton,26.390693,-80.216087 +33510,FL,Brandon,27.955112,-82.296554 +33511,FL,Brandon,27.905649,-82.288116 +33513,FL,Bushnell,28.661062,-82.155297 +33514,FL,Center Hill,28.663484,-81.996289 +33525,FL,Ridge Manor,28.386912,-82.207936 +33527,FL,Dover,27.991975,-82.213845 +33534,FL,Gibsonton,27.841059,-82.369831 +33538,FL,Lake Panasoffkee,28.795261,-82.136279 +33540,FL,Zephyrhills,28.24096,-82.168347 +33541,FL,Zephyrhills,28.231063,-82.20566 +33543,FL,Wesley Chapel,28.210365,-82.288956 +33544,FL,Zephyrhills,28.263664,-82.34933 +33547,FL,Lithia,27.829349,-82.135679 +33549,FL,Lutz,28.136688,-82.461045 +33556,FL,Odessa,28.142072,-82.590506 +33565,FL,Plant City,28.069855,-82.157554 +33566,FL,Plant City,28.009448,-82.113816 +33567,FL,Plant City,27.976167,-82.146268 +33569,FL,Riverview,27.844952,-82.312473 +33570,FL,Ruskin,27.701501,-82.435501 +33572,FL,Apollo Beach,27.771553,-82.410199 +33573,FL,Sun City Center,27.714711,-82.353832 +33576,FL,San Antonio,28.337139,-82.288237 +33584,FL,Seffner,27.992199,-82.286296 +33592,FL,Thonotosassa,28.061747,-82.308212 +33594,FL,Valrico,27.912435,-82.246557 +33597,FL,Ridge Manor Esta,28.577492,-82.092975 +33598,FL,Wimauma,27.701497,-82.315136 +33602,FL,Tampa,27.961381,-82.45972 +33603,FL,Tampa,27.984534,-82.462997 +33604,FL,Tampa,28.017312,-82.457848 +33605,FL,Tampa,27.967078,-82.433368 +33606,FL,Tampa,27.933828,-82.467035 +33607,FL,Tampa,27.962538,-82.489535 +33608,FL,Tampa,27.865916,-82.507097 +33609,FL,Tampa,27.942456,-82.50572 +33610,FL,Tampa,27.995125,-82.404584 +33611,FL,Tampa,27.891422,-82.506714 +33612,FL,Tampa,28.050187,-82.450018 +33613,FL,Tampa,28.077184,-82.445519 +33614,FL,Tampa,28.00914,-82.503393 +33615,FL,Tampa,28.008057,-82.580495 +33616,FL,Tampa,27.87418,-82.52029 +33617,FL,Tampa,28.038358,-82.394876 +33618,FL,Carrollwood,28.075875,-82.493291 +33619,FL,Tampa,27.93824,-82.375558 +33620,FL,Tampa,28.069465,-82.409188 +33624,FL,Carrollwood,28.077194,-82.524944 +33625,FL,Tampa,28.072551,-82.558987 +33626,FL,Tampa,28.050932,-82.616378 +33629,FL,Tampa,27.92102,-82.507897 +33634,FL,Tampa,28.006783,-82.556006 +33635,FL,Tampa,28.03013,-82.604822 +33637,FL,Tampa,28.03377,-82.365876 +33647,FL,Tampa,28.114698,-82.367751 +33701,FL,Saint Petersburg,27.772318,-82.638609 +33702,FL,Saint Petersburg,27.842712,-82.644795 +33703,FL,Saint Petersburg,27.816957,-82.626393 +33704,FL,Saint Petersburg,27.795435,-82.637289 +33705,FL,Saint Petersburg,27.739113,-82.64349 +33706,FL,Saint Petersburg,27.745606,-82.751646 +33707,FL,Saint Petersburg,27.75487,-82.720791 +33708,FL,Madeira Beach,27.816529,-82.800779 +33709,FL,Kenneth City,27.817427,-82.729845 +33710,FL,Saint Petersburg,27.789798,-82.724285 +33711,FL,Saint Petersburg,27.74649,-82.689708 +33712,FL,Saint Petersburg,27.735336,-82.666298 +33713,FL,Saint Petersburg,27.789015,-82.677939 +33714,FL,Saint Petersburg,27.817621,-82.677612 +33715,FL,Tierra Verde,27.694792,-82.715646 +33716,FL,Saint Petersburg,27.873764,-82.640039 +33801,FL,Lakeland,28.038134,-81.939153 +33803,FL,Lakeland,28.014045,-81.952283 +33805,FL,Lakeland,28.072006,-81.96091 +33809,FL,Lakeland,28.123356,-81.984219 +33811,FL,Southside,27.966284,-82.007236 +33813,FL,Southside,27.969534,-81.933187 +33821,FL,Arcadia,27.18996,-81.865755 +33823,FL,Auburndale,28.072443,-81.812234 +33825,FL,Avon Park,27.600085,-81.501486 +33827,FL,Babson Park,27.831698,-81.534221 +33830,FL,Bartow,27.895664,-81.812684 +33834,FL,Duette,27.627738,-81.845058 +33837,FL,Davenport,28.196265,-81.607912 +33838,FL,Dundee,28.019412,-81.621207 +33839,FL,Eagle Lake,27.978661,-81.756357 +33841,FL,Fort Meade,27.746356,-81.782346 +33843,FL,Frostproof,27.721058,-81.514778 +33844,FL,Grenelefe,28.095073,-81.614712 +33849,FL,Kathleen,28.205224,-82.043499 +33850,FL,Lake Alfred,28.089483,-81.727138 +33852,FL,Lake Placid,27.294474,-81.364918 +33853,FL,Lake Wales,27.903734,-81.548805 +33857,FL,Lorida,27.414952,-81.196533 +33860,FL,Mulberry,27.90202,-82.001489 +33865,FL,Ona,27.412657,-81.92805 +33868,FL,Polk City,28.19867,-81.808282 +33870,FL,Sebring,27.492391,-81.435712 +33872,FL,Sebring,27.470289,-81.487242 +33873,FL,Wauchula,27.551742,-81.807388 +33880,FL,Eloise,27.999296,-81.751507 +33881,FL,Winter Haven,28.045219,-81.732485 +33884,FL,Cypress Gardens,27.994901,-81.678905 +33890,FL,Zolfo Springs,27.480042,-81.742328 +33901,FL,Fort Myers,26.620403,-81.8725 +33903,FL,Fort Myers,26.678138,-81.909632 +33904,FL,Cape Coral Centr,26.57746,-81.952243 +33905,FL,Tice,26.676472,-81.785341 +33907,FL,Fort Myers,26.568057,-81.873558 +33908,FL,Fort Myers,26.502518,-81.927589 +33909,FL,Cape Coral Centr,26.680276,-81.958909 +33912,FL,Fort Myers,26.49722,-81.824554 +33913,FL,Fort Myers,26.522808,-81.706469 +33914,FL,Cape Coral Centr,26.56971,-81.990915 +33916,FL,Fort Myers,26.646595,-81.842946 +33917,FL,Fort Myers,26.707947,-81.859447 +33919,FL,College Parkway,26.554159,-81.900587 +33920,FL,Alva,26.714657,-81.635055 +33922,FL,Bokeelia,26.662726,-82.140064 +33923,FL,Bonita Springs,26.348035,-81.789963 +33924,FL,Captiva,26.750541,-82.261017 +33927,FL,El Jobean,26.97608,-82.19957 +33928,FL,Estero,26.435052,-81.810244 +33931,FL,Fort Myers Beach,26.451952,-81.924543 +33934,FL,Immokalee,26.409794,-81.445365 +33935,FL,Labelle,26.732093,-81.434027 +33936,FL,Lehigh Acres,26.615302,-81.61046 +33937,FL,Marco Island,25.939568,-81.720394 +33940,FL,Naples,26.171391,-81.802196 +33942,FL,Naples,26.201578,-81.766125 +33943,FL,Ochopee,25.87998,-81.311228 +33946,FL,Placida,26.819301,-82.261638 +33947,FL,Placida,26.90039,-82.293778 +33948,FL,Port Charlotte,26.98268,-82.141173 +33950,FL,Punta Gorda,26.915163,-82.053166 +33952,FL,Port Charlotte,26.990475,-82.096372 +33953,FL,Port Charlotte,27.004008,-82.211743 +33954,FL,Port Charlotte,27.022815,-82.110782 +33955,FL,Punta Gorda,26.823981,-81.954712 +33956,FL,Saint James City,26.529012,-82.091591 +33957,FL,Sanibel,26.4514,-82.086825 +33960,FL,Venus,27.13463,-81.359412 +33961,FL,Naples,26.027721,-81.658635 +33962,FL,Naples,26.113096,-81.749661 +33963,FL,Naples,26.263499,-81.808092 +33964,FL,Naples,26.211253,-81.640436 +33971,FL,Lehigh Acres,26.602252,-81.665822 +33980,FL,Port Charlotte,26.983969,-82.058886 +33981,FL,Port Charlotte,26.937925,-82.238774 +33982,FL,Punta Gorda,26.966751,-81.954484 +33983,FL,Punta Gorda,27.007398,-82.016268 +33990,FL,Cape Coral Centr,26.630893,-81.945967 +33991,FL,Cape Coral Centr,26.628881,-82.006703 +33999,FL,Naples,26.191612,-81.70927 +34202,FL,Braden River,27.46521,-82.431487 +34203,FL,Braden River,27.444871,-82.5404 +34205,FL,Westgate,27.480896,-82.584733 +34207,FL,College Plaza,27.439663,-82.580627 +34208,FL,Braden River,27.485881,-82.536961 +34209,FL,Palma Sola,27.487909,-82.627631 +34210,FL,Bradenton,27.454393,-82.635752 +34215,FL,Cortez,27.472686,-82.700642 +34217,FL,Bradenton Beach,27.515149,-82.721027 +34219,FL,Parrish,27.557162,-82.396009 +34221,FL,Palmetto,27.542946,-82.562957 +34222,FL,Ellenton,27.53818,-82.5006 +34223,FL,Englewood,26.966743,-82.359886 +34224,FL,Grove City,26.92504,-82.311731 +34228,FL,Whitney Beach,27.38669,-82.638403 +34229,FL,Osprey,27.18384,-82.485339 +34231,FL,South Trail,27.26757,-82.513793 +34232,FL,Forest Lakes,27.320056,-82.475709 +34233,FL,Sarasota,27.286614,-82.47698 +34234,FL,Meadows Village,27.365355,-82.535182 +34235,FL,Sarasota,27.367162,-82.484759 +34236,FL,Sarasota,27.331588,-82.548624 +34237,FL,Sarasota,27.336915,-82.512778 +34238,FL,Sarasota Square,27.243834,-82.482898 +34239,FL,Sarasota,27.311137,-82.519545 +34240,FL,Sarasota,27.32765,-82.385594 +34241,FL,Sarasota,27.282179,-82.418112 +34242,FL,Crescent Beach,27.266025,-82.546932 +34243,FL,Sarasota,27.407235,-82.530299 +34251,FL,Myakka City,27.364764,-82.184897 +34275,FL,Nokomis,27.138398,-82.451779 +34285,FL,Venice,27.093312,-82.44983 +34287,FL,North Port,27.047839,-82.241616 +34292,FL,Mid Venice,27.103245,-82.415112 +34293,FL,South Venice,27.053022,-82.404096 +34601,FL,Brooksville,28.565805,-82.373674 +34602,FL,Ridge Manor West,28.511167,-82.290545 +34606,FL,Spring Hill,28.46551,-82.598084 +34607,FL,Spring Hill,28.506546,-82.626671 +34608,FL,Spring Hill,28.479696,-82.556206 +34609,FL,Spring Hill,28.477611,-82.499896 +34610,FL,Shady Hills,28.405084,-82.530148 +34613,FL,Brooksville,28.546558,-82.521286 +34614,FL,Brooksville,28.662244,-82.523613 +34615,FL,Clearwater,27.986241,-82.780807 +34616,FL,Clearwater,27.945624,-82.786711 +34619,FL,Clearwater,27.976503,-82.717248 +34620,FL,Clearwater,27.913981,-82.715885 +34621,FL,Clearwater,28.02961,-82.723718 +34622,FL,Airport,27.896713,-82.676876 +34623,FL,Clearwater,28.002734,-82.747405 +34624,FL,Clearwater,27.93595,-82.743485 +34625,FL,Clearwater,27.973063,-82.745504 +34630,FL,Clearwater,27.984526,-82.822281 +34635,FL,Belleair Beach,27.917605,-82.840486 +34639,FL,Land O Lakes,28.225849,-82.45472 +34640,FL,Belleair Bluffs,27.915835,-82.801978 +34641,FL,Largo,27.907547,-82.75937 +34642,FL,Seminole,27.844571,-82.796896 +34643,FL,Largo,27.880334,-82.762806 +34644,FL,Largo,27.883597,-82.826287 +34646,FL,Largo,27.852906,-82.826978 +34647,FL,Largo,27.851549,-82.758701 +34648,FL,Largo,27.884391,-82.795946 +34652,FL,New Port Richey,28.232574,-82.732721 +34653,FL,New Port Richey,28.244398,-82.6986 +34654,FL,New Port Richey,28.302201,-82.626423 +34655,FL,New Port Richey,28.212898,-82.680729 +34665,FL,Pinellas Park,27.840313,-82.71335 +34666,FL,Pinellas Park,27.860742,-82.709353 +34667,FL,Hudson,28.364763,-82.675669 +34668,FL,Port Richey,28.301148,-82.692714 +34669,FL,Hudson,28.350634,-82.628793 +34677,FL,Oldsmar,28.046035,-82.684778 +34683,FL,Palm Harbor,28.066248,-82.758488 +34684,FL,Lake Tarpon,28.073963,-82.726573 +34685,FL,Palm Harbor,28.096725,-82.696357 +34689,FL,Tarpon Springs,28.138465,-82.743023 +34690,FL,Holiday,28.191273,-82.727935 +34691,FL,Holiday,28.191336,-82.755965 +34695,FL,Safety Harbor,28.009608,-82.696658 +34698,FL,Dunedin,28.028382,-82.779434 +34705,FL,Astatula,28.708754,-81.719473 +34711,FL,Clermont,28.552541,-81.757407 +34731,FL,Fruitland Park,28.863949,-81.899755 +34736,FL,Groveland,28.564445,-81.874526 +34737,FL,Howey In The Hil,28.709818,-81.789983 +34739,FL,Kenansville,27.876698,-81.050049 +34741,FL,Kissimmee,28.305056,-81.424208 +34743,FL,Buena Ventura La,28.329656,-81.356044 +34744,FL,Kissimmee,28.307807,-81.368122 +34746,FL,Kissimmee,28.26796,-81.467478 +34748,FL,Leesburg,28.807965,-81.885772 +34756,FL,Montverde,28.597153,-81.679368 +34758,FL,Kissimmee,28.198436,-81.487014 +34759,FL,Poinciana,28.124786,-81.458984 +34761,FL,Ocoee,28.583685,-81.532618 +34762,FL,Okahumpka,28.737257,-81.883949 +34769,FL,Saint Cloud,28.247992,-81.287626 +34771,FL,Saint Cloud,28.27301,-81.200311 +34772,FL,Saint Cloud,28.190518,-81.264493 +34773,FL,Saint Cloud,28.129295,-81.017552 +34785,FL,Wildwood,28.845353,-82.03473 +34786,FL,Windermere,28.50061,-81.535411 +34787,FL,Winter Garden,28.542321,-81.591127 +34788,FL,Haines Creek,28.85744,-81.781159 +34797,FL,Yalaha,28.744443,-81.826324 +34945,FL,Fort Pierce,27.438233,-80.443963 +34946,FL,Fort Pierce,27.50077,-80.35996 +34947,FL,Fort Pierce,27.449281,-80.359185 +34949,FL,Fort Pierce,27.389594,-80.261468 +34950,FL,Fort Pierce,27.448567,-80.3385 +34951,FL,Fort Pierce,27.539097,-80.405195 +34952,FL,Port Saint Lucie,27.288895,-80.297971 +34953,FL,Port Saint Lucie,27.262506,-80.379323 +34956,FL,Indiantown,27.061461,-80.480277 +34957,FL,Jensen Beach,27.235568,-80.227656 +34972,FL,Basinger,27.311532,-80.847853 +34974,FL,Okeechobee,27.200224,-80.84103 +34981,FL,Fort Pierce,27.404882,-80.362257 +34982,FL,Fort Pierce,27.390764,-80.324633 +34983,FL,Port Saint Lucie,27.309444,-80.345029 +34984,FL,Port Saint Lucie,27.265476,-80.338936 +34986,FL,Port Saint Lucie,27.32148,-80.403045 +34987,FL,Port Saint Lucie,27.260595,-80.477052 +34988,FL,Port Saint Lucie,27.323233,-80.51726 +34990,FL,Palm City,27.165646,-80.291646 +34994,FL,Stuart,27.196834,-80.253786 +34996,FL,Stuart,27.192857,-80.216378 +34997,FL,Stuart,27.139817,-80.212937 +30001,GA,Austell,33.807226,-84.605026 +30002,GA,Avondale Estates,33.771727,-84.260691 +30021,GA,Clarkston,33.810107,-84.238825 +30027,GA,Conley,33.645104,-84.327571 +30030,GA,Decatur,33.769883,-84.295044 +30032,GA,Decatur,33.740825,-84.263165 +30033,GA,Decatur,33.812305,-84.281918 +30034,GA,Decatur,33.695385,-84.248939 +30035,GA,Decatur,33.72784,-84.2143 +30038,GA,Lithonia,33.682311,-84.160997 +30049,GA,Ellenwood,33.635376,-84.264333 +30050,GA,Forest Park,33.609737,-84.367075 +30057,GA,Lithia Springs,33.772999,-84.66081 +30058,GA,Centerville Gwin,33.746412,-84.099291 +30059,GA,Mableton,33.816572,-84.565062 +30060,GA,Marietta,33.909199,-84.564881 +30062,GA,Marietta,34.002521,-84.463291 +30064,GA,Marietta,33.934285,-84.607584 +30066,GA,Marietta,34.037807,-84.503817 +30067,GA,Marietta,33.928198,-84.473251 +30068,GA,Marietta,33.967861,-84.438549 +30071,GA,Norcross,33.938145,-84.197158 +30073,GA,Powder Springs,33.875377,-84.685645 +30075,GA,Roswell,34.040832,-84.385901 +30076,GA,Roswell,34.021324,-84.310408 +30079,GA,Scottdale,33.793396,-84.258521 +30080,GA,Smyrna,33.879602,-84.502284 +30082,GA,Smyrna,33.863051,-84.538234 +30083,GA,Stone Mountain,33.794233,-84.201754 +30084,GA,Tucker,33.856986,-84.21602 +30087,GA,Stone Mountain,33.811511,-84.128829 +30088,GA,Stone Mountain,33.75798,-84.18022 +30092,GA,Norcross,33.967688,-84.243787 +30093,GA,Norcross,33.905964,-84.183953 +30101,GA,Acworth,34.075627,-84.647741 +30103,GA,Adairsville,34.359527,-84.917634 +30104,GA,Aragon,34.066556,-85.069559 +30105,GA,Armuchee,34.441082,-85.184298 +30107,GA,Ball Ground,34.339262,-84.375756 +30108,GA,Bowdon,33.537259,-85.25329 +30110,GA,Bremen,33.730872,-85.128638 +30113,GA,Buchanan,33.82828,-85.150551 +30114,GA,Canton,34.205874,-84.457756 +30117,GA,Carrollton,33.579751,-85.081211 +30120,GA,Cartersville,34.186975,-84.820401 +30124,GA,Cave Spring,34.116683,-85.337906 +30125,GA,Cedartown,34.011196,-85.2459 +30130,GA,Cumming,34.220197,-84.146762 +30132,GA,Dallas,33.916315,-84.827791 +30134,GA,Douglasville,33.760645,-84.747719 +30135,GA,Douglasville,33.698936,-84.745441 +30136,GA,Duluth,33.98619,-84.157936 +30137,GA,Emerson,34.119969,-84.757045 +30139,GA,Fairmount,34.465241,-84.766878 +30140,GA,Felton,33.887066,-85.220781 +30141,GA,Hiram,33.867286,-84.769875 +30143,GA,Jasper,34.461965,-84.475881 +30144,GA,Kennesaw,34.028656,-84.60466 +30145,GA,Kingston,34.250053,-84.997299 +30147,GA,Lindale,34.170741,-85.182491 +30148,GA,Marble Hill,34.415353,-84.337151 +30153,GA,Rockmart,33.997912,-85.05937 +30161,GA,Rome,34.250726,-85.146501 +30165,GA,Rome,34.283679,-85.223122 +30170,GA,Roopville,33.432226,-85.167148 +30171,GA,Pine Log,34.392732,-84.780315 +30173,GA,Silver Creek,34.159272,-85.142933 +30174,GA,Suwanee,34.057245,-84.082391 +30175,GA,Talking Rock,34.539356,-84.491154 +30176,GA,Tallapoosa,33.760174,-85.300047 +30177,GA,Tate,34.42387,-84.365299 +30178,GA,Taylorsville,34.122941,-84.973859 +30179,GA,Temple,33.767687,-85.013315 +30180,GA,Villa Rica,33.71729,-84.929697 +30182,GA,Waco,33.683986,-85.219674 +30183,GA,Waleska,34.321662,-84.561981 +30184,GA,White,34.271683,-84.738327 +30185,GA,Whitesburg,33.511093,-84.925426 +30187,GA,Winston,33.663419,-84.863915 +30188,GA,Woodstock,34.106005,-84.511683 +30201,GA,Alpharetta,34.107677,-84.295167 +30202,GA,Alpharetta,34.035487,-84.238972 +30203,GA,Auburn,34.007758,-83.824128 +30204,GA,Barnesville,33.045713,-84.15147 +30205,GA,Brooks,33.298433,-84.476941 +30206,GA,Concord,33.099836,-84.447025 +30207,GA,Conyers,33.682932,-84.019818 +30208,GA,Conyers,33.607711,-84.012689 +30209,GA,Starrsville,33.570328,-83.890752 +30211,GA,Dacula,33.988234,-83.883849 +30213,GA,Fairburn,33.56482,-84.580857 +30214,GA,Woolsey,33.448054,-84.463586 +30216,GA,Flovilla,33.250012,-83.907938 +30217,GA,Glenn,33.291073,-85.105459 +30218,GA,Alvaton,33.149902,-84.580576 +30220,GA,Grantville,33.247253,-84.834977 +30221,GA,Grayson,33.898344,-83.979846 +30222,GA,Stovall,33.037169,-84.742173 +30223,GA,Griffin,33.2549,-84.272759 +30228,GA,Hampton,33.412398,-84.294744 +30230,GA,Hogansville,33.164382,-84.930856 +30233,GA,Jackson,33.282006,-83.978391 +30234,GA,Jenkinsburg,33.318619,-84.026122 +30236,GA,Jonesboro,33.524236,-84.358968 +30240,GA,La Grange,33.034025,-85.039511 +30243,GA,Lawrenceville,34.005049,-84.014944 +30244,GA,Lawrenceville,33.923781,-84.081652 +30245,GA,Lawrenceville,33.944293,-83.996413 +30247,GA,Lilburn,33.873182,-84.119595 +30248,GA,Locust Grove,33.344936,-84.09825 +30249,GA,Loganville,33.83366,-83.903631 +30251,GA,Luthersville,33.179817,-84.757707 +30253,GA,Mc Donough,33.46466,-84.135751 +30255,GA,Mansfield,33.540373,-83.727638 +30256,GA,Meansville,33.013387,-84.316938 +30257,GA,Milner,33.141023,-84.175909 +30258,GA,Molena,32.997845,-84.45578 +30259,GA,Moreland,33.273437,-84.75656 +30260,GA,Morrow,33.584934,-84.324695 +30262,GA,Newborn,33.494923,-83.668396 +30263,GA,Raymond,33.389404,-84.816952 +30265,GA,Newnan,33.39576,-84.712062 +30267,GA,Oxford,33.686474,-83.863517 +30268,GA,Palmetto,33.524195,-84.678999 +30269,GA,Peachtree City,33.391467,-84.563478 +30273,GA,Rex,33.580805,-84.278228 +30274,GA,Riverdale,33.553126,-84.400348 +30276,GA,Senoia,33.284459,-84.591779 +30277,GA,Sharpsburg,33.401287,-84.654027 +30278,GA,Snellville,33.848607,-84.028011 +30279,GA,Social Circle,33.656386,-83.706149 +30281,GA,Stockbridge,33.563343,-84.21649 +30285,GA,The Rock,32.971734,-84.242359 +30286,GA,Thomaston,32.901534,-84.3324 +30290,GA,Tyrone,33.471948,-84.591357 +30291,GA,Union City,33.583155,-84.549853 +30292,GA,Williamson,33.159838,-84.379493 +30293,GA,Woodbury,32.981318,-84.598632 +30295,GA,Zebulon,33.100235,-84.310827 +30296,GA,Riverdale,33.566716,-84.43645 +30303,GA,Atlanta,33.752504,-84.388846 +30305,GA,Atlanta,33.831963,-84.385145 +30306,GA,Atlanta,33.786027,-84.351418 +30307,GA,Atlanta,33.769138,-84.335957 +30308,GA,Atlanta,33.771839,-84.375744 +30309,GA,Atlanta,33.798407,-84.388338 +30310,GA,Atlanta,33.727849,-84.423173 +30311,GA,Atlanta,33.722957,-84.470219 +30312,GA,Atlanta,33.746749,-84.378125 +30313,GA,Atlanta,33.76825,-84.39352 +30314,GA,Atlanta,33.756103,-84.425546 +30315,GA,Atlanta,33.705062,-84.380771 +30316,GA,Atlanta,33.721686,-84.333913 +30317,GA,Atlanta,33.749788,-84.31685 +30318,GA,Atlanta,33.786454,-84.445432 +30319,GA,Atlanta,33.868728,-84.335091 +30324,GA,Atlanta,33.820609,-84.354867 +30326,GA,Atlanta,33.848168,-84.358232 +30327,GA,Atlanta,33.862723,-84.419966 +30328,GA,Sandy Springs,33.936295,-84.381143 +30329,GA,Atlanta,33.823555,-84.321402 +30330,GA,Atlanta,33.70645,-84.434735 +30331,GA,Atlanta,33.72241,-84.520468 +30334,GA,Atlanta,33.74715,-84.388188 +30336,GA,Atlanta,33.78534,-84.510028 +30337,GA,College Park,33.644227,-84.460849 +30338,GA,Dunwoody,33.944313,-84.316529 +30339,GA,Atlanta,33.87125,-84.462879 +30340,GA,Doraville,33.896377,-84.248265 +30341,GA,Chamblee,33.886727,-84.286969 +30342,GA,Atlanta,33.884245,-84.376091 +30344,GA,East Point,33.676214,-84.457292 +30345,GA,Atlanta,33.851347,-84.286961 +30346,GA,Atlanta,33.926717,-84.333354 +30349,GA,Atlanta,33.605331,-84.481258 +30350,GA,Atlanta,33.979471,-84.341146 +30354,GA,Hapeville,33.66546,-84.387025 +30360,GA,Atlanta,33.937772,-84.271645 +30401,GA,Oak Park,32.581938,-82.338668 +30410,GA,Ailey,32.214262,-82.47619 +30411,GA,Alamo,32.13298,-82.794445 +30413,GA,Bartow,32.863186,-82.470788 +30415,GA,Brooklet,32.294046,-81.628003 +30417,GA,Claxton,32.165009,-81.908032 +30420,GA,Cobbtown,32.264237,-82.133274 +30421,GA,Collins,32.185228,-82.10948 +30425,GA,Garfield,32.600776,-82.085599 +30426,GA,Girard,33.043689,-81.710581 +30427,GA,Glennville,31.946708,-81.948313 +30428,GA,Glenwood,32.157243,-82.675881 +30434,GA,Louisville,33.016342,-82.383616 +30436,GA,Lyons,32.171148,-82.307783 +30438,GA,Manassas,32.096551,-82.052925 +30439,GA,Metter,32.401034,-82.060722 +30441,GA,Midville,32.863794,-82.204181 +30442,GA,Millen,32.787739,-81.961807 +30445,GA,Mount Vernon,32.18398,-82.58672 +30446,GA,Newington,32.588385,-81.532686 +30450,GA,Portal,32.55504,-81.912257 +30452,GA,Register,32.338235,-81.872828 +30453,GA,Reidsville,32.054759,-82.147809 +30454,GA,Rockledge,32.391507,-82.747939 +30455,GA,Rocky Ford,32.656863,-81.741749 +30456,GA,Sardis,32.980946,-81.773039 +30457,GA,Soperton,32.386861,-82.587098 +30458,GA,Statesboro,32.440841,-81.773956 +30467,GA,Hiltonia,32.77627,-81.633394 +30470,GA,Tarrytown,32.290623,-82.516933 +30471,GA,Twin City,32.612926,-82.197856 +30473,GA,Uvalda,32.048271,-82.508879 +30474,GA,Vidalia,32.193408,-82.406724 +30477,GA,Wadley,32.874742,-82.402459 +30501,GA,Gainesville,34.307269,-83.825596 +30504,GA,Gainesville,34.272281,-83.879311 +30506,GA,Gainesville,34.356227,-83.888211 +30507,GA,Gainesville,34.25915,-83.771625 +30510,GA,Alto,34.459079,-83.601996 +30511,GA,Baldwin,34.456411,-83.529781 +30512,GA,Blairsville,34.876253,-83.992027 +30513,GA,Blue Ridge,34.855523,-84.328087 +30516,GA,Bowersville,34.399592,-83.048364 +30517,GA,Braselton,34.138941,-83.781162 +30518,GA,Buford,34.112373,-83.996459 +30520,GA,Canon,34.347766,-83.126693 +30521,GA,Carnesville,34.394723,-83.279209 +30522,GA,Cherrylog,34.773711,-84.443136 +30523,GA,Clarkesville,34.644993,-83.524304 +30525,GA,Clayton,34.882569,-83.40655 +30527,GA,Clermont,34.476091,-83.785311 +30528,GA,Cleveland,34.583949,-83.749985 +30529,GA,Commerce,34.213413,-83.448011 +30531,GA,Cornelia,34.520882,-83.54527 +30533,GA,Dahlonega,34.529949,-83.979838 +30534,GA,Juno,34.394331,-84.103705 +30535,GA,Demorest,34.575564,-83.569625 +30537,GA,Sky Valley,34.979659,-83.380113 +30538,GA,Eastanollee,34.50366,-83.258685 +30539,GA,East Ellijay,34.682636,-84.473062 +30540,GA,Ellijay,34.677514,-84.481226 +30541,GA,Epworth,34.944249,-84.441593 +30542,GA,Flowery Branch,34.181893,-83.902407 +30543,GA,Gillsville,34.300148,-83.675681 +30545,GA,Helen,34.686601,-83.739936 +30546,GA,Hiawassee,34.937667,-83.7478 +30547,GA,Homer,34.356312,-83.497432 +30548,GA,Hoschton,34.086578,-83.780253 +30549,GA,Jefferson,34.106197,-83.570813 +30552,GA,Lakemont,34.761697,-83.403763 +30553,GA,Lavonia,34.452758,-83.112992 +30554,GA,Lula,34.398513,-83.694459 +30555,GA,Mc Caysville,34.952212,-84.368294 +30557,GA,Martin,34.515482,-83.168553 +30558,GA,Maysville,34.273627,-83.584019 +30559,GA,Mineral Bluff,34.934112,-84.254066 +30560,GA,Morganton,34.871382,-84.211479 +30563,GA,Mount Airy,34.567825,-83.471272 +30564,GA,Murrayville,34.434167,-83.894919 +30565,GA,Nicholson,34.097016,-83.421031 +30566,GA,Oakwood,34.237196,-83.894013 +30567,GA,Pendergrass,34.179634,-83.663356 +30568,GA,Rabun Gap,34.957552,-83.390122 +30571,GA,Sautee Nacoochee,34.716245,-83.693116 +30572,GA,Suches,34.72529,-84.049582 +30575,GA,Talmo,34.19506,-83.71872 +30576,GA,Tiger,34.81741,-83.433317 +30577,GA,Toccoa,34.566474,-83.31144 +30582,GA,Young Harris,34.958791,-83.86882 +30601,GA,Athens,33.976097,-83.363174 +30605,GA,Athens,33.932097,-83.352508 +30606,GA,Athens,33.946085,-83.418019 +30607,GA,Athens,34.006978,-83.427761 +30619,GA,Arnoldsville,33.880338,-83.234137 +30620,GA,Bethlehem,33.926116,-83.728227 +30621,GA,Bishop,33.808091,-83.477655 +30622,GA,Bogart,33.934038,-83.50546 +30624,GA,Bowman,34.19193,-83.028437 +30625,GA,Buckhead,33.536842,-83.343484 +30627,GA,Carlton,33.985217,-83.003827 +30628,GA,Colbert,34.038246,-83.21906 +30629,GA,Comer,34.088776,-83.121978 +30630,GA,Crawford,33.909533,-83.189319 +30631,GA,Crawfordville,33.570801,-82.887234 +30633,GA,Danielsville,34.170799,-83.275841 +30634,GA,Dewy Rose,34.172052,-82.940894 +30635,GA,Elberton,34.108202,-82.844765 +30641,GA,Good Hope,33.761346,-83.594952 +30642,GA,Greensboro,33.563682,-83.170192 +30643,GA,Hartwell,34.357124,-82.929576 +30646,GA,Hull,34.04781,-83.311029 +30648,GA,Lexington,33.879913,-83.085809 +30650,GA,Madison,33.594681,-83.461781 +30655,GA,Monroe,33.808141,-83.707221 +30660,GA,Philomath,33.783593,-82.909975 +30662,GA,Royston,34.277793,-83.140614 +30663,GA,Rutledge,33.616316,-83.602302 +30666,GA,Statham,33.960233,-83.5893 +30667,GA,Stephens,33.771471,-83.115902 +30668,GA,Danburg,33.883294,-82.695558 +30669,GA,Union Point,33.634544,-83.087913 +30673,GA,Washington,33.726541,-82.742912 +30677,GA,Watkinsville,33.854247,-83.408043 +30678,GA,White Plains,33.484338,-83.090845 +30680,GA,Winder,33.998544,-83.711473 +30683,GA,Winterville,33.954253,-83.290645 +30701,GA,Calhoun,34.496456,-84.934545 +30705,GA,Chatsworth,34.758929,-84.794293 +30707,GA,Chickamauga,34.857963,-85.322136 +30708,GA,Cisco,34.847405,-84.717382 +30710,GA,Cohutta,34.932635,-84.945801 +30711,GA,Crandall,34.941225,-84.764533 +30720,GA,Dalton,34.76352,-84.987477 +30721,GA,Dalton,34.77922,-84.933871 +30725,GA,Flintstone,34.925162,-85.352443 +30728,GA,La Fayette,34.692008,-85.260212 +30730,GA,Lyerly,34.402958,-85.403826 +30731,GA,Cloudland,34.570909,-85.459723 +30733,GA,Plainville,34.41447,-85.031204 +30734,GA,Ranger,34.540361,-84.727018 +30735,GA,Hill City,34.591996,-84.916251 +30736,GA,Ringgold,34.92052,-85.154908 +30738,GA,Rising Fawn,34.853491,-85.471078 +30739,GA,Rock Spring,34.806534,-85.241481 +30740,GA,Rocky Face,34.774456,-85.056143 +30741,GA,Rossville,34.953481,-85.296785 +30742,GA,Fort Oglethorpe,34.964082,-85.242812 +30746,GA,Sugar Valley,34.551929,-85.026048 +30747,GA,Summerville,34.485899,-85.336224 +30750,GA,Lookout Mountain,34.933512,-85.379384 +30752,GA,Trenton,34.901681,-85.517118 +30753,GA,Trion,34.54679,-85.311156 +30755,GA,Tunnel Hill,34.854129,-85.046815 +30757,GA,Wildwood,34.977911,-85.430456 +30802,GA,Appling,33.627088,-82.285631 +30803,GA,Avera,33.140997,-82.514965 +30805,GA,Blythe,33.294088,-82.203044 +30808,GA,Dearing,33.40702,-82.395512 +30809,GA,Evans,33.541194,-82.139775 +30810,GA,Gibson,33.247097,-82.576591 +30813,GA,Grovetown,33.476622,-82.240937 +30814,GA,Harlem,33.417007,-82.309659 +30815,GA,Hephzibah,33.343328,-82.088689 +30816,GA,Keysville,33.17191,-82.183368 +30817,GA,Lincolnton,33.777335,-82.443481 +30818,GA,Matthews,33.217582,-82.286747 +30820,GA,Mitchell,33.20515,-82.681654 +30821,GA,Norwood,33.478921,-82.735575 +30822,GA,Perkins,32.905747,-81.869573 +30823,GA,Stapleton,33.189423,-82.459704 +30824,GA,Thomson,33.477363,-82.494204 +30828,GA,Warrenton,33.40914,-82.63568 +30830,GA,Waynesboro,33.101254,-81.990797 +30833,GA,Wrens,33.210397,-82.380962 +30901,GA,Augusta,33.460084,-81.972959 +30904,GA,Augusta,33.47374,-82.013078 +30905,GA,Fort Gordon,33.419032,-82.139179 +30906,GA,Peach Orchard,33.402024,-82.038358 +30907,GA,Martinez,33.511692,-82.099505 +30909,GA,Forest Hills,33.480932,-82.060439 +31001,GA,Abbeville,31.96484,-83.306845 +31002,GA,Adrian,32.563505,-82.569508 +31003,GA,Allentown,32.653829,-83.189796 +31005,GA,Bonaire,32.546037,-83.604736 +31006,GA,Butler,32.572597,-84.234308 +31007,GA,Byromville,32.185192,-83.899128 +31008,GA,Powersville,32.647384,-83.762244 +31009,GA,Cadwell,32.317395,-83.026767 +31011,GA,Chauncey,32.083532,-83.050804 +31012,GA,Chester,32.398152,-83.174029 +31014,GA,Cochran,32.398066,-83.322886 +31015,GA,Cordele,31.956625,-83.783507 +31016,GA,Culloden,32.830078,-84.045628 +31017,GA,Danville,32.593017,-83.303298 +31018,GA,Davisboro,32.944296,-82.622738 +31019,GA,Dexter,32.435639,-83.052771 +31020,GA,Dry Branch,32.70499,-83.495105 +31021,GA,East Dublin,32.547794,-82.90368 +31022,GA,Dudley,32.525879,-83.089918 +31023,GA,Eastman,32.208425,-83.185959 +31024,GA,Eatonton,33.312723,-83.36277 +31025,GA,Elko,32.333648,-83.730388 +31028,GA,Centerville,32.634375,-83.676773 +31029,GA,Forsyth,33.050764,-83.936209 +31030,GA,Fort Valley,32.54956,-83.888727 +31031,GA,Stevens Pottery,32.909212,-83.320416 +31032,GA,Gray,33.017177,-83.539951 +31033,GA,Haddock,33.051888,-83.431219 +31035,GA,Harrison,32.842007,-82.71593 +31036,GA,Hawkinsville,32.277834,-83.494763 +31037,GA,Helena,32.078093,-82.91782 +31038,GA,Round Oak,33.179994,-83.687092 +31041,GA,Ideal,32.393022,-84.148149 +31042,GA,Irwinton,32.808849,-83.173963 +31044,GA,Jeffersonville,32.741096,-83.385896 +31045,GA,Jewell,33.328754,-82.732803 +31046,GA,Juliette,33.119412,-83.823529 +31047,GA,Kathleen,32.467218,-83.61284 +31049,GA,Kite,32.707833,-82.527361 +31050,GA,Knoxville,32.64724,-83.943011 +31052,GA,Lizella,32.777316,-83.825009 +31054,GA,Mc Intyre,32.84679,-83.203953 +31055,GA,Mc Rae,32.043529,-82.887665 +31057,GA,Marshallville,32.452003,-83.943478 +31058,GA,Mauk,32.509016,-84.399906 +31060,GA,Milan,31.961797,-83.058845 +31061,GA,Milledgeville,33.079958,-83.237943 +31063,GA,Montezuma,32.302615,-84.004139 +31064,GA,Monticello,33.311797,-83.714049 +31065,GA,Montrose,32.561867,-83.160119 +31066,GA,Musella,32.820228,-84.045591 +31068,GA,Oglethorpe,32.284186,-84.082991 +31069,GA,Perry,32.46051,-83.728258 +31070,GA,Pinehurst,32.196692,-83.720853 +31071,GA,Pineview,32.090728,-83.515835 +31072,GA,Pitts,31.942533,-83.55788 +31075,GA,Rentz,32.363834,-82.913987 +31076,GA,Reynolds,32.55411,-84.101134 +31077,GA,Rhine,32.011303,-83.19831 +31078,GA,Roberta,32.722152,-84.045114 +31079,GA,Rochelle,31.949119,-83.444978 +31081,GA,Rupert,32.432524,-84.273753 +31082,GA,Deepstep,32.986972,-82.816934 +31085,GA,Shady Dale,33.401353,-83.704031 +31087,GA,Devereux,33.265516,-82.985948 +31088,GA,Warner Robins,32.593365,-83.641578 +31089,GA,Tennille,32.9063,-82.840024 +31090,GA,Toomsboro,32.821895,-83.084427 +31091,GA,Unadilla,32.255766,-83.74467 +31092,GA,Vienna,32.091291,-83.792198 +31093,GA,Warner Robins,32.636839,-83.639466 +31094,GA,Warthen,33.125455,-82.803899 +31096,GA,Wrightsville,32.721866,-82.726206 +31097,GA,Yatesville,32.915592,-84.159253 +31098,GA,Robins A F B,32.60958,-83.58775 +31201,GA,Huber,32.84386,-83.598686 +31204,GA,Macon,32.842393,-83.676634 +31206,GA,Wilson Airport,32.780758,-83.682303 +31210,GA,Macon,32.892565,-83.745537 +31211,GA,Macon,32.886905,-83.602062 +31301,GA,Allenhurst,31.774059,-81.618577 +31302,GA,Bloomingdale,32.117654,-81.308465 +31303,GA,Clyo,32.512646,-81.30857 +31304,GA,Crescent,31.49675,-81.389219 +31305,GA,Darien,31.382574,-81.431175 +31308,GA,Ellabell,32.127304,-81.498302 +31309,GA,Fleming,31.864477,-81.423165 +31312,GA,Guyton,32.31399,-81.389593 +31313,GA,Hinesville,31.851296,-81.607214 +31314,GA,Fort Stewart,31.979085,-81.440489 +31316,GA,Ludowici,31.770477,-81.745315 +31319,GA,Meridian,31.411068,-81.423915 +31320,GA,Midway,31.801803,-81.390897 +31321,GA,Pembroke,32.157088,-81.553341 +31322,GA,Pooler,32.114931,-81.251958 +31323,GA,Riceboro,31.735696,-81.467134 +31324,GA,Richmond Hill,31.896152,-81.294026 +31326,GA,Rincon,32.235632,-81.287777 +31327,GA,Sapelo Island,31.421948,-81.267933 +31328,GA,Tybee Island,32.006797,-80.850938 +31329,GA,Stillwell,32.4121,-81.326435 +31331,GA,Townsend,31.567339,-81.418204 +31401,GA,Savannah,32.067631,-81.102394 +31404,GA,State College,32.044178,-81.068704 +31405,GA,Savannah,32.039119,-81.124192 +31406,GA,Savannah,31.988993,-81.097893 +31407,GA,Port Wentworth,32.148075,-81.162891 +31408,GA,Garden City,32.109245,-81.168181 +31409,GA,Savannah,32.002104,-81.158371 +31410,GA,Savannah,32.016188,-80.983859 +31411,GA,Savannah,31.926801,-81.038074 +31419,GA,M M,31.985149,-81.177387 +31501,GA,Okefenokee,31.219686,-82.364512 +31510,GA,Alma,31.546525,-82.4633 +31512,GA,Ambrose,31.536712,-82.997637 +31513,GA,Baxley,31.783663,-82.348643 +31516,GA,Blackshear,31.293063,-82.261708 +31518,GA,Bristol,31.40278,-82.249594 +31519,GA,Broxton,31.648426,-82.904954 +31520,GA,Glynco,31.169652,-81.493045 +31522,GA,Saint Simons Isl,31.16916,-81.382421 +31525,GA,Brunswick,31.230411,-81.511365 +31527,GA,Jekyll Island,31.074049,-81.41281 +31532,GA,Denton,31.745842,-82.720146 +31533,GA,Douglas,31.497287,-82.846468 +31537,GA,Folkston,30.850838,-82.011617 +31539,GA,Hazlehurst,31.860569,-82.590947 +31542,GA,Hoboken,31.183777,-82.183847 +31543,GA,Hortense,31.319949,-81.959561 +31544,GA,Jacksonville,31.848079,-82.975003 +31545,GA,Jesup,31.604326,-81.88706 +31548,GA,Kingsland,30.797681,-81.707483 +31549,GA,Lumber City,31.925124,-82.707312 +31550,GA,Manor,31.108829,-82.574173 +31551,GA,Mershon,31.478279,-82.216995 +31552,GA,Millwood,31.250566,-82.644148 +31553,GA,Nahunta,31.182652,-81.972212 +31554,GA,Nicholls,31.449812,-82.603207 +31555,GA,Odum,31.699916,-81.994301 +31557,GA,Patterson,31.390338,-82.127444 +31558,GA,Saint Marys,30.773467,-81.565211 +31560,GA,Screven,31.516846,-82.039742 +31563,GA,Surrency,31.648931,-82.198218 +31565,GA,Waverly,31.042672,-81.56967 +31566,GA,Waynesville,31.244792,-81.803928 +31567,GA,West Green,31.592271,-82.756417 +31568,GA,White Oak,31.034037,-81.808237 +31569,GA,Woodbine,30.943692,-81.678313 +31601,GA,Clyattville,30.810578,-83.277166 +31602,GA,Bemiss,30.890268,-83.273299 +31620,GA,Adel,31.125143,-83.421346 +31622,GA,Alapaha,31.394027,-83.21321 +31624,GA,Axson,31.303455,-82.731945 +31625,GA,Barney,31.007424,-83.521934 +31626,GA,Boston,30.785547,-83.797085 +31629,GA,Dixie,30.772213,-83.67918 +31630,GA,Du Pont,30.999996,-82.855518 +31631,GA,Fargo,30.716587,-82.580056 +31632,GA,Hahira,30.941593,-83.357366 +31634,GA,Cogdell,31.044991,-82.743103 +31635,GA,Lakeland,31.038107,-83.088859 +31636,GA,Lake Park,30.690615,-83.175293 +31637,GA,Lenox,31.266405,-83.448135 +31638,GA,Morven,30.893733,-83.449796 +31639,GA,Nashville,31.207379,-83.231946 +31641,GA,Naylor,30.89846,-83.122368 +31642,GA,Pearson,31.310583,-82.859096 +31643,GA,Quitman,30.779699,-83.556748 +31645,GA,Ray City,31.08247,-83.214283 +31646,GA,Saint George,30.559161,-82.083367 +31647,GA,Sparks,31.178984,-83.447586 +31648,GA,Statenville,30.725503,-82.979863 +31649,GA,Stockton,31.022865,-83.013944 +31650,GA,Willacoochee,31.345481,-83.044931 +31701,GA,Albany,31.567783,-84.161923 +31704,GA,Marine Corps Log,31.550099,-84.050812 +31705,GA,Bridgeboro,31.550851,-84.090089 +31707,GA,Albany,31.578908,-84.211834 +31709,GA,Georgia Southwes,32.07077,-84.224729 +31711,GA,Andersonville,32.129907,-84.10101 +31712,GA,Arabi,31.862923,-83.72856 +31713,GA,Arlington,31.445597,-84.72572 +31714,GA,Ashburn,31.705877,-83.660775 +31715,GA,Attapulgus,30.750639,-84.486008 +31716,GA,Baconton,31.387804,-84.11345 +31717,GA,Bainbridge,30.897865,-84.573975 +31723,GA,Blakely,31.371854,-84.935285 +31724,GA,Bluffton,31.556189,-84.877175 +31725,GA,Brinson,30.960957,-84.667112 +31726,GA,Bronwood,31.821591,-84.359389 +31728,GA,Cairo,30.892462,-84.196246 +31729,GA,Calvary,30.747036,-84.32267 +31730,GA,Camilla,31.219915,-84.229683 +31733,GA,Chula,31.543855,-83.550864 +31734,GA,Climax,30.85731,-84.443217 +31735,GA,Cobb,31.961708,-83.958087 +31736,GA,Coleman,31.656831,-84.874471 +31737,GA,Colquitt,31.161871,-84.730896 +31738,GA,Coolidge,30.985908,-83.875245 +31740,GA,Cuthbert,31.769073,-84.788874 +31741,GA,Damascus,31.341528,-84.720047 +31742,GA,Graves,31.759846,-84.430782 +31743,GA,De Soto,31.950186,-84.027101 +31744,GA,Doerun,31.313647,-83.925316 +31745,GA,Donalsonville,30.981801,-84.887024 +31746,GA,Edison,31.564979,-84.745626 +31749,GA,Enigma,31.373599,-83.355157 +31750,GA,Fitzgerald,31.724769,-83.249534 +31751,GA,Fort Gaines,31.646353,-85.039375 +31754,GA,Georgetown,31.884763,-85.071137 +31756,GA,Hartsfield,31.217316,-83.970364 +31759,GA,Iron City,30.994728,-84.796632 +31760,GA,Irwinville,31.654238,-83.401708 +31761,GA,Jakin,31.175064,-84.994845 +31762,GA,Leary,31.505924,-84.509486 +31763,GA,Leesburg,31.681161,-84.159263 +31764,GA,Leslie,31.953952,-84.07834 +31765,GA,Meigs,31.062536,-84.082375 +31766,GA,Morgan,31.556557,-84.617798 +31767,GA,Springvale,31.823432,-85.057251 +31768,GA,Moultrie,31.179244,-83.764089 +31770,GA,Newton,31.313426,-84.441107 +31771,GA,Norman Park,31.069128,-83.94044 +31772,GA,Oakfield,31.779768,-83.97059 +31773,GA,Ochlocknee,30.959407,-84.0326 +31774,GA,Ocilla,31.592944,-83.256542 +31775,GA,Omega,31.360432,-83.593936 +31777,GA,Parrott,31.872016,-84.501152 +31778,GA,Pavo,30.940142,-83.740856 +31779,GA,Pelham,31.127233,-84.156367 +31780,GA,Plains,32.033908,-84.358638 +31781,GA,Poulan,31.467206,-83.761554 +31783,GA,Rebecca,31.797921,-83.523478 +31784,GA,Sale City,31.260004,-84.042195 +31786,GA,Shellman,31.743407,-84.616616 +31787,GA,Smithville,31.884692,-84.227066 +31789,GA,Sumner,31.53925,-83.724463 +31790,GA,Sycamore,31.655329,-83.606363 +31791,GA,Sylvester,31.539268,-83.860731 +31792,GA,Thomasville,30.838543,-83.969616 +31794,GA,Abac,31.451722,-83.498867 +31795,GA,Ty Ty,31.45595,-83.621989 +31796,GA,Warwick,31.734495,-83.920092 +31797,GA,Whigham,30.90701,-84.315771 +31798,GA,Wray,31.595229,-83.107484 +31801,GA,Juniper,32.565562,-84.612951 +31803,GA,Tazewell,32.354198,-84.527347 +31804,GA,Cataula,32.624246,-84.920691 +31805,GA,Cusseta,32.299026,-84.764537 +31806,GA,Ellaville,32.23901,-84.303868 +31807,GA,Ellerslie,32.661718,-84.877197 +31808,GA,Fortson,32.628841,-85.001654 +31811,GA,Hamilton,32.741795,-84.884753 +31812,GA,Junction City,32.608046,-84.45741 +31815,GA,Lumpkin,32.043465,-84.802227 +31816,GA,Manchester,32.8721,-84.631166 +31820,GA,Midland,32.561587,-84.855851 +31821,GA,Omaha,32.165234,-84.900792 +31822,GA,Pine Mountain,32.873488,-84.895953 +31823,GA,Pine Mountain Va,32.791849,-84.823874 +31824,GA,Preston,32.074031,-84.548918 +31825,GA,Richland,32.084578,-84.666724 +31826,GA,Shiloh,32.806678,-84.741171 +31827,GA,Talbotton,32.679702,-84.546206 +31829,GA,Upatoi,32.560057,-84.744819 +31830,GA,Warm Springs,32.895558,-84.821728 +31831,GA,Waverly Hall,32.679326,-84.742463 +31832,GA,Weston,31.963665,-84.575579 +31833,GA,West Point,32.833683,-85.119714 +31836,GA,Woodland,32.806066,-84.595187 +31901,GA,Columbus,32.473035,-84.979456 +31903,GA,Columbus,32.424513,-84.948127 +31904,GA,Columbus,32.516091,-84.978475 +31905,GA,Custer Terrace,32.369728,-84.945264 +31906,GA,Columbus,32.463819,-84.948422 +31907,GA,Columbus,32.477909,-84.89799 +31909,GA,Columbus,32.536913,-84.927404 +32350,GA,Pinetta,30.634794,-83.310491 +96701,HI,Aiea,21.390795,-157.933237 +96704,HI,Captain Cook,19.438604,-155.887463 +96705,HI,Eleele,21.923017,-159.538115 +96706,HI,Ewa Beach,21.327418,-158.010307 +96707,HI,Kapolei,21.345284,-158.087007 +96708,HI,Haiku,20.907097,-156.299983 +96710,HI,Hakalau,19.888217,-155.133335 +96712,HI,Haleiwa,21.631151,-158.069315 +96713,HI,Hana,20.761635,-156.039659 +96716,HI,Hanapepe,21.915644,-159.592022 +96717,HI,Hauula,21.61395,-157.915704 +96718,HI,Hawaii National,19.431103,-155.284015 +96719,HI,Hawi,20.238021,-155.838007 +96720,HI,Hilo,19.702522,-155.093921 +96722,HI,Princeville,22.215948,-159.462587 +96725,HI,Holualoa,19.610316,-155.917639 +96726,HI,Honaunau,19.44845,-155.893356 +96727,HI,Honokaa,20.08266,-155.488026 +96728,HI,Honomu,19.872767,-155.11766 +96729,HI,Hoolehua,21.173025,-157.079138 +96730,HI,Kaaawa,21.56737,-157.873734 +96732,HI,Kahului,20.881388,-156.478327 +96734,HI,Kailua,21.406262,-157.744781 +96740,HI,Kailua Kona,19.653053,-155.979809 +96742,HI,Kalaupapa,21.19289,-156.983453 +96743,HI,Kamuela,20.008128,-155.705189 +96744,HI,Kaneohe,21.422819,-157.811543 +96746,HI,Kapaa,22.086798,-159.344842 +96747,HI,Kaumakani,21.921329,-159.62413 +96748,HI,Kaunakakai,21.090504,-156.969015 +96749,HI,Keaau,19.589277,-154.992644 +96750,HI,Kealakekua,19.526149,-155.930025 +96752,HI,Kekaha,21.973509,-159.71988 +96753,HI,Kihei,20.744124,-156.447543 +96755,HI,Kapaau,20.218323,-155.798981 +96756,HI,Koloa,21.908293,-159.474927 +96757,HI,Kualapuu,21.160097,-157.027669 +96760,HI,Kurtistown,19.570637,-155.020659 +96761,HI,Lahaina,20.917432,-156.677162 +96762,HI,Laie,21.659513,-157.939377 +96763,HI,Lanai City,20.829323,-156.921027 +96764,HI,Laupahoehoe,19.980194,-155.232263 +96766,HI,Lihue,21.981618,-159.368258 +96768,HI,Makawao,20.846932,-156.332735 +96769,HI,Makaweli,21.927639,-159.790721 +96770,HI,Maunaloa,21.142202,-157.219277 +96771,HI,Mountain View,19.550587,-155.086436 +96772,HI,Naalehu,19.066844,-155.657474 +96773,HI,Ninole,19.904436,-155.159923 +96774,HI,Ookala,20.011887,-155.274666 +96775,HI,Paauhau,20.027748,-155.449088 +96776,HI,Paauilo,20.027119,-155.369728 +96777,HI,Pahala,19.207898,-155.481506 +96778,HI,Pahoa,19.508901,-154.923135 +96779,HI,Paia,20.91539,-156.38017 +96780,HI,Papaaloa,19.904835,-155.218402 +96781,HI,Papaikou,19.791643,-155.098442 +96782,HI,Pearl City,21.408393,-157.965164 +96783,HI,Pepeekeo,19.835283,-155.112994 +96785,HI,Volcano,19.480066,-155.19743 +96786,HI,Wahiawa,21.500596,-158.043527 +96789,HI,Mililani,21.45311,-158.017379 +96790,HI,Kula,20.753353,-156.326026 +96791,HI,Waialua,21.576623,-158.126673 +96792,HI,Waianae,21.435192,-158.178071 +96793,HI,Wailuku,20.896586,-156.503612 +96795,HI,Waimanalo,21.341786,-157.713094 +96796,HI,Waimea,21.968487,-159.669429 +96797,HI,Waipahu,21.398203,-158.012418 +96813,HI,Honolulu,21.317905,-157.852072 +96814,HI,Honolulu,21.299846,-157.843876 +96815,HI,Honolulu,21.281084,-157.826616 +96816,HI,Honolulu,21.288677,-157.800626 +96817,HI,Honolulu,21.329452,-157.861469 +96818,HI,Honolulu,21.353173,-157.926925 +96819,HI,Honolulu,21.34877,-157.875947 +96821,HI,Honolulu,21.292811,-157.755242 +96822,HI,Honolulu,21.311704,-157.829819 +96825,HI,Honolulu,21.298684,-157.698523 +96826,HI,Honolulu,21.294139,-157.828388 +83201,ID,Pocatello,42.887592,-112.438142 +83202,ID,Chubbuck,42.926548,-112.474873 +83203,ID,Fort Hall,42.988717,-112.459854 +83204,ID,Pocatello,42.846463,-112.443352 +83210,ID,Sterling,42.976717,-112.818124 +83211,ID,American Falls,42.789876,-112.870714 +83212,ID,Arbon,42.502634,-112.558481 +83213,ID,Arco,43.635521,-113.317559 +83214,ID,Arimo,42.559953,-112.174649 +83217,ID,Bancroft,42.720463,-111.842944 +83220,ID,Bern,42.319144,-111.392595 +83221,ID,Blackfoot,43.194327,-112.361545 +83226,ID,Challis,44.496912,-114.19463 +83227,ID,Clayton,44.273289,-114.410189 +83228,ID,Clifton,42.215972,-111.995737 +83230,ID,Conda,42.717126,-111.54023 +83231,ID,Darlington,43.7715,-113.380284 +83232,ID,Dayton,42.11836,-111.985836 +83234,ID,Downey,42.418127,-112.109019 +83235,ID,Ellis,44.878829,-114.001594 +83236,ID,Firth,43.302066,-112.158819 +83237,ID,Franklin,42.030389,-111.822862 +83238,ID,Geneva,42.313585,-111.072185 +83241,ID,Grace,42.549978,-111.739981 +83243,ID,Holbrook,42.222148,-112.693404 +83245,ID,Inkom,42.796379,-112.246474 +83246,ID,Lava Hot Springs,42.618474,-112.017644 +83250,ID,Mc Cammon,42.63362,-112.175758 +83251,ID,Mackay,43.91106,-113.611984 +83252,ID,Malad City,42.180783,-112.262045 +83253,ID,Patterson,44.701745,-113.916039 +83254,ID,Montpelier,42.35199,-111.31946 +83255,ID,Moore,43.782094,-113.260349 +83260,ID,Ovid,42.311423,-111.451109 +83261,ID,Paris,42.207065,-111.402938 +83262,ID,Pingree,43.195618,-112.449035 +83263,ID,Preston,42.110917,-111.856516 +83271,ID,Rockland,42.555582,-112.853982 +83272,ID,Saint Charles,42.112812,-111.389744 +83274,ID,Shelley,43.376901,-112.107549 +83276,ID,Soda Springs,42.671819,-111.569896 +83278,ID,Stanley,44.22908,-114.725414 +83280,ID,Stone,42.038983,-112.711473 +83283,ID,Thatcher,42.331959,-111.78899 +83285,ID,Wayan,43.02691,-111.254056 +83286,ID,Weston,42.044621,-111.97154 +83287,ID,Fish Haven,42.045926,-111.463323 +83301,ID,Twin Falls,42.556495,-114.469265 +83302,ID,Rogerson,42.219567,-114.603794 +83313,ID,Bellevue,43.439694,-114.249804 +83314,ID,Bliss,42.944859,-114.910387 +83316,ID,Buhl,42.600763,-114.782545 +83318,ID,Burley,42.524442,-113.793081 +83320,ID,Carey,43.274443,-113.892567 +83321,ID,Castleford,42.521015,-114.873433 +83322,ID,Corral,43.307127,-115.00871 +83323,ID,Declo,42.524005,-113.644794 +83324,ID,Dietrich,42.91254,-114.266408 +83325,ID,Eden,42.580374,-114.162762 +83326,ID,Elba,42.180865,-113.663559 +83327,ID,Fairfield,43.367504,-114.790845 +83328,ID,Filer,42.565269,-114.614047 +83330,ID,Gooding,42.937345,-114.711966 +83332,ID,Hagerman,42.814205,-114.88697 +83333,ID,Hailey,43.523861,-114.306398 +83334,ID,Hansen,42.524895,-114.299364 +83335,ID,Hazelton,42.595462,-114.134984 +83336,ID,Heyburn,42.559922,-113.770885 +83338,ID,Jerome,42.71784,-114.501244 +83340,ID,Obsidian,43.675459,-114.373664 +83341,ID,Kimberly,42.528656,-114.365725 +83342,ID,Naf,42.364652,-113.448656 +83343,ID,Minidoka,42.759784,-113.620033 +83344,ID,Murtaugh,42.477597,-114.160641 +83346,ID,Oakley,42.347561,-113.906945 +83347,ID,Paul,42.623999,-113.797125 +83348,ID,Picabo,43.310149,-114.086065 +83349,ID,Richfield,43.058839,-114.15079 +83350,ID,Acequia,42.621467,-113.66699 +83352,ID,Shoshone,42.947353,-114.382176 +83355,ID,Wendell,42.757868,-114.715391 +83401,ID,Ammon,43.517679,-111.990626 +83402,ID,Idaho Falls,43.493373,-112.057762 +83404,ID,Idaho Falls,43.475043,-112.012449 +83406,ID,Idaho Falls,43.473233,-111.966052 +83420,ID,Ashton,43.988078,-111.619526 +83422,ID,Driggs,43.726291,-111.119896 +83423,ID,Dubois,44.185769,-112.325852 +83424,ID,Felt,43.872407,-111.189496 +83425,ID,Hamer,43.930751,-112.187189 +83427,ID,Iona,43.525946,-111.928356 +83429,ID,Island Park,44.446606,-111.367914 +83431,ID,Lewisville,43.672476,-112.018884 +83434,ID,Menan,43.726576,-111.983702 +83435,ID,Monteview,43.986242,-112.578321 +83436,ID,Newdale,43.888078,-111.604192 +83440,ID,Rexburg,43.809968,-111.789022 +83442,ID,Rigby,43.671462,-111.900481 +83443,ID,Ririe,43.631961,-111.760692 +83444,ID,Roberts,43.7116,-112.119591 +83445,ID,Saint Anthony,44.274499,-111.523156 +83446,ID,Spencer,44.281444,-112.098821 +83448,ID,Sugar City,43.866852,-111.79004 +83449,ID,Swan Valley,43.405826,-111.279358 +83450,ID,Terreton,43.858635,-112.420041 +83451,ID,Teton,43.898751,-111.668145 +83452,ID,Tetonia,43.843713,-111.186997 +83455,ID,Victor,43.614827,-111.125934 +83462,ID,Carmen,45.255016,-113.857267 +83463,ID,Gibbonsville,45.484608,-113.956466 +83464,ID,Leadore,44.738909,-113.492586 +83466,ID,North Fork,45.377605,-113.857287 +83467,ID,Salmon,45.157142,-113.878356 +83469,ID,Shoup,45.18514,-114.405987 +83501,ID,South Gate Plaza,46.389457,-116.987714 +83520,ID,Ahsahka,46.510318,-116.371537 +83522,ID,Cottonwood,46.044789,-116.373306 +83523,ID,Craigmont,46.245292,-116.467655 +83524,ID,Culdesac,46.378012,-116.653579 +83525,ID,Dixie,45.888897,-115.359158 +83526,ID,Ferdinand,46.134877,-116.39817 +83530,ID,Grangeville,45.927239,-116.107639 +83533,ID,Greencreek,46.115523,-116.27239 +83535,ID,Juliaetta,46.575376,-116.718849 +83536,ID,Kamiah,46.21856,-116.034742 +83537,ID,Kendrick,46.628628,-116.604895 +83538,ID,Keuterville,45.929443,-116.535583 +83539,ID,Clearwater,46.125859,-115.92396 +83540,ID,Lapwai,46.412403,-116.790225 +83541,ID,Lenore,46.535408,-116.513015 +83542,ID,Lucile,45.556963,-116.266899 +83543,ID,Nezperce,46.247533,-116.239281 +83544,ID,Orofino,46.495197,-116.240417 +83545,ID,Peck,46.480661,-116.411394 +83546,ID,Pierce,46.492424,-115.807071 +83547,ID,Pollock,45.306754,-116.351742 +83548,ID,Reubens,46.336112,-116.533334 +83549,ID,Riggins,45.397006,-116.300553 +83553,ID,Weippe,46.38069,-115.938593 +83554,ID,White Bird,45.752096,-116.2889 +83555,ID,Winchester,46.238334,-116.620382 +83601,ID,Atlanta,43.567436,-115.357042 +83602,ID,Banks,44.149152,-115.983737 +83604,ID,Grasmere,42.76006,-115.677259 +83605,ID,Caldwell,43.662719,-116.700038 +83610,ID,Cambridge,44.59216,-116.675717 +83611,ID,West Mountain,44.493273,-116.027676 +83612,ID,Council,44.762754,-116.451833 +83615,ID,Donnelly,44.74937,-116.08578 +83616,ID,Eagle,43.706879,-116.361966 +83617,ID,Montour,43.879152,-116.511459 +83619,ID,Fruitland,44.002658,-116.914259 +83622,ID,Garden Valley,44.090932,-115.824311 +83623,ID,Glenns Ferry,42.962202,-115.315973 +83624,ID,Grand View,42.810101,-116.08187 +83627,ID,Hammett,42.981755,-115.565839 +83628,ID,Homedale,43.613844,-116.947228 +83629,ID,Horseshoe Bend,43.922882,-116.180898 +83631,ID,Idaho City,43.758601,-115.918436 +83632,ID,Indian Valley,44.549134,-116.442969 +83633,ID,King Hill,42.936104,-115.269098 +83634,ID,Kuna,43.487034,-116.381859 +83636,ID,Letha,43.840306,-116.585004 +83637,ID,Lowman,44.110616,-115.528488 +83638,ID,Mc Call,44.891784,-116.078873 +83639,ID,Marsing,43.539866,-116.823968 +83641,ID,Melba,43.37842,-116.548875 +83642,ID,Meridian,43.614963,-116.397538 +83643,ID,Mesa,44.657747,-116.42113 +83644,ID,Middleton,43.719052,-116.61122 +83645,ID,Midvale,44.441979,-116.703838 +83647,ID,Mountain Home,43.139223,-115.696334 +83648,ID,Mountain Home A,43.049315,-115.873609 +83650,ID,Oreana,43.207296,-116.605379 +83651,ID,Nampa,43.58342,-116.584818 +83654,ID,New Meadows,44.993969,-116.287438 +83655,ID,New Plymouth,43.959021,-116.804818 +83657,ID,Ola,44.235026,-116.290915 +83660,ID,Parma,43.789576,-116.940066 +83661,ID,Payette,44.07818,-116.920277 +83669,ID,Star,43.701296,-116.496735 +83670,ID,Sweet,43.99475,-116.323215 +83672,ID,Weiser,44.25222,-116.96507 +83676,ID,Wilder,43.657851,-116.912199 +83677,ID,Yellow Pine,44.969809,-115.49634 +83686,ID,Nampa,43.544125,-116.565962 +83687,ID,Nampa,43.593657,-116.536024 +83702,ID,Boise,43.632237,-116.205192 +83703,ID,Boise,43.660051,-116.252396 +83704,ID,Boise,43.633001,-116.295099 +83705,ID,Boise,43.585077,-116.219104 +83706,ID,Boise,43.588495,-116.191006 +83709,ID,Boise,43.574085,-116.29407 +83712,ID,Boise,43.602311,-116.164924 +83714,ID,Garden City,43.643036,-116.265751 +83801,ID,Athol,47.92674,-116.731821 +83802,ID,Avery,47.271431,-115.866012 +83803,ID,Bayview,47.96535,-116.568745 +83804,ID,Blanchard,48.022344,-116.990865 +83805,ID,Bonners Ferry,48.730642,-116.332178 +83808,ID,Calder,47.274135,-116.222793 +83809,ID,Careywood,48.062494,-116.598761 +83810,ID,Cataldo,47.552169,-116.443138 +83811,ID,Clark Fork,48.140457,-116.169865 +83812,ID,Clarkia,47.044477,-116.277408 +83813,ID,Cocolalla,48.124828,-116.657051 +83814,ID,Coeur D Alene,47.692841,-116.784976 +83821,ID,Coolin,48.522754,-116.840823 +83822,ID,Old Town,48.187988,-116.927382 +83823,ID,Deary,46.806062,-116.523782 +83824,ID,Desmet,47.125954,-116.893746 +83827,ID,Elk River,46.782972,-116.179943 +83830,ID,Fernwood,47.116027,-116.383126 +83832,ID,Genesee,46.571394,-116.928991 +83833,ID,Harrison,47.501692,-116.744607 +83834,ID,Harvard,46.937647,-116.702524 +83835,ID,Hayden Lake,47.773853,-116.776821 +83836,ID,Hope,48.244402,-116.279504 +83837,ID,Kellogg,47.543069,-116.125281 +83839,ID,Kingston,47.550881,-116.288722 +83842,ID,Medimont,47.462482,-116.568291 +83843,ID,Moscow,46.730921,-116.989683 +83845,ID,Moyie Springs,48.746434,-116.179603 +83846,ID,Mullan,47.470906,-115.792603 +83847,ID,Naples,48.60491,-116.319636 +83848,ID,Nordman,48.566944,-116.92126 +83850,ID,Pinehurst,47.501823,-116.264679 +83851,ID,Plummer,47.327782,-116.866161 +83853,ID,Porthill,48.992037,-116.477517 +83854,ID,Post Falls,47.720475,-116.935349 +83855,ID,Potlatch,46.944833,-116.914101 +83856,ID,Priest River,48.16637,-116.906617 +83857,ID,Princeton,46.899556,-116.828728 +83858,ID,Rathdrum,47.824107,-116.887294 +83860,ID,Sagle,48.2035,-116.5455 +83861,ID,Saint Maries,47.297727,-116.568107 +83864,ID,Sandpoint,48.311989,-116.533249 +83868,ID,Smelterville,47.537096,-116.240113 +83869,ID,Spirit Lake,47.965652,-116.868046 +83870,ID,Tensed,47.170735,-116.902716 +83871,ID,Troy,46.742648,-116.768105 +83872,ID,Viola,46.858293,-116.97319 +83873,ID,Wallace,47.490842,-115.962001 +83876,ID,Worley,47.429213,-116.905634 +60002,IL,Antioch,42.464811,-88.117802 +60004,IL,Arlington Height,42.111619,-87.979099 +60005,IL,Arlington Height,42.066599,-87.985461 +60007,IL,Elk Grove Villag,42.005613,-88.012775 +60008,IL,Rolling Meadows,42.072979,-88.019075 +60010,IL,Barrington,42.161387,-88.138345 +60012,IL,Crystal Lake,42.266198,-88.321294 +60013,IL,Cary,42.219599,-88.242594 +60014,IL,Crystal Lake,42.230755,-88.332364 +60015,IL,Deerfield,42.170494,-87.859033 +60016,IL,Des Plaines,42.046734,-87.885899 +60018,IL,Rosemont,42.015116,-87.897882 +60020,IL,Fox Lake,42.393701,-88.164752 +60021,IL,Fox River Grove,42.193594,-88.220483 +60022,IL,Glencoe,42.133339,-87.761486 +60025,IL,Glenview,42.075785,-87.822299 +60026,IL,Glenview Nas,42.09134,-87.824782 +60030,IL,Gages Lake,42.34848,-88.037789 +60031,IL,Gurnee,42.366906,-87.945232 +60033,IL,Harvard,42.422727,-88.604812 +60034,IL,Hebron,42.464173,-88.417583 +60035,IL,Highland Park,42.179446,-87.805894 +60037,IL,Fort Sheridan,42.209683,-87.805572 +60040,IL,Highwood,42.203549,-87.814068 +60041,IL,Ingleside,42.363093,-88.158749 +60042,IL,Island Lake,42.274186,-88.19263 +60043,IL,Kenilworth,42.088444,-87.716463 +60044,IL,Lake Bluff,42.28196,-87.85595 +60045,IL,Lake Forest,42.237398,-87.848154 +60046,IL,Lindenhurst,42.414796,-88.063318 +60047,IL,Long Grove,42.196721,-88.070299 +60048,IL,Libertyville,42.281001,-87.949955 +60050,IL,Mc Henry,42.345527,-88.254429 +60053,IL,Morton Grove,42.043133,-87.789879 +60056,IL,Mount Prospect,42.062392,-87.937667 +60060,IL,Mundelein,42.263616,-88.004762 +60061,IL,Vernon Hills,42.228753,-87.971852 +60062,IL,Northbrook,42.125443,-87.846535 +60064,IL,Abbott Park,42.318901,-87.847819 +60067,IL,Palatine,42.113888,-88.042937 +60068,IL,Park Ridge,42.012171,-87.841675 +60069,IL,Prairie View,42.192872,-87.904823 +60070,IL,Prospect Heights,42.103324,-87.914934 +60071,IL,Richmond,42.466863,-88.290024 +60072,IL,Ringwood,42.380427,-88.297073 +60073,IL,Round Lake,42.366809,-88.088819 +60074,IL,Palatine,42.145775,-88.022998 +60076,IL,Skokie,42.036168,-87.732828 +60077,IL,Skokie,42.034525,-87.754123 +60081,IL,Spring Grove,42.441267,-88.223734 +60082,IL,Techny,42.121425,-87.804882 +60083,IL,Wadsworth,42.446032,-87.904048 +60084,IL,Wauconda,42.263553,-88.133284 +60085,IL,Mc Gaw Park,42.361882,-87.852585 +60087,IL,Waukegan,42.398906,-87.855387 +60088,IL,Great Lakes,42.303173,-87.864192 +60089,IL,Buffalo Grove,42.159843,-87.964364 +60090,IL,Wheeling,42.13404,-87.934097 +60091,IL,Wilmette,42.076462,-87.724572 +60093,IL,Northfield,42.103605,-87.752256 +60096,IL,Winthrop Harbor,42.479269,-87.831788 +60097,IL,Wonder Lake,42.384908,-88.353364 +60098,IL,Woodstock,42.319775,-88.447671 +60099,IL,Zion,42.444249,-87.838925 +60101,IL,Addison,41.933509,-88.0054 +60102,IL,Lake In The Hill,42.170923,-88.301429 +60103,IL,Hanover Park,41.983559,-88.160356 +60104,IL,Bellwood,41.882484,-87.878557 +60106,IL,Bensenville,41.950145,-87.944973 +60107,IL,Streamwood,42.022539,-88.168965 +60108,IL,Bloomingdale,41.94827,-88.07824 +60110,IL,Carpentersville,42.123004,-88.2606 +60111,IL,Clare,42.027045,-88.837832 +60115,IL,De Kalb,41.934245,-88.760673 +60118,IL,Dundee,42.096197,-88.290202 +60119,IL,Elburn,41.882405,-88.461106 +60120,IL,Elgin,42.038356,-88.260631 +60123,IL,Elgin,42.037574,-88.318615 +60126,IL,Elmhurst,41.892661,-87.941025 +60129,IL,Esmond,42.022458,-88.94386 +60130,IL,Forest Park,41.874373,-87.810624 +60131,IL,Franklin Park,41.933878,-87.873423 +60134,IL,Geneva,41.886013,-88.310954 +60135,IL,Genoa,42.09811,-88.690803 +60136,IL,Gilberts,42.098377,-88.369089 +60137,IL,Glen Ellyn,41.866112,-88.064774 +60139,IL,Glendale Heights,41.920523,-88.079282 +60140,IL,Hampshire,42.080748,-88.517033 +60141,IL,Hines,41.862262,-87.835542 +60142,IL,Huntley,42.175555,-88.426848 +60143,IL,Itasca,41.971967,-88.020247 +60145,IL,Kingston,42.105654,-88.769496 +60146,IL,Kirkland,42.101406,-88.868522 +60148,IL,Lombard,41.872139,-88.015988 +60150,IL,Malta,41.918332,-88.868818 +60151,IL,Maple Park,41.923217,-88.59985 +60152,IL,Marengo,42.244189,-88.607369 +60153,IL,Broadview,41.874857,-87.847675 +60154,IL,Westchester,41.852368,-87.884488 +60157,IL,Medinah,41.970545,-88.057507 +60160,IL,Melrose Park,41.900347,-87.858066 +60162,IL,Hillside,41.872452,-87.901591 +60163,IL,Hillside,41.886538,-87.910678 +60164,IL,Northlake,41.917961,-87.89592 +60165,IL,Stone Park,41.903005,-87.881053 +60171,IL,River Grove,41.927886,-87.838707 +60172,IL,Roselle,41.979834,-88.085699 +60173,IL,Schaumburg,42.05807,-88.048189 +60174,IL,Saint Charles,41.919417,-88.307022 +60175,IL,Saint Charles,41.947842,-88.391799 +60176,IL,Schiller Park,41.956304,-87.869179 +60177,IL,South Elgin,41.996868,-88.298558 +60178,IL,Sycamore,41.991117,-88.692809 +60180,IL,Union,42.210274,-88.528295 +60181,IL,Villa Park,41.879899,-87.978246 +60185,IL,West Chicago,41.888558,-88.202168 +60187,IL,Wheaton,41.856592,-88.107633 +60188,IL,Carol Stream,41.91784,-88.136962 +60190,IL,Winfield,41.874358,-88.151621 +60191,IL,Wood Dale,41.960171,-87.980971 +60193,IL,Schaumburg,42.014432,-88.093481 +60194,IL,Hoffman Estates,42.039025,-88.109442 +60195,IL,Hoffman Estates,42.073865,-88.108709 +60201,IL,Evanston,42.054551,-87.694331 +60202,IL,Evanston,42.03022,-87.686544 +60203,IL,Evanston,42.048487,-87.71759 +60301,IL,Oak Park,41.888601,-87.798598 +60302,IL,Oak Park,41.892471,-87.789543 +60304,IL,Oak Park,41.872458,-87.787712 +60305,IL,River Forest,41.895064,-87.8159 +60401,IL,Beecher,41.34437,-87.611538 +60402,IL,Stickney,41.841819,-87.79075 +60406,IL,Blue Island,41.658187,-87.679465 +60407,IL,Braceville,41.228788,-88.269042 +60408,IL,Braidwood,41.26574,-88.223124 +60409,IL,Calumet City,41.615257,-87.548328 +60410,IL,Channahon,41.434664,-88.213786 +60411,IL,Sauk Village,41.506202,-87.613209 +60415,IL,Chicago Ridge,41.70171,-87.777381 +60416,IL,Coal City,41.290769,-88.282346 +60417,IL,Crete,41.438952,-87.602738 +60419,IL,Dolton,41.625723,-87.597952 +60420,IL,Dwight,41.088701,-88.415884 +60421,IL,Elwood,41.426018,-88.08642 +60422,IL,Flossmoor,41.540574,-87.683737 +60423,IL,Frankfort,41.509361,-87.824774 +60424,IL,Gardner,41.179321,-88.296543 +60425,IL,Glenwood,41.546718,-87.612584 +60426,IL,Markham,41.608536,-87.661115 +60429,IL,Hazel Crest,41.573803,-87.684885 +60430,IL,Homewood,41.555579,-87.661578 +60431,IL,Joliet,41.527154,-88.08241 +60432,IL,Joliet,41.537758,-88.057178 +60433,IL,Joliet,41.511873,-88.05687 +60435,IL,Shorewood,41.541468,-88.128107 +60436,IL,Rockdale,41.508818,-88.135779 +60437,IL,Kinsman,41.161825,-88.480477 +60438,IL,Lansing,41.566045,-87.544634 +60439,IL,Argonne,41.695076,-88.023558 +60440,IL,Bolingbrook,41.697605,-88.087315 +60441,IL,Romeoville,41.613481,-88.025581 +60442,IL,Manhattan,41.428883,-87.977133 +60443,IL,Matteson,41.510183,-87.740648 +60444,IL,Mazon,41.297189,-88.409561 +60445,IL,Crestwood,41.634106,-87.732418 +60447,IL,Minooka,41.461516,-88.278596 +60448,IL,Mokena,41.53421,-87.891121 +60449,IL,Monee,41.419133,-87.77484 +60450,IL,Morris,41.367233,-88.417769 +60451,IL,New Lenox,41.506701,-87.963083 +60452,IL,Oak Forest,41.607684,-87.754219 +60453,IL,Oak Lawn,41.714305,-87.751564 +60455,IL,Bridgeview,41.743128,-87.806572 +60456,IL,Hometown,41.73113,-87.731536 +60457,IL,Hickory Hills,41.726228,-87.828893 +60458,IL,Justice,41.744709,-87.834587 +60459,IL,Burbank,41.744704,-87.769907 +60460,IL,Odell,41.023773,-88.515641 +60461,IL,Olympia Fields,41.51564,-87.689952 +60462,IL,Orland Park,41.619378,-87.84225 +60463,IL,Palos Heights,41.662146,-87.792697 +60464,IL,Palos Park,41.662352,-87.852146 +60465,IL,Palos Hills,41.700389,-87.826276 +60466,IL,University Park,41.474064,-87.682867 +60468,IL,Peotone,41.33609,-87.78968 +60469,IL,Posen,41.62766,-87.687213 +60470,IL,Ransom,41.153048,-88.650214 +60471,IL,Richton Park,41.481854,-87.723834 +60472,IL,Robbins,41.642289,-87.708909 +60473,IL,South Holland,41.597916,-87.593814 +60475,IL,Steger,41.468608,-87.638585 +60476,IL,Thornton,41.572726,-87.607823 +60477,IL,Tinley Park,41.582535,-87.804963 +60478,IL,Country Club Hil,41.559773,-87.718452 +60479,IL,Verona,41.250094,-88.51701 +60480,IL,Willow Springs,41.736416,-87.878588 +60481,IL,Custer Park,41.298063,-88.130083 +60482,IL,Worth,41.689498,-87.786272 +60501,IL,Argo,41.784245,-87.807468 +60504,IL,Aurora,41.752269,-88.245281 +60505,IL,Aurora,41.758209,-88.297139 +60506,IL,Aurora,41.766414,-88.344582 +60510,IL,Batavia,41.848165,-88.309756 +60511,IL,Big Rock,41.759308,-88.537617 +60512,IL,Bristol,41.707446,-88.401354 +60513,IL,Brookfield,41.82167,-87.849246 +60514,IL,Clarendon Hills,41.779729,-87.955322 +60515,IL,Downers Grove,41.803428,-88.013753 +60516,IL,Downers Grove,41.760157,-88.015873 +60517,IL,Woodridge,41.751755,-88.04885 +60518,IL,Earlville,41.585901,-88.910346 +60520,IL,Hinckley,41.769108,-88.644831 +60521,IL,Oak Brook,41.7891,-87.940089 +60525,IL,Hodgkins,41.801345,-87.875252 +60530,IL,Lee,41.786418,-88.971386 +60531,IL,Leland,41.606591,-88.771574 +60532,IL,Lisle,41.786174,-88.0879 +60534,IL,Lyons,41.813016,-87.823559 +60538,IL,Montgomery,41.717742,-88.331965 +60539,IL,Mooseheart,41.824148,-88.331532 +60540,IL,Naperville,41.766198,-88.141038 +60541,IL,Newark,41.526679,-88.527006 +60542,IL,North Aurora,41.808932,-88.327424 +60543,IL,Oswego,41.684893,-88.345305 +60544,IL,Plainfield,41.600884,-88.199391 +60545,IL,Plano,41.666987,-88.53838 +60546,IL,North Riverside,41.837367,-87.821356 +60548,IL,Sandwich,41.635286,-88.639303 +60549,IL,Serena,41.499481,-88.75089 +60550,IL,Shabbona,41.763846,-88.875249 +60551,IL,Sheridan,41.516428,-88.670634 +60552,IL,Somonauk,41.638289,-88.681645 +60553,IL,Steward,41.847545,-89.015086 +60554,IL,Sugar Grove,41.774113,-88.439721 +60555,IL,Warrenville,41.828046,-88.19213 +60556,IL,Waterman,41.750365,-88.775381 +60558,IL,Western Springs,41.804864,-87.899485 +60559,IL,Westmont,41.772848,-87.975736 +60560,IL,Yorkville,41.638725,-88.443794 +60563,IL,Naperville,41.78955,-88.16901 +60564,IL,Naperville,41.704022,-88.195248 +60565,IL,Naperville,41.732833,-88.128245 +60601,IL,Chicago,41.885847,-87.618123 +60602,IL,Chicago,41.882883,-87.632125 +60603,IL,Chicago,41.87985,-87.628499 +60604,IL,Chicago,41.87845,-87.632999 +60605,IL,Chicago,41.87125,-87.627715 +60606,IL,Chicago,41.886822,-87.638648 +60607,IL,Chicago,41.872075,-87.657845 +60608,IL,Chicago,41.851482,-87.669444 +60609,IL,Chicago,41.809721,-87.653279 +60610,IL,Chicago,41.903294,-87.633565 +60611,IL,Chicago,41.897105,-87.622285 +60612,IL,Chicago,41.880483,-87.687333 +60613,IL,Chicago,41.954341,-87.657491 +60614,IL,Chicago,41.92286,-87.648295 +60615,IL,Chicago,41.802211,-87.600623 +60616,IL,Chicago,41.84258,-87.630552 +60617,IL,Chicago,41.725743,-87.556012 +60618,IL,Chicago,41.946401,-87.704214 +60619,IL,Chicago,41.745765,-87.60539 +60620,IL,Chicago,41.741119,-87.654251 +60621,IL,Chicago,41.774993,-87.642136 +60622,IL,Chicago,41.901923,-87.67785 +60623,IL,Chicago,41.849015,-87.7157 +60624,IL,Chicago,41.880394,-87.722349 +60625,IL,Chicago,41.970325,-87.704157 +60626,IL,Chicago,42.009475,-87.668887 +60627,IL,Riverdale,41.645918,-87.618213 +60628,IL,Chicago,41.693443,-87.624277 +60629,IL,Chicago,41.778149,-87.706936 +60630,IL,Chicago,41.969862,-87.760273 +60631,IL,Chicago,41.995145,-87.808215 +60632,IL,Chicago,41.809274,-87.70518 +60633,IL,Burnham,41.649791,-87.549489 +60634,IL,Norridge,41.945213,-87.796054 +60635,IL,Elmwood Park,41.922907,-87.808593 +60636,IL,Chicago,41.775989,-87.667368 +60637,IL,Chicago,41.781312,-87.605097 +60638,IL,Bedford Park,41.789703,-87.771927 +60639,IL,Chicago,41.920162,-87.753502 +60640,IL,Chicago,41.971928,-87.662405 +60641,IL,Chicago,41.945333,-87.747376 +60642,IL,Evergreen Park,41.718765,-87.701721 +60643,IL,Calumet Park,41.693243,-87.659445 +60644,IL,Chicago,41.882913,-87.758163 +60645,IL,Lincolnwood,42.007718,-87.6962 +60646,IL,Lincolnwood,41.996414,-87.759172 +60647,IL,Chicago,41.920903,-87.704322 +60648,IL,Chicago,42.031101,-87.81636 +60649,IL,Chicago,41.761968,-87.570252 +60650,IL,Cicero,41.84776,-87.76008 +60651,IL,Chicago,41.902509,-87.739307 +60652,IL,Chicago,41.745393,-87.713516 +60653,IL,Chicago,41.819645,-87.612605 +60654,IL,Chicago,41.888533,-87.635292 +60655,IL,Merrionette Park,41.693033,-87.702188 +60656,IL,Harwood Heights,41.971844,-87.819981 +60657,IL,Chicago,41.93992,-87.652805 +60658,IL,Alsip,41.671505,-87.729967 +60659,IL,Lincolnwood,41.991687,-87.700823 +60660,IL,Chicago,41.990879,-87.662856 +60661,IL,Chicago,41.881351,-87.642969 +60666,IL,Amf Ohare,41.9821,-87.906803 +60901,IL,Kankakee,41.116582,-87.869607 +60910,IL,Aroma Park,41.094653,-87.771887 +60911,IL,Ashkum,40.884431,-87.941148 +60912,IL,Beaverville,40.967164,-87.621715 +60913,IL,Bonfield,41.15731,-88.061854 +60914,IL,Bourbonnais,41.166119,-87.879023 +60915,IL,Bradley,41.145376,-87.860115 +60917,IL,Buckingham,41.043316,-88.177156 +60918,IL,Buckley,40.601827,-88.036092 +60919,IL,Cabery,40.981895,-88.192085 +60921,IL,Chatsworth,40.748441,-88.293662 +60922,IL,Chebanse,41.02541,-87.895917 +60924,IL,Cissna Park,40.585814,-87.87588 +60927,IL,Clifton,40.939444,-87.920237 +60928,IL,Crescent City,40.7682,-87.83703 +60929,IL,Cullom,40.878066,-88.276476 +60930,IL,Danforth,40.82443,-87.986824 +60931,IL,Donovan,40.889074,-87.604635 +60934,IL,Emington,40.978317,-88.321135 +60935,IL,Essex,41.167644,-88.184528 +60936,IL,Gibson City,40.465932,-88.360873 +60938,IL,Gilman,40.767987,-87.993336 +60940,IL,Grant Park,41.247677,-87.647992 +60941,IL,Herscher,41.046441,-88.085801 +60942,IL,Hoopeston,40.463873,-87.666229 +60946,IL,Kempton,40.912604,-88.209013 +60948,IL,Loda,40.524097,-88.092675 +60949,IL,Ludlow,40.374736,-88.137965 +60950,IL,Manteno,41.251439,-87.846761 +60951,IL,Martinton,40.905233,-87.744257 +60952,IL,Melvin,40.571379,-88.255078 +60953,IL,Milford,40.629253,-87.685332 +60954,IL,Momence,41.159308,-87.657515 +60955,IL,Onarga,40.712005,-87.995841 +60957,IL,Paxton,40.456546,-88.098989 +60959,IL,Piper City,40.755615,-88.187347 +60960,IL,Rankin,40.455911,-87.888355 +60961,IL,Reddick,41.10053,-88.208928 +60962,IL,Roberts,40.619333,-88.180414 +60963,IL,Rossville,40.362548,-87.669181 +60964,IL,Saint Anne,41.048725,-87.656363 +60966,IL,Sheldon,40.780288,-87.57364 +60968,IL,Thawville,40.684011,-88.09993 +60970,IL,Watseka,40.773351,-87.730932 +60973,IL,Wellington,40.53394,-87.65607 +61001,IL,Apple River,42.471432,-90.120145 +61006,IL,Ashton,41.864327,-89.2086 +61007,IL,Baileyville,42.190465,-89.593937 +61008,IL,Belvidere,42.259465,-88.850943 +61010,IL,Byron,42.129236,-89.265887 +61011,IL,Caledonia,42.38346,-88.918456 +61012,IL,Capron,42.408659,-88.746518 +61014,IL,Chadwick,41.996205,-89.896278 +61015,IL,Chana,41.993343,-89.211693 +61016,IL,Cherry Valley,42.220562,-88.961923 +61018,IL,Dakota,42.403078,-89.546782 +61019,IL,Davis,42.442157,-89.406721 +61020,IL,Davis Junction,42.09792,-89.083838 +61021,IL,Dixon,41.847797,-89.489303 +61024,IL,Durand,42.433653,-89.309378 +61025,IL,East Dubuque,42.487488,-90.604597 +61028,IL,Elizabeth,42.308942,-90.19862 +61030,IL,Forreston,42.122924,-89.583124 +61031,IL,Franklin Grove,41.857968,-89.317112 +61032,IL,Freeport,42.299148,-89.634521 +61036,IL,Galena,42.418233,-90.419509 +61038,IL,Garden Prairie,42.250983,-88.74367 +61039,IL,German Valley,42.21761,-89.471151 +61041,IL,Hanover,42.259405,-90.289707 +61042,IL,Harmon,41.697296,-89.569513 +61044,IL,Kent,42.315528,-89.919489 +61045,IL,Kings,42.013987,-89.099685 +61046,IL,Lanark,42.093534,-89.824732 +61047,IL,Egan,42.140975,-89.401024 +61048,IL,Lena,42.379054,-89.825251 +61049,IL,Lindenwood,42.050741,-89.033979 +61050,IL,Mc Connell,42.439511,-89.741545 +61051,IL,Milledgeville,41.96737,-89.780121 +61052,IL,Monroe Center,42.10501,-89.016946 +61053,IL,Mount Carroll,42.105308,-89.984454 +61054,IL,Mount Morris,42.047903,-89.434614 +61060,IL,Orangeville,42.472779,-89.644757 +61061,IL,Oregon,42.009512,-89.344364 +61062,IL,Pearl City,42.260972,-89.839329 +61063,IL,Pecatonica,42.305111,-89.347225 +61064,IL,Polo,41.98895,-89.598358 +61065,IL,Poplar Grove,42.359365,-88.842774 +61067,IL,Ridott,42.299607,-89.462664 +61068,IL,Rochelle,41.928156,-89.071035 +61070,IL,Rock City,42.410345,-89.475901 +61071,IL,Rock Falls,41.766525,-89.692473 +61072,IL,Rockton,42.454371,-89.088744 +61073,IL,Roscoe,42.421659,-88.99433 +61074,IL,Savanna,42.095581,-90.140061 +61075,IL,Scales Mound,42.471548,-90.258033 +61078,IL,Shannon,42.161049,-89.748075 +61080,IL,South Beloit,42.483672,-89.029791 +61081,IL,Sterling,41.805511,-89.70539 +61084,IL,Stillman Valley,42.11835,-89.189762 +61085,IL,Stockton,42.349224,-90.020185 +61087,IL,Warren,42.489001,-89.985992 +61088,IL,Winnebago,42.272723,-89.237316 +61089,IL,Winslow,42.48383,-89.806028 +61101,IL,Rockford,42.292233,-89.116118 +61102,IL,Rockford,42.254669,-89.124695 +61103,IL,Rockford,42.300986,-89.083326 +61104,IL,Rockford,42.255355,-89.076779 +61107,IL,Rockford,42.278629,-89.036107 +61108,IL,Rockford,42.251406,-89.023519 +61109,IL,Rockford,42.216581,-89.05118 +61111,IL,Loves Park,42.32952,-89.033521 +61112,IL,Rockford,42.245639,-88.970429 +61201,IL,Rock Island,41.491317,-90.564796 +61230,IL,Albany,41.765874,-90.208051 +61231,IL,Aledo,41.20078,-90.741629 +61232,IL,Andalusia,41.435324,-90.728385 +61234,IL,Annawan,41.398022,-89.912949 +61235,IL,Atkinson,41.41619,-90.022482 +61238,IL,Cambridge,41.311379,-90.18048 +61240,IL,Coal Valley,41.435143,-90.465179 +61241,IL,Green Rock,41.475224,-90.349231 +61242,IL,Cordova,41.69278,-90.307121 +61243,IL,Deer Grove,41.631599,-89.6972 +61244,IL,East Moline,41.511804,-90.432118 +61250,IL,Erie,41.655958,-90.084264 +61251,IL,Fenton,41.728495,-90.045685 +61252,IL,Fulton,41.8522,-90.150653 +61254,IL,Geneseo,41.46881,-90.171127 +61256,IL,Hampton,41.541805,-90.323037 +61257,IL,Hillsdale,41.592896,-90.226255 +61259,IL,Illinois City,41.389236,-90.892507 +61260,IL,Joy,41.226198,-90.851757 +61261,IL,Lyndon,41.719933,-89.916865 +61262,IL,Lynn Center,41.288761,-90.330444 +61263,IL,Matherville,41.269075,-90.602343 +61264,IL,Milan,41.426197,-90.573935 +61265,IL,Moline,41.490609,-90.497968 +61270,IL,Morrison,41.816664,-89.968995 +61272,IL,New Boston,41.215259,-90.98786 +61273,IL,Orion,41.363367,-90.384929 +61274,IL,Osco,41.363674,-90.268093 +61275,IL,Port Byron,41.601346,-90.326291 +61277,IL,Prophetstown,41.631223,-89.946665 +61279,IL,Reynolds,41.327675,-90.638367 +61281,IL,Sherrard,41.302669,-90.493863 +61282,IL,Silvis,41.500677,-90.412609 +61283,IL,Tampico,41.652158,-89.794793 +61284,IL,Taylor Ridge,41.382755,-90.734047 +61285,IL,Thomson,41.981626,-90.084443 +61301,IL,La Salle,41.344221,-89.095468 +61310,IL,Amboy,41.704181,-89.34716 +61311,IL,Ancona,41.055118,-88.766039 +61312,IL,Arlington,41.443669,-89.221949 +61313,IL,Blackstone,41.071945,-88.649782 +61314,IL,Buda,41.313973,-89.679476 +61318,IL,Compton,41.684976,-89.087708 +61319,IL,Manville,40.985827,-88.742694 +61320,IL,Dalzell,41.373077,-89.203269 +61321,IL,Dana,40.954675,-88.962793 +61325,IL,Grand Ridge,41.238621,-88.816836 +61326,IL,Granville,41.264212,-89.225029 +61327,IL,Hennepin,41.235154,-89.321791 +61330,IL,La Moille,41.537557,-89.297024 +61332,IL,Leonore,41.166368,-88.996936 +61333,IL,Long Point,40.989553,-88.881106 +61334,IL,Lostant,41.145007,-89.075031 +61335,IL,Mc Nabb,41.173026,-89.218664 +61336,IL,Magnolia,41.116374,-89.22701 +61337,IL,Malden,41.437743,-89.36761 +61341,IL,Marseilles,41.330201,-88.694678 +61342,IL,Mendota,41.544308,-89.10828 +61344,IL,Mineral,41.403556,-89.820087 +61345,IL,Neponset,41.290457,-89.794382 +61346,IL,New Bedford,41.540883,-89.778558 +61348,IL,Oglesby,41.292768,-89.055341 +61349,IL,Ohio,41.537149,-89.457411 +61350,IL,Ottawa,41.352619,-88.841589 +61353,IL,Paw Paw,41.685228,-88.967377 +61354,IL,Peru,41.333021,-89.126478 +61356,IL,Princeton,41.362934,-89.427017 +61358,IL,Rutland,40.984407,-89.038829 +61360,IL,Seneca,41.315248,-88.610013 +61361,IL,Sheffield,41.394876,-89.711502 +61362,IL,Spring Valley,41.327923,-89.20417 +61364,IL,Streator,41.12249,-88.830672 +61367,IL,Sublette,41.633144,-89.235409 +61368,IL,Tiskilwa,41.289055,-89.507968 +61369,IL,Toluca,41.004553,-89.13481 +61370,IL,Tonica,41.232741,-89.088993 +61373,IL,Utica,41.363033,-89.000795 +61375,IL,Varna,41.032723,-89.248331 +61376,IL,Normandy,41.553035,-89.592237 +61377,IL,Wenona,41.054846,-89.041637 +61378,IL,West Brooklyn,41.729156,-89.190917 +61379,IL,Wyanet,41.378452,-89.574423 +61401,IL,Galesburg,40.952138,-90.369807 +61410,IL,Abingdon,40.802312,-90.400898 +61411,IL,Adair,40.385197,-90.503742 +61412,IL,Alexis,41.052146,-90.543576 +61413,IL,Alpha,41.193029,-90.382081 +61414,IL,Altona,41.112828,-90.159826 +61415,IL,Avon,40.654947,-90.446053 +61416,IL,Bardolph,40.498078,-90.502495 +61417,IL,Berwick,40.779911,-90.505913 +61418,IL,Biggsville,40.853122,-90.856057 +61420,IL,Blandinsville,40.551585,-90.859521 +61421,IL,Bradford,41.15323,-89.652077 +61422,IL,Bushnell,40.553916,-90.506027 +61423,IL,Cameron,40.888963,-90.50013 +61425,IL,Carman,40.755054,-91.056396 +61427,IL,Cuba,40.4995,-90.181055 +61428,IL,Dahinda,40.95508,-90.139808 +61431,IL,Ellisville,40.604652,-90.287469 +61432,IL,Fairview,40.64418,-90.165265 +61433,IL,Fiatt,40.571779,-90.162186 +61434,IL,Galva,41.165627,-90.048093 +61435,IL,Gerlaw,40.999519,-90.622765 +61436,IL,Gilson,40.876525,-90.174663 +61437,IL,Gladstone,40.837682,-90.994078 +61438,IL,Good Hope,40.574891,-90.632432 +61440,IL,Industry,40.3256,-90.610524 +61441,IL,Ipava,40.359375,-90.296744 +61442,IL,Keithsburg,41.104333,-90.926337 +61443,IL,Kewanee,41.241116,-89.92739 +61447,IL,Kirkwood,40.863849,-90.745659 +61448,IL,Knoxville,40.910672,-90.287116 +61449,IL,La Fayette,41.109535,-89.957466 +61450,IL,La Harpe,40.584586,-90.968746 +61451,IL,Laura,40.933468,-89.934908 +61452,IL,Littleton,40.233929,-90.619008 +61453,IL,Little York,41.01529,-90.736434 +61454,IL,Lomax,40.676143,-91.039096 +61455,IL,Macomb,40.461674,-90.678674 +61458,IL,Maquon,40.784863,-90.200841 +61459,IL,Marietta,40.497775,-90.38846 +61460,IL,Media,40.761775,-90.85696 +61462,IL,Monmouth,40.910702,-90.644828 +61465,IL,New Windsor,41.198734,-90.459842 +61466,IL,North Henderson,41.100607,-90.473571 +61467,IL,Oneida,41.083236,-90.239093 +61469,IL,Oquawka,40.944174,-90.930199 +61470,IL,Prairie City,40.617952,-90.472748 +61471,IL,Raritan,40.687808,-90.831891 +61472,IL,Rio,41.110319,-90.389978 +61473,IL,Roseville,40.723821,-90.65145 +61474,IL,Saint Augustine,40.7289,-90.379781 +61475,IL,Sciota,40.567361,-90.707999 +61476,IL,Seaton,41.073222,-90.825654 +61477,IL,Smithfield,40.48551,-90.285601 +61478,IL,Smithshire,40.740021,-90.739874 +61479,IL,Speer,41.009682,-89.693254 +61480,IL,Stronghurst,40.752265,-90.925702 +61482,IL,Table Grove,40.378441,-90.423901 +61483,IL,Toulon,41.100949,-89.860584 +61484,IL,Vermont,40.30623,-90.422028 +61485,IL,Victoria,41.025635,-90.093325 +61486,IL,Viola,41.202422,-90.593583 +61488,IL,Wataga,41.022351,-90.27231 +61489,IL,Williamsfield,40.927724,-90.026725 +61490,IL,Woodhull,41.184887,-90.283282 +61491,IL,Wyoming,41.059879,-89.778238 +61501,IL,Astoria,40.231144,-90.344254 +61516,IL,Benson,40.83058,-89.116501 +61517,IL,Brimfield,40.840654,-89.897038 +61518,IL,Oak Hill,40.786938,-89.83725 +61519,IL,Bryant,40.483072,-90.066134 +61520,IL,Canton,40.560137,-90.024151 +61523,IL,Chillicothe,40.901349,-89.506793 +61524,IL,Dunfermline,40.490342,-90.031349 +61525,IL,Dunlap,40.844417,-89.639655 +61526,IL,Edelstein,40.945367,-89.585812 +61528,IL,Edwards,40.764362,-89.705344 +61529,IL,Elmwood,40.772594,-89.928882 +61530,IL,Eureka,40.715249,-89.270561 +61531,IL,Middlegrove,40.690265,-90.013434 +61532,IL,Forest City,40.35942,-89.833426 +61533,IL,Glasford,40.575976,-89.811326 +61534,IL,Green Valley,40.41978,-89.654925 +61536,IL,Hanna City,40.679776,-89.795242 +61537,IL,Henry,41.111543,-89.374328 +61539,IL,Kingston Mines,40.49028,-89.806791 +61540,IL,Lacon,41.021587,-89.400842 +61542,IL,Lewistown,40.383046,-90.156287 +61543,IL,Liverpool,40.411574,-90.038972 +61544,IL,London Mills,40.694954,-90.261594 +61545,IL,Cazenovia,40.871082,-89.370399 +61546,IL,Manito,40.415991,-89.789791 +61547,IL,Mapleton,40.611699,-89.718429 +61548,IL,Metamora,40.784428,-89.430876 +61550,IL,Morton,40.614771,-89.460445 +61554,IL,Pekin,40.567435,-89.624332 +61559,IL,Princeville,40.909277,-89.772285 +61560,IL,Putnam,41.19486,-89.440901 +61561,IL,Roanoke,40.795601,-89.209334 +61563,IL,Saint David,40.522571,-90.043739 +61565,IL,Sparland,41.013366,-89.45711 +61567,IL,Topeka,40.38108,-89.93263 +61568,IL,Tremont,40.505337,-89.483316 +61569,IL,Trivoli,40.679506,-89.913546 +61570,IL,Washburn,40.91413,-89.283049 +61571,IL,Sunnyland,40.699364,-89.447926 +61572,IL,Yates City,40.787826,-90.026481 +61602,IL,Peoria,40.687987,-89.601178 +61603,IL,Peoria Heights,40.713915,-89.580813 +61604,IL,Peoria,40.711142,-89.632377 +61605,IL,Peoria,40.677512,-89.626325 +61606,IL,Peoria,40.698926,-89.612189 +61607,IL,Bartonville,40.652434,-89.673898 +61611,IL,East Peoria,40.673121,-89.55141 +61614,IL,Peoria Heights,40.75481,-89.603295 +61615,IL,Peoria,40.770165,-89.632083 +61701,IL,Bloomington,40.478295,-88.989318 +61704,IL,Bloomington,40.471618,-88.962466 +61720,IL,Anchor,40.544091,-88.526581 +61721,IL,Armington,40.317046,-89.321775 +61722,IL,Arrowsmith,40.411966,-88.629648 +61723,IL,Atlanta,40.258624,-89.230021 +61724,IL,Bellflower,40.340091,-88.522702 +61725,IL,Carlock,40.602898,-89.109779 +61726,IL,Chenoa,40.744633,-88.721853 +61727,IL,Clinton,40.148708,-88.96266 +61728,IL,Colfax,40.570377,-88.620016 +61729,IL,Congerville,40.620762,-89.199397 +61730,IL,Cooksville,40.536014,-88.735047 +61731,IL,Cropsey,40.602983,-88.494343 +61732,IL,Danvers,40.536353,-89.188487 +61733,IL,Deer Creek,40.627992,-89.3003 +61734,IL,Delavan,40.369029,-89.532133 +61735,IL,Dewitt,40.184759,-88.763672 +61736,IL,Holder,40.380858,-88.870814 +61737,IL,Ellsworth,40.443154,-88.737121 +61738,IL,El Paso,40.738948,-89.011952 +61739,IL,Fairbury,40.745033,-88.516486 +61740,IL,Flanagan,40.879003,-88.86196 +61741,IL,Forrest,40.751324,-88.411143 +61743,IL,Graymont,40.90663,-88.760299 +61744,IL,Gridley,40.74387,-88.884044 +61745,IL,Heyworth,40.3307,-88.977608 +61747,IL,Hopedale,40.427318,-89.421398 +61748,IL,Hudson,40.620485,-88.975931 +61749,IL,Kenney,40.10247,-89.078925 +61752,IL,Le Roy,40.346781,-88.759813 +61753,IL,Lexington,40.635685,-88.806203 +61754,IL,Mc Lean,40.328159,-89.164483 +61755,IL,Mackinaw,40.539643,-89.345795 +61756,IL,Maroa,40.034159,-88.957769 +61759,IL,Minier,40.435889,-89.316484 +61760,IL,Minonk,40.898501,-89.034863 +61761,IL,Normal,40.512446,-88.988287 +61764,IL,Pontiac,40.876404,-88.632775 +61769,IL,Saunemin,40.888516,-88.40936 +61770,IL,Saybrook,40.432005,-88.524656 +61771,IL,Secor,40.722402,-89.127065 +61772,IL,Shirley,40.417437,-89.082181 +61773,IL,Sibley,40.582315,-88.38146 +61774,IL,Stanford,40.437575,-89.216434 +61775,IL,Strawn,40.647615,-88.404036 +61776,IL,Towanda,40.553326,-88.88865 +61777,IL,Wapella,40.232305,-88.967264 +61778,IL,Waynesville,40.243673,-89.114299 +61801,IL,Urbana,40.109522,-88.203631 +61810,IL,Allerton,39.918818,-87.931235 +61811,IL,Alvin,40.3007,-87.608003 +61812,IL,Armstrong,40.217548,-87.894256 +61813,IL,Bement,39.922207,-88.56877 +61814,IL,Bismarck,40.255187,-87.613769 +61816,IL,Broadlands,39.914247,-87.994831 +61817,IL,Catlin,40.069922,-87.711255 +61818,IL,Cerro Gordo,39.868062,-88.725634 +61820,IL,Champaign,40.111017,-88.240747 +61821,IL,Champaign,40.107262,-88.278847 +61830,IL,Cisco,39.997164,-88.696153 +61831,IL,Collison,40.220737,-87.798709 +61832,IL,Danville,40.136976,-87.621737 +61833,IL,Tilton,40.096406,-87.644048 +61839,IL,De Land,40.110656,-88.639193 +61840,IL,Dewey,40.313055,-88.276966 +61841,IL,Fairmount,40.037329,-87.836456 +61842,IL,Farmer City,40.244689,-88.663385 +61843,IL,Fisher,40.299126,-88.355991 +61844,IL,Fithian,40.11924,-87.879713 +61845,IL,Foosland,40.35537,-88.420177 +61846,IL,Georgetown,39.97922,-87.63648 +61847,IL,Gifford,40.302755,-88.031705 +61849,IL,Homer,40.034619,-87.962742 +61850,IL,Indianola,39.926819,-87.73882 +61851,IL,Ivesdale,39.950233,-88.445095 +61852,IL,Longview,39.901241,-88.075282 +61853,IL,Mahomet,40.196437,-88.39283 +61854,IL,Mansfield,40.214697,-88.517895 +61855,IL,Milmine,39.900702,-88.648696 +61856,IL,Monticello,40.02632,-88.568555 +61858,IL,Oakwood,40.116656,-87.7825 +61859,IL,Ogden,40.140117,-87.966499 +61862,IL,Penfield,40.310137,-87.95702 +61863,IL,Pesotum,39.9151,-88.274331 +61864,IL,Philo,40.005156,-88.159506 +61865,IL,Potomac,40.309,-87.823192 +61866,IL,Rantoul,40.310742,-88.146179 +61868,IL,Rantoul,40.295886,-88.149884 +61870,IL,Ridge Farm,39.915455,-87.634578 +61872,IL,Sadorus,39.961312,-88.344717 +61873,IL,Saint Joseph,40.120736,-88.047232 +61874,IL,Savoy,40.065373,-88.252837 +61875,IL,Seymour,40.103471,-88.394431 +61876,IL,Sidell,39.911018,-87.824802 +61877,IL,Sidney,40.023206,-88.069029 +61878,IL,Thomasboro,40.240206,-88.183033 +61880,IL,Tolono,39.985006,-88.259641 +61882,IL,Weldon,40.117741,-88.753055 +61883,IL,Westville,40.045113,-87.635952 +61884,IL,White Heath,40.100911,-88.519297 +61910,IL,Arcola,39.687001,-88.303679 +61911,IL,Arthur,39.707679,-88.455509 +61912,IL,Ashmore,39.525428,-88.034097 +61913,IL,Atwood,39.804368,-88.449446 +61914,IL,Bethany,39.634754,-88.754301 +61917,IL,Brocton,39.692311,-87.926258 +61919,IL,Camargo,39.799955,-88.146815 +61920,IL,Charleston,39.486933,-88.176115 +61924,IL,Chrisman,39.799572,-87.655552 +61925,IL,Dalton City,39.711943,-88.797459 +61928,IL,Gays,39.479553,-88.524153 +61929,IL,Hammond,39.79465,-88.579305 +61930,IL,Hindsboro,39.701799,-88.148611 +61931,IL,Humboldt,39.60118,-88.314089 +61932,IL,Hume,39.800882,-87.874659 +61933,IL,Kansas,39.552533,-87.935238 +61937,IL,Lovington,39.719192,-88.641675 +61938,IL,Mattoon,39.480184,-88.376152 +61940,IL,Metcalf,39.800847,-87.795524 +61942,IL,Newman,39.784788,-88.000055 +61943,IL,Oakland,39.651618,-88.025325 +61944,IL,Paris,39.613219,-87.697631 +61951,IL,Sullivan,39.593431,-88.603767 +61953,IL,Tuscola,39.799509,-88.281585 +61956,IL,Villa Grove,39.868716,-88.161635 +61957,IL,Windsor,39.430198,-88.585747 +62001,IL,Alhambra,38.882211,-89.744123 +62002,IL,Alton,38.908651,-90.156806 +62006,IL,Batchtown,39.072468,-90.659114 +62009,IL,Benld,39.093903,-89.803057 +62010,IL,Bethalto,38.907353,-90.034447 +62011,IL,Bingham,39.14667,-89.195789 +62012,IL,Brighton,39.036098,-90.144312 +62013,IL,Meppen,38.937115,-90.590696 +62014,IL,Bunker Hill,39.040827,-89.962379 +62015,IL,Butler,39.211419,-89.530535 +62016,IL,Carrollton,39.300937,-90.409211 +62017,IL,Coffeen,39.090757,-89.39454 +62018,IL,Cottage Hills,38.912377,-90.082632 +62019,IL,Donnellson,39.034422,-89.490858 +62020,IL,62020,39.048485,-89.865796 +62021,IL,Dorsey,38.983237,-89.978635 +62022,IL,Dow,39.031198,-90.301059 +62024,IL,East Alton,38.88031,-90.083045 +62025,IL,Edwardsville,38.804967,-89.963697 +62027,IL,Eldred,39.283592,-90.532874 +62028,IL,Elsah,38.961297,-90.331913 +62030,IL,Fidelity,39.132286,-90.198803 +62031,IL,Fieldon,39.108608,-90.529742 +62032,IL,Fillmore,39.103872,-89.294551 +62033,IL,Dorchester,39.136106,-89.818577 +62034,IL,Glen Carbon,38.760871,-89.970583 +62035,IL,Godfrey,38.946035,-90.206024 +62036,IL,Golden Eagle,38.896138,-90.560199 +62037,IL,Grafton,39.002134,-90.432335 +62040,IL,Mitchell,38.721572,-90.115822 +62044,IL,Greenfield,39.349058,-90.208851 +62045,IL,Hamburg,39.223488,-90.699546 +62046,IL,Hamel,38.878433,-89.872678 +62047,IL,Hardin,39.154652,-90.624002 +62048,IL,Hartford,38.829852,-90.074533 +62049,IL,Hillsboro,39.149412,-89.488146 +62050,IL,Hillview,39.467373,-90.512837 +62051,IL,Irving,39.208903,-89.41043 +62052,IL,Jerseyville,39.121324,-90.333757 +62053,IL,Kampsville,39.306388,-90.626934 +62054,IL,Kane,39.203688,-90.37188 +62056,IL,Litchfield,39.179345,-89.649915 +62060,IL,Madison,38.68109,-90.156585 +62061,IL,Marine,38.785458,-89.821376 +62063,IL,Medora,39.198593,-90.154225 +62064,IL,62064,39.010683,-90.624693 +62065,IL,Michael,39.21821,-90.633498 +62067,IL,Moro,38.931769,-89.961771 +62069,IL,Mount Olive,39.070504,-89.744842 +62070,IL,Mozier,39.287719,-90.714978 +62074,IL,New Douglas,38.967633,-89.739235 +62075,IL,Nokomis,39.303642,-89.285297 +62079,IL,Piasa,39.151697,-90.131147 +62080,IL,Ramsey,39.078123,-89.105147 +62081,IL,Rockbridge,39.283146,-90.255818 +62082,IL,Roodhouse,39.484646,-90.349814 +62083,IL,Rosamond,39.389229,-89.1846 +62084,IL,Roxana,38.848154,-90.07978 +62086,IL,Sorento,38.969342,-89.565347 +62088,IL,Staunton,39.01348,-89.785697 +62090,IL,Venice,38.67063,-90.168928 +62091,IL,Walshville,39.047257,-89.634968 +62092,IL,White Hall,39.428804,-90.401899 +62094,IL,Witt,39.246919,-89.341426 +62095,IL,Wood River,38.864279,-90.087507 +62097,IL,Worden,38.944895,-89.853214 +62201,IL,Sauget,38.631538,-90.138066 +62203,IL,East Saint Louis,38.599191,-90.074449 +62204,IL,Washington Park,38.631335,-90.102008 +62205,IL,East Saint Louis,38.614947,-90.127502 +62206,IL,Cahokia,38.561899,-90.16587 +62207,IL,Alorton,38.58734,-90.12829 +62208,IL,Fairview Heights,38.596044,-90.007093 +62214,IL,Venedy,38.360422,-89.52273 +62215,IL,Albers,38.531955,-89.620151 +62217,IL,Baldwin,38.175351,-89.841391 +62218,IL,Bartelso,38.53851,-89.457841 +62220,IL,Belleville,38.512677,-89.984693 +62221,IL,Belleville,38.539639,-89.958302 +62223,IL,Belleville,38.545581,-90.037775 +62225,IL,Scott A F B,38.54692,-89.858775 +62230,IL,Breese,38.618802,-89.52838 +62231,IL,Carlyle,38.606609,-89.380544 +62232,IL,Caseyville,38.634458,-90.013486 +62233,IL,Chester,37.918822,-89.821807 +62234,IL,Collinsville,38.683545,-89.98529 +62236,IL,Columbia,38.432469,-90.202717 +62237,IL,Swanwick,38.176401,-89.582064 +62238,IL,Cutler,38.042663,-89.566127 +62239,IL,Dupo,38.514771,-90.194188 +62240,IL,East Carondelet,38.534912,-90.220782 +62241,IL,Ellis Grove,38.005358,-89.900847 +62242,IL,Evansville,38.09258,-89.917028 +62243,IL,Freeburg,38.408016,-89.91806 +62244,IL,Fults,38.179736,-90.197353 +62245,IL,Germantown,38.548677,-89.54134 +62246,IL,Greenville,38.893338,-89.405185 +62248,IL,Hecker,38.281039,-89.983115 +62249,IL,Highland,38.763086,-89.678894 +62253,IL,Keyesport,38.738773,-89.306323 +62254,IL,Lebanon,38.60528,-89.799213 +62255,IL,Lenzburg,38.295003,-89.792202 +62256,IL,Maeystown,38.24112,-90.20178 +62257,IL,Marissa,38.245455,-89.750119 +62258,IL,Mascoutah,38.474496,-89.787745 +62260,IL,Millstadt,38.444264,-90.088818 +62261,IL,Modoc,38.050683,-90.016261 +62262,IL,Mulberry Grove,38.931082,-89.246297 +62263,IL,Nashville,38.335208,-89.384058 +62264,IL,New Athens,38.315998,-89.872777 +62265,IL,New Baden,38.531485,-89.692232 +62268,IL,Oakdale,38.257285,-89.596046 +62269,IL,Shiloh,38.59052,-89.9093 +62271,IL,Okawville,38.431862,-89.523045 +62272,IL,Percy,38.01261,-89.616961 +62274,IL,Pinckneyville,38.090327,-89.38578 +62275,IL,Pocahontas,38.78456,-89.524684 +62277,IL,Prairie Du Roche,38.085468,-90.090147 +62278,IL,Red Bud,38.190738,-89.988356 +62279,IL,Renault,38.170396,-90.095043 +62280,IL,Rockwood,37.832201,-89.621445 +62281,IL,Saint Jacob,38.72448,-89.669616 +62283,IL,Shattuc,38.643533,-89.205436 +62284,IL,Smithboro,38.873893,-89.326556 +62285,IL,Smithton,38.423137,-89.989604 +62286,IL,Sparta,38.131815,-89.703458 +62288,IL,Steeleville,38.005713,-89.666458 +62293,IL,Trenton,38.619102,-89.644696 +62294,IL,Troy,38.724275,-89.870848 +62295,IL,Valmeyer,38.295163,-90.309234 +62296,IL,62296,38.377482,-89.644751 +62297,IL,Walsh,38.020286,-89.829658 +62298,IL,Waterloo,38.322273,-90.147773 +62301,IL,Quincy,39.930701,-91.376284 +62311,IL,Augusta,40.234109,-90.955416 +62312,IL,Barry,39.704662,-91.026482 +62313,IL,Basco,40.328303,-91.196983 +62314,IL,Baylis,39.761201,-90.883216 +62316,IL,Bowen,40.234076,-91.070491 +62318,IL,Burnside,40.497445,-91.142392 +62319,IL,Camden,40.151076,-90.754433 +62320,IL,Camp Point,40.029285,-91.076926 +62321,IL,Carthage,40.412937,-91.100522 +62323,IL,Chambersburg,39.807058,-90.663017 +62324,IL,Clayton,40.013342,-90.955394 +62325,IL,Coatsburg,40.055385,-91.174733 +62326,IL,Colchester,40.415643,-90.78456 +62330,IL,Pontoosuc,40.620062,-91.163454 +62332,IL,Detroit,39.618307,-90.65449 +62334,IL,Elvaston,40.40662,-91.21642 +62338,IL,Fowler,39.992504,-91.245226 +62339,IL,Golden,40.120257,-91.029588 +62340,IL,Griggsville,39.708378,-90.724891 +62341,IL,Hamilton,40.439213,-91.344042 +62343,IL,Hull,39.718562,-91.233844 +62344,IL,Huntsville,40.154396,-90.853136 +62345,IL,Kinderhook,39.695313,-91.163728 +62346,IL,La Prairie,40.157191,-90.984387 +62347,IL,Liberty,39.889176,-91.08688 +62348,IL,Lima,40.170098,-91.386756 +62349,IL,Loraine,40.153197,-91.21301 +62351,IL,Mendon,40.085658,-91.289923 +62352,IL,Milton,39.550811,-90.644346 +62353,IL,Mount Sterling,39.980279,-90.741424 +62355,IL,Nebo,39.420181,-90.7692 +62356,IL,New Canton,39.634242,-91.088556 +62357,IL,New Salem,39.699573,-90.843986 +62358,IL,Niota,40.597753,-91.299136 +62359,IL,Paloma,40.036616,-91.205287 +62360,IL,Payson,39.815253,-91.262676 +62361,IL,Pearl,39.444072,-90.637954 +62362,IL,Perry,39.787042,-90.746105 +62363,IL,Pittsfield,39.601306,-90.807269 +62365,IL,Plainville,39.800448,-91.143598 +62366,IL,Pleasant Hill,39.446697,-90.877011 +62367,IL,Colmar,40.288493,-90.873815 +62370,IL,Rockport,39.532846,-90.972178 +62373,IL,Sutter,40.309683,-91.376094 +62374,IL,Tennessee,40.41399,-90.855605 +62375,IL,Timewell,40.011658,-90.866067 +62376,IL,Ursa,40.080918,-91.373341 +62378,IL,Versailles,39.888286,-90.674147 +62379,IL,Warsaw,40.354449,-91.434803 +62380,IL,West Point,40.245184,-91.249568 +62401,IL,Effingham,39.121727,-88.561105 +62410,IL,Allendale,38.523236,-87.721901 +62411,IL,Altamont,39.063449,-88.748092 +62413,IL,Annapolis,39.117857,-87.802875 +62414,IL,Beecher City,39.183515,-88.80385 +62415,IL,Birds,38.812059,-87.681545 +62417,IL,Bridgeport,38.694506,-87.854926 +62418,IL,Brownstown,38.989118,-88.949438 +62419,IL,Calhoun,38.635116,-88.003745 +62420,IL,Casey,39.301716,-87.991306 +62421,IL,Claremont,38.742904,-87.972685 +62422,IL,Cowden,39.232643,-88.886799 +62423,IL,Dennison,39.449033,-87.58671 +62424,IL,Dieterich,39.031875,-88.407448 +62425,IL,Dundas,38.830572,-88.097309 +62426,IL,Laclede,38.91318,-88.663868 +62427,IL,Flat Rock,38.909606,-87.683747 +62428,IL,Hazel Dell,39.239454,-88.144502 +62431,IL,Herrick,39.224481,-88.981211 +62432,IL,Hidalgo,39.122808,-88.139706 +62433,IL,Hutsonville,39.106357,-87.669455 +62434,IL,Ingraham,38.828446,-88.320374 +62436,IL,Jewett,39.207596,-88.24744 +62438,IL,Lakewood,39.313358,-88.871474 +62439,IL,Lawrenceville,38.730862,-87.678397 +62440,IL,Lerna,39.39579,-88.253026 +62441,IL,Marshall,39.421999,-87.692261 +62442,IL,Martinsville,39.317443,-87.870737 +62443,IL,Mason,38.964453,-88.623396 +62445,IL,Montrose,39.157274,-88.33497 +62446,IL,Mount Erie,38.522151,-88.218521 +62447,IL,Neoga,39.322024,-88.450288 +62448,IL,Newton,38.984678,-88.170386 +62449,IL,Oblong,39.001043,-87.895016 +62450,IL,Olney,38.733389,-88.080936 +62451,IL,Palestine,39.002823,-87.615695 +62452,IL,Parkersburg,38.589998,-88.064722 +62454,IL,Robinson,39.007034,-87.748352 +62458,IL,Saint Elmo,39.031544,-88.855181 +62460,IL,Saint Francisvil,38.612494,-87.673628 +62461,IL,Shumway,39.188138,-88.641826 +62462,IL,Sigel,39.21762,-88.480301 +62463,IL,Stewardson,39.27199,-88.631853 +62465,IL,Strasburg,39.364111,-88.627862 +62466,IL,Sumner,38.734077,-87.780728 +62467,IL,Teutopolis,39.131978,-88.476741 +62468,IL,Toledo,39.277223,-88.246821 +62469,IL,Trilla,39.385286,-88.345698 +62471,IL,Vandalia,38.94391,-89.104116 +62473,IL,Watson,39.039488,-88.559876 +62474,IL,Westfield,39.442369,-88.044799 +62475,IL,West Liberty,38.894989,-88.097929 +62476,IL,West Salem,38.518267,-88.032297 +62477,IL,West Union,39.240185,-87.651215 +62478,IL,West York,39.193793,-87.713073 +62479,IL,Wheeler,39.018185,-88.317536 +62480,IL,Willow Hill,38.975654,-88.017156 +62481,IL,Yale,39.129975,-88.01047 +62501,IL,Newburg,39.991581,-88.821371 +62510,IL,Assumption,39.509489,-89.039807 +62511,IL,Atwater,39.310733,-89.763374 +62512,IL,Beason,40.143652,-89.194801 +62513,IL,Blue Mound,39.697813,-89.113558 +62514,IL,Boody,39.762824,-89.072061 +62515,IL,Buffalo Hart,39.847201,-89.388846 +62518,IL,Chestnut,40.058202,-89.190014 +62520,IL,Dawson,39.85629,-89.460329 +62521,IL,Decatur,39.827137,-88.925984 +62522,IL,Decatur,39.843237,-88.986139 +62523,IL,Decatur,39.841694,-88.953435 +62526,IL,Bearsdale,39.877413,-88.953515 +62530,IL,Cimic,39.567684,-89.654654 +62531,IL,Edinburg,39.661223,-89.377884 +62533,IL,Thomasville,39.453048,-89.642718 +62534,IL,Brunswick,39.503253,-88.756208 +62536,IL,Glenarm,39.632713,-89.658144 +62538,IL,Harvel,39.371865,-89.53804 +62539,IL,Illiopolis,39.849929,-89.251319 +62543,IL,Latham,39.97111,-89.172492 +62544,IL,Macon,39.704093,-88.988026 +62545,IL,Bolivia,39.77771,-89.417692 +62546,IL,Morrisonville,39.415336,-89.45407 +62547,IL,Mount Auburn,39.762845,-89.235672 +62548,IL,Mount Pulaski,40.004482,-89.293482 +62549,IL,Hervey City,39.778883,-88.870207 +62550,IL,Radford,39.616135,-89.012776 +62551,IL,Niantic,39.858175,-89.170071 +62552,IL,Casner,39.896897,-88.805591 +62553,IL,Oconee,39.288408,-89.083636 +62554,IL,Oreana,39.935135,-88.854675 +62555,IL,Owaneco,39.477508,-89.195071 +62556,IL,Clarksdale,39.470817,-89.425555 +62557,IL,Dunkel,39.388124,-89.078165 +62558,IL,Sicily,39.590966,-89.578955 +62560,IL,Raymond,39.310551,-89.585135 +62561,IL,Spaulding,39.855239,-89.541908 +62563,IL,Berry,39.759047,-89.547208 +62565,IL,Clarksburg,39.404873,-88.804615 +62567,IL,Stonington,39.640482,-89.191328 +62568,IL,Hewittsville,39.554516,-89.313357 +62571,IL,Dollville,39.36576,-88.974517 +62572,IL,Waggoner,39.38383,-89.647429 +62573,IL,Heman,39.939737,-89.068316 +62601,IL,Orleans,39.725935,-90.035304 +62611,IL,Arenzville,39.897927,-90.363595 +62612,IL,Newmansville,39.89168,-90.028721 +62613,IL,Fancy Prairie,39.964813,-89.72108 +62615,IL,Auburn,39.591787,-89.744033 +62617,IL,Lynchburg,40.161774,-90.148568 +62618,IL,Beardstown,40.004356,-90.422851 +62621,IL,Exeter,39.744078,-90.530527 +62624,IL,Bader,40.155025,-90.351671 +62625,IL,Cantrall,39.911267,-89.66426 +62626,IL,Comer,39.279821,-89.888935 +62627,IL,Panther Creek,40.038437,-90.147657 +62628,IL,Chapin,39.771581,-90.411299 +62629,IL,Chatham,39.673679,-89.711212 +62630,IL,Hagaman,39.270756,-90.076632 +62631,IL,Concord,39.822958,-90.372175 +62633,IL,Biggs,40.235482,-89.846447 +62634,IL,Broadwell,40.002394,-89.474938 +62635,IL,Emden,40.294538,-89.517441 +62638,IL,Clements,39.608461,-90.048535 +62639,IL,Frederick,40.070246,-90.504391 +62640,IL,Mcvey,39.447182,-89.780535 +62642,IL,Hubly,40.079859,-89.711606 +62643,IL,Hartsburg,40.245073,-89.451944 +62644,IL,Eckard,40.295995,-90.04952 +62649,IL,Hettick,39.375217,-90.067161 +62650,IL,Arcadia,39.729269,-90.236238 +62655,IL,Kilbourne,40.158696,-90.004279 +62656,IL,Lincoln,40.14508,-89.368376 +62661,IL,Loami,39.670394,-89.858823 +62664,IL,Luther,40.199938,-89.699256 +62665,IL,Naples,39.797631,-90.549542 +62666,IL,Middletown,40.096668,-89.58182 +62667,IL,Modesto,39.475965,-89.979386 +62668,IL,Nortonville,39.572952,-90.231189 +62670,IL,Bates,39.736048,-89.905721 +62671,IL,New Holland,40.168226,-89.56044 +62672,IL,Nilwood,39.387199,-89.778411 +62673,IL,Oakford,40.099445,-89.960135 +62674,IL,Barr,39.41654,-89.956736 +62675,IL,Atterbury,40.011529,-89.847874 +62676,IL,Plainview,39.128311,-89.975687 +62677,IL,Farmingdale,39.849767,-89.838361 +62681,IL,Layton,40.124189,-90.560883 +62682,IL,Allen,40.294466,-89.625029 +62683,IL,Scottville,39.478167,-90.096921 +62684,IL,Barclay,39.889456,-89.60251 +62685,IL,Royal Lakes,39.124165,-90.048737 +62688,IL,Tallula,39.940188,-89.882274 +62690,IL,Virden,39.506447,-89.778332 +62691,IL,Little Indian,39.945475,-90.212681 +62692,IL,Waverly,39.586983,-89.944903 +62693,IL,Williamsville,39.930438,-89.534172 +62694,IL,Glasgow,39.614113,-90.433696 +62701,IL,Springfield,39.80004,-89.649531 +62702,IL,Grandview,39.816768,-89.644147 +62703,IL,Southern View,39.772401,-89.63333 +62704,IL,Jerome,39.780319,-89.681066 +62707,IL,Andrew,39.772842,-89.663991 +62801,IL,Centralia,38.524117,-89.136478 +62803,IL,Hoyleton,38.445468,-89.306854 +62806,IL,Albion,38.374003,-88.063557 +62807,IL,Alma,38.723089,-88.915695 +62808,IL,Ashley,38.306002,-89.231115 +62809,IL,Barnhill,38.278144,-88.350831 +62810,IL,Belle Rive,38.215268,-88.755801 +62812,IL,Benton,37.99998,-88.922659 +62814,IL,Bluford,38.353138,-88.75872 +62815,IL,Bone Gap,38.448967,-88.002491 +62816,IL,Bonnie,38.198017,-88.922884 +62817,IL,Broughton,37.954554,-88.467775 +62818,IL,Browns,38.376433,-87.992824 +62819,IL,Buckner,37.966881,-88.977993 +62820,IL,Burnt Prairie,38.208151,-88.214719 +62821,IL,Carmi,38.080819,-88.166987 +62822,IL,Christopher,37.984905,-89.057367 +62823,IL,Cisne,38.513774,-88.404524 +62824,IL,Clay City,38.669501,-88.351641 +62827,IL,Crossville,38.166029,-88.059474 +62828,IL,Dahlgren,38.197479,-88.636311 +62829,IL,Dale,37.996585,-88.534231 +62830,IL,Dix,38.43329,-88.965697 +62831,IL,Du Bois,38.252638,-89.204187 +62832,IL,Du Quoin,38.013687,-89.233268 +62833,IL,Ellery,38.365021,-88.133455 +62835,IL,Enfield,38.092746,-88.332546 +62836,IL,Ewing,38.07021,-88.850441 +62837,IL,Fairfield,38.378214,-88.359323 +62838,IL,Farina,38.846902,-88.761412 +62839,IL,Flora,38.670337,-88.49186 +62840,IL,Frankfort Height,37.901301,-88.845651 +62842,IL,Geff,38.441326,-88.414428 +62843,IL,Golden Gate,38.364514,-88.207466 +62844,IL,Grayville,38.262707,-88.003539 +62845,IL,Herald,37.967542,-88.213152 +62846,IL,Ina,38.152743,-88.889362 +62849,IL,Iuka,38.613563,-88.768925 +62850,IL,Johnsonville,38.525628,-88.588701 +62851,IL,Keenes,38.369146,-88.648058 +62853,IL,Kell,38.513256,-88.841107 +62854,IL,Kinmundy,38.755857,-88.812999 +62855,IL,Lancaster,38.537438,-87.871216 +62858,IL,Bible Grove,38.811856,-88.510046 +62859,IL,Mc Leansboro,38.093861,-88.528556 +62860,IL,Macedonia,38.013023,-88.696077 +62862,IL,Mill Shoals,38.244675,-88.333817 +62863,IL,Mount Carmel,38.414727,-87.791107 +62864,IL,Mount Vernon,38.317014,-88.910525 +62865,IL,Mulkeytown,37.968712,-89.1159 +62866,IL,Nason,38.173872,-88.968839 +62867,IL,New Haven,37.899907,-88.128458 +62868,IL,Noble,38.711851,-88.219038 +62869,IL,Norris City,37.9773,-88.32434 +62870,IL,Odin,38.608786,-89.055228 +62871,IL,Omaha,37.890423,-88.286484 +62872,IL,Opdyke,38.274955,-88.774955 +62875,IL,Patoka,38.754852,-89.094188 +62877,IL,Richview,38.408227,-89.175572 +62878,IL,Rinard,38.580596,-88.464094 +62880,IL,Saint Peter,38.869684,-88.855998 +62881,IL,Salem,38.626421,-88.948077 +62882,IL,Sandoval,38.613113,-89.11401 +62883,IL,Scheller,38.173095,-89.092691 +62884,IL,Sesser,38.089422,-89.057404 +62885,IL,Shobonier,38.844584,-89.078959 +62886,IL,Sims,38.392318,-88.530642 +62887,IL,Springerton,38.169868,-88.372611 +62888,IL,Tamaroa,38.137969,-89.223091 +62889,IL,Texico,38.425035,-88.870151 +62890,IL,Thompsonville,37.880438,-88.768394 +62892,IL,Vernon,38.803328,-89.083001 +62893,IL,Walnut Hill,38.520006,-88.984514 +62894,IL,Waltonville,38.246479,-89.006702 +62895,IL,Wayne City,38.332808,-88.583317 +62896,IL,West Frankfort,37.897914,-88.930724 +62897,IL,Whittington,38.098937,-88.863456 +62898,IL,Woodlawn,38.38444,-89.074457 +62899,IL,Xenia,38.669747,-88.63789 +62901,IL,Carbondale,37.719994,-89.215762 +62905,IL,Alto Pass,37.568142,-89.317179 +62906,IL,Anna,37.466777,-89.220684 +62907,IL,Ava,37.879286,-89.465366 +62908,IL,Belknap,37.326584,-88.950652 +62910,IL,New Liberty,37.138731,-88.611944 +62912,IL,Buncombe,37.463661,-88.980586 +62913,IL,Cache,37.114131,-89.298018 +62914,IL,Cairo,37.012293,-89.181104 +62916,IL,Campbell Hill,37.922778,-89.579901 +62917,IL,Carrier Mills,37.678199,-88.612706 +62918,IL,Carterville,37.774785,-89.097793 +62919,IL,Cave In Rock,37.517947,-88.221961 +62920,IL,Cobden,37.542358,-89.245741 +62922,IL,Creal Springs,37.628393,-88.880697 +62923,IL,Cypress,37.366223,-89.014414 +62924,IL,De Soto,37.81473,-89.221834 +62926,IL,Dongola,37.371234,-89.134933 +62928,IL,Eddyville,37.52439,-88.594893 +62930,IL,Eldorado,37.813885,-88.443382 +62931,IL,Elizabethtown,37.466492,-88.286735 +62932,IL,Elkville,37.915506,-89.233574 +62934,IL,Equality,37.727786,-88.3445 +62935,IL,Galatia,37.827444,-88.623488 +62938,IL,Brownfield,37.349984,-88.555148 +62939,IL,Goreville,37.574985,-88.965524 +62940,IL,Gorham,37.740611,-89.444031 +62941,IL,Grand Chain,37.251043,-89.008335 +62942,IL,Grand Tower,37.63222,-89.49986 +62943,IL,Grantsburg,37.39672,-88.770489 +62946,IL,Harrisburg,37.725661,-88.54404 +62947,IL,Herod,37.469731,-88.458062 +62948,IL,Herrin,37.801884,-89.02316 +62950,IL,Jacob,37.743738,-89.544359 +62951,IL,Johnston City,37.824477,-88.920858 +62952,IL,Jonesboro,37.446082,-89.291494 +62953,IL,Joppa,37.247192,-88.84819 +62954,IL,Junction,37.695206,-88.249071 +62955,IL,Karbers Ridge,37.463071,-88.367893 +62956,IL,Karnak,37.291066,-88.973943 +62957,IL,Mc Clure,37.301983,-89.453119 +62958,IL,Makanda,37.656396,-89.214232 +62959,IL,Marion,37.725662,-88.929447 +62960,IL,Metropolis,37.175348,-88.725179 +62961,IL,Millcreek,37.353127,-89.269889 +62962,IL,Miller City,37.103359,-89.349443 +62963,IL,Mound City,37.086474,-89.163687 +62964,IL,Mounds,37.11883,-89.200064 +62966,IL,Murphysboro,37.765464,-89.331749 +62967,IL,New Burnside,37.580608,-88.771253 +62970,IL,Olmsted,37.193507,-89.093266 +62972,IL,Ozark,37.536704,-88.768778 +62974,IL,Pittsburg,37.78387,-88.870393 +62975,IL,Pomona,37.641081,-89.336308 +62976,IL,Pulaski,37.214575,-89.196801 +62977,IL,Raleigh,37.825597,-88.532368 +62979,IL,Ridgway,37.804242,-88.261202 +62982,IL,Rosiclare,37.423987,-88.346189 +62983,IL,Royalton,37.879033,-89.114149 +62984,IL,Shawneetown,37.713188,-88.178503 +62985,IL,Robbs,37.463032,-88.762459 +62987,IL,Stonefort,37.62992,-88.742807 +62988,IL,Tamms,37.234493,-89.276346 +62990,IL,Gale,37.191554,-89.396896 +62991,IL,Tunnel Hill,37.573676,-88.883459 +62992,IL,Ullin,37.270385,-89.191137 +62994,IL,Vergennes,37.905128,-89.326863 +62995,IL,Vienna,37.420541,-88.887869 +62996,IL,Villa Ridge,37.157765,-89.182522 +62997,IL,Willisville,37.982142,-89.578487 +62998,IL,Wolf Lake,37.511985,-89.440761 +62999,IL,Zeigler,37.906923,-89.06026 +63673,IL,Saint Mary,37.914034,-89.929268 +46001,IN,Alexandria,40.256081,-85.668148 +46011,IN,Anderson,40.114577,-85.725305 +46012,IN,Anderson,40.130947,-85.653591 +46013,IN,Anderson,40.061865,-85.680073 +46016,IN,Anderson,40.098799,-85.684566 +46017,IN,Chesterfield,40.096431,-85.601493 +46030,IN,Arcadia,40.17758,-86.040882 +46031,IN,Atlanta,40.146964,-85.933945 +46032,IN,Carmel,39.971232,-86.124545 +46034,IN,Cicero,40.126781,-86.024844 +46035,IN,Colfax,40.195619,-86.659271 +46036,IN,Elwood,40.280278,-85.839055 +46038,IN,Fishers,39.957486,-86.023048 +46039,IN,Forest,40.375728,-86.320098 +46040,IN,Fortville,39.922835,-85.818554 +46041,IN,Hillisburg,40.288404,-86.511387 +46044,IN,Frankton,40.228548,-85.77911 +46048,IN,Ingalls,40.000237,-85.825596 +46049,IN,Kempton,40.275946,-86.1887 +46050,IN,Kirklin,40.203066,-86.332372 +46051,IN,Lapel,40.085429,-85.84395 +46052,IN,Lebanon,40.044894,-86.464074 +46055,IN,Mc Cordsville,39.901823,-85.909502 +46056,IN,Markleville,39.994385,-85.622736 +46057,IN,Michigantown,40.310823,-86.375306 +46058,IN,Mulberry,40.343299,-86.661261 +46060,IN,Noblesville,40.056292,-86.016294 +46064,IN,Pendleton,39.979237,-85.794614 +46065,IN,Rossville,40.410928,-86.607966 +46068,IN,Sharpsville,40.373232,-86.108641 +46069,IN,Sheridan,40.110407,-86.236741 +46070,IN,Summitville,40.339833,-85.640261 +46071,IN,Thorntown,40.113335,-86.589822 +46072,IN,Tipton,40.281725,-86.043291 +46074,IN,Westfield,40.048868,-86.149907 +46075,IN,Whitestown,40.00002,-86.350716 +46076,IN,Windfall,40.366891,-85.947624 +46077,IN,Zionsville,39.956111,-86.276737 +46104,IN,Arlington,39.648791,-85.582775 +46105,IN,Bainbridge,39.740664,-86.771119 +46106,IN,Bargersville,39.499989,-86.179687 +46107,IN,Beech Grove,39.715434,-86.093299 +46110,IN,Boggstown,39.568331,-85.915965 +46112,IN,Brownsburg,39.846605,-86.386933 +46113,IN,Camby,39.640501,-86.311811 +46115,IN,Carthage,39.746627,-85.575382 +46117,IN,Charlottesville,39.811981,-85.653599 +46118,IN,Clayton,39.668154,-86.495921 +46120,IN,Cloverdale,39.543442,-86.814021 +46121,IN,Coatesville,39.693041,-86.631447 +46122,IN,Danville,39.762815,-86.534254 +46124,IN,Edinburgh,39.362601,-85.970712 +46126,IN,Fairland,39.629467,-85.891284 +46127,IN,Falmouth,39.743617,-85.352423 +46128,IN,Fillmore,39.647518,-86.746861 +46130,IN,Fountaintown,39.675131,-85.784827 +46131,IN,Franklin,39.485389,-86.060752 +46133,IN,Glenwood,39.612436,-85.273532 +46135,IN,Greencastle,39.649487,-86.868614 +46140,IN,Greenfield,39.790204,-85.814102 +46142,IN,Greenwood,39.622398,-86.148993 +46143,IN,Greenwood,39.596037,-86.130919 +46147,IN,Jamestown,39.95789,-86.623561 +46148,IN,Knightstown,39.806029,-85.526148 +46149,IN,Lizton,39.884326,-86.542857 +46150,IN,Manilla,39.575711,-85.635369 +46151,IN,Centerton,39.447646,-86.42901 +46156,IN,Milroy,39.495474,-85.504371 +46157,IN,Monrovia,39.571397,-86.48937 +46158,IN,Mooresville,39.591469,-86.364173 +46160,IN,Morgantown,39.362841,-86.280297 +46161,IN,Morristown,39.667477,-85.693419 +46162,IN,Needham,39.477935,-86.004094 +46163,IN,New Palestine,39.723264,-85.90515 +46164,IN,Nineveh,39.365597,-86.097641 +46165,IN,North Salem,39.867051,-86.638833 +46166,IN,Paragon,39.404203,-86.577867 +46167,IN,Pittsboro,39.861529,-86.464548 +46168,IN,Avon,39.716036,-86.395061 +46171,IN,Reelsville,39.546416,-86.94998 +46172,IN,Roachdale,39.832545,-86.790225 +46173,IN,Rushville,39.619232,-85.43212 +46175,IN,Russellville,39.836598,-86.966975 +46176,IN,Shelbyville,39.50434,-85.787515 +46180,IN,Stilesville,39.639113,-86.61819 +46181,IN,Trafalgar,39.369585,-86.183793 +46182,IN,Waldron,39.468849,-85.664407 +46184,IN,New Whiteland,39.555313,-86.093476 +46186,IN,Wilkinson,39.895668,-85.61436 +46201,IN,Indianapolis,39.775006,-86.109348 +46202,IN,Indianapolis,39.785063,-86.159502 +46203,IN,Indianapolis,39.743025,-86.117859 +46204,IN,Indianapolis,39.771986,-86.153491 +46205,IN,Indianapolis,39.826761,-86.138582 +46208,IN,Indianapolis,39.829905,-86.179444 +46214,IN,Eagle Creek,39.792678,-86.289952 +46216,IN,Fort Benjamin Ha,39.857731,-86.016688 +46217,IN,Southport,39.664141,-86.175394 +46218,IN,Indianapolis,39.80817,-86.101425 +46219,IN,Indianapolis,39.782092,-86.049533 +46220,IN,Indianapolis,39.864685,-86.11815 +46221,IN,Indianapolis,39.750885,-86.19243 +46222,IN,Indianapolis,39.788971,-86.213574 +46224,IN,Speedway,39.798674,-86.257308 +46225,IN,Indianapolis,39.740599,-86.156944 +46226,IN,Lawrence,39.836969,-86.048945 +46227,IN,Southport,39.675,-86.129817 +46229,IN,Cumberland,39.792219,-85.983826 +46231,IN,Bridgeport,39.740637,-86.318289 +46234,IN,Clermont,39.788438,-86.324117 +46236,IN,Oaklandon,39.849588,-85.985059 +46237,IN,Southport,39.686777,-86.07891 +46239,IN,Wanamaker,39.721826,-86.008209 +46240,IN,Nora,39.9057,-86.129548 +46241,IN,Park Fletcher,39.723814,-86.250856 +46250,IN,Castleton,39.9069,-86.069112 +46254,IN,Eagle Creek,39.841379,-86.2638 +46256,IN,Castleton,39.90114,-86.023877 +46259,IN,Acton,39.660901,-85.992603 +46260,IN,Nora,39.897488,-86.184809 +46268,IN,New Augusta,39.900296,-86.222104 +46278,IN,New Augusta,39.883858,-86.291455 +46280,IN,Nora,39.938417,-86.13894 +46290,IN,Nora,39.93077,-86.167118 +46303,IN,East Cedar Lake,41.377338,-87.444509 +46304,IN,Porter,41.603949,-87.050196 +46307,IN,Crown Point,41.423571,-87.355586 +46310,IN,Demotte,41.171319,-87.249129 +46311,IN,Dyer,41.491976,-87.510803 +46312,IN,East Chicago,41.634893,-87.462734 +46319,IN,Griffith,41.53352,-87.422837 +46320,IN,Hammond,41.609929,-87.507911 +46321,IN,Munster,41.554438,-87.501101 +46322,IN,Highland,41.55005,-87.456911 +46323,IN,Hammond,41.587755,-87.453196 +46324,IN,Hammond,41.583954,-87.503393 +46327,IN,Hammond,41.632695,-87.51135 +46340,IN,Hanna,41.408767,-86.775922 +46341,IN,Hebron,41.315537,-87.208791 +46342,IN,Hobart,41.526281,-87.252499 +46347,IN,Kouts,41.309085,-87.024043 +46348,IN,La Crosse,41.315709,-86.868216 +46349,IN,Lake Village,41.138741,-87.445422 +46350,IN,La Porte,41.599438,-86.707654 +46356,IN,Lowell,41.284531,-87.419072 +46360,IN,Michigan City,41.698031,-86.869899 +46365,IN,Mill Creek,41.556102,-86.547247 +46366,IN,North Judson,41.224372,-86.696601 +46368,IN,Portage,41.567201,-87.175689 +46371,IN,Rolling Prairie,41.72286,-86.584092 +46373,IN,Saint John,41.44949,-87.476376 +46374,IN,San Pierre,41.21108,-86.872532 +46375,IN,Schererville,41.492233,-87.460532 +46382,IN,Union Mills,41.460236,-86.835512 +46383,IN,Valparaiso,41.475661,-87.075866 +46390,IN,Wanatah,41.384477,-86.876439 +46391,IN,Westville,41.536516,-86.901317 +46392,IN,Wheatfield,41.177948,-87.069876 +46394,IN,Whiting,41.678656,-87.500537 +46402,IN,Gary,41.599711,-87.338548 +46403,IN,Gary,41.603612,-87.258984 +46404,IN,Gary,41.589937,-87.373153 +46405,IN,Lake Station,41.568629,-87.262209 +46406,IN,Gary,41.587806,-87.40621 +46407,IN,Gary,41.580429,-87.334958 +46408,IN,Gary,41.542178,-87.35883 +46409,IN,Gary,41.541247,-87.327126 +46410,IN,Merrillville,41.4957,-87.350932 +46501,IN,Argos,41.230827,-86.250573 +46504,IN,Bourbon,41.309785,-86.117438 +46506,IN,Bremen,41.446701,-86.19323 +46507,IN,Bristol,41.716885,-85.826192 +46510,IN,Claypool,41.116497,-85.868571 +46511,IN,Culver Military,41.22307,-86.412888 +46514,IN,Elkhart,41.710083,-85.972949 +46516,IN,Elkhart,41.676333,-85.962137 +46517,IN,Elkhart,41.646922,-85.972849 +46524,IN,Etna Green,41.291789,-86.034995 +46526,IN,Foraker,41.584484,-85.837988 +46530,IN,Granger,41.742704,-86.141104 +46531,IN,Grovertown,41.321969,-86.528905 +46532,IN,Hamlet,41.393338,-86.53213 +46534,IN,Ober,41.29006,-86.610715 +46536,IN,Lakeville,41.525328,-86.27144 +46538,IN,Leesburg,41.326592,-85.816028 +46539,IN,Mentone,41.161494,-86.029918 +46540,IN,Middlebury,41.675415,-85.711443 +46542,IN,Milford,41.401141,-85.855438 +46543,IN,Millersburg,41.533513,-85.707249 +46544,IN,Mishawaka,41.650659,-86.162301 +46545,IN,Mishawaka,41.683498,-86.168232 +46550,IN,Nappanee,41.449297,-85.994534 +46552,IN,New Carlisle,41.705115,-86.483827 +46553,IN,New Paris,41.491652,-85.83383 +46554,IN,North Liberty,41.542507,-86.413328 +46555,IN,North Webster,41.308423,-85.707872 +46556,IN,Saint Marys,41.70057,-86.242893 +46561,IN,Osceola,41.674074,-86.078883 +46562,IN,Pierceton,41.212406,-85.706119 +46563,IN,Inwood,41.333897,-86.324087 +46565,IN,Shipshewana,41.663257,-85.593198 +46567,IN,Syracuse,41.40649,-85.718352 +46570,IN,Tippecanoe,41.216609,-86.109508 +46571,IN,Topeka,41.563441,-85.531668 +46573,IN,Wakarusa,41.540073,-86.020524 +46574,IN,Walkerton,41.445748,-86.451018 +46580,IN,Warsaw,41.24377,-85.85078 +46590,IN,Winona Lake,41.211007,-85.830531 +46601,IN,South Bend,41.672699,-86.253489 +46613,IN,South Bend,41.654636,-86.247865 +46614,IN,South Bend,41.625461,-86.243278 +46615,IN,South Bend,41.67413,-86.210375 +46616,IN,South Bend,41.691894,-86.264739 +46617,IN,South Bend,41.684966,-86.2351 +46619,IN,South Bend,41.667397,-86.315266 +46628,IN,South Bend,41.701525,-86.294929 +46635,IN,South Bend,41.716768,-86.207806 +46637,IN,South Bend,41.729936,-86.240694 +46701,IN,Albion,41.348217,-85.414183 +46702,IN,Andrews,40.861792,-85.606726 +46703,IN,Angola,41.656321,-85.019803 +46705,IN,Ashley,41.534651,-85.050385 +46706,IN,Auburn,41.359001,-85.046848 +46710,IN,Avilla,41.36894,-85.241418 +46711,IN,Linn Grove,40.661517,-84.934271 +46714,IN,Bluffton,40.736837,-85.162199 +46721,IN,Butler,41.42873,-84.878716 +46723,IN,Churubusco,41.228988,-85.324364 +46725,IN,Columbia City,41.161855,-85.473736 +46730,IN,Corunna,41.450377,-85.137028 +46731,IN,Craigville,40.793034,-85.090379 +46732,IN,Cromwell,41.37514,-85.603133 +46733,IN,Decatur,40.827333,-84.931432 +46737,IN,Fremont,41.733125,-84.945247 +46738,IN,Garrett,41.348216,-85.13467 +46740,IN,Geneva,40.607129,-84.962074 +46741,IN,Grabill,41.210753,-84.940593 +46742,IN,Hamilton,41.5566,-84.895092 +46743,IN,Harlan,41.228468,-84.838635 +46745,IN,Hoagland,40.952375,-85.00751 +46746,IN,Howe,41.728594,-85.472746 +46747,IN,Helmer,41.559887,-85.141953 +46748,IN,Huntertown,41.239113,-85.167724 +46750,IN,Huntington,40.881128,-85.505438 +46755,IN,Kendallville,41.448206,-85.260874 +46759,IN,Keystone,40.589667,-85.276748 +46760,IN,Kimmell,41.363103,-85.518734 +46761,IN,Lagrange,41.652008,-85.40401 +46763,IN,Laotto,41.299119,-85.190086 +46764,IN,Larwill,41.164623,-85.613869 +46765,IN,Leo,41.224864,-85.030093 +46766,IN,Liberty Center,40.700159,-85.277411 +46767,IN,Ligonier,41.466175,-85.59272 +46770,IN,Markle,40.837972,-85.373994 +46772,IN,Monroe,40.700523,-84.844128 +46773,IN,Monroeville,40.987044,-84.89373 +46774,IN,New Haven,41.069856,-85.01173 +46776,IN,Orland,41.730884,-85.146512 +46777,IN,Ossian,40.880611,-85.157041 +46779,IN,Pleasant Lake,41.584255,-85.021276 +46781,IN,Poneto,40.641871,-85.256188 +46783,IN,Roanoke,40.960003,-85.35263 +46784,IN,Rome City,41.484907,-85.374303 +46785,IN,Saint Joe,41.324049,-84.90425 +46787,IN,South Whitley,41.072635,-85.614252 +46788,IN,Spencerville,41.269555,-84.93975 +46791,IN,Uniondale,40.871658,-85.273206 +46792,IN,Warren,40.688646,-85.418337 +46793,IN,Waterloo,41.440216,-85.022103 +46794,IN,Wawaka,41.483251,-85.480427 +46795,IN,Wolcottville,41.556972,-85.314986 +46797,IN,Woodburn,41.136102,-84.892871 +46798,IN,Yoder,40.937059,-85.195828 +46802,IN,Fort Wayne,41.070717,-85.15431 +46803,IN,Fort Wayne,41.069452,-85.107362 +46804,IN,Fort Wayne,41.050843,-85.256013 +46805,IN,Fort Wayne,41.097663,-85.118865 +46806,IN,Fort Wayne,41.047988,-85.113496 +46807,IN,Fort Wayne,41.049054,-85.146167 +46808,IN,Fort Wayne,41.093877,-85.162121 +46809,IN,Fort Wayne,41.02543,-85.1834 +46815,IN,Fort Wayne,41.105318,-85.062397 +46816,IN,Fort Wayne,41.016519,-85.097573 +46818,IN,Fort Wayne,41.146847,-85.206686 +46819,IN,Fort Wayne,41.005167,-85.152743 +46825,IN,Fort Wayne,41.146482,-85.123156 +46835,IN,Fort Wayne,41.137051,-85.068531 +46845,IN,Fort Wayne,41.195783,-85.119088 +46901,IN,Kokomo,40.49884,-86.145273 +46902,IN,Kokomo,40.450856,-86.135227 +46910,IN,Akron,41.038921,-86.039471 +46911,IN,Amboy,40.610505,-85.949726 +46913,IN,Bringhurst,40.516294,-86.520369 +46914,IN,Bunker Hill,40.642267,-86.09615 +46917,IN,Camden,40.599588,-86.515217 +46919,IN,Converse,40.577031,-85.876299 +46920,IN,Cutler,40.4785,-86.446172 +46923,IN,Delphi,40.57339,-86.678849 +46926,IN,Chili,40.869363,-86.076953 +46928,IN,Fairmount,40.418755,-85.671327 +46929,IN,Flora,40.544467,-86.501572 +46932,IN,Galveston,40.586249,-86.1972 +46933,IN,Gas City,40.487895,-85.605533 +46936,IN,Greentown,40.479096,-85.958195 +46938,IN,Jonesboro,40.481456,-85.636496 +46939,IN,Kewanna,41.008706,-86.406055 +46940,IN,La Fontaine,40.690896,-85.697138 +46941,IN,Lagro,40.819897,-85.720447 +46947,IN,Logansport,40.760377,-86.359888 +46950,IN,Lucerne,40.861434,-86.407726 +46951,IN,Macy,40.961838,-86.126428 +46952,IN,Marion,40.574333,-85.674127 +46953,IN,Marion,40.53592,-85.661624 +46960,IN,Monterey,41.138334,-86.517862 +46962,IN,North Manchester,40.998603,-85.784184 +46970,IN,Peru,40.749203,-86.068044 +46971,IN,Grissom Air Forc,40.663546,-86.147292 +46974,IN,Roann,40.906649,-85.889885 +46975,IN,Rochester,41.065493,-86.231007 +46978,IN,Royal Center,40.864499,-86.507751 +46979,IN,Russiaville,40.415086,-86.267467 +46982,IN,Silver Lake,41.074318,-85.879207 +46985,IN,Star City,40.960176,-86.540405 +46986,IN,Swayzee,40.511199,-85.826542 +46988,IN,Twelve Mile,40.854661,-86.212595 +46989,IN,Upland,40.454841,-85.499049 +46990,IN,Urbana,40.898655,-85.748481 +46991,IN,Landess,40.63199,-85.481891 +46992,IN,Wabash,40.790947,-85.832124 +46994,IN,Walton,40.677225,-86.280501 +46996,IN,Winamac,41.056242,-86.630697 +47001,IN,Aurora,39.071897,-84.945188 +47006,IN,Batesville,39.300057,-85.222053 +47010,IN,Bath,39.499237,-84.836007 +47011,IN,Bennington,38.875993,-85.071897 +47012,IN,Brookville,39.421305,-84.999423 +47016,IN,Cedar Grove,39.345891,-84.892402 +47017,IN,Cross Plains,38.949046,-85.21221 +47018,IN,Dillsboro,38.996195,-85.054994 +47020,IN,Florence,38.822436,-84.939872 +47021,IN,Friendship,39.114591,-85.215296 +47022,IN,Guilford,39.205855,-84.961586 +47023,IN,Holton,39.049817,-85.373945 +47024,IN,Laurel,39.491573,-85.208044 +47025,IN,Lawrenceburg,39.140123,-84.865819 +47030,IN,Metamora,39.428775,-85.15044 +47031,IN,Milan,39.150333,-85.13242 +47032,IN,Moores Hill,39.094459,-85.063806 +47036,IN,Oldenburg,39.359797,-85.22223 +47037,IN,Osgood,39.157342,-85.293812 +47038,IN,Patriot,38.853691,-84.851543 +47040,IN,Rising Sun,38.956667,-84.880676 +47041,IN,Sunman,39.262307,-85.115929 +47042,IN,Versailles,39.051074,-85.223489 +47043,IN,Vevay,38.772423,-85.085217 +47060,IN,W Harrison,39.266727,-84.878027 +47102,IN,Austin,38.747801,-85.796188 +47106,IN,Borden,38.436171,-85.921473 +47108,IN,Campbellsburg,38.669037,-86.235846 +47110,IN,Central,38.094543,-86.197381 +47111,IN,Charlestown,38.456778,-85.660614 +47112,IN,Corydon,38.218865,-86.114465 +47114,IN,Crandall,38.28927,-86.069804 +47115,IN,Depauw,38.336078,-86.210857 +47116,IN,Eckerty,38.318548,-86.605939 +47117,IN,Elizabeth,38.124389,-85.958874 +47118,IN,English,38.325807,-86.442875 +47119,IN,Floyds Knobs,38.351006,-85.899555 +47120,IN,Fredericksburg,38.482118,-86.178255 +47122,IN,Georgetown,38.302943,-85.961704 +47123,IN,Grantsburg,38.289183,-86.466043 +47124,IN,Greenville,38.353533,-86.008299 +47125,IN,Hardinsburg,38.462599,-86.317983 +47126,IN,Henryville,38.539829,-85.773403 +47129,IN,Clarksville,38.537273,-85.524438 +47130,IN,Jeffersonville,38.307767,-85.735885 +47135,IN,Laconia,38.052703,-86.084415 +47136,IN,Lanesville,38.244817,-85.959314 +47137,IN,Leavenworth,38.194244,-86.359862 +47138,IN,Lexington,38.650643,-85.658915 +47140,IN,Marengo,38.373603,-86.357784 +47141,IN,Marysville,38.554488,-85.630809 +47142,IN,Mauckport,38.04366,-86.184622 +47143,IN,Memphis,38.464181,-85.777501 +47145,IN,Milltown,38.344453,-86.300344 +47147,IN,Nabb,38.612768,-85.521704 +47150,IN,New Albany,38.308919,-85.822085 +47160,IN,New Middletown,38.144199,-86.055261 +47161,IN,New Salisbury,38.339885,-86.088731 +47162,IN,New Washington,38.557521,-85.45987 +47163,IN,Otisco,38.542342,-85.664702 +47164,IN,Palmyra,38.410484,-86.088778 +47165,IN,Pekin,38.49308,-86.017045 +47166,IN,Ramsey,38.335442,-86.130768 +47167,IN,Salem,38.607138,-86.078742 +47170,IN,Scottsburg,38.688499,-85.798654 +47172,IN,Speed,38.390331,-85.763518 +47174,IN,Sulphur,38.227194,-86.487296 +47175,IN,Taswell,38.346302,-86.538675 +47177,IN,Underwood,38.590251,-85.767211 +47201,IN,Columbus,39.205507,-85.931745 +47203,IN,Columbus,39.230097,-85.885497 +47220,IN,Brownstown,38.883593,-86.048619 +47223,IN,Butlerville,39.120598,-85.494415 +47224,IN,Canaan,38.869644,-85.268896 +47227,IN,Commiskey,38.852629,-85.643384 +47228,IN,Cortland,38.991546,-86.000918 +47229,IN,Crothersville,38.806672,-85.846965 +47230,IN,Deputy,38.775891,-85.630407 +47231,IN,Dupont,38.890504,-85.509205 +47232,IN,Elizabethtown,39.124291,-85.815311 +47234,IN,Flat Rock,39.407503,-85.675886 +47235,IN,Freetown,38.995728,-86.124051 +47236,IN,Grammer,39.159192,-85.718338 +47240,IN,Adams,39.331223,-85.473532 +47243,IN,Hanover,38.71378,-85.476316 +47244,IN,Hartsville,39.273318,-85.70046 +47246,IN,Hope,39.25733,-85.766538 +47250,IN,Madison,38.764866,-85.407019 +47260,IN,Medora,38.825505,-86.189733 +47264,IN,Norman,38.929996,-86.207934 +47265,IN,North Vernon,39.001763,-85.627216 +47270,IN,Paris Crossing,38.855843,-85.748725 +47272,IN,Saint Paul,39.427747,-85.599374 +47273,IN,Scipio,39.066544,-85.712859 +47274,IN,Seymour,38.957133,-85.882477 +47281,IN,Vallonia,38.817413,-86.068997 +47282,IN,Vernon,38.96887,-85.598377 +47283,IN,Westport,39.174856,-85.585596 +47302,IN,Muncie,40.168414,-85.380689 +47303,IN,Muncie,40.217992,-85.378966 +47304,IN,Muncie,40.211134,-85.429115 +47305,IN,Muncie,40.193299,-85.386163 +47306,IN,Ball State Unive,40.192739,-85.410153 +47320,IN,Albany,40.292049,-85.257987 +47325,IN,Brownsville,39.684485,-84.98807 +47326,IN,Bryant,40.54462,-84.911748 +47327,IN,Cambridge City,39.818171,-85.168455 +47330,IN,Centerville,39.808103,-85.00317 +47331,IN,Connersville,39.643508,-85.146431 +47334,IN,Daleville,40.125738,-85.511016 +47336,IN,Dunkirk,40.388291,-85.225541 +47338,IN,Eaton,40.337673,-85.354387 +47339,IN,Economy,39.971215,-85.087803 +47340,IN,Farmland,40.194454,-85.125381 +47341,IN,Fountain City,39.963429,-84.908996 +47342,IN,Gaston,40.29479,-85.489842 +47345,IN,Greens Fork,39.89163,-85.049413 +47346,IN,Hagerstown,39.92277,-85.160091 +47348,IN,Hartford City,40.454106,-85.375771 +47352,IN,Lewisville,39.828288,-85.36211 +47353,IN,Liberty,39.612645,-84.908947 +47354,IN,Losantville,40.047492,-85.21085 +47355,IN,Lynn,40.051863,-84.93003 +47356,IN,Middletown,40.047488,-85.536778 +47357,IN,Milton,39.776279,-85.142267 +47358,IN,Modoc,40.05816,-85.091904 +47359,IN,Montpelier,40.557656,-85.251339 +47360,IN,Mooreland,39.994066,-85.258065 +47362,IN,New Castle,39.920765,-85.366322 +47368,IN,Parker City,40.193841,-85.196265 +47369,IN,Pennville,40.508195,-85.149166 +47371,IN,Portland,40.430564,-84.992825 +47373,IN,Redkey,40.326491,-85.161966 +47374,IN,Richmond,39.83244,-84.893606 +47380,IN,Ridgeville,40.280359,-85.037101 +47381,IN,Salamonia,40.358234,-84.855098 +47382,IN,Saratoga,40.257365,-84.950846 +47383,IN,Selma,40.169295,-85.273765 +47384,IN,Shirley,39.91582,-85.518151 +47385,IN,Spiceland,39.827078,-85.445043 +47386,IN,Springport,40.008848,-85.368867 +47387,IN,Straughn,39.831946,-85.272406 +47388,IN,Sulphur Springs,40.011121,-85.440747 +47390,IN,Union City,40.202372,-84.826787 +47392,IN,Webster,39.905701,-84.942908 +47393,IN,Williamsburg,39.958005,-84.998442 +47394,IN,Winchester,40.16959,-85.004366 +47396,IN,Yorktown,40.183581,-85.495995 +47401,IN,Bloomington,39.140057,-86.508262 +47403,IN,Bloomington,39.12632,-86.576867 +47404,IN,Bloomington,39.195026,-86.57572 +47408,IN,Woodbridge,39.183175,-86.505836 +47421,IN,Bedford,38.872881,-86.487072 +47424,IN,Bloomfield,39.029542,-86.867549 +47427,IN,Coal City,39.257304,-86.988297 +47429,IN,Ellettsville,39.254477,-86.619635 +47431,IN,Freedom,39.215147,-86.850027 +47432,IN,French Lick,38.532351,-86.619555 +47433,IN,Gosport,39.344969,-86.6583 +47436,IN,Heltonville,38.948014,-86.370328 +47438,IN,Jasonville,39.172333,-87.202292 +47441,IN,Linton,39.046139,-87.172286 +47443,IN,Lyons,38.971731,-87.101595 +47446,IN,Mitchell,38.742625,-86.476096 +47448,IN,Nashville,39.236712,-86.22199 +47449,IN,Newberry,38.922905,-87.008055 +47451,IN,Oolitic,38.89378,-86.524617 +47452,IN,Orleans,38.653464,-86.453157 +47453,IN,Owensburg,38.952216,-86.744122 +47454,IN,Paoli,38.550697,-86.44902 +47456,IN,Quincy,39.439521,-86.802506 +47459,IN,Solsberry,39.119047,-86.737843 +47460,IN,Spencer,39.289067,-86.77894 +47462,IN,Springville,38.950655,-86.613879 +47465,IN,Switz City,39.036937,-87.050238 +47468,IN,Unionville,39.251396,-86.418947 +47469,IN,West Baden Sprin,38.585501,-86.613826 +47470,IN,Williams,38.773478,-86.628488 +47471,IN,Worthington,39.12298,-86.999058 +47501,IN,Washington,38.653568,-87.170656 +47512,IN,Bicknell,38.77272,-87.313718 +47513,IN,Birdseye,38.30058,-86.710193 +47514,IN,Branchville,38.157189,-86.585866 +47515,IN,Siberia,38.163101,-86.721815 +47516,IN,Bruceville,38.756279,-87.431299 +47519,IN,Cannelburg,38.694696,-86.966868 +47520,IN,Mount Pleasant,37.910851,-86.732617 +47521,IN,Celestine,38.387789,-86.756809 +47522,IN,Crane Naval Depo,38.849618,-86.865473 +47523,IN,Dale,38.170638,-87.006982 +47524,IN,Decker,38.507629,-87.553713 +47525,IN,Derby,38.023933,-86.576951 +47527,IN,Dubois,38.472824,-86.78319 +47528,IN,Edwardsport,38.810584,-87.251856 +47529,IN,Elnora,38.822284,-87.065243 +47531,IN,Evanston,38.022436,-86.836422 +47532,IN,Ferdinand,38.233582,-86.860669 +47537,IN,Gentryville,38.085458,-87.044137 +47541,IN,Holland,38.23851,-87.008768 +47542,IN,Huntingburg,38.297902,-86.953299 +47546,IN,Haysville,38.404392,-86.940787 +47550,IN,Buffaloville,38.047904,-86.962908 +47551,IN,Leopold,38.101138,-86.60443 +47552,IN,Lincoln City,38.127565,-86.987204 +47553,IN,Loogootee,38.662901,-86.913658 +47555,IN,Magnet,38.088165,-86.48353 +47556,IN,Mariah Hill,38.149493,-86.831593 +47557,IN,Monroe City,38.60015,-87.364136 +47558,IN,Montgomery,38.652146,-87.047603 +47559,IN,47559,38.126823,-86.519682 +47561,IN,Oaktown,38.857939,-87.387877 +47562,IN,Odon,38.818666,-86.975214 +47564,IN,Otwell,38.466221,-87.098548 +47567,IN,Petersburg,38.478929,-87.288294 +47568,IN,Plainville,38.791507,-87.157822 +47574,IN,Rome,37.937561,-86.595787 +47575,IN,Kyana,38.332222,-86.824858 +47576,IN,Saint Croix,38.239773,-86.603511 +47577,IN,Saint Meinrad,38.181946,-86.842916 +47578,IN,Sandborn,38.881743,-87.202532 +47579,IN,Santa Claus,38.094496,-86.903528 +47580,IN,Schnellville,38.341436,-86.756506 +47581,IN,Shoals,38.679103,-86.776094 +47585,IN,Stendal,38.283472,-87.12045 +47586,IN,Tell City,37.965505,-86.745704 +47587,IN,Tobinsport,37.874726,-86.634128 +47588,IN,Troy,37.997994,-86.797766 +47590,IN,Velpen,38.367981,-87.098996 +47591,IN,Vincennes,38.67344,-87.509806 +47597,IN,Wheatland,38.667055,-87.306204 +47598,IN,Winslow,38.363951,-87.222328 +47601,IN,Boonville,38.047435,-87.261994 +47610,IN,Chandler,38.042304,-87.375552 +47611,IN,Chrisney,38.005995,-87.070421 +47612,IN,Cynthiana,38.174299,-87.711518 +47613,IN,Elberfeld,38.205267,-87.417943 +47615,IN,Grandview,37.970297,-86.956774 +47616,IN,Griffin,38.206858,-87.916631 +47619,IN,Lynnville,38.196085,-87.293486 +47620,IN,Mount Vernon,37.950569,-87.856887 +47630,IN,Newburgh,37.963746,-87.393798 +47631,IN,New Harmony,38.124502,-87.917186 +47633,IN,Poseyville,38.171986,-87.802747 +47634,IN,Richland,37.913599,-87.200957 +47635,IN,Rockport,37.885803,-87.07701 +47637,IN,Tennyson,38.123207,-87.13875 +47638,IN,Wadesville,38.082791,-87.754295 +47639,IN,Haubstadt,38.189536,-87.579827 +47640,IN,Hazleton,38.462283,-87.498348 +47647,IN,Buckskin,38.220867,-87.43077 +47648,IN,Fort Branch,38.247136,-87.568233 +47649,IN,Francisco,38.332953,-87.453621 +47660,IN,Oakland City,38.336053,-87.351907 +47665,IN,Owensville,38.274414,-87.709052 +47666,IN,Patoka,38.414296,-87.595789 +47670,IN,Princeton,38.352502,-87.569069 +47708,IN,Evansville,37.971818,-87.571973 +47710,IN,Evansville,38.008617,-87.574569 +47711,IN,Evansville,38.076377,-87.535236 +47712,IN,Evansville,37.998484,-87.634682 +47713,IN,Evansville,37.962326,-87.55768 +47714,IN,Evansville,37.959076,-87.529302 +47715,IN,Evansville,37.967815,-87.485526 +47720,IN,Evansville,37.998832,-87.538793 +47802,IN,Terre Haute,39.40697,-87.402019 +47803,IN,Terre Haute,39.465696,-87.353967 +47804,IN,Terre Haute,39.493665,-87.394494 +47805,IN,North Terre Haut,39.535981,-87.341109 +47807,IN,Terre Haute,39.470974,-87.400859 +47832,IN,Bloomingdale,39.834808,-87.255967 +47833,IN,Bowling Green,39.381209,-87.005249 +47834,IN,Brazil,39.521041,-87.127767 +47836,IN,Bridgeton,39.648366,-87.181396 +47837,IN,Carbon,39.57463,-87.064455 +47838,IN,Carlisle,38.976297,-87.366738 +47840,IN,Centerpoint,39.390989,-87.09347 +47841,IN,Clay City,39.2727,-87.108244 +47842,IN,Clinton,39.659142,-87.4208 +47846,IN,Cory,39.343545,-87.195644 +47847,IN,Dana,39.752829,-87.501018 +47848,IN,Dugger,39.069057,-87.259867 +47849,IN,Fairbanks,39.212865,-87.518483 +47850,IN,Farmersburg,39.268456,-87.502365 +47854,IN,Hillsdale,39.771235,-87.404102 +47858,IN,Lewis,39.273261,-87.263681 +47859,IN,Marshall,39.906216,-87.178032 +47861,IN,Merom,39.032307,-87.539675 +47862,IN,Montezuma,39.796061,-87.360679 +47866,IN,Pimento,39.289792,-87.379186 +47868,IN,Poland,39.446195,-86.963103 +47872,IN,Rockville,39.768152,-87.197794 +47874,IN,Rosedale,39.62391,-87.308592 +47879,IN,Shelburn,39.209924,-87.361194 +47882,IN,Sullivan,39.101018,-87.410235 +47885,IN,Sandford,39.49384,-87.467086 +47901,IN,Lafayette,40.417743,-86.888358 +47904,IN,Lafayette,40.427649,-86.873464 +47905,IN,Lafayette,40.400054,-86.860236 +47906,IN,West Lafayette,40.444025,-86.923661 +47917,IN,Ambia,40.479328,-87.479554 +47918,IN,Attica,40.281127,-87.224108 +47920,IN,Battle Ground,40.5248,-86.823784 +47921,IN,Boswell,40.518021,-87.378947 +47922,IN,Brook,40.865534,-87.352685 +47923,IN,Brookston,40.601088,-86.875311 +47926,IN,Burnettsville,40.707753,-86.574744 +47928,IN,Cayuga,39.930028,-87.459019 +47929,IN,Chalmers,40.669265,-86.862621 +47930,IN,Clarks Hill,40.262805,-86.760766 +47932,IN,Covington,40.132618,-87.381876 +47933,IN,Crawfordsville,40.032524,-86.907424 +47940,IN,Darlington,40.111778,-86.764505 +47942,IN,Earl Park,40.694465,-87.423199 +47943,IN,Fair Oaks,41.072862,-87.197031 +47944,IN,Fowler,40.625511,-87.309019 +47946,IN,Francesville,40.97094,-86.85534 +47948,IN,Goodland,40.766872,-87.299858 +47949,IN,Hillsboro,40.083452,-87.154509 +47950,IN,Idaville,40.767372,-86.655647 +47951,IN,Kentland,40.787678,-87.447071 +47952,IN,Cates,39.989383,-87.303548 +47954,IN,Ladoga,39.91325,-86.803098 +47955,IN,Linden,40.183316,-86.890549 +47957,IN,Medaryville,41.089734,-86.880844 +47959,IN,Monon,40.861176,-86.863537 +47960,IN,Monticello,40.762556,-86.754999 +47963,IN,Morocco,40.964547,-87.41871 +47967,IN,New Richmond,40.18118,-86.978925 +47968,IN,New Ross,39.988266,-86.752768 +47970,IN,Otterbein,40.517013,-87.12249 +47971,IN,Oxford,40.521708,-87.252576 +47974,IN,Perrysville,40.073697,-87.464787 +47975,IN,Pine Village,40.432759,-87.231724 +47977,IN,Remington,40.766653,-87.15994 +47978,IN,Collegeville,40.947731,-87.133733 +47980,IN,Reynolds,40.760608,-86.86914 +47981,IN,Romney,40.2605,-86.904412 +47985,IN,Tangier,39.920601,-87.341551 +47987,IN,Veedersburg,40.118616,-87.260167 +47989,IN,Waveland,39.901996,-87.01776 +47990,IN,Waynetown,40.085788,-87.051165 +47991,IN,West Lebanon,40.241491,-87.436676 +47992,IN,Westpoint,40.358052,-87.057477 +47993,IN,Marshfield,40.309435,-87.278689 +47994,IN,Wingate,40.166594,-87.066441 +47995,IN,Wolcott,40.751613,-87.028997 +50001,IA,Ackworth,41.37372,-93.376719 +50002,IA,Adair,41.513687,-94.644363 +50003,IA,Adel,41.62214,-94.037965 +50005,IA,Albion,42.11427,-92.98821 +50006,IA,Alden,42.51789,-93.384123 +50007,IA,Alleman,41.815886,-93.606305 +50008,IA,Allerton,40.702301,-93.37239 +50009,IA,Altoona,41.647549,-93.472415 +50010,IA,Ames,42.029859,-93.639398 +50020,IA,Anita,41.449973,-94.779401 +50021,IA,Ankeny,41.72755,-93.602175 +50022,IA,Atlantic,41.400279,-95.010123 +50025,IA,Audubon,41.730032,-94.916412 +50026,IA,Bagley,41.834053,-94.441535 +50027,IA,Barnes City,41.488269,-92.470338 +50028,IA,Baxter,41.820369,-93.158332 +50029,IA,Bayard,41.838599,-94.591533 +50030,IA,Beaconsfield,40.778431,-94.075126 +50031,IA,Beaver,42.039936,-94.103309 +50033,IA,Bevington,41.371763,-93.812865 +50034,IA,Blairsburg,42.493725,-93.659444 +50035,IA,Bondurant,41.70166,-93.452689 +50036,IA,Boone,42.069354,-93.878083 +50038,IA,Booneville,41.533987,-93.881357 +50039,IA,Bouton,41.828432,-93.996286 +50040,IA,Boxholm,42.170567,-94.105246 +50041,IA,Bradford,42.610434,-93.218068 +50042,IA,Brayton,41.55236,-94.974017 +50044,IA,Bussey,41.209422,-92.896252 +50046,IA,Cambridge,41.90251,-93.530538 +50047,IA,Carlisle,41.481384,-93.49214 +50048,IA,Casey,41.496116,-94.414475 +50049,IA,Chariton,41.022638,-93.30419 +50050,IA,Churdan,42.161402,-94.493346 +50051,IA,Clemons,42.090041,-93.16878 +50052,IA,Clio,40.680261,-93.486443 +50054,IA,Colfax,41.678785,-93.258816 +50055,IA,Collins,41.903226,-93.300808 +50056,IA,Colo,42.013102,-93.307114 +50057,IA,Columbia,41.183814,-93.158217 +50058,IA,Coon Rapids,41.893957,-94.679979 +50059,IA,Cooper,41.903433,-94.339073 +50060,IA,Sewal,40.76131,-93.322549 +50061,IA,Cumming,41.484876,-93.75386 +50062,IA,Dallas,41.221332,-93.253525 +50063,IA,Dallas Center,41.686248,-93.970657 +50064,IA,Dana,42.10634,-94.232212 +50065,IA,Pleasanton,40.632075,-93.807022 +50066,IA,Dawson,41.832396,-94.217127 +50067,IA,Decatur,40.755258,-93.832598 +50068,IA,Derby,40.935476,-93.47959 +50069,IA,De Soto,41.533285,-94.027582 +50070,IA,Dexter,41.519806,-94.2145 +50071,IA,Dows,42.661026,-93.505801 +50072,IA,Earlham,41.470916,-94.129443 +50073,IA,Elkhart,41.811384,-93.485458 +50074,IA,Ellston,40.850485,-94.084116 +50075,IA,Ellsworth,42.30086,-93.548979 +50076,IA,Exira,41.576771,-94.857145 +50101,IA,Galt,42.691187,-93.603512 +50102,IA,Garden City,42.25266,-93.403068 +50103,IA,Garden Grove,40.771078,-93.611669 +50104,IA,Gibson,41.464206,-92.353121 +50106,IA,Gilman,41.901236,-92.810067 +50107,IA,Grand Junction,42.029578,-94.233629 +50108,IA,Grand River,40.813704,-93.954372 +50109,IA,Granger,41.752355,-93.841002 +50110,IA,Gray,41.82663,-95.02272 +50111,IA,Grimes,41.701838,-93.782109 +50112,IA,Grinnell,41.742081,-92.734432 +50115,IA,Guthrie Center,41.683671,-94.486444 +50116,IA,Hamilton,41.175543,-92.924349 +50117,IA,Hamlin,41.650571,-94.915745 +50118,IA,Hartford,41.459629,-93.402213 +50119,IA,Harvey,41.302972,-92.931843 +50120,IA,Haverhill,41.93196,-92.945857 +50122,IA,Hubbard,42.302208,-93.293928 +50123,IA,Humeston,40.846922,-93.510117 +50124,IA,Huxley,41.899434,-93.602381 +50125,IA,Spring Hill,41.35617,-93.571502 +50126,IA,Iowa Falls,42.513756,-93.270943 +50127,IA,Ira,41.731759,-93.164436 +50128,IA,Jamaica,41.841931,-94.320367 +50129,IA,Jefferson,42.009325,-94.388768 +50130,IA,Jewell,42.313912,-93.642821 +50131,IA,Johnston,41.673017,-93.702792 +50132,IA,Kamrar,42.394517,-93.727941 +50133,IA,Kellerton,40.686127,-94.060693 +50134,IA,Kelley,41.948773,-93.664354 +50135,IA,Kellogg,41.718371,-92.911404 +50136,IA,Keswick,41.461251,-92.239547 +50138,IA,Knoxville,41.316446,-93.095427 +50139,IA,Lacona,41.198832,-93.383801 +50140,IA,Lamoni,40.622852,-93.934899 +50141,IA,Laurel,41.882904,-92.926294 +50143,IA,Leighton,41.364677,-92.808125 +50144,IA,Leon,40.737334,-93.742903 +50145,IA,Liberty Center,41.207668,-93.497391 +50146,IA,Linden,41.64225,-94.24058 +50147,IA,Lineville,40.600373,-93.486207 +50148,IA,Liscomb,42.184,-92.983279 +50149,IA,Lorimor,41.1233,-94.063885 +50150,IA,Lovilia,41.12719,-92.929272 +50151,IA,Lucas,41.058451,-93.483614 +50152,IA,Luther,41.991934,-93.855394 +50153,IA,Lynnville,41.569766,-92.787715 +50154,IA,Mc Callsburg,42.166475,-93.397757 +50155,IA,Macksburg,41.202792,-94.185673 +50156,IA,Madrid,41.884083,-93.844815 +50157,IA,Malcom,41.769502,-92.535426 +50158,IA,Marshalltown,42.040482,-92.91269 +50161,IA,Maxwell,41.89673,-93.400125 +50162,IA,Melbourne,41.932348,-93.085627 +50163,IA,Melcher-Dallas,41.222912,-93.219404 +50164,IA,Menlo,41.534797,-94.409002 +50165,IA,Millerton,40.854889,-93.279586 +50166,IA,Milo,41.29042,-93.445356 +50167,IA,Minburn,41.756206,-94.01501 +50168,IA,Mingo,41.789843,-93.288015 +50169,IA,Mitchellville,41.66089,-93.36995 +50170,IA,Monroe,41.535619,-93.072551 +50171,IA,Montezuma,41.592845,-92.527582 +50172,IA,Guernsey,41.662496,-92.333549 +50173,IA,Montour,41.970876,-92.700575 +50174,IA,Murray,41.037644,-93.952975 +50201,IA,Nevada,42.018983,-93.446219 +50206,IA,New Providence,42.269261,-93.175262 +50207,IA,New Sharon,41.463976,-92.684815 +50208,IA,Newton,41.699173,-93.045456 +50210,IA,New Virginia,41.160063,-93.711312 +50211,IA,Norwalk,41.486055,-93.657332 +50212,IA,Ogden,42.035106,-94.006333 +50213,IA,Osceola,41.029503,-93.771236 +50214,IA,Otley,41.451806,-93.034778 +50216,IA,Panora,41.696684,-94.360613 +50217,IA,Paton,42.165841,-94.273038 +50218,IA,Patterson,41.353912,-93.878174 +50219,IA,Pella,41.408175,-92.917207 +50220,IA,Perry,41.839695,-94.102167 +50222,IA,Peru,41.21454,-93.943729 +50223,IA,Pilot Mound,42.160395,-94.010184 +50225,IA,Pleasantville,41.373836,-93.271206 +50226,IA,Polk City,41.754905,-93.689346 +50227,IA,Popejoy,42.595628,-93.430867 +50228,IA,Prairie City,41.585425,-93.240986 +50229,IA,Prole,41.382973,-93.734357 +50230,IA,Radcliffe,42.324064,-93.423364 +50231,IA,Randall,42.247463,-93.62109 +50232,IA,Reasnor,41.579802,-93.019827 +50233,IA,Redfield,41.587349,-94.189733 +50234,IA,Rhodes,41.917717,-93.179586 +50235,IA,Rippey,41.92574,-94.213202 +50236,IA,Roland,42.164585,-93.506313 +50237,IA,Runnells,41.551549,-93.42025 +50238,IA,Russell,40.945557,-93.178371 +50239,IA,Saint Anthony,42.151974,-93.182431 +50240,IA,Saint Charles,41.292443,-93.824195 +50241,IA,Saint Marys,41.297826,-93.736107 +50242,IA,Searsboro,41.56561,-92.698737 +50244,IA,Slater,41.876511,-93.681155 +50246,IA,Stanhope,42.290407,-93.775081 +50247,IA,State Center,42.010911,-93.167283 +50248,IA,Story City,42.183487,-93.598811 +50249,IA,Stratford,42.284673,-93.90294 +50250,IA,Stuart,41.518643,-94.304563 +50251,IA,Sully,41.573969,-92.845085 +50252,IA,Swan,41.4717,-93.234165 +50254,IA,Thayer,41.00293,-94.068639 +50256,IA,Tracy,41.275564,-92.875337 +50257,IA,Truro,41.207622,-93.840978 +50258,IA,Union,42.252074,-93.056192 +50261,IA,Van Meter,41.539415,-93.95303 +50262,IA,Van Wert,40.864451,-93.80733 +50263,IA,Waukee,41.592959,-93.85916 +50264,IA,Weldon,40.873906,-93.738743 +50265,IA,West Des Moines,41.580512,-93.744711 +50268,IA,What Cheer,41.395276,-92.354789 +50271,IA,Williams,42.461376,-93.56774 +50272,IA,Williamson,41.102026,-93.26593 +50273,IA,Winterset,41.339077,-94.008763 +50274,IA,Wiota,41.384552,-94.840515 +50275,IA,Woodburn,41.00001,-93.608282 +50276,IA,Woodward,41.845219,-93.905617 +50277,IA,Yale,41.775309,-94.35026 +50278,IA,Zearing,42.15349,-93.292766 +50309,IA,Des Moines,41.588743,-93.621175 +50310,IA,Des Moines,41.625475,-93.673611 +50311,IA,Windsor Heights,41.601562,-93.674371 +50312,IA,Des Moines,41.585453,-93.671908 +50313,IA,Des Moines,41.638085,-93.620305 +50314,IA,Des Moines,41.603003,-93.632993 +50315,IA,Des Moines,41.544394,-93.619226 +50316,IA,Des Moines,41.609228,-93.599966 +50317,IA,Pleasant Hill,41.612499,-93.549446 +50320,IA,Des Moines,41.548693,-93.582674 +50321,IA,Des Moines,41.547628,-93.661846 +50322,IA,Urbandale,41.629479,-93.723042 +50325,IA,Clive,41.606729,-93.745749 +50401,IA,Mason City,43.149869,-93.195379 +50420,IA,Alexander,42.811395,-93.445 +50421,IA,Belmond,42.851137,-93.620012 +50423,IA,Britt,43.100582,-93.775175 +50424,IA,Buffalo Center,43.373204,-93.937557 +50428,IA,Clear Lake,43.140607,-93.384978 +50430,IA,Corwith,42.992736,-93.932303 +50432,IA,Crystal Lake,43.218692,-93.794166 +50433,IA,Dougherty,42.941633,-93.068586 +50434,IA,Fertile,43.279514,-93.434485 +50435,IA,Floyd,43.143049,-92.723988 +50436,IA,Forest City,43.269184,-93.635595 +50438,IA,Garner,43.114395,-93.594394 +50439,IA,Goodell,42.938298,-93.582426 +50440,IA,Grafton,43.311016,-93.079718 +50441,IA,Hampton,42.740531,-93.210954 +50444,IA,Hanlontown,43.307234,-93.335065 +50446,IA,Joice,43.376105,-93.445354 +50447,IA,Kanawha,42.94338,-93.772801 +50448,IA,Kensett,43.37391,-93.172805 +50449,IA,Klemme,43.013643,-93.587944 +50450,IA,Lake Mills,43.416696,-93.533628 +50451,IA,Lakota,43.395283,-94.07055 +50452,IA,Latimer,42.759783,-93.351798 +50453,IA,Leland,43.307043,-93.751496 +50454,IA,Little Cedar,43.391861,-92.734376 +50455,IA,Mc Intire,43.44999,-92.60485 +50456,IA,Manly,43.289116,-93.201802 +50457,IA,Meservey,42.913696,-93.477298 +50458,IA,Nora Springs,43.147858,-93.000221 +50459,IA,Northwood,43.450604,-93.241943 +50460,IA,Orchard,43.235459,-92.719979 +50461,IA,Osage,43.28722,-92.814356 +50464,IA,Plymouth,43.246046,-93.122628 +50465,IA,Rake,43.476655,-93.917128 +50466,IA,Riceville,43.371899,-92.555372 +50467,IA,Rock Falls,43.198014,-93.076402 +50468,IA,Rockford,43.057331,-92.952034 +50469,IA,Rockwell,43.003167,-93.216737 +50470,IA,Rowan,42.759644,-93.556966 +50471,IA,Rudd,43.141958,-92.888546 +50472,IA,Saint Ansgar,43.406107,-92.923523 +50473,IA,Scarville,43.467286,-93.64233 +50475,IA,Sheffield,42.877881,-93.215583 +50476,IA,Stacyville,43.445687,-92.761031 +50477,IA,Swaledale,42.962167,-93.311529 +50478,IA,Thompson,43.387497,-93.751671 +50479,IA,Thornton,42.968405,-93.408787 +50480,IA,Titonka,43.245606,-94.036656 +50482,IA,Ventura,43.126178,-93.4706 +50483,IA,Wesley,43.09765,-94.003776 +50484,IA,Woden,43.222564,-93.910925 +50501,IA,Fort Dodge,42.508817,-94.180737 +50510,IA,Albert City,42.778403,-94.98238 +50511,IA,Algona,43.065976,-94.230638 +50514,IA,Armstrong,43.402423,-94.485305 +50515,IA,Ayrshire,43.037001,-94.847804 +50516,IA,Badger,42.599595,-94.162988 +50517,IA,Bancroft,43.293485,-94.210778 +50518,IA,Barnum,42.515867,-94.370327 +50519,IA,Bode,42.866078,-94.278055 +50520,IA,Bradgate,42.779425,-94.400239 +50521,IA,Burnside,42.341318,-94.114253 +50522,IA,Burt,43.206167,-94.21223 +50523,IA,Callender,42.349372,-94.281963 +50524,IA,Clare,42.595397,-94.308028 +50525,IA,Clarion,42.727149,-93.727715 +50527,IA,Curlew,42.963321,-94.797528 +50528,IA,Cylinder,43.150716,-94.510672 +50530,IA,Dayton,42.259438,-94.06105 +50531,IA,Dolliver,43.466382,-94.624236 +50532,IA,Duncombe,42.449303,-94.059212 +50533,IA,Eagle Grove,42.660867,-93.904872 +50535,IA,Early,42.448258,-95.172569 +50536,IA,Emmetsburg,43.108249,-94.682545 +50538,IA,Farnhamville,42.269234,-94.422623 +50539,IA,Fenton,43.242047,-94.404366 +50540,IA,Fonda,42.605148,-94.82974 +50541,IA,Gilmore City,42.706691,-94.410824 +50542,IA,Goldfield,42.758055,-93.919435 +50543,IA,Gowrie,42.276712,-94.298669 +50544,IA,Harcourt,42.253052,-94.196095 +50545,IA,Hardy,42.782247,-94.030852 +50546,IA,Havelock,42.84109,-94.725233 +50548,IA,Humboldt,42.719574,-94.213184 +50551,IA,Jolley,42.507785,-94.742338 +50552,IA,Knierim,42.431944,-94.453153 +50553,IA,Knoke,42.520515,-94.85437 +50554,IA,Laurens,42.840938,-94.850816 +50556,IA,Ledyard,43.434569,-94.150281 +50557,IA,Lehigh,42.352645,-94.034158 +50558,IA,Livermore,42.866601,-94.174716 +50559,IA,Lone Rock,43.166645,-94.358578 +50560,IA,Lu Verne,42.98684,-94.095912 +50561,IA,Lytton,42.430375,-94.813991 +50562,IA,Mallard,42.94167,-94.674608 +50563,IA,Manson,42.528503,-94.530386 +50565,IA,Marathon,42.861233,-94.983551 +50566,IA,Moorland,42.434005,-94.319886 +50567,IA,Nemaha,42.518027,-95.093914 +50568,IA,Newell,42.615699,-94.994591 +50569,IA,Otho,42.432825,-94.170776 +50570,IA,Ottosen,42.876443,-94.378648 +50571,IA,Palmer,42.641871,-94.543155 +50573,IA,Plover,42.869107,-94.622507 +50574,IA,Pocahontas,42.729602,-94.673675 +50575,IA,Pomeroy,42.532565,-94.663758 +50576,IA,Rembrandt,42.826034,-95.165178 +50577,IA,Renwick,42.849132,-94.007437 +50578,IA,Ringsted,43.297654,-94.529137 +50579,IA,Rockwell City,42.396126,-94.629219 +50580,IA,Rodman,43.035233,-94.499243 +50581,IA,Rolfe,42.808233,-94.516593 +50582,IA,Rutland,42.763486,-94.271882 +50583,IA,Sac City,42.426212,-94.979552 +50585,IA,Sioux Rapids,42.906472,-95.138836 +50586,IA,Somers,42.356065,-94.44639 +50588,IA,Storm Lake,42.64738,-95.196079 +50590,IA,Swea City,43.402225,-94.319322 +50591,IA,Thor,42.688923,-94.038958 +50594,IA,Vincent,42.562292,-94.033534 +50595,IA,Webster City,42.465682,-93.826216 +50597,IA,West Bend,42.957415,-94.456402 +50598,IA,Whittemore,43.02608,-94.406395 +50599,IA,Woolstock,42.584439,-93.82161 +50601,IA,Ackley,42.552722,-93.060835 +50602,IA,Allison,42.761465,-92.782952 +50603,IA,Alta Vista,43.148159,-92.423682 +50604,IA,Aplington,42.587039,-92.875141 +50605,IA,Aredale,42.854852,-92.97688 +50606,IA,Arlington,42.733827,-91.666814 +50607,IA,Aurora,42.620317,-91.733469 +50608,IA,Austinville,42.596245,-92.959422 +50609,IA,Beaman,42.236707,-92.816215 +50611,IA,Bristow,42.774106,-92.886424 +50612,IA,Buckingham,42.255211,-92.409788 +50613,IA,Cedar Falls,42.524071,-92.449725 +50616,IA,Charles City,43.068327,-92.676062 +50619,IA,Clarksville,42.804079,-92.658833 +50621,IA,Conrad,42.234188,-92.886525 +50622,IA,Denver,42.673137,-92.341701 +50624,IA,Dike,42.47301,-92.612154 +50625,IA,Dumont,42.736773,-92.967347 +50626,IA,Dunkerton,42.578028,-92.158826 +50627,IA,Eldora,42.357158,-93.103699 +50628,IA,Elma,43.27855,-92.398066 +50629,IA,Fairbank,42.616235,-92.032589 +50630,IA,Fredericksburg,42.959299,-92.198334 +50632,IA,Garwin,42.087228,-92.68935 +50633,IA,Geneva,42.68044,-93.103793 +50635,IA,Gladbrook,42.177432,-92.714112 +50636,IA,Greene,42.91604,-92.758324 +50638,IA,Grundy Center,42.3672,-92.777344 +50640,IA,Hansell,42.771195,-93.090036 +50641,IA,Hazleton,42.607561,-91.910462 +50642,IA,Holland,42.40114,-92.799884 +50643,IA,Hudson,42.390497,-92.454872 +50644,IA,Independence,42.46744,-91.880343 +50645,IA,Ionia,43.040253,-92.486521 +50647,IA,Janesville,42.646515,-92.479096 +50648,IA,Jesup,42.482329,-92.045625 +50649,IA,Kesley,42.685717,-92.853455 +50650,IA,Lamont,42.594552,-91.670078 +50651,IA,La Porte City,42.341618,-92.186155 +50652,IA,Lincoln,42.256056,-92.704693 +50653,IA,Marble Rock,42.964547,-92.891681 +50654,IA,Masonville,42.50461,-91.550576 +50655,IA,Maynard,42.775156,-91.890773 +50658,IA,Nashua,42.952848,-92.529839 +50659,IA,New Hampton,43.056015,-92.313136 +50660,IA,New Hartford,42.583128,-92.616359 +50662,IA,Oelwein,42.681095,-91.913084 +50665,IA,Parkersburg,42.571377,-92.768763 +50666,IA,Plainfield,42.850267,-92.511558 +50667,IA,Raymond,42.467169,-92.216247 +50668,IA,Readlyn,42.692869,-92.215432 +50669,IA,Reinbeck,42.313078,-92.594839 +50670,IA,Shell Rock,42.70611,-92.58878 +50671,IA,Stanley,42.635623,-91.812673 +50672,IA,Steamboat Rock,42.417841,-93.06291 +50674,IA,Sumner,42.841935,-92.118562 +50675,IA,Traer,42.184685,-92.482681 +50676,IA,Tripoli,42.810538,-92.265934 +50677,IA,Bremer,42.737307,-92.466199 +50680,IA,Wellsburg,42.449418,-92.939763 +50681,IA,Westgate,42.805453,-92.018299 +50682,IA,Winthrop,42.491163,-91.731467 +50701,IA,Waterloo,42.477784,-92.366099 +50702,IA,Waterloo,42.473112,-92.336486 +50703,IA,Waterloo,42.514875,-92.326919 +50706,IA,Washburn,42.407605,-92.2676 +50707,IA,Evansdale,42.475453,-92.281158 +50801,IA,Nevinville,41.062384,-94.369151 +50830,IA,Afton,41.040146,-94.194044 +50833,IA,Bedford,40.66829,-94.732448 +50835,IA,Benton,40.725836,-94.393104 +50836,IA,Blockton,40.624242,-94.504901 +50837,IA,Bridgewater,41.157084,-94.641011 +50840,IA,Clearfield,40.793534,-94.494439 +50841,IA,Corning,40.987121,-94.735789 +50843,IA,Cumberland,41.263165,-94.871006 +50844,IA,Delphos,40.661959,-94.316188 +50845,IA,Diagonal,40.822644,-94.355156 +50846,IA,Fontanelle,41.289568,-94.541904 +50847,IA,Grant,41.125799,-94.984554 +50848,IA,Gravity,40.790914,-94.750595 +50849,IA,Greenfield,41.313311,-94.440757 +50850,IA,Kent,40.944856,-94.421718 +50851,IA,Lenox,40.884096,-94.56117 +50852,IA,Maloy,40.673648,-94.40764 +50853,IA,Massena,41.249867,-94.764872 +50854,IA,Mount Ayr,40.7142,-94.232146 +50855,IA,50855,41.111656,-94.796602 +50857,IA,Nodaway,40.954034,-94.87309 +50858,IA,Orient,41.219191,-94.370496 +50859,IA,Prescott,41.024848,-94.524901 +50860,IA,Redding,40.605312,-94.359451 +50861,IA,Shannon City,40.936636,-94.250106 +50862,IA,Sharpsburg,40.795042,-94.641633 +50863,IA,Tingley,40.851597,-94.190823 +50864,IA,Villisca,40.943718,-94.979588 +51001,IA,Akron,42.835392,-96.52245 +51002,IA,Alta,42.677118,-95.3129 +51003,IA,Alton,42.978175,-96.017268 +51004,IA,Anthon,42.386967,-95.894765 +51005,IA,Aurelia,42.69122,-95.438086 +51006,IA,Battle Creek,42.332662,-95.604517 +51007,IA,Bronson,42.429181,-96.198591 +51009,IA,Calumet,42.953272,-95.554871 +51010,IA,Castana,42.105404,-95.943121 +51012,IA,Cherokee,42.748187,-95.556842 +51014,IA,Cleghorn,42.808593,-95.712436 +51016,IA,Correctionville,42.474322,-95.780382 +51018,IA,Cushing,42.464182,-95.67748 +51019,IA,Danbury,42.269337,-95.726259 +51020,IA,Galva,42.510508,-95.429838 +51022,IA,Granville,42.969252,-95.897167 +51023,IA,Hawarden,43.001333,-96.472992 +51024,IA,Hinton,42.604046,-96.305033 +51025,IA,Holstein,42.494779,-95.564971 +51026,IA,Hornick,42.289741,-96.079553 +51027,IA,Ireton,42.966566,-96.323226 +51028,IA,Kingsley,42.619057,-95.976151 +51029,IA,Larrabee,42.862758,-95.581228 +51030,IA,Lawton,42.504748,-96.21893 +51031,IA,Le Mars,42.79623,-96.170386 +51033,IA,Linn Grove,42.874229,-95.251249 +51034,IA,Mapleton,42.158524,-95.790934 +51035,IA,Marcus,42.819959,-95.803431 +51036,IA,Maurice,42.962647,-96.165531 +51037,IA,Meriden,42.787416,-95.640797 +51038,IA,Merrill,42.704737,-96.228324 +51039,IA,Moville,42.481924,-96.065583 +51040,IA,Onawa,42.036967,-96.107213 +51041,IA,Orange City,43.01849,-96.056464 +51044,IA,Oto,42.264592,-95.861575 +51046,IA,Paullina,42.970277,-95.708322 +51047,IA,Peterson,42.932794,-95.337658 +51048,IA,Pierson,42.533493,-95.892193 +51049,IA,Quimby,42.628711,-95.681175 +51050,IA,Remsen,42.8149,-95.954378 +51051,IA,Rodney,42.201541,-95.953456 +51052,IA,Salix,42.330554,-96.287912 +51053,IA,Schaller,42.505501,-95.284587 +51054,IA,Sergeant Bluff,42.401895,-96.353392 +51055,IA,Sloan,42.242726,-96.230634 +51056,IA,Smithland,42.24079,-95.948647 +51058,IA,Sutherland,42.982623,-95.480665 +51059,IA,Turin,41.973189,-95.951828 +51060,IA,Ute,42.058085,-95.712542 +51061,IA,Washta,42.578108,-95.729537 +51062,IA,Westfield,42.695329,-96.491987 +51063,IA,Whiting,42.15216,-96.182247 +51101,IA,Sioux City,42.497223,-96.40292 +51103,IA,Sioux City,42.506793,-96.42951 +51104,IA,Sioux City,42.52536,-96.400453 +51105,IA,Sioux City,42.503224,-96.382855 +51106,IA,Sioux City,42.467057,-96.352755 +51107,IA,Sioux City,42.490266,-96.376064 +51108,IA,Sioux City,42.546891,-96.361695 +51109,IA,Sioux City,42.517287,-96.480304 +51110,IA,Sioux City,42.400921,-96.372559 +51111,IA,Sioux City,42.408912,-96.371294 +51201,IA,Sheldon,43.180797,-95.840141 +51230,IA,Alvord,43.320109,-96.290994 +51231,IA,Archer,43.117917,-95.741656 +51232,IA,Ashton,43.305259,-95.765509 +51234,IA,Boyden,43.20343,-95.982309 +51235,IA,Doon,43.287183,-96.201987 +51237,IA,George,43.343903,-95.989383 +51238,IA,Hospers,43.079337,-95.914172 +51239,IA,Hull,43.195201,-96.139248 +51240,IA,Inwood,43.304747,-96.436293 +51241,IA,Larchwood,43.438673,-96.42522 +51243,IA,Little Rock,43.449571,-95.892622 +51245,IA,Primghar,43.075892,-95.653304 +51246,IA,Rock Rapids,43.427192,-96.178055 +51247,IA,Rock Valley,43.201356,-96.310342 +51248,IA,Sanborn,43.189002,-95.662227 +51249,IA,Sibley,43.406929,-95.7424 +51250,IA,Sioux Center,43.081416,-96.179952 +51301,IA,Spencer,43.145107,-95.14569 +51331,IA,Arnolds Park,43.36358,-95.131261 +51333,IA,Dickens,43.154836,-94.985383 +51334,IA,Estherville,43.401709,-94.818001 +51338,IA,Everly,43.160917,-95.322777 +51340,IA,Fostoria,43.225857,-95.185042 +51342,IA,Graettinger,43.227731,-94.733401 +51343,IA,Greenville,43.033348,-95.058184 +51345,IA,Harris,43.456793,-95.442603 +51346,IA,Hartley,43.179984,-95.481696 +51347,IA,Lake Park,43.445239,-95.321601 +51350,IA,Melvin,43.284496,-95.592951 +51351,IA,Milford,43.31964,-95.161534 +51354,IA,Ocheyedan,43.39105,-95.520366 +51355,IA,Okoboji,43.37938,-95.153026 +51357,IA,Royal,43.048751,-95.267856 +51358,IA,Ruthven,43.144845,-94.884214 +51360,IA,Spirit Lake,43.426211,-95.112336 +51363,IA,Superior,43.450317,-94.964935 +51364,IA,Terril,43.324073,-94.973725 +51365,IA,Wallingford,43.312158,-94.82057 +51366,IA,Webb,42.950189,-94.995124 +51401,IA,Carroll,42.071972,-94.866664 +51430,IA,Arcadia,42.057279,-95.03714 +51431,IA,Arthur,42.336283,-95.367519 +51432,IA,Aspinwall,41.908252,-95.149936 +51433,IA,Yetter,42.280895,-94.903447 +51436,IA,Breda,42.175835,-95.000679 +51439,IA,Charter Oak,42.070735,-95.599241 +51440,IA,Dedham,41.905539,-94.814896 +51441,IA,Deloit,42.085899,-95.286338 +51442,IA,Denison,42.019626,-95.363572 +51443,IA,Glidden,42.061816,-94.714777 +51444,IA,Halbur,41.997357,-94.93586 +51445,IA,Ida Grove,42.340026,-95.464488 +51446,IA,Irwin,41.794094,-95.195842 +51447,IA,Kirkman,41.73076,-95.267083 +51448,IA,Kiron,42.179359,-95.31146 +51449,IA,Lake City,42.270494,-94.745787 +51450,IA,Lake View,42.315367,-95.048562 +51451,IA,Lanesboro,42.174687,-94.690274 +51452,IA,Lidderdale,42.152815,-94.795353 +51453,IA,Lohrville,42.261923,-94.556605 +51454,IA,Manilla,41.892233,-95.239126 +51455,IA,Manning,41.907248,-95.055622 +51458,IA,Odebolt,42.309514,-95.25005 +51459,IA,Ralston,42.075655,-94.569779 +51460,IA,Ricketts,42.15406,-95.599547 +51461,IA,Schleswig,42.164586,-95.444309 +51462,IA,Scranton,42.012381,-94.551764 +51463,IA,Templeton,41.912077,-94.932009 +51465,IA,Vail,42.033772,-95.177766 +51466,IA,Wall Lake,42.265252,-95.085156 +51467,IA,Westside,42.10844,-95.1273 +51501,IA,Manawa,41.252954,-95.880992 +51503,IA,Council Bluffs,41.261584,-95.825083 +51510,IA,Carter Lake,41.292524,-95.91406 +51520,IA,Arion,41.950406,-95.46233 +51521,IA,Avoca,41.476834,-95.350872 +51523,IA,Blencoe,41.923662,-96.082663 +51525,IA,Carson,41.225276,-95.368086 +51526,IA,Crescent,41.364378,-95.827648 +51527,IA,Earling,41.827063,-95.340293 +51528,IA,Dow City,41.913429,-95.4862 +51529,IA,Earling,41.842301,-95.615709 +51530,IA,Earling,41.792483,-95.421045 +51531,IA,Elk Horn,41.582871,-95.070015 +51532,IA,Elliott,41.130617,-95.160237 +51533,IA,Emerson,41.028439,-95.410624 +51534,IA,Glenwood,41.047009,-95.73892 +51535,IA,Griswold,41.223842,-95.098989 +51536,IA,Hancock,41.383238,-95.344528 +51537,IA,Harlan,41.64375,-95.311101 +51540,IA,Hastings,40.960514,-95.553097 +51541,IA,Henderson,41.125426,-95.458629 +51542,IA,Honey Creek,41.463045,-95.8802 +51543,IA,Kimballton,41.635214,-95.055324 +51544,IA,Lewis,41.296289,-95.062024 +51545,IA,Little Sioux,41.808267,-96.031357 +51546,IA,Logan,41.624345,-95.752478 +51548,IA,Mc Clelland,41.293168,-95.681278 +51549,IA,Macedonia,41.191627,-95.431386 +51550,IA,Magnolia,41.708177,-95.854955 +51551,IA,Malvern,41.007378,-95.583988 +51552,IA,Marne,41.454681,-95.097308 +51553,IA,Minden,41.465355,-95.551887 +51554,IA,Mineola,41.110171,-95.755699 +51555,IA,Missouri Valley,41.564399,-95.891346 +51556,IA,Modale,41.637143,-95.985225 +51557,IA,Mondamin,41.708876,-96.007204 +51558,IA,Moorhead,41.918601,-95.829031 +51559,IA,Neola,41.456383,-95.679358 +51560,IA,Oakland,41.311964,-95.379034 +51561,IA,Pacific Junction,41.027123,-95.804645 +51562,IA,Panama,41.728813,-95.487046 +51563,IA,Persia,41.56473,-95.56577 +51564,IA,Pisgah,41.821376,-95.919172 +51565,IA,Portsmouth,41.648385,-95.510751 +51566,IA,Red Oak,41.007949,-95.226924 +51570,IA,Shelby,41.533898,-95.446888 +51571,IA,Silver City,41.113024,-95.626912 +51572,IA,Soldier,41.994188,-95.782531 +51573,IA,Stanton,40.985924,-95.09876 +51575,IA,Treynor,41.220679,-95.617041 +51576,IA,Underwood,41.360294,-95.626997 +51577,IA,Walnut,41.462329,-95.217973 +51578,IA,Westphalia,41.718014,-95.386978 +51579,IA,Woodbine,41.737267,-95.700785 +51601,IA,Shenandoah,40.758087,-95.364798 +51630,IA,Blanchard,40.612156,-95.205377 +51631,IA,Braddyville,40.599081,-94.995578 +51632,IA,Clarinda,40.749084,-95.037976 +51636,IA,Coin,40.668591,-95.221653 +51637,IA,College Springs,40.617109,-95.099717 +51638,IA,Essex,40.840359,-95.288777 +51639,IA,Farragut,40.729971,-95.455498 +51640,IA,Hamburg,40.614902,-95.625789 +51645,IA,Imogene,40.863144,-95.435804 +51646,IA,New Market,40.742174,-94.891662 +51647,IA,Northboro,40.612737,-95.309592 +51648,IA,Percival,40.740148,-95.809307 +51649,IA,Randolph,40.870353,-95.562386 +51650,IA,Riverton,40.686968,-95.557803 +51651,IA,Shambaugh,40.675735,-95.063591 +51652,IA,Sidney,40.750671,-95.64027 +51653,IA,Tabor,40.900448,-95.672892 +51654,IA,Thurman,40.84241,-95.760535 +51656,IA,Yorktown,40.769244,-95.216335 +52001,IA,Dubuque,42.514977,-90.681914 +52002,IA,Dubuque,42.512191,-90.738372 +52003,IA,Dubuque,42.464916,-90.682884 +52030,IA,Andrew,42.158496,-90.60035 +52031,IA,Bellevue,42.25825,-90.435603 +52032,IA,Bernard,42.33207,-90.863032 +52033,IA,Cascade,42.286959,-91.014395 +52035,IA,Colesburg,42.638346,-91.19628 +52036,IA,Delaware,42.477713,-91.347176 +52037,IA,Delmar,41.996065,-90.608712 +52038,IA,Dundee,42.593979,-91.547697 +52039,IA,Durango,42.552564,-90.860794 +52040,IA,Dyersville,42.483332,-91.118265 +52041,IA,Earlville,42.500101,-91.259658 +52042,IA,Edgewood,42.654098,-91.394951 +52043,IA,Elkader,42.849627,-91.414308 +52044,IA,Elkport,42.739892,-91.283934 +52045,IA,Epworth,42.443928,-90.931331 +52046,IA,Farley,42.445059,-91.008266 +52047,IA,Farmersburg,42.952205,-91.338984 +52048,IA,Garber,42.74528,-91.259275 +52049,IA,Garnavillo,42.876188,-91.215609 +52050,IA,Greeley,42.59389,-91.323316 +52052,IA,Guttenberg,42.759443,-91.119015 +52053,IA,Holy Cross,42.580778,-90.972986 +52054,IA,La Motte,42.304448,-90.617673 +52057,IA,Manchester,42.483418,-91.449001 +52060,IA,Maquoketa,42.07782,-90.677075 +52064,IA,Miles,42.100587,-90.336716 +52065,IA,New Vienna,42.567829,-91.097637 +52066,IA,North Buena Vist,42.671103,-90.958772 +52068,IA,Peosta,42.443535,-90.809372 +52069,IA,Preston,42.053854,-90.395382 +52070,IA,Sabula,42.073668,-90.19553 +52071,IA,Saint Donatus,42.33119,-90.484514 +52072,IA,Saint Olaf,42.948179,-91.417549 +52073,IA,Sherrill,42.617078,-90.811486 +52074,IA,Spragueville,42.072742,-90.473044 +52075,IA,Springbrook,42.167401,-90.484637 +52076,IA,Strawberry Point,42.683225,-91.540926 +52077,IA,Volga,42.790389,-91.542891 +52078,IA,Worthington,42.393001,-91.106919 +52079,IA,Zwingle,42.277486,-90.750666 +52101,IA,Decorah,43.322711,-91.793947 +52131,IA,Burr Oak,43.463912,-91.892074 +52132,IA,Calmar,43.197402,-91.912579 +52133,IA,Castalia,43.161179,-91.662904 +52134,IA,Chester,43.473021,-92.415528 +52135,IA,Clermont,43.01298,-91.655184 +52136,IA,Cresco,43.363007,-92.125954 +52140,IA,Dorchester,43.442136,-91.50765 +52141,IA,Elgin,42.954845,-91.645375 +52142,IA,Fayette,42.84941,-91.813887 +52144,IA,Fort Atkinson,43.133932,-91.91336 +52146,IA,Harpers Ferry,43.16977,-91.218822 +52147,IA,Hawkeye,42.948702,-91.957764 +52150,IA,Jackson Junction,43.121369,-92.018447 +52151,IA,Lansing,43.366126,-91.265979 +52154,IA,Lawler,43.093247,-92.143974 +52155,IA,Lime Springs,43.45563,-92.273324 +52156,IA,Luana,43.049281,-91.458275 +52157,IA,Mc Gregor,43.023719,-91.188724 +52158,IA,Marquette,43.050457,-91.192141 +52159,IA,Monona,43.073485,-91.458677 +52160,IA,New Albin,43.489877,-91.294166 +52161,IA,Ossian,43.137858,-91.773431 +52162,IA,Postville,43.003619,-91.547809 +52164,IA,Randalia,42.862551,-91.884628 +52165,IA,Ridgeway,43.297853,-92.003413 +52166,IA,Saint Lucas,43.047703,-91.911561 +52169,IA,Wadena,42.854956,-91.663865 +52170,IA,Waterville,43.263608,-91.263045 +52171,IA,Waucoma,43.043329,-92.03022 +52172,IA,Waukon,43.263951,-91.479994 +52175,IA,Eldorado,42.973232,-91.803602 +52201,IA,Ainsworth,41.320226,-91.547173 +52202,IA,Alburnett,42.158322,-91.639245 +52203,IA,Amana,41.831284,-91.88545 +52205,IA,Anamosa,42.107763,-91.285115 +52206,IA,Atkins,41.988103,-91.875966 +52207,IA,Baldwin,42.073188,-90.819968 +52208,IA,Belle Plaine,41.899159,-92.257381 +52209,IA,Blairstown,41.906338,-92.082861 +52210,IA,Brandon,42.330912,-92.005892 +52211,IA,Brooklyn,41.732147,-92.428462 +52212,IA,Center Junction,42.092585,-91.067013 +52213,IA,Center Point,42.189844,-91.775764 +52214,IA,Central City,42.198234,-91.491399 +52215,IA,Chelsea,41.913132,-92.407815 +52216,IA,Clarence,41.88958,-91.060457 +52217,IA,Clutier,42.078892,-92.376347 +52218,IA,Coggon,42.279158,-91.541285 +52220,IA,Conroy,41.74255,-91.969479 +52222,IA,Deep River,41.571713,-92.364513 +52223,IA,Delhi,42.427082,-91.270226 +52224,IA,Dysart,42.169017,-92.318731 +52225,IA,Elberon,42.008769,-92.331447 +52226,IA,Elwood,41.99083,-90.724609 +52227,IA,Ely,41.894275,-91.573767 +52228,IA,Fairfax,41.915304,-91.780102 +52229,IA,Garrison,42.158827,-92.164409 +52231,IA,Harper,41.37283,-92.038758 +52232,IA,Hartwick,41.808019,-92.353845 +52233,IA,Hiawatha,42.042455,-91.67696 +52236,IA,Homestead,41.733858,-91.879471 +52237,IA,Hopkinton,42.342164,-91.246051 +52240,IA,Iowa City,41.654899,-91.511192 +52241,IA,Coralville,41.693666,-91.590608 +52245,IA,Iowa City,41.664916,-91.51507 +52246,IA,Iowa City,41.643813,-91.566882 +52247,IA,Kalona,41.482299,-91.705678 +52248,IA,Keota,41.350429,-91.964064 +52249,IA,Keystone,42.015636,-92.217944 +52250,IA,Kinross,41.460998,-92.001007 +52251,IA,Ladora,41.756353,-92.187281 +52253,IA,Lisbon,41.921169,-91.386137 +52254,IA,Lost Nation,41.974503,-90.82654 +52255,IA,Lowden,41.859393,-90.93822 +52257,IA,Luzerne,41.90614,-92.179334 +52301,IA,Marengo,41.786286,-92.072049 +52302,IA,Marion,42.041095,-91.594135 +52305,IA,Martelle,42.003512,-91.321703 +52306,IA,Mechanicsville,41.903906,-91.27637 +52307,IA,Middle Amana,41.799737,-91.882696 +52308,IA,Millersburg,41.575099,-92.160843 +52309,IA,Monmouth,42.07716,-90.878551 +52310,IA,Monticello,42.232591,-91.198901 +52313,IA,Mount Auburn,42.255395,-92.159485 +52314,IA,Mount Vernon,41.928741,-91.427371 +52315,IA,Newhall,41.992685,-91.977888 +52316,IA,North English,41.524128,-92.089291 +52317,IA,North Liberty,41.744318,-91.60612 +52318,IA,Norway,41.899176,-91.89197 +52320,IA,Olin,41.995423,-91.140926 +52321,IA,Onslow,42.123509,-90.97305 +52322,IA,Oxford,41.650687,-91.772418 +52323,IA,Oxford Junction,41.985382,-90.954341 +52324,IA,Palo,42.036496,-91.787703 +52325,IA,Parnell,41.570161,-92.005159 +52326,IA,Quasqueton,42.395551,-91.76795 +52327,IA,Riverside,41.475792,-91.57414 +52328,IA,Robins,42.073092,-91.664841 +52329,IA,Rowley,42.343449,-91.787543 +52330,IA,Ryan,42.343643,-91.484838 +52331,IA,Scotch Grove,42.164441,-91.083682 +52332,IA,Shellsburg,42.084829,-91.874568 +52333,IA,Solon,41.809913,-91.508609 +52334,IA,South Amana,41.757609,-91.92626 +52335,IA,South English,41.46214,-92.102557 +52336,IA,Springville,42.060741,-91.43935 +52337,IA,Stanwood,41.896318,-91.166202 +52338,IA,Swisher,41.826843,-91.673916 +52339,IA,Tama,41.961642,-92.580049 +52341,IA,Toddville,42.103932,-91.728981 +52342,IA,Toledo,42.007696,-92.566206 +52343,IA,Toronto,41.89709,-90.793889 +52346,IA,Van Horne,42.019394,-92.104617 +52347,IA,Victor,41.729004,-92.284172 +52348,IA,Vining,41.979881,-92.369687 +52349,IA,Vinton,42.174284,-91.989154 +52352,IA,Walker,42.272024,-91.730179 +52353,IA,Washington,41.301453,-91.698671 +52354,IA,Watkins,41.903993,-91.996468 +52355,IA,Webster,41.436408,-92.176525 +52356,IA,Wellman,41.470032,-91.839953 +52357,IA,West Amana,41.802996,-91.933566 +52358,IA,West Branch,41.672622,-91.3141 +52359,IA,West Chester,41.361019,-91.861858 +52361,IA,Williamsburg,41.639308,-92.024011 +52362,IA,Wyoming,42.060352,-90.994024 +52401,IA,Cedar Rapids,41.9743,-91.655382 +52402,IA,Cedar Rapids,42.018778,-91.661222 +52403,IA,Cedar Rapids,41.984312,-91.625919 +52404,IA,Cedar Rapids,41.952108,-91.685286 +52405,IA,Cedar Rapids,41.980422,-91.709816 +52501,IA,Highland Center,41.015099,-92.413428 +52530,IA,Agency,40.995693,-92.316231 +52531,IA,Albia,41.028718,-92.794619 +52533,IA,Batavia,40.99048,-92.143059 +52534,IA,Beacon,41.287133,-92.72843 +52535,IA,Birmingham,40.862605,-91.953431 +52536,IA,Blakesburg,40.984763,-92.594037 +52537,IA,Bloomfield,40.732368,-92.398712 +52538,IA,West Grove,40.719646,-92.549849 +52540,IA,Brighton,41.154331,-91.828351 +52542,IA,Cantril,40.654598,-92.046521 +52543,IA,Cedar,41.212054,-92.509021 +52544,IA,Centerville,40.73259,-92.872826 +52548,IA,Chillicothe,41.077041,-92.532762 +52549,IA,Cincinnati,40.634384,-92.921898 +52550,IA,Delta,41.316682,-92.335912 +52551,IA,Douds,40.803931,-92.045222 +52552,IA,Drakesville,40.825332,-92.505109 +52553,IA,Eddyville,41.153266,-92.622052 +52554,IA,Eldon,40.92613,-92.226754 +52555,IA,Exline,40.641399,-92.826999 +52556,IA,Fairfield,41.003943,-91.957611 +52560,IA,Floris,40.859071,-92.324715 +52561,IA,Fremont,41.211739,-92.436186 +52563,IA,Hedrick,41.182578,-92.309725 +52565,IA,Keosauqua,40.74235,-91.970434 +52566,IA,Kirkville,41.117927,-92.469895 +52567,IA,Libertyville,40.949863,-92.024951 +52569,IA,Melrose,40.966466,-93.014514 +52570,IA,Milton,40.672143,-92.143793 +52571,IA,Moravia,40.882522,-92.853358 +52572,IA,Moulton,40.686617,-92.683252 +52573,IA,Mount Sterling,40.645765,-91.902663 +52574,IA,Mystic,40.788268,-92.928437 +52575,IA,Numa,40.674147,-93.013233 +52576,IA,Ollie,41.200134,-92.135366 +52577,IA,Oskaloosa,41.294205,-92.64393 +52580,IA,Packwood,41.122781,-92.066389 +52581,IA,Plano,40.775109,-93.038554 +52583,IA,Promise City,40.758477,-93.152654 +52584,IA,Pulaski,40.694081,-92.257973 +52585,IA,Richland,41.193905,-91.973921 +52586,IA,Rose Hill,41.330918,-92.471958 +52588,IA,Selma,40.851936,-92.110672 +52590,IA,Seymour,40.672416,-93.136826 +52591,IA,Sigourney,41.330071,-92.201888 +52593,IA,Udell,40.783573,-92.718512 +52594,IA,Unionville,40.841637,-92.693452 +52601,IA,Burlington,40.808665,-91.116972 +52619,IA,Argyle,40.565658,-91.563896 +52620,IA,Bonaparte,40.714825,-91.789734 +52621,IA,Crawfordsville,41.209257,-91.541444 +52623,IA,Danville,40.854046,-91.314027 +52624,IA,Denmark,40.748693,-91.326593 +52625,IA,Donnellson,40.661171,-91.574547 +52626,IA,Farmington,40.639715,-91.744719 +52627,IA,Fort Madison,40.633008,-91.339829 +52630,IA,Hillsboro,40.837211,-91.711938 +52631,IA,Houghton,40.775001,-91.6393 +52632,IA,Keokuk,40.409434,-91.398234 +52635,IA,Lockridge,41.011867,-91.76454 +52637,IA,Mediapolis,41.005932,-91.132142 +52638,IA,Middletown,40.82963,-91.263106 +52639,IA,Montrose,40.513915,-91.423985 +52640,IA,Morning Sun,41.098424,-91.258146 +52641,IA,Mount Pleasant,40.964573,-91.561427 +52644,IA,Mount Union,41.03735,-91.413831 +52645,IA,New London,40.916055,-91.398587 +52646,IA,Oakville,41.100326,-91.043922 +52647,IA,Olds,41.12065,-91.548413 +52649,IA,Salem,40.856804,-91.633621 +52650,IA,Sperry,40.941939,-91.185047 +52651,IA,Stockport,40.858933,-91.803497 +52653,IA,Wapello,41.206982,-91.171921 +52654,IA,Wayland,41.144919,-91.658946 +52655,IA,West Burlington,40.832081,-91.179894 +52656,IA,West Point,40.714986,-91.439733 +52657,IA,Saint Paul,40.769306,-91.53754 +52658,IA,Wever,40.706652,-91.226767 +52659,IA,Winfield,41.125693,-91.437892 +52660,IA,Yarmouth,41.029687,-91.317548 +52701,IA,Andover,41.992552,-90.238584 +52720,IA,Atalissa,41.561443,-91.174764 +52721,IA,Bennett,41.735267,-90.965613 +52722,IA,Bettendorf,41.550865,-90.494201 +52726,IA,Blue Grass,41.511168,-90.738015 +52727,IA,Bryant,41.962932,-90.338767 +52729,IA,Calamus,41.811122,-90.741553 +52730,IA,Camanche,41.788636,-90.270855 +52731,IA,Charlotte,41.977859,-90.478226 +52732,IA,Clinton,41.851684,-90.207784 +52738,IA,Columbus Junctio,41.279911,-91.374198 +52739,IA,Conesville,41.380454,-91.346498 +52742,IA,De Witt,41.826726,-90.523735 +52745,IA,Big Rock,41.735013,-90.778332 +52746,IA,Donahue,41.709316,-90.682908 +52747,IA,Durant,41.614513,-90.909988 +52748,IA,Eldridge,41.663532,-90.563379 +52750,IA,Goose Lake,41.979898,-90.381855 +52751,IA,Grand Mound,41.823559,-90.632878 +52753,IA,Le Claire,41.608234,-90.362788 +52754,IA,Letts,41.293027,-91.20399 +52755,IA,Lone Tree,41.498804,-91.436262 +52756,IA,Long Grove,41.721327,-90.55344 +52760,IA,Moscow,41.564558,-91.085888 +52761,IA,Muscatine,41.430378,-91.050928 +52765,IA,New Liberty,41.713229,-90.859922 +52766,IA,Nichols,41.476634,-91.293116 +52768,IA,Princeton,41.685753,-90.370574 +52769,IA,Stockton,41.558327,-90.847332 +52772,IA,Tipton,41.756276,-91.136163 +52773,IA,Walcott,41.645309,-90.725603 +52774,IA,Welton,41.907472,-90.606785 +52776,IA,West Liberty,41.570055,-91.266847 +52777,IA,Wheatland,41.82585,-90.840151 +52778,IA,Wilton,41.585801,-91.009958 +52802,IA,Davenport,41.516358,-90.61409 +52803,IA,Davenport,41.538509,-90.561348 +52804,IA,Davenport,41.538603,-90.61147 +52806,IA,Davenport,41.573271,-90.603845 +52807,IA,Davenport,41.561822,-90.540262 +66002,KS,Atchison,39.559411,-95.130408 +66006,KS,Baldwin City,38.795308,-95.227621 +66007,KS,Basehor,39.128137,-94.957034 +66008,KS,Bendena,39.717379,-95.176458 +66010,KS,Blue Mound,38.090772,-95.005269 +66012,KS,Lake Of The Fore,39.068455,-94.886098 +66013,KS,Bucyrus,38.687017,-94.742947 +66014,KS,Centerville,38.213032,-94.993431 +66015,KS,Colony,38.076147,-95.328705 +66016,KS,Cummings,39.482976,-95.286281 +66017,KS,Denton,39.715358,-95.274377 +66018,KS,De Soto,38.956563,-94.964713 +66020,KS,Easton,39.362054,-95.054352 +66021,KS,Edgerton,38.781084,-95.009377 +66023,KS,Effingham,39.502259,-95.41982 +66025,KS,Eudora,38.933043,-95.102206 +66026,KS,Fontana,38.410153,-94.871788 +66027,KS,Fort Leavenworth,39.348508,-94.926547 +66030,KS,Gardner,38.80754,-94.915675 +66031,KS,Industrial Airpo,38.850264,-94.932263 +66032,KS,Garnett,38.285907,-95.259368 +66033,KS,Greeley,38.352428,-95.11876 +66035,KS,Highland,39.860752,-95.258335 +66036,KS,Hillsdale,38.684463,-94.85837 +66039,KS,Mildred,38.091497,-95.145167 +66040,KS,La Cygne,38.343402,-94.759264 +66041,KS,Huron,39.591202,-95.308902 +66042,KS,Lane,38.437499,-95.097886 +66043,KS,Lansing,39.250191,-94.899379 +66044,KS,Lawrence,38.964402,-95.241789 +66046,KS,Lawrence,38.936925,-95.24203 +66047,KS,Lawrence,38.940714,-95.277865 +66048,KS,Leavenworth,39.301546,-94.933865 +66049,KS,Lawrence,38.970433,-95.276862 +66050,KS,Lecompton,39.000125,-95.402519 +66052,KS,Linwood,39.020627,-94.991388 +66053,KS,Louisburg,38.607341,-94.682905 +66054,KS,Mc Louth,39.166763,-95.218295 +66056,KS,Mound City,38.155954,-94.818632 +66058,KS,Muscotah,39.588046,-95.49845 +66060,KS,Nortonville,39.409532,-95.32357 +66061,KS,Olathe,38.886548,-94.820359 +66062,KS,Olathe,38.873287,-94.775168 +66064,KS,Osawatomie,38.488803,-94.96199 +66066,KS,Oskaloosa,39.215183,-95.313546 +66067,KS,Ottawa,38.614247,-95.274519 +66070,KS,Ozawkie,39.213648,-95.44039 +66071,KS,Paola,38.571999,-94.893694 +66072,KS,Parker,38.330311,-94.987074 +66073,KS,Perry,39.087524,-95.373122 +66075,KS,Pleasanton,38.182285,-94.70567 +66076,KS,Pomona,38.615255,-95.448915 +66078,KS,Princeton,38.484684,-95.276444 +66079,KS,Rantoul,38.566594,-95.123421 +66080,KS,Richmond,38.407434,-95.248871 +66081,KS,66081,39.772103,-95.225453 +66083,KS,Spring Hill,38.763088,-94.824593 +66085,KS,Stilwell,38.790157,-94.664282 +66086,KS,Tonganoxie,39.102614,-95.105055 +66087,KS,Severance,39.778746,-95.066345 +66088,KS,Valley Falls,39.34843,-95.466996 +66090,KS,Wathena,39.762505,-94.92546 +66091,KS,Welda,38.168615,-95.309606 +66092,KS,Wellsville,38.713676,-95.091573 +66093,KS,Westphalia,38.171792,-95.466512 +66094,KS,White Cloud,39.962717,-95.298203 +66095,KS,Williamsburg,38.490166,-95.422615 +66097,KS,Winchester,39.324531,-95.269584 +66101,KS,Kansas City,39.115733,-94.627139 +66102,KS,Kansas City,39.113247,-94.669337 +66103,KS,Rosedale,39.056193,-94.625105 +66104,KS,Kansas City,39.137512,-94.679158 +66105,KS,Kansas City,39.085025,-94.635646 +66106,KS,Lake Quivira,39.061187,-94.687396 +66109,KS,Kansas City,39.143376,-94.785598 +66111,KS,Kansas City,39.080332,-94.780593 +66112,KS,Kansas City,39.115999,-94.764024 +66115,KS,Kansas City,39.114534,-94.614647 +66118,KS,Kansas City,39.096867,-94.608361 +66202,KS,Countryside,39.025376,-94.666998 +66203,KS,Shawnee,39.019802,-94.708303 +66204,KS,Overland Park,38.992488,-94.674769 +66205,KS,Mission,39.031944,-94.631806 +66206,KS,Leawood,38.960567,-94.619644 +66207,KS,Shawnee Mission,38.957472,-94.645193 +66208,KS,Prairie Village,38.996812,-94.631513 +66209,KS,Leawood,38.901798,-94.634047 +66210,KS,Lenexa,38.922007,-94.704788 +66211,KS,Leawood,38.925956,-94.637991 +66212,KS,Overland Park,38.958954,-94.68414 +66213,KS,Overland Park,38.904899,-94.700344 +66214,KS,Lenexa,38.959929,-94.713265 +66215,KS,Lenexa,38.963028,-94.739947 +66216,KS,Shawnee,39.009289,-94.738234 +66217,KS,Shawnee,39.004835,-94.779663 +66218,KS,Shawnee,39.017431,-94.823913 +66219,KS,Lenexa,38.961896,-94.773145 +66220,KS,Lenexa,38.96884,-94.829997 +66221,KS,Stanley,38.85272,-94.706745 +66223,KS,Stanley,38.848477,-94.664467 +66224,KS,Stanley,38.867526,-94.628903 +66226,KS,Shawnee,38.997764,-94.873017 +66227,KS,Lenexa,38.99416,-94.840082 +66401,KS,Alma,39.009206,-96.292323 +66402,KS,Auburn,38.916673,-95.819938 +66403,KS,Axtell,39.870676,-96.267559 +66404,KS,Baileyville,39.881621,-96.180136 +66406,KS,Beattie,39.89884,-96.428618 +66407,KS,Belvue,39.2273,-96.186635 +66408,KS,Bern,39.957051,-95.961028 +66409,KS,Berryton,38.944182,-95.582487 +66411,KS,Blue Rapids,39.674974,-96.63595 +66412,KS,Bremen,39.877473,-96.745846 +66413,KS,Burlingame,38.763395,-95.840017 +66414,KS,Carbondale,38.820622,-95.687083 +66415,KS,Centralia,39.738051,-96.148604 +66416,KS,Circleville,39.515472,-95.851708 +66417,KS,Corning,39.657015,-96.077589 +66418,KS,Delia,39.265453,-95.960805 +66419,KS,Denison,39.415307,-95.632851 +66420,KS,Dover,39.019223,-95.898547 +66422,KS,Emmett,39.304819,-96.059325 +66423,KS,Eskridge,38.851361,-96.101583 +66424,KS,Everest,39.687972,-95.413802 +66425,KS,Fairview,39.844504,-95.711012 +66427,KS,Winifred,39.718996,-96.428323 +66428,KS,Goff,39.665388,-95.957394 +66429,KS,Grantville,39.097208,-95.539733 +66431,KS,Harveyville,38.857413,-95.996239 +66432,KS,Havensville,39.494197,-96.076884 +66433,KS,Herkimer,39.956337,-96.746861 +66434,KS,Reserve,39.871563,-95.528905 +66436,KS,Holton,39.443624,-95.752498 +66438,KS,Home,39.854542,-96.529201 +66439,KS,Horton,39.678883,-95.529858 +66440,KS,Hoyt,39.255249,-95.686742 +66441,KS,Junction City,39.029913,-96.839553 +66442,KS,Fort Riley,39.061947,-96.787338 +66449,KS,Leonardville,39.365151,-96.831223 +66450,KS,Louisville,39.267048,-96.316954 +66451,KS,Lyndon,38.635649,-95.680226 +66502,KS,Manhattan,39.193757,-96.585776 +66507,KS,Maple Hill,39.069456,-96.018727 +66508,KS,Marysville,39.842827,-96.642183 +66509,KS,Mayetta,39.348915,-95.692753 +66510,KS,Melvern,38.50266,-95.628986 +66512,KS,Meriden,39.203832,-95.547637 +66514,KS,Milford,39.169173,-96.91005 +66515,KS,Morrill,39.935592,-95.712048 +66516,KS,Netawaka,39.606298,-95.727004 +66517,KS,Ogden,39.119219,-96.700077 +66518,KS,Oketo,39.95984,-96.623525 +66520,KS,Olsburg,39.412506,-96.600249 +66521,KS,Duluth,39.472974,-96.176105 +66522,KS,Oneida,39.866087,-95.958097 +66523,KS,Osage City,38.626896,-95.830303 +66524,KS,Overbrook,38.792173,-95.561632 +66526,KS,Paxico,39.080285,-96.181777 +66527,KS,Powhattan,39.71769,-95.675111 +66528,KS,Quenemo,38.578504,-95.53619 +66531,KS,Riley,39.122421,-96.811824 +66532,KS,Leona,39.812721,-95.386236 +66533,KS,Rossville,39.145114,-95.9553 +66534,KS,Sabetha,39.89929,-95.811271 +66535,KS,Saint George,39.210806,-96.434488 +66536,KS,Saint Marys,39.198674,-96.068277 +66537,KS,Scranton,38.787998,-95.74799 +66538,KS,Kelly,39.839804,-96.059489 +66539,KS,Silver Lake,39.1102,-95.855182 +66540,KS,Soldier,39.501254,-95.965178 +66541,KS,Summerfield,39.979847,-96.327909 +66542,KS,Tecumseh,39.021664,-95.537926 +66543,KS,Vassar,38.669127,-95.581278 +66544,KS,Vliets,39.705044,-96.281642 +66545,KS,66545,39.705219,-96.339281 +66546,KS,Wakarusa,38.904543,-95.701464 +66547,KS,Wamego,39.210001,-96.315344 +66548,KS,Waterville,39.697088,-96.749781 +66549,KS,Blaine,39.416545,-96.411402 +66550,KS,Wetmore,39.642761,-95.823118 +66551,KS,Onaga,39.510969,-96.314753 +66552,KS,Whiting,39.597396,-95.61584 +66554,KS,Randolph,39.487939,-96.782842 +66603,KS,Topeka,39.055344,-95.680212 +66604,KS,Topeka,39.040549,-95.717831 +66605,KS,Topeka,39.015076,-95.643894 +66606,KS,Topeka,39.058345,-95.709458 +66607,KS,Topeka,39.042111,-95.644858 +66608,KS,Topeka,39.085812,-95.686651 +66609,KS,Topeka,38.991899,-95.668069 +66610,KS,Topeka,38.982213,-95.746061 +66611,KS,Topeka,39.014152,-95.69815 +66612,KS,Topeka,39.042714,-95.681806 +66614,KS,Topeka,39.015403,-95.746883 +66615,KS,Topeka,39.04458,-95.790561 +66616,KS,Topeka,39.064479,-95.641302 +66617,KS,Topeka,39.127098,-95.638388 +66618,KS,Topeka,39.132853,-95.70231 +66619,KS,Pauline,38.942859,-95.700728 +66701,KS,Hiattville,37.834159,-94.704221 +66710,KS,Altoona,37.519669,-95.64833 +66711,KS,Arcadia,37.634113,-94.654782 +66713,KS,Baxter Springs,37.028057,-94.739276 +66714,KS,Benedict,37.651401,-95.624213 +66716,KS,Bronson,37.921356,-95.030345 +66717,KS,Buffalo,37.701057,-95.701417 +66720,KS,Chanute,37.674928,-95.456962 +66724,KS,Cherokee,37.369413,-94.842412 +66725,KS,Hallowell,37.168992,-94.850227 +66727,KS,Coyville,37.659167,-95.917164 +66728,KS,Crestline,37.161226,-94.678275 +66732,KS,Elsmore,37.80353,-95.154645 +66733,KS,Erie,37.604395,-95.25138 +66734,KS,Farlington,37.6163,-94.847928 +66736,KS,Lafontaine,37.525622,-95.822898 +66738,KS,Fulton,37.988279,-94.739591 +66739,KS,Galena,37.063237,-94.655743 +66740,KS,Galesburg,37.469346,-95.310772 +66741,KS,Garland,37.717363,-94.672055 +66743,KS,Girard,37.509129,-94.856913 +66746,KS,Hepler,37.657558,-94.989225 +66748,KS,Humboldt,37.80446,-95.422006 +66749,KS,Carlyle,37.928244,-95.402146 +66751,KS,La Harpe,37.92239,-95.323192 +66753,KS,Mc Cune,37.346754,-95.037591 +66754,KS,Mapleton,38.022821,-94.873519 +66755,KS,Moran,37.934159,-95.164733 +66756,KS,Mulberry,37.544197,-94.683902 +66757,KS,Neodesha,37.425709,-95.676478 +66758,KS,Neosho Falls,37.966883,-95.549732 +66759,KS,New Albany,37.544436,-95.912594 +66761,KS,Piqua,37.872847,-95.590026 +66762,KS,Radley,37.413156,-94.70225 +66767,KS,Prescott,38.071802,-94.700841 +66769,KS,Redfield,37.856046,-94.828988 +66770,KS,Riverton,37.099262,-94.678801 +66771,KS,Saint Paul,37.518046,-95.168784 +66772,KS,Savonburg,37.751725,-95.154532 +66773,KS,Carona,37.271102,-94.851961 +66775,KS,Stark,37.681111,-95.138794 +66776,KS,Thayer,37.452657,-95.467083 +66777,KS,Toronto,37.795343,-95.936818 +66778,KS,Treece,37.039883,-94.869047 +66779,KS,Uniontown,37.811681,-94.981366 +66780,KS,Walnut,37.59674,-95.045531 +66781,KS,Lawton,37.298173,-94.743909 +66783,KS,Yates Center,37.880125,-95.72894 +66801,KS,Emporia,38.418405,-96.187145 +66830,KS,Admire,38.639297,-96.101657 +66833,KS,Bushong,38.637522,-96.249968 +66834,KS,Alta Vista,38.86357,-96.479983 +66835,KS,Americus,38.509803,-96.260753 +66838,KS,Burdick,38.567369,-96.83963 +66839,KS,Strawn,38.201596,-95.741162 +66840,KS,Burns,38.12216,-96.863435 +66842,KS,Cassoday,38.029801,-96.674565 +66843,KS,Clements,38.279757,-96.775444 +66845,KS,Cottonwood Falls,38.356538,-96.541849 +66846,KS,Dunlap,38.667657,-96.497294 +66847,KS,66847,38.650627,-96.836125 +66849,KS,Dwight,38.838902,-96.580215 +66850,KS,Elmdale,38.377924,-96.667464 +66851,KS,Florence,38.241536,-96.934561 +66852,KS,Gridley,38.101234,-95.887351 +66853,KS,Hamilton,37.979122,-96.169133 +66854,KS,Hartford,38.28326,-95.999718 +66856,KS,Lebo,38.416085,-95.822174 +66857,KS,Le Roy,38.087429,-95.622655 +66858,KS,Antelope,38.481037,-96.96123 +66859,KS,Lost Springs,38.565723,-96.979872 +66860,KS,Madison,38.127755,-96.121283 +66861,KS,Marion,38.355444,-97.02045 +66862,KS,Matfield Green,38.144768,-96.554105 +66864,KS,Neosho Rapids,38.394762,-96.016824 +66865,KS,Olpe,38.257774,-96.189056 +66866,KS,Peabody,38.173746,-97.118386 +66868,KS,Reading,38.529012,-95.98949 +66869,KS,Strong City,38.41292,-96.517192 +66870,KS,Virgil,37.897594,-96.032935 +66871,KS,Waverly,38.378214,-95.598201 +66872,KS,White City,38.78902,-96.763677 +66873,KS,Wilsey,38.633449,-96.670407 +66901,KS,Rice,39.559427,-97.662735 +66930,KS,Agenda,39.702868,-97.426983 +66931,KS,Ames,39.533923,-97.538245 +66932,KS,Athol,39.771872,-98.907733 +66933,KS,Barnes,39.684114,-96.867574 +66935,KS,Belleville,39.824054,-97.629016 +66936,KS,Burr Oak,39.893177,-98.349911 +66937,KS,Clifton,39.620121,-97.261104 +66938,KS,Clyde,39.575842,-97.407999 +66939,KS,Courtland,39.78509,-97.889956 +66940,KS,Cuba,39.797482,-97.449623 +66941,KS,Esbon,39.756186,-98.446222 +66942,KS,Formoso,39.779467,-97.988909 +66943,KS,Greenleaf,39.706145,-96.977465 +66944,KS,Haddam,39.851969,-97.308142 +66945,KS,Hanover,39.89266,-96.868947 +66946,KS,Hollenberg,39.959987,-96.973509 +66948,KS,Jamestown,39.602144,-97.863082 +66949,KS,Ionia,39.669686,-98.125603 +66951,KS,Kensington,39.769179,-99.030848 +66952,KS,Bellaire,39.812839,-98.558148 +66953,KS,Linn,39.684687,-97.085412 +66955,KS,Mahaska,39.984502,-97.345272 +66956,KS,Mankato,39.783259,-98.215227 +66958,KS,Morrowville,39.861551,-97.182521 +66959,KS,Munden,39.927219,-97.540302 +66960,KS,Narka,39.958162,-97.424332 +66961,KS,Norway,39.695305,-97.811926 +66962,KS,Palmer,39.619165,-97.112214 +66963,KS,Randall,39.62859,-98.066054 +66964,KS,Republic,39.937572,-97.843456 +66966,KS,Scandia,39.793861,-97.778645 +66967,KS,Smith Center,39.804217,-98.784243 +66968,KS,Washington,39.82234,-97.048368 +66970,KS,Webber,39.924496,-97.997793 +67001,KS,Andale,37.782686,-97.640712 +67002,KS,Andover,37.698531,-97.117901 +67003,KS,Anthony,37.151206,-98.028499 +67004,KS,Argonia,37.283966,-97.755678 +67005,KS,Arkansas City,37.067593,-97.035658 +67008,KS,Atlanta,37.434309,-96.766135 +67009,KS,Attica,37.25277,-98.226425 +67010,KS,Augusta,37.683606,-96.964772 +67012,KS,Beaumont,37.607871,-96.63864 +67013,KS,Belle Plaine,37.405155,-97.285221 +67014,KS,67014,37.512029,-98.196403 +67016,KS,Bentley,37.879582,-97.516381 +67017,KS,Benton,37.794615,-97.097117 +67018,KS,Bluff City,37.083846,-97.875412 +67019,KS,Burden,37.320856,-96.757044 +67020,KS,Burrton,38.026128,-97.666649 +67021,KS,Byers,37.784693,-98.901662 +67022,KS,Caldwell,37.045241,-97.624659 +67023,KS,Cambridge,37.358348,-96.66388 +67024,KS,Cedar Vale,37.126487,-96.470133 +67025,KS,Cheney,37.635299,-97.768638 +67026,KS,Clearwater,37.507592,-97.508179 +67028,KS,Coats,37.512502,-98.850398 +67029,KS,Coldwater,37.247915,-99.311484 +67030,KS,Colwich,37.77824,-97.540518 +67031,KS,Conway Springs,37.390272,-97.628358 +67032,KS,Corbin,37.073142,-97.526326 +67035,KS,Penalosa,37.666149,-98.39297 +67036,KS,Danville,37.267424,-97.868933 +67037,KS,Derby,37.552976,-97.254888 +67038,KS,Dexter,37.164087,-96.691702 +67039,KS,Douglass,37.51951,-96.994848 +67041,KS,Elbing,38.046208,-97.112766 +67042,KS,El Dorado,37.822649,-96.854297 +67045,KS,Eureka,37.826471,-96.295877 +67047,KS,Fall River,37.621049,-96.043456 +67049,KS,Freeport,37.190257,-97.86342 +67050,KS,Garden Plain,37.676712,-97.66002 +67051,KS,Geuda Springs,37.08093,-97.179504 +67052,KS,Goddard,37.657483,-97.536408 +67053,KS,Goessel,38.234259,-97.33628 +67054,KS,Greensburg,37.608367,-99.301057 +67056,KS,Halstead,38.006391,-97.511792 +67057,KS,Hardtner,37.030009,-98.654732 +67058,KS,Harper,37.290943,-98.017978 +67059,KS,Haviland,37.609615,-99.133964 +67060,KS,Haysville,37.56467,-97.355323 +67061,KS,Hazelton,37.098421,-98.400319 +67062,KS,Hesston,38.135951,-97.449458 +67063,KS,Hillsboro,38.344907,-97.212154 +67065,KS,Isabel,37.448544,-98.53514 +67066,KS,Iuka,37.739725,-98.736103 +67068,KS,Belmont,37.636246,-98.109295 +67070,KS,Kiowa,37.017166,-98.485908 +67071,KS,Lake City,37.356885,-98.809833 +67072,KS,Latham,37.530983,-96.679148 +67073,KS,Lehigh,38.377106,-97.304315 +67074,KS,Leon,37.681268,-96.752634 +67101,KS,Maize,37.774727,-97.468874 +67102,KS,Maple City,37.071295,-96.781387 +67103,KS,Mayfield,37.251806,-97.541603 +67104,KS,Medicine Lodge,37.284452,-98.584785 +67105,KS,Milan,37.257764,-97.652065 +67106,KS,Milton,37.440064,-97.759156 +67107,KS,Moundridge,38.206029,-97.508767 +67108,KS,Mount Hope,37.868412,-97.659092 +67109,KS,Mullinville,37.571608,-99.46388 +67110,KS,Mulvane,37.476433,-97.231954 +67111,KS,Murdock,37.609945,-97.95027 +67112,KS,Nashville,37.434419,-98.417052 +67114,KS,Newton,38.045067,-97.343457 +67117,KS,North Newton,38.128246,-97.328796 +67118,KS,Norwich,37.4501,-97.866247 +67119,KS,Oxford,37.265303,-97.176131 +67120,KS,Peck,37.472445,-97.311565 +67122,KS,Piedmont,37.637169,-96.369503 +67123,KS,Potwin,37.971872,-97.000608 +67124,KS,Pratt,37.650219,-98.73003 +67127,KS,Protection,37.196782,-99.481628 +67128,KS,Rago,37.439824,-98.077208 +67131,KS,Rock,37.429435,-96.936468 +67132,KS,Rosalia,37.796041,-96.648161 +67133,KS,Rose Hill,37.578371,-97.117346 +67134,KS,Sawyer,37.51007,-98.66422 +67135,KS,Sedgwick,37.869328,-97.402412 +67137,KS,Climax,37.64985,-96.229777 +67138,KS,Sharon,37.249239,-98.414168 +67140,KS,South Haven,37.049997,-97.404228 +67142,KS,Spivey,37.440986,-98.175122 +67143,KS,Sun City,37.394647,-98.90386 +67144,KS,Towanda,37.800506,-96.991769 +67146,KS,Udall,37.393861,-97.110784 +67147,KS,Valley Center,37.861643,-97.262146 +67149,KS,Viola,37.569624,-97.630636 +67150,KS,Waldron,37.072994,-98.228877 +67151,KS,Walton,38.123909,-97.236077 +67152,KS,Wellington,37.27783,-97.390976 +67154,KS,Whitewater,37.961231,-97.130816 +67155,KS,Wilmore,37.331794,-99.184577 +67156,KS,Winfield,37.241621,-96.979987 +67159,KS,Zenda,37.437253,-98.28736 +67202,KS,Wichita,37.689945,-97.33551 +67203,KS,Wichita,37.704798,-97.363766 +67204,KS,Wichita,37.748838,-97.356563 +67205,KS,Wichita,37.763929,-97.426924 +67206,KS,Eastborough,37.699622,-97.239253 +67207,KS,Eastborough,37.667152,-97.238962 +67208,KS,Wichita,37.702428,-97.281062 +67209,KS,Wichita,37.677855,-97.42354 +67210,KS,Wichita,37.637915,-97.261254 +67211,KS,Wichita,37.666181,-97.316451 +67212,KS,Wichita,37.700683,-97.438344 +67213,KS,Wichita,37.667959,-97.359074 +67214,KS,Wichita,37.705051,-97.313284 +67215,KS,Wichita,37.633333,-97.424985 +67216,KS,Wichita,37.622332,-97.313625 +67217,KS,Wichita,37.626574,-97.358139 +67218,KS,Wichita,37.669007,-97.280219 +67219,KS,Park City,37.76482,-97.313517 +67220,KS,Bel Aire,37.74548,-97.275915 +67221,KS,Mc Connell A F B,37.623687,-97.254021 +67223,KS,Wichita,37.748434,-97.467421 +67226,KS,Wichita,37.737891,-97.247853 +67227,KS,Wichita,37.588466,-97.460561 +67228,KS,Wichita,37.776061,-97.201404 +67230,KS,Wichita,37.680814,-97.155764 +67231,KS,Wichita,37.526866,-97.423384 +67232,KS,Wichita,37.642797,-97.164278 +67233,KS,Wichita,37.54434,-97.32237 +67235,KS,Wichita,37.668631,-97.461145 +67236,KS,Wichita,37.497943,-97.26821 +67301,KS,Independence,37.229247,-95.716528 +67330,KS,Altamont,37.187298,-95.298302 +67332,KS,Bartlett,37.060096,-95.211512 +67333,KS,Caney,37.022412,-95.909128 +67335,KS,Cherryvale,37.266828,-95.559019 +67336,KS,Chetopa,37.041817,-95.079572 +67337,KS,Coffeyville,37.044056,-95.632756 +67341,KS,Dennis,37.324324,-95.411602 +67342,KS,Edna,37.056146,-95.344159 +67344,KS,Elk City,37.314571,-95.913517 +67345,KS,Elk Falls,37.374514,-96.195902 +67346,KS,Grenola,37.366824,-96.439564 +67347,KS,Havana,37.091655,-95.941372 +67349,KS,Howard,37.48089,-96.256298 +67351,KS,Liberty,37.157629,-95.601698 +67352,KS,Longton,37.390455,-96.081379 +67353,KS,Moline,37.364868,-96.306875 +67354,KS,Mound Valley,37.209078,-95.424712 +67355,KS,Niotaze,37.05133,-96.01922 +67356,KS,Oswego,37.182254,-95.133458 +67357,KS,Parsons,37.338888,-95.269288 +67360,KS,Peru,37.056823,-96.140376 +67361,KS,Sedan,37.12968,-96.173248 +67401,KS,Bavaria,38.823802,-97.608787 +67410,KS,Abilene,38.937144,-97.20632 +67414,KS,Ada,39.157777,-97.887387 +67416,KS,Assaria,38.667596,-97.62032 +67417,KS,Aurora,39.447188,-97.530411 +67418,KS,Barnard,39.181572,-98.071144 +67420,KS,Scottsville,39.45446,-98.111714 +67422,KS,Bennington,39.02239,-97.603121 +67423,KS,Beverly,38.984416,-97.981785 +67425,KS,Brookville,38.785771,-97.863002 +67427,KS,Bushton,38.501836,-98.401629 +67428,KS,Canton,38.385838,-97.429072 +67429,KS,Carlton,38.6729,-97.307506 +67430,KS,Cawker City,39.511529,-98.433458 +67431,KS,Chapman,38.972225,-97.016961 +67432,KS,Clay Center,39.384354,-97.127793 +67436,KS,Delphos,39.273122,-97.771692 +67437,KS,Downs,39.502753,-98.544117 +67438,KS,Durham,38.503836,-97.255532 +67439,KS,Ellsworth,38.731219,-98.205678 +67441,KS,Enterprise,38.906321,-97.112222 +67442,KS,Falun,38.664794,-97.755411 +67443,KS,Galva,38.382377,-97.53592 +67444,KS,Geneseo,38.503655,-98.185818 +67445,KS,Glasco,39.362092,-97.841829 +67446,KS,Glen Elder,39.495775,-98.315508 +67447,KS,Green,39.420056,-96.999424 +67448,KS,Gypsum,38.704744,-97.43384 +67449,KS,Delavan,38.702306,-97.015491 +67450,KS,Holyrood,38.589955,-98.415916 +67451,KS,Hope,38.6776,-97.106126 +67452,KS,Hunter,39.242964,-98.401745 +67454,KS,Kanopolis,38.709111,-98.157468 +67455,KS,Westfall,39.028644,-98.140426 +67456,KS,Lindsborg,38.576058,-97.67389 +67457,KS,Little River,38.407868,-98.011317 +67458,KS,Longford,39.174324,-97.208662 +67459,KS,Lorraine,38.565175,-98.289954 +67460,KS,Conway,38.373732,-97.654989 +67463,KS,Manchester,39.087051,-97.309547 +67464,KS,Marquette,38.556028,-97.838079 +67465,KS,Mentor,38.732103,-97.566034 +67466,KS,Miltonvale,39.348078,-97.457911 +67467,KS,Minneapolis,39.129487,-97.668778 +67468,KS,Morganville,39.509219,-97.249219 +67469,KS,Navarre,38.81772,-97.105554 +67470,KS,New Cambria,38.896008,-97.523012 +67472,KS,Oakhill,39.247668,-97.330501 +67473,KS,Osborne,39.419402,-98.696081 +67474,KS,Portis,39.545545,-98.690446 +67475,KS,Ramona,38.577726,-97.075874 +67476,KS,Roxbury,38.474325,-97.42719 +67478,KS,Simpson,39.373074,-97.948887 +67479,KS,Smolan,38.76442,-97.713277 +67480,KS,Solomon,38.919359,-97.351803 +67481,KS,Sylvan Grove,39.032443,-98.373031 +67482,KS,Talmage,39.008594,-97.297367 +67483,KS,Tampa,38.553437,-97.177388 +67484,KS,Culver,38.998318,-97.828375 +67485,KS,Tipton,39.343639,-98.464391 +67487,KS,Wakefield,39.224916,-97.022851 +67488,KS,Wells,39.059224,-97.554636 +67490,KS,Wilson,38.813373,-98.443216 +67491,KS,Windom,38.384518,-97.896476 +67492,KS,Woodbine,38.813064,-96.961935 +67501,KS,Hutchinson,38.054995,-97.931052 +67502,KS,Medora,38.091483,-97.920517 +67505,KS,South Hutchinson,38.007306,-97.90814 +67510,KS,Abbyville,37.962597,-98.207103 +67511,KS,Albert,38.475758,-98.980714 +67512,KS,Alden,38.234303,-98.311202 +67513,KS,Alexander,38.456996,-99.537828 +67514,KS,Arlington,37.859795,-98.159045 +67515,KS,Arnold,38.609122,-100.012003 +67516,KS,Bazine,38.456457,-99.701607 +67517,KS,Beaver,38.650055,-98.648327 +67518,KS,Beeler,38.48113,-100.170957 +67519,KS,Belpre,37.934655,-99.09357 +67520,KS,Bison,38.519332,-99.198634 +67521,KS,Brownell,38.623854,-99.732806 +67522,KS,Buhler,38.130903,-97.769093 +67523,KS,Burdett,38.210384,-99.527515 +67524,KS,Chase,38.363515,-98.355634 +67525,KS,Claflin,38.540885,-98.53722 +67526,KS,Ellinwood,38.356498,-98.584872 +67529,KS,Garfield,38.064929,-99.237433 +67530,KS,Heizer,38.370937,-98.783103 +67543,KS,Haven,37.868593,-97.777244 +67544,KS,Susank,38.529246,-98.791041 +67545,KS,Hudson,38.148493,-98.640815 +67546,KS,Inman,38.223212,-97.795107 +67547,KS,Kinsley,37.924715,-99.411556 +67548,KS,La Crosse,38.531144,-99.309733 +67549,KS,67549,37.833447,-98.307511 +67550,KS,Radium,38.179643,-99.112382 +67552,KS,Lewis,37.906223,-99.247977 +67553,KS,Liebenthal,38.646585,-99.282051 +67554,KS,Lyons,38.334881,-98.183094 +67556,KS,Mc Cracken,38.595734,-99.553982 +67557,KS,Macksville,37.943276,-98.948052 +67559,KS,Nekoma,38.437226,-99.42338 +67560,KS,Ness City,38.438754,-99.90286 +67561,KS,Nickerson,38.141171,-98.067408 +67562,KS,Odin,38.55628,-98.626762 +67563,KS,Offerle,37.882805,-99.549757 +67564,KS,Galatia,38.567045,-98.92899 +67565,KS,Galatia,38.509239,-99.065635 +67566,KS,Partridge,37.967129,-98.079811 +67567,KS,Pawnee Rock,38.278193,-98.981436 +67568,KS,Plevna,37.965762,-98.298807 +67570,KS,Pretty Prairie,37.77828,-97.988603 +67572,KS,Ransom,38.640003,-99.926651 +67573,KS,Raymond,38.287677,-98.411867 +67574,KS,Rozel,38.214823,-99.404846 +67575,KS,Rush Center,38.453341,-99.307881 +67576,KS,Saint John,38.030939,-98.764653 +67577,KS,Seward,38.206558,-98.76391 +67578,KS,Stafford,37.955372,-98.592854 +67579,KS,Sterling,38.212621,-98.205474 +67580,KS,67580,38.647124,-98.761573 +67581,KS,Sylvia,37.955687,-98.406765 +67582,KS,Timken,38.445489,-99.190154 +67583,KS,Langdon,37.809593,-98.421798 +67584,KS,Utica,38.641057,-100.137976 +67601,KS,Antonino,38.878046,-99.320134 +67621,KS,Agra,39.803701,-99.125543 +67622,KS,Almena,39.889071,-99.704177 +67623,KS,Alton,39.451422,-98.953875 +67625,KS,Bogue,39.378221,-99.67882 +67626,KS,Bunker Hill,38.835704,-98.678285 +67627,KS,Catharine,38.96034,-99.215992 +67628,KS,Cedar,39.660242,-98.936923 +67629,KS,Clayton,39.69985,-100.059623 +67630,KS,Codell,39.206652,-99.159186 +67631,KS,Collyer,38.965231,-100.06921 +67632,KS,Damar,39.324181,-99.581056 +67633,KS,67633,39.624374,-99.674433 +67634,KS,Dorrance,38.834784,-98.569471 +67635,KS,Dresden,39.609357,-100.411219 +67636,KS,Edmond,39.661348,-99.784185 +67637,KS,Ellis,38.947128,-99.52851 +67638,KS,Gaylord,39.659923,-98.801751 +67639,KS,Glade,39.670373,-99.29963 +67640,KS,Gorham,38.872226,-99.01116 +67641,KS,Harlan,39.611345,-98.789796 +67642,KS,Hill City,39.35657,-99.842921 +67643,KS,Jennings,39.676242,-100.283441 +67644,KS,Kirwin,39.671716,-99.120378 +67645,KS,Densmore,39.609364,-100.001566 +67646,KS,Logan,39.661096,-99.568694 +67647,KS,Long Island,39.951683,-99.539125 +67648,KS,Lucas,39.058126,-98.535186 +67649,KS,Luray,39.103856,-98.685084 +67650,KS,Morland,39.322905,-100.07328 +67651,KS,Natoma,39.201341,-98.982863 +67652,KS,New Almelo,39.624755,-100.139829 +67653,KS,Norcatur,39.844661,-100.200714 +67654,KS,Norton,39.840706,-99.887832 +67656,KS,Ogallah,38.932307,-99.681117 +67657,KS,Palco,39.253107,-99.559265 +67658,KS,Paradise,39.075617,-98.920723 +67659,KS,Penokee,39.391667,-99.919603 +67660,KS,Pfeifer,38.729915,-99.141162 +67661,KS,Phillipsburg,39.762333,-99.33284 +67663,KS,Plainville,39.230823,-99.300827 +67664,KS,Prairie View,39.836967,-99.568314 +67665,KS,Russell,38.880563,-98.859451 +67667,KS,Schoenchen,38.748087,-99.386872 +67669,KS,Stockton,39.43761,-99.287106 +67671,KS,Victoria,38.858932,-99.139057 +67672,KS,Wa Keeney,39.011415,-99.881824 +67673,KS,Waldo,39.087715,-98.778516 +67675,KS,Woodston,39.443118,-99.103745 +67676,KS,Zurich,39.218155,-99.44908 +67701,KS,Colby,39.383038,-101.044169 +67730,KS,Atwood,39.792607,-101.031766 +67731,KS,Bird City,39.757941,-101.531875 +67732,KS,Brewster,39.36552,-101.372973 +67733,KS,Edson,39.357873,-101.520999 +67734,KS,Gem,39.429587,-100.894781 +67735,KS,Goodland,39.349099,-101.716396 +67736,KS,Gove,38.886969,-100.486707 +67737,KS,Grainfield,39.103016,-100.468038 +67738,KS,Grinnell,39.085107,-100.662052 +67739,KS,Herndon,39.90356,-100.813935 +67740,KS,Hoxie,39.332189,-100.47583 +67741,KS,Kanorado,39.343753,-102.001491 +67743,KS,Levant,39.384083,-101.209587 +67744,KS,Ludell,39.863037,-100.960352 +67745,KS,Mc Donald,39.792304,-101.322697 +67746,KS,67746,39.340679,-100.752304 +67747,KS,Monument,39.07896,-101.034952 +67748,KS,Oakley,39.112102,-100.858048 +67749,KS,Oberlin,39.827507,-100.531389 +67751,KS,Park,39.078832,-100.34694 +67752,KS,Quinter,39.036252,-100.233739 +67753,KS,Menlo,39.462185,-100.748982 +67755,KS,Russell Springs,38.868374,-101.2759 +67756,KS,Wheeler,39.773634,-101.81226 +67757,KS,Selden,39.521636,-100.525695 +67758,KS,Sharon Springs,38.885661,-101.743118 +67759,KS,Studley,39.261618,-100.281436 +67761,KS,Wallace,38.874675,-101.573474 +67762,KS,Weskan,38.864867,-101.951162 +67764,KS,Winona,39.061038,-101.221569 +67801,KS,Dodge City,37.756882,-100.024074 +67830,KS,67830,38.488191,-100.314071 +67831,KS,Ashland,37.182345,-99.75904 +67833,KS,67833,37.50452,-99.915745 +67834,KS,Bucklin,37.552974,-99.632543 +67835,KS,Cimarron,37.812727,-100.343825 +67837,KS,Copeland,37.567994,-100.614815 +67838,KS,Deerfield,38.00677,-101.143141 +67839,KS,Alamota,38.474588,-100.458023 +67840,KS,Englewood,37.065751,-99.987793 +67841,KS,Ensign,37.641381,-100.249555 +67842,KS,Ford,37.632312,-99.76422 +67843,KS,Fort Dodge,37.70652,-99.945631 +67844,KS,Fowler,37.354201,-100.19815 +67846,KS,Garden City,37.97693,-100.862088 +67849,KS,Hanston,38.108964,-99.69278 +67850,KS,Healy,38.566355,-100.615941 +67851,KS,Holcomb,37.993105,-100.989323 +67853,KS,Ingalls,37.829339,-100.514253 +67854,KS,Jetmore,38.073829,-99.932668 +67855,KS,Johnson,37.569424,-101.719354 +67856,KS,Kalvesta,38.102796,-100.443095 +67857,KS,Kendall,37.963657,-101.596883 +67858,KS,Kingsdown,37.52138,-99.751553 +67859,KS,Kismet,37.133601,-100.750645 +67860,KS,Lakin,37.938197,-101.271297 +67861,KS,Leoti,38.498726,-101.358851 +67862,KS,Manter,37.545094,-101.910869 +67863,KS,Modoc,38.482523,-101.199231 +67864,KS,Meade,37.282137,-100.336378 +67865,KS,Bloom,37.42454,-99.960358 +67866,KS,67866,38.486906,-100.996709 +67867,KS,Montezuma,37.601638,-100.446127 +67868,KS,Pierceville,37.907739,-100.71177 +67869,KS,Plains,37.270106,-100.573174 +67870,KS,Satanta,37.440916,-100.96908 +67871,KS,Friend,38.47994,-100.899331 +67874,KS,Shields,38.620794,-100.417699 +67876,KS,Spearville,37.823473,-99.737041 +67877,KS,Sublette,37.522148,-100.820775 +67878,KS,Syracuse,37.982581,-101.768654 +67879,KS,Tribune,38.496219,-101.765584 +67880,KS,Ulysses,37.579174,-101.348846 +67882,KS,Wright,37.767638,-99.923766 +67901,KS,Liberal,37.043789,-100.92857 +67950,KS,Elkhart,37.015448,-101.901244 +67951,KS,Hugoton,37.168226,-101.334614 +67952,KS,Moscow,37.317175,-101.242699 +67953,KS,Richfield,37.283364,-101.700382 +67954,KS,Rolla,37.108881,-101.644683 +40003,KY,Bagdad,38.260811,-85.065142 +40004,KY,Bardstown,37.80835,-85.461343 +40006,KY,Bedford,38.586363,-85.313331 +40007,KY,Bethlehem,38.402433,-85.064874 +40008,KY,Bloomfield,37.907979,-85.286209 +40009,KY,Bradfordsville,37.46622,-85.143599 +40010,KY,Buckner,38.363008,-85.47406 +40011,KY,Campbellsburg,38.523083,-85.161094 +40012,KY,Chaplin,37.902541,-85.201472 +40013,KY,Deatsville,37.896386,-85.484159 +40014,KY,Crestwood,38.332637,-85.461038 +40019,KY,Eminence,38.369606,-85.17816 +40022,KY,Finchville,38.156064,-85.347573 +40023,KY,Fisherville,38.165154,-85.428222 +40026,KY,Goshen,38.411294,-85.570816 +40028,KY,Howardstown,37.566393,-85.554769 +40031,KY,La Grange,38.402897,-85.392819 +40033,KY,Lebanon,37.565834,-85.266811 +40036,KY,Lockport,38.421874,-84.958635 +40037,KY,Loretto,37.642112,-85.411297 +40040,KY,Mackville,37.724703,-85.085201 +40045,KY,Milton,38.692489,-85.36593 +40046,KY,Mount Eden,38.035238,-85.164114 +40047,KY,Mount Washington,38.045206,-85.558631 +40050,KY,New Castle,38.437368,-85.175567 +40051,KY,Trappist,37.666327,-85.557694 +40055,KY,Pendleton,38.480918,-85.317019 +40056,KY,Pewee Valley,38.303945,-85.483377 +40057,KY,Cropper,38.358718,-85.087198 +40059,KY,Prospect,38.355987,-85.608287 +40060,KY,Raywick,37.537959,-85.43003 +40061,KY,Saint Catharine,37.699126,-85.27106 +40062,KY,Saint Francis,37.628644,-85.464208 +40065,KY,Shelbyville,38.216222,-85.224271 +40067,KY,Simpsonville,38.231186,-85.354797 +40068,KY,Smithfield,38.393308,-85.265579 +40069,KY,Maud,37.701352,-85.240473 +40070,KY,Sulphur,38.492062,-85.252021 +40071,KY,Taylorsville,38.047054,-85.382861 +40075,KY,Turners Station,38.550361,-85.132512 +40076,KY,Waddy,38.105445,-85.12883 +40077,KY,Westport,38.492068,-85.45242 +40078,KY,Willisburg,37.837333,-85.136187 +40103,KY,40103,37.684826,-86.444084 +40104,KY,Battletown,38.039295,-86.299104 +40106,KY,Big Spring,37.798795,-86.191791 +40107,KY,Boston,37.763991,-85.619927 +40108,KY,Brandenburg,37.96624,-86.108359 +40109,KY,Brooks,38.054576,-85.771344 +40111,KY,Cloverport,37.822125,-86.595401 +40114,KY,Constantine,37.679412,-86.24009 +40115,KY,Custer,37.742593,-86.271006 +40117,KY,Ekron,37.91129,-86.154212 +40118,KY,Fairdale,38.108668,-85.754924 +40119,KY,Glen Dean,37.569353,-86.510747 +40121,KY,Fort Knox,37.892798,-85.948909 +40140,KY,Garfield,37.814508,-86.316868 +40141,KY,40141,37.650765,-86.518324 +40142,KY,Guston,37.89511,-86.215515 +40143,KY,Mooleyville,37.772548,-86.416856 +40144,KY,Locust Hill,37.742925,-86.37779 +40145,KY,Hudson,37.650613,-86.301238 +40146,KY,Irvington,37.876239,-86.296534 +40150,KY,Lebanon Junction,37.851054,-85.724641 +40152,KY,Mc Daniels,37.595251,-86.397278 +40157,KY,Payneville,38.030128,-86.408164 +40160,KY,Radcliff,37.826652,-85.940408 +40161,KY,Rhodelia,37.968538,-86.304079 +40162,KY,Rineyville,37.75249,-85.995395 +40163,KY,40163,37.911025,-86.497033 +40164,KY,Se Ree,37.676018,-86.399176 +40165,KY,Shepherdsville,38.004515,-85.688767 +40170,KY,Stephensport,37.904781,-86.523961 +40171,KY,Union Star,37.961589,-86.461519 +40175,KY,Vine Grove,37.858937,-86.006888 +40176,KY,Webster,37.923936,-86.403204 +40177,KY,West Point,37.995408,-85.954502 +40178,KY,Westview,37.679196,-86.427286 +40202,KY,Louisville,38.250734,-85.747646 +40203,KY,Louisville,38.245332,-85.762595 +40204,KY,Louisville,38.236936,-85.724938 +40205,KY,Louisville,38.22217,-85.688542 +40206,KY,Saint Matthews,38.256495,-85.697581 +40207,KY,Saint Matthews,38.257908,-85.649689 +40208,KY,Louisville,38.219988,-85.764823 +40209,KY,Louisville,38.190125,-85.751904 +40210,KY,Louisville,38.230585,-85.790548 +40211,KY,Louisville,38.241958,-85.81265 +40212,KY,Louisville,38.265116,-85.804479 +40213,KY,Louisville,38.183929,-85.710642 +40214,KY,Louisville,38.159318,-85.778027 +40215,KY,Louisville,38.191319,-85.784707 +40216,KY,Shively,38.186138,-85.831771 +40217,KY,Louisville,38.21736,-85.740371 +40218,KY,Buechel,38.191084,-85.654834 +40219,KY,Okolona,38.141291,-85.680548 +40220,KY,Louisville,38.21494,-85.624489 +40222,KY,Lyndon,38.263825,-85.611183 +40223,KY,Anchorage,38.253688,-85.561151 +40228,KY,Buechel,38.1392,-85.630967 +40229,KY,Okolona,38.090655,-85.671889 +40241,KY,Lyndon,38.301509,-85.582421 +40242,KY,Lyndon,38.276858,-85.590224 +40243,KY,Middletown,38.240115,-85.537381 +40245,KY,Louisville,38.268273,-85.484461 +40258,KY,Pleasure Ridge P,38.142369,-85.862505 +40272,KY,Valley Station,38.097063,-85.858701 +40291,KY,Fern Creek,38.15205,-85.594513 +40299,KY,Jeffersontown,38.188491,-85.568947 +40311,KY,Carlisle,38.321233,-84.027902 +40312,KY,Westbend,37.860571,-83.934693 +40313,KY,Clearfield,38.143992,-83.327289 +40316,KY,Denniston,37.919068,-83.513136 +40322,KY,Scranton,37.946031,-83.642405 +40324,KY,Georgetown,38.211712,-84.556179 +40327,KY,Gratz,38.478104,-84.942882 +40328,KY,Gravel Switch,37.575802,-85.082403 +40330,KY,Cornishville,37.769989,-84.84675 +40336,KY,Jinks,37.705051,-83.996172 +40337,KY,Jeffersonville,37.964004,-83.855778 +40339,KY,Keene,37.941057,-84.651924 +40341,KY,Lamero,37.319166,-84.162353 +40342,KY,Lawrenceburg,38.018853,-84.929938 +40345,KY,Mariba,37.913527,-83.553692 +40346,KY,Means,37.928382,-83.725343 +40347,KY,Midway,38.148741,-84.692845 +40350,KY,Moorefield,38.292627,-83.892889 +40351,KY,Morehead,38.199047,-83.443645 +40353,KY,Mount Sterling,38.054822,-83.938774 +40355,KY,New Liberty,38.624556,-84.901064 +40356,KY,Nicholasville,37.880794,-84.56459 +40358,KY,Olympia,38.061089,-83.758456 +40359,KY,Owenton,38.4986,-84.808632 +40360,KY,Owingsville,38.153196,-83.756439 +40361,KY,Paris,38.208293,-84.244987 +40365,KY,Pomeroyton,37.874352,-83.526315 +40370,KY,Sadieville,38.390816,-84.538424 +40371,KY,Salt Lick,38.104031,-83.631619 +40372,KY,Bondville,37.915078,-84.884546 +40374,KY,Sharpsburg,38.214742,-83.893199 +40376,KY,Slade,37.788958,-83.684852 +40379,KY,Stamping Ground,38.288802,-84.681824 +40380,KY,Patsey,37.842703,-83.829947 +40383,KY,Versailles,38.041301,-84.728683 +40385,KY,Bybee,37.766833,-84.117061 +40387,KY,Korea,37.965353,-83.47305 +40390,KY,High Bridge,37.862141,-84.662079 +40391,KY,Winchester,37.987161,-84.178894 +40402,KY,Moores Creek,37.306965,-83.959737 +40403,KY,Berea,37.579942,-84.274919 +40409,KY,Brodhead,37.381524,-84.43358 +40415,KY,Cobhill,37.743428,-83.840053 +40417,KY,Conway,37.479933,-84.308072 +40419,KY,Crab Orchard,37.446523,-84.493912 +40422,KY,Danville,37.646524,-84.774696 +40426,KY,Dreyfus,37.650696,-84.154495 +40437,KY,Hustonville,37.459503,-84.852775 +40440,KY,Junction City,37.582157,-84.802782 +40442,KY,Kings Mountain,37.381795,-84.714764 +40444,KY,Lancaster,37.658391,-84.596912 +40445,KY,Livingston,37.307391,-84.231776 +40447,KY,Clover Bottom,37.431678,-84.00896 +40456,KY,Climax,37.336609,-84.354882 +40460,KY,Orlando,37.373405,-84.252801 +40461,KY,Paint Lick,37.609231,-84.426869 +40464,KY,Parksville,37.577768,-84.928132 +40468,KY,Perryville,37.637494,-84.966508 +40471,KY,Pryse,37.684068,-83.842586 +40472,KY,Ravenna,37.686711,-83.938657 +40475,KY,Richmond,37.754605,-84.295526 +40481,KY,Sandgap,37.487097,-84.056676 +40484,KY,Stanford,37.524529,-84.691177 +40486,KY,Elias,37.343023,-83.870674 +40489,KY,Waynesburg,37.349932,-84.665486 +40502,KY,Lexington,38.017394,-84.485423 +40503,KY,Lexington,38.001002,-84.52821 +40504,KY,Lexington,38.040628,-84.543325 +40505,KY,Lexington,38.061201,-84.458338 +40507,KY,Lexington,38.046385,-84.495289 +40508,KY,Lexington,38.04754,-84.496435 +40509,KY,Lexington,38.010166,-84.427419 +40510,KY,Lexington,38.070211,-84.591046 +40511,KY,Lexington,38.093233,-84.500671 +40513,KY,Lexington,38.01388,-84.581522 +40514,KY,Lexington,37.983291,-84.576667 +40515,KY,Lexington,37.965102,-84.470751 +40516,KY,Lexington,38.054355,-84.354802 +40517,KY,Lexington,37.984864,-84.481588 +40601,KY,Hatton,38.192831,-84.88061 +40701,KY,Corbin,36.934429,-84.10208 +40724,KY,Bush,37.070874,-83.976117 +40729,KY,Symbol,37.190779,-84.145676 +40734,KY,Gray,36.946743,-83.982799 +40737,KY,Keavy,37.015604,-84.143606 +40740,KY,Lily,37.002295,-84.08071 +40741,KY,Sasser,37.101605,-84.097498 +40754,KY,Nevisdale,36.663711,-84.111113 +40759,KY,Rockholds,36.824216,-84.104048 +40763,KY,Siler,36.720352,-83.964192 +40769,KY,Pleasant View,36.735535,-84.143592 +40771,KY,Woodbine,36.918793,-84.082743 +40801,KY,Ages Brookside,36.840734,-83.235294 +40806,KY,Baxter,36.874913,-83.314082 +40807,KY,Benham,36.957377,-82.909399 +40808,KY,Big Laurel,37.002795,-83.156468 +40810,KY,Lewis Creek,36.912348,-83.353901 +40813,KY,Calvin,36.707818,-83.737144 +40815,KY,Crummies,36.74619,-83.265719 +40817,KY,40817,36.847053,-83.387894 +40818,KY,Coalgood,36.793394,-83.238782 +40819,KY,Coldiron,36.877718,-83.409591 +40820,KY,Cranks,36.760228,-83.203948 +40823,KY,Cumberland,36.971085,-82.977052 +40824,KY,Dayhoit,36.864603,-83.394329 +40825,KY,Dizney,36.817697,-83.117659 +40826,KY,Eolia,37.061767,-82.77062 +40828,KY,Louellen,36.855294,-83.181648 +40829,KY,Grays Knob,36.811105,-83.323998 +40830,KY,Gulston,36.765622,-83.326227 +40831,KY,Chevrolet,36.84999,-83.319573 +40843,KY,Holmes Mill,36.875652,-82.994304 +40845,KY,Hulen,36.771449,-83.555132 +40846,KY,Keith,36.871241,-83.361367 +40847,KY,Kenvir,36.777596,-83.16055 +40849,KY,Lejunior,36.921199,-83.190486 +40855,KY,Lynch,36.997856,-82.915629 +40858,KY,Mozelle,37.003666,-83.413499 +40861,KY,Oven Fork,37.053929,-82.818484 +40862,KY,Partridge,37.012932,-82.877168 +40863,KY,Pathfork,36.752071,-83.462925 +40865,KY,Putney,36.925907,-83.260793 +40867,KY,Smith,36.71869,-83.320906 +40868,KY,Stinnett,37.08835,-83.390742 +40870,KY,Totz,36.970968,-83.201891 +40873,KY,Wallins Creek,36.816532,-83.418968 +40902,KY,Arjay,36.828342,-83.641537 +40903,KY,Artemus,36.838837,-83.832886 +40905,KY,40905,36.929529,-83.919839 +40906,KY,Bailey Switch,36.864807,-83.899316 +40913,KY,Beverly,36.944179,-83.556031 +40914,KY,Big Creek,37.14168,-83.633095 +40915,KY,Bimble,36.886751,-83.828179 +40921,KY,Bryants Store,36.783087,-83.930729 +40923,KY,Cannon,36.94888,-83.842498 +40927,KY,Closplint,36.89227,-83.099766 +40930,KY,Dewitt,36.8738,-83.73156 +40935,KY,Salt Gum,36.834531,-83.771397 +40940,KY,Fonde,36.64455,-83.895022 +40943,KY,Girdler,36.969096,-83.85388 +40946,KY,Green Road,36.998937,-83.895768 +40949,KY,Heidrick,36.892696,-83.866509 +40953,KY,Hinkle,36.875323,-83.780441 +40958,KY,Kettle Island,36.809344,-83.589183 +40962,KY,Bright Shade,37.142321,-83.768291 +40964,KY,Mary Alice,36.706797,-83.424408 +40965,KY,Middlesboro,36.617188,-83.723079 +40970,KY,Mills,36.940659,-83.605305 +40972,KY,Oneida,37.2677,-83.655467 +40977,KY,Callaway,36.751302,-83.698502 +40979,KY,Roark,37.024432,-83.506201 +40980,KY,40980,36.964535,-83.69705 +40982,KY,Scalf,36.91748,-83.726554 +40983,KY,Sextons Creek,37.27334,-83.798378 +40988,KY,Stoney Fork,36.889184,-83.538504 +40995,KY,Trosper,36.782564,-83.831442 +40997,KY,Walker,36.891138,-83.6616 +40999,KY,Woollum,37.009657,-83.847202 +41001,KY,Alexandria,38.940605,-84.394329 +41002,KY,Augusta,38.762991,-83.995352 +41003,KY,Berry,38.515974,-84.361118 +41004,KY,Brooksville,38.664387,-84.078649 +41005,KY,Rabbit Hash,39.032411,-84.74142 +41006,KY,Butler,38.801328,-84.34458 +41007,KY,California,38.900614,-84.309794 +41008,KY,Carrollton,38.669565,-85.173036 +41010,KY,Corinth,38.53021,-84.584596 +41011,KY,Covington,39.070839,-84.52121 +41014,KY,Rouse,39.066593,-84.505061 +41015,KY,Latonia,39.021686,-84.498858 +41016,KY,Ludlow,39.088946,-84.548304 +41017,KY,Dixie,39.032378,-84.569611 +41018,KY,Erlanger,39.008238,-84.597745 +41030,KY,Crittenden,38.774107,-84.598202 +41031,KY,Cynthiana,38.396403,-84.294921 +41033,KY,Demossville,38.75165,-84.470802 +41034,KY,Dover,38.691016,-83.871793 +41035,KY,Dry Ridge,38.704854,-84.623736 +41039,KY,Ewing,38.415651,-83.873317 +41040,KY,Falmouth,38.664304,-84.345124 +41041,KY,Flemingsburg,38.427983,-83.707968 +41042,KY,Florence,38.994065,-84.641961 +41043,KY,Foster,38.75064,-84.156593 +41044,KY,Germantown,38.707534,-83.960616 +41045,KY,Ghent,38.718823,-85.055662 +41046,KY,Glencoe,38.722946,-84.811552 +41048,KY,Hebron,39.07553,-84.700745 +41049,KY,Hillsboro,38.29294,-83.66967 +41051,KY,Independence,38.935407,-84.547912 +41052,KY,Jonesville,38.648251,-84.76367 +41055,KY,Mays Lick,38.52692,-83.874874 +41056,KY,Limestone Sq,38.619716,-83.758858 +41059,KY,Melbourne,39.006699,-84.353751 +41063,KY,Morning View,38.83942,-84.506918 +41064,KY,Mount Olivet,38.521751,-84.047977 +41071,KY,Southgate,39.082847,-84.486511 +41073,KY,Bellevue,39.102431,-84.478746 +41074,KY,Dayton,39.111428,-84.471155 +41075,KY,Fort Thomas,39.078634,-84.45234 +41076,KY,Newport,39.026184,-84.440792 +41080,KY,Petersburg,39.041561,-84.837104 +41083,KY,Sanders,38.661004,-84.973151 +41085,KY,Silver Grove,39.034262,-84.390849 +41086,KY,Sparta,38.725582,-84.881334 +41091,KY,Union,38.943511,-84.727359 +41092,KY,Verona,38.839012,-84.690722 +41093,KY,Wallingford,38.337449,-83.562532 +41094,KY,Walton,38.887491,-84.63277 +41095,KY,Warsaw,38.780704,-84.849584 +41097,KY,Williamstown,38.629191,-84.57441 +41098,KY,Worthville,38.617948,-85.066321 +41101,KY,Westwood,38.443038,-82.702709 +41102,KY,Ashland,38.461255,-82.644721 +41121,KY,Argillite,38.432228,-82.809442 +41124,KY,Blaine,38.026974,-82.851347 +41127,KY,Camp Dix,38.508044,-83.287793 +41129,KY,Catlettsburg,38.379946,-82.632065 +41132,KY,Denton,38.295212,-82.826924 +41135,KY,Head Of Grassy,38.367225,-83.261786 +41137,KY,Firebrick,38.687785,-83.043203 +41139,KY,Flatwoods,38.518776,-82.72122 +41141,KY,Garrison,38.586915,-83.200036 +41143,KY,Fultz,38.328037,-82.965087 +41144,KY,Lynn,38.547969,-82.868396 +41146,KY,Hitchins,38.254585,-82.920268 +41149,KY,Isonville,38.046229,-83.050607 +41159,KY,Martha,38.015228,-82.95576 +41163,KY,Oldtown,38.441153,-82.95695 +41164,KY,Lawton,38.336275,-83.168985 +41166,KY,Quincy,38.627059,-83.105647 +41168,KY,Rush,38.30893,-82.747602 +41169,KY,Raceland,38.522575,-82.715632 +41170,KY,Saint Paul,38.665445,-83.067931 +41171,KY,Burke,38.129368,-83.12725 +41174,KY,South Portsmouth,38.708706,-83.016218 +41175,KY,Maloneton,38.709269,-82.946373 +41177,KY,Stephens,38.114625,-82.983689 +41178,KY,41178,38.267723,-83.271776 +41179,KY,Trinity,38.551511,-83.355448 +41180,KY,Webbville,38.163377,-82.789743 +41183,KY,Worthington,38.551102,-82.739553 +41189,KY,Tollesboro,38.572332,-83.560458 +41201,KY,Adams,37.991375,-82.702437 +41204,KY,Boons Camp,37.821609,-82.67043 +41214,KY,Davella,37.790019,-82.586729 +41215,KY,Denver,37.796582,-82.863048 +41216,KY,East Point,37.708578,-82.828801 +41219,KY,Elna,37.938594,-82.882825 +41220,KY,Fuget,37.902164,-82.911422 +41222,KY,Hagerhill,37.803511,-82.81491 +41224,KY,Job,37.867149,-82.520421 +41225,KY,41225,37.948703,-82.534771 +41226,KY,Keaton,37.968049,-82.956105 +41228,KY,Leander,37.761904,-82.831045 +41230,KY,Clifford,38.094332,-82.617598 +41231,KY,Lovely,37.792109,-82.363794 +41234,KY,Meally,37.796498,-82.744177 +41237,KY,Offutt,37.852766,-82.708126 +41238,KY,Manila,37.826409,-82.928079 +41240,KY,Nippa,37.819293,-82.805162 +41250,KY,Laura,37.763752,-82.448754 +41254,KY,River,37.875063,-82.670944 +41255,KY,Sitka,37.892187,-82.844554 +41256,KY,Barnetts Creek,37.838463,-82.85743 +41257,KY,Stambaugh,37.84112,-82.76779 +41258,KY,Riceville,37.743408,-82.911269 +41260,KY,Thelma,37.798745,-82.775532 +41262,KY,Davisport,37.879292,-82.599269 +41263,KY,Tutor Key,37.860527,-82.735106 +41265,KY,Van Lear,37.692916,-82.703236 +41266,KY,Fuget,37.902927,-82.911224 +41267,KY,Hode,37.858088,-82.432192 +41269,KY,Whitehouse,37.895347,-82.775328 +41271,KY,Williamsport,37.81416,-82.710455 +41274,KY,Wittensville,37.870297,-82.809987 +41301,KY,Flat,37.750243,-83.516395 +41306,KY,Altro,37.356346,-83.395749 +41311,KY,Vada,37.581891,-83.702337 +41314,KY,Morris Fork,37.478717,-83.660624 +41315,KY,Burkhart,37.687451,-83.273396 +41316,KY,41316,37.465492,-83.460672 +41317,KY,Clayhole,37.466076,-83.281254 +41321,KY,Decoy,37.49046,-83.028956 +41327,KY,Gillmore,37.697155,-83.348026 +41328,KY,Green Hall,37.368938,-83.780693 +41331,KY,Haddix,37.492249,-83.376176 +41332,KY,Grassy Creek,37.775989,-83.398918 +41338,KY,Island City,37.389926,-83.717991 +41339,KY,Canoe,37.557378,-83.396904 +41340,KY,Lambric,37.579455,-83.100888 +41342,KY,Lee City,37.731163,-83.325474 +41343,KY,Leeco,37.698933,-83.692806 +41346,KY,Little,37.432158,-83.382373 +41348,KY,Hardshell,37.484106,-83.328889 +41351,KY,Mistletoe,37.331428,-83.588078 +41357,KY,Noctor,37.569915,-83.270831 +41358,KY,Old Landing,37.639678,-83.805784 +41359,KY,41359,37.490374,-83.741021 +41360,KY,Pine Ridge,37.774872,-83.632059 +41363,KY,Quicksand,37.532947,-83.365098 +41364,KY,Ricetown,37.409305,-83.615062 +41365,KY,Rogers,37.739538,-83.65667 +41366,KY,Rousseau,37.63491,-83.21472 +41367,KY,Rowdy,37.413063,-83.20403 +41369,KY,Saldee,37.455799,-83.373268 +41370,KY,41370,37.388184,-83.502919 +41377,KY,Talbert,37.399505,-83.448185 +41385,KY,Vancleve,37.64768,-83.380553 +41386,KY,Vincent,37.443733,-83.784628 +41390,KY,Whick,37.41022,-83.374707 +41393,KY,41393,37.381593,-83.346466 +41396,KY,Zachariah,37.674917,-83.677244 +41397,KY,Zoe,37.666371,-83.668778 +41401,KY,41401,37.77131,-83.187829 +41407,KY,Caney,37.809847,-83.291662 +41409,KY,Carver,37.650274,-83.069009 +41412,KY,Cottle,37.892975,-83.220078 +41419,KY,Edna,37.799813,-83.179973 +41421,KY,Elkfork,37.940358,-83.077112 +41422,KY,Elsie,37.768875,-83.142321 +41425,KY,Ezel,37.903985,-83.388835 +41429,KY,41429,37.654647,-83.119869 +41431,KY,41431,37.716626,-83.128914 +41441,KY,Hendricks,37.70505,-83.098108 +41447,KY,Lenox,37.967224,-83.181593 +41464,KY,Royalton,37.652116,-82.986669 +41465,KY,Bethanna,37.763499,-83.055443 +41466,KY,Seitz,37.668402,-83.174941 +41472,KY,Blairs Mill,37.949746,-83.279926 +41474,KY,White Oak,37.849769,-83.204869 +41501,KY,Broad Bottom,37.506833,-82.520175 +41503,KY,South Williamson,37.666991,-82.288608 +41512,KY,Ashcamp,37.258909,-82.461269 +41513,KY,Belcher,37.3137,-82.396536 +41514,KY,Belfry,37.64011,-82.257301 +41519,KY,Canada,37.637816,-82.35331 +41522,KY,Senterville,37.302649,-82.353337 +41524,KY,Biggs,37.361002,-82.257466 +41527,KY,Forest Hills,37.643238,-82.299145 +41528,KY,Freeburn,37.551188,-82.143378 +41529,KY,Aflex,37.689943,-82.307961 +41531,KY,Hardy,37.602652,-82.255236 +41535,KY,Huddy,37.566819,-82.25004 +41536,KY,Jamboree,37.485976,-82.089129 +41537,KY,Payne Gap,37.186328,-82.630045 +41539,KY,Kimper,37.469588,-82.318041 +41540,KY,Lick Creek,37.347969,-82.325456 +41543,KY,Mc Andrews,37.544986,-82.2558 +41544,KY,Mc Carr,37.596944,-82.167365 +41545,KY,Mc Combs,37.593432,-82.548228 +41546,KY,Mc Veigh,37.534249,-82.2228 +41548,KY,Mouthcard,37.333908,-82.305424 +41551,KY,Paw Paw,37.435562,-82.134942 +41553,KY,Phelps,37.498736,-82.158378 +41554,KY,Phyllis,37.422152,-82.266786 +41555,KY,Pinsonfork,37.565137,-82.195366 +41557,KY,Fishtrap,37.524072,-82.426256 +41559,KY,Regina,37.359686,-82.373697 +41560,KY,Robinson Creek,37.334708,-82.567679 +41562,KY,Shelbiana,37.375478,-82.455321 +41563,KY,Shelby Gap,37.232743,-82.575149 +41564,KY,Sidney,37.580225,-82.338666 +41565,KY,Speight,37.262473,-82.716502 +41566,KY,Steele,37.40292,-82.207079 +41567,KY,Stone,37.560639,-82.288987 +41568,KY,Argo,37.530336,-82.073522 +41570,KY,Turkey Creek,37.659347,-82.320225 +41571,KY,Varney,37.698541,-82.350976 +41572,KY,Etty,37.313669,-82.649445 +41601,KY,Allen,37.566182,-82.636272 +41602,KY,Auxier,37.721847,-82.767736 +41603,KY,Banner,37.577051,-82.697369 +41604,KY,Ligon,37.372179,-82.680295 +41605,KY,Betsy Layne,37.531593,-82.700249 +41606,KY,Bevinsville,37.338488,-82.712468 +41607,KY,Blue River,37.648097,-82.827361 +41614,KY,Craynor,37.408673,-82.69176 +41615,KY,Dana,37.546653,-82.670501 +41616,KY,David,37.604387,-82.892748 +41622,KY,Eastern,37.532386,-82.826496 +41626,KY,Endicott,37.681936,-82.627608 +41627,KY,Estill,37.46201,-82.819629 +41629,KY,Galveston,37.478249,-82.661868 +41630,KY,Garrett,37.486126,-82.846192 +41631,KY,Grethel,37.459599,-82.739575 +41632,KY,Waldo,37.546661,-82.93574 +41633,KY,Halo,37.307629,-82.730606 +41635,KY,Harold,37.504184,-82.621595 +41636,KY,Buckingham,37.393499,-82.73245 +41637,KY,Pyrmid,37.513484,-82.864919 +41639,KY,Honaker,37.514977,-82.667534 +41640,KY,Elmrock,37.506204,-82.836764 +41642,KY,Ivel,37.555443,-82.64268 +41643,KY,Lackey,37.464283,-82.798012 +41645,KY,Langley,37.538079,-82.797648 +41647,KY,East Mc Dowell,37.425232,-82.745018 +41648,KY,41648,37.566181,-82.798667 +41649,KY,Hite,37.563267,-82.747852 +41653,KY,Emma,37.649462,-82.788135 +41655,KY,Printer,37.505485,-82.706027 +41659,KY,Stanville,37.578386,-82.669174 +41660,KY,Teaberry,37.421955,-82.640456 +41666,KY,Wayland,37.436709,-82.801037 +41701,KY,Darfork,37.252641,-83.199845 +41712,KY,Ary,37.354364,-83.139253 +41714,KY,Bear Branch,37.210894,-83.494449 +41719,KY,Blue Diamond,37.310812,-83.228579 +41721,KY,Buckhorn,37.301036,-83.493648 +41722,KY,Tribbey,37.328174,-83.158487 +41723,KY,Busy,37.26316,-83.300705 +41725,KY,Carrie,37.297995,-83.041549 +41727,KY,Chavies,37.355545,-83.331466 +41728,KY,Cinda,37.09667,-83.302886 +41729,KY,Combs,37.291321,-83.202294 +41730,KY,Confluence,37.271904,-83.371102 +41731,KY,Ulvah,37.120385,-83.035127 +41732,KY,Cutshin,37.108109,-83.247304 +41733,KY,Daisy,37.115936,-83.095095 +41735,KY,Delphia,37.023317,-83.095574 +41736,KY,Dice,37.382539,-83.205335 +41740,KY,Bearville,37.322096,-83.068449 +41743,KY,Fisty,37.356348,-83.108251 +41745,KY,Gays Creek,37.350421,-83.455607 +41746,KY,Happy,37.195047,-83.081408 +41749,KY,Dryhill,37.154604,-83.415668 +41754,KY,Napfor,37.318325,-83.305913 +41756,KY,Leatherwood,37.040503,-83.151254 +41759,KY,Anco,37.233926,-83.032125 +41760,KY,Scuddy,37.212182,-83.093242 +41763,KY,Slemp,37.08037,-83.11694 +41764,KY,Smilax,37.166314,-83.284533 +41765,KY,Talcum,37.383621,-83.047864 +41772,KY,Vest,37.408732,-83.06265 +41773,KY,Vicco,37.189826,-83.099792 +41774,KY,Farler,37.150655,-83.158299 +41775,KY,Wendover,37.129115,-83.350185 +41776,KY,Frew,37.192435,-83.292655 +41777,KY,Big Rock,37.043019,-83.227006 +41801,KY,Amburgey,37.26716,-83.000483 +41804,KY,Carcassonne,37.134266,-82.940189 +41805,KY,Brinkley,37.262613,-82.913976 +41811,KY,Crown,37.159125,-82.847442 +41812,KY,Deane,37.23332,-82.799722 +41815,KY,Ermine,37.174612,-82.822118 +41817,KY,Larkslane,37.377663,-82.893847 +41819,KY,Gilly,36.990109,-83.069317 +41821,KY,Skyline,37.069879,-83.020354 +41822,KY,Hindman,37.327607,-82.952653 +41823,KY,Hollybush,37.337608,-82.831509 +41824,KY,Isom,37.196027,-82.913348 +41825,KY,Jackhorn,37.171685,-82.691856 +41826,KY,Jeremiah,37.165127,-82.926836 +41828,KY,Puncheon,37.270944,-82.784725 +41829,KY,Kona,37.166814,-82.752469 +41831,KY,Soft Shell,37.383737,-82.956428 +41832,KY,Letcher,37.155,-82.980908 +41833,KY,Linefork,37.051399,-82.919765 +41834,KY,Littcarr,37.271457,-82.965098 +41836,KY,Mallie,37.334623,-82.871364 +41838,KY,Millstone,37.151615,-82.7533 +41839,KY,Mousie,37.433125,-82.901768 +41840,KY,Fleming Neon,37.212056,-82.697555 +41843,KY,Omaha,37.311528,-82.830417 +41844,KY,Raven,37.363252,-82.829164 +41845,KY,Premium,37.068587,-82.958115 +41847,KY,Redfox,37.25311,-82.871865 +41848,KY,Roxana,37.090502,-83.034488 +41849,KY,Seco,37.176523,-82.735832 +41855,KY,Thornton,37.129622,-82.7382 +41858,KY,Day Rural,37.115463,-82.838768 +41859,KY,Dema,37.421491,-82.852313 +41861,KY,Raven,37.404328,-82.826064 +41862,KY,Dry Creek,37.346979,-82.781036 +42001,KY,Paducah,37.063377,-88.663204 +42003,KY,Paducah,37.036833,-88.593388 +42020,KY,Almo,36.712805,-88.308666 +42021,KY,Arlington,36.800117,-88.943835 +42023,KY,Bardwell,36.863387,-89.020855 +42024,KY,Barlow,37.049279,-89.040815 +42025,KY,Benton,36.880649,-88.354773 +42027,KY,Boaz,36.929974,-88.622288 +42028,KY,Burna,37.231514,-88.394185 +42029,KY,Calvert City,37.014741,-88.381115 +42031,KY,Clinton,36.667531,-88.967574 +42032,KY,Columbus,36.755505,-89.098288 +42035,KY,Cunningham,36.896256,-88.872815 +42036,KY,Dexter,36.70313,-88.180695 +42038,KY,Eddyville,37.066385,-88.04939 +42039,KY,Fancy Farm,36.77674,-88.791785 +42040,KY,Farmington,36.686903,-88.547832 +42041,KY,Crutchfield,36.528678,-88.889224 +42044,KY,Gilbertsville,36.962465,-88.274856 +42045,KY,Iuka,37.05781,-88.261382 +42047,KY,Hampton,37.334764,-88.364897 +42048,KY,Hardin,36.776233,-88.262153 +42049,KY,Hazel,36.542215,-88.331862 +42050,KY,Hickman,36.559269,-89.194667 +42051,KY,Hickory,36.847783,-88.678782 +42053,KY,Kevil,37.087231,-88.876366 +42054,KY,Kirksey,36.673092,-88.423815 +42055,KY,Kuttawa,37.061871,-88.149813 +42056,KY,La Center,37.083019,-88.972954 +42058,KY,Ledbetter,37.049167,-88.486503 +42064,KY,Marion,37.325426,-88.100471 +42066,KY,Mayfield,36.732686,-88.650637 +42069,KY,Melber,36.919658,-88.752037 +42071,KY,Murray,36.609915,-88.303249 +42076,KY,New Concord,36.550003,-88.09548 +42078,KY,Salem,37.255346,-88.271139 +42079,KY,Sedalia,36.588208,-88.594813 +42081,KY,Carrsville,37.12269,-88.383593 +42082,KY,Symsonia,36.871544,-88.528576 +42083,KY,Tiline,37.162773,-88.254679 +42085,KY,Water Valley,36.569358,-88.808371 +42086,KY,West Paducah,37.092239,-88.761075 +42087,KY,Wickliffe,36.967969,-89.017693 +42088,KY,Wingo,36.625282,-88.739449 +42101,KY,Plum Springs,37.007874,-86.455891 +42103,KY,Bowling Green,36.96629,-86.393321 +42104,KY,Bowling Green,36.937537,-86.448077 +42120,KY,Adolphus,36.677486,-86.263596 +42122,KY,Alvaton,36.86296,-86.363213 +42123,KY,Austin,36.812376,-85.98503 +42124,KY,Beaumont,36.88758,-85.648829 +42127,KY,Cave City,37.11696,-85.944283 +42129,KY,Subtle,36.985197,-85.592741 +42130,KY,Eighty Eight,36.939238,-85.828076 +42131,KY,Etoile,36.813428,-85.917279 +42133,KY,Fountain Run,36.72002,-85.952023 +42134,KY,Franklin,36.725353,-86.570043 +42140,KY,Gamaliel,36.654037,-85.813353 +42141,KY,Glasgow,36.988189,-85.922053 +42151,KY,Hestand,36.653473,-85.569799 +42153,KY,Holland,36.667316,-86.049756 +42154,KY,Knob Lick,36.996922,-85.713698 +42155,KY,Lamb,36.799768,-85.885413 +42156,KY,Lucas,36.837594,-86.035678 +42157,KY,Mount Herman,36.808982,-85.819162 +42159,KY,Oakland,37.007595,-86.285934 +42160,KY,Park City,37.057926,-86.077619 +42163,KY,Rocky Hill,37.067481,-86.11009 +42164,KY,Scottsville,36.761437,-86.192863 +42166,KY,Summer Shade,36.888345,-85.708322 +42167,KY,T Ville,36.713085,-85.696842 +42169,KY,Willow Shade,36.858183,-85.62203 +42170,KY,Woodburn,36.855688,-86.562291 +42171,KY,Smiths Grove,37.058104,-86.193757 +42202,KY,Adairville,36.691385,-86.858523 +42204,KY,Allensville,36.694744,-87.024442 +42206,KY,Auburn,36.881755,-86.719813 +42207,KY,Bee Spring,37.29754,-86.279377 +42210,KY,Reedyville,37.18817,-86.274003 +42211,KY,Golden Pond,36.846421,-87.841243 +42214,KY,Center,37.100897,-85.670455 +42215,KY,Cerulean,36.949619,-87.664848 +42217,KY,Crofton,37.034387,-87.489072 +42220,KY,Elkton,36.909403,-87.167833 +42223,KY,Fort Campbell,36.653584,-87.459706 +42232,KY,Gracey,36.856393,-87.6545 +42234,KY,Tiny Town,36.664268,-87.170931 +42236,KY,Herndon,36.708469,-87.608215 +42240,KY,Hopkinsville,36.862053,-87.485148 +42250,KY,Huff,37.234241,-86.382112 +42252,KY,Jetson,37.240367,-86.520872 +42254,KY,La Fayette,36.658165,-87.65634 +42256,KY,Lewisburg,37.003747,-86.988748 +42257,KY,Lindseyville,37.22813,-86.296384 +42259,KY,Mammoth Cave Nat,37.274385,-86.178112 +42261,KY,Logansport,37.19102,-86.703726 +42262,KY,Oak Grove,36.665225,-87.425514 +42265,KY,Olmstead,36.78463,-86.981846 +42266,KY,Pembroke,36.798221,-87.331892 +42268,KY,Quality,37.035402,-86.869053 +42273,KY,Rochester,37.204778,-86.85921 +42274,KY,Browning,36.939859,-86.585389 +42275,KY,Roundhill,37.25601,-86.406974 +42276,KY,Daysville,36.853074,-86.888708 +42280,KY,Sharon Grove,36.927754,-87.10029 +42284,KY,Sunfish,37.3022,-86.390826 +42285,KY,Kyrock,37.252343,-86.29569 +42286,KY,Trenton,36.731384,-87.261098 +42287,KY,Welchs Creek,37.30856,-86.637139 +42301,KY,Owensboro,37.751255,-87.155394 +42303,KY,Owensboro,37.755884,-87.080252 +42320,KY,Beaver Dam,37.386958,-86.872932 +42321,KY,Beech Creek,37.183704,-87.123854 +42323,KY,Beechmont,37.177552,-87.03934 +42324,KY,Belton,37.151056,-86.977369 +42325,KY,Bremen,37.342955,-87.232989 +42326,KY,Browder,37.259333,-86.978197 +42327,KY,Calhoun,37.574997,-87.277307 +42328,KY,Centertown,37.407918,-87.00902 +42330,KY,Central City,37.300699,-87.120236 +42333,KY,Cromwell,37.341765,-86.769964 +42337,KY,Drakesboro,37.213588,-87.047966 +42338,KY,Dundee,37.551052,-86.760446 +42339,KY,Dunmor,37.083967,-87.00789 +42340,KY,42340,37.351295,-86.965861 +42343,KY,Fordsville,37.629738,-86.726251 +42344,KY,Graham,37.225836,-87.257849 +42345,KY,Greenville,37.207642,-87.180613 +42347,KY,Hartford,37.478533,-86.917982 +42348,KY,Hawesville,37.850318,-86.763804 +42349,KY,Horse Branch,37.423417,-86.698734 +42350,KY,Island,37.447109,-87.16921 +42351,KY,Lewisport,37.909016,-86.895712 +42352,KY,Livermore,37.504453,-87.123861 +42355,KY,Maceo,37.843601,-86.999915 +42358,KY,Narrows,37.569072,-86.68672 +42361,KY,Olaton,37.498666,-86.728223 +42365,KY,Penrod,37.116725,-86.998181 +42366,KY,Philpot,37.718317,-86.937172 +42368,KY,Reynolds Station,37.696533,-86.77942 +42369,KY,Rockport,37.326871,-86.974624 +42371,KY,Rumsey,37.50762,-87.280644 +42372,KY,Sacramento,37.417687,-87.273584 +42376,KY,Utica,37.620559,-87.059082 +42378,KY,Whitesville,37.683402,-86.869912 +42404,KY,Clay,37.475599,-87.836793 +42406,KY,Corydon,37.744284,-87.700033 +42408,KY,Dawson Springs,37.196386,-87.68205 +42409,KY,Dixon,37.510587,-87.701904 +42410,KY,Earlington,37.267899,-87.522679 +42411,KY,Fredonia,37.212956,-88.011229 +42413,KY,Hanson,37.438246,-87.475135 +42420,KY,Henderson,37.827393,-87.563228 +42431,KY,Madisonville,37.325551,-87.495326 +42436,KY,Manitou,37.407972,-87.56118 +42437,KY,Henshaw,37.663935,-87.87686 +42441,KY,Nebo,37.368255,-87.686521 +42442,KY,Nortonville,37.183367,-87.460505 +42445,KY,Princeton,37.115097,-87.863226 +42450,KY,Providence,37.404958,-87.750512 +42451,KY,Reed,37.858764,-87.370382 +42452,KY,Robards,37.675836,-87.526596 +42453,KY,Saint Charles,37.176635,-87.55386 +42455,KY,Sebree,37.588921,-87.525489 +42456,KY,Slaughters,37.5054,-87.505344 +42458,KY,Spottsville,37.839948,-87.424682 +42459,KY,Sturgis,37.548669,-87.996457 +42461,KY,Uniontown,37.767741,-87.926335 +42462,KY,Waverly,37.742985,-87.806688 +42464,KY,White Plains,37.178765,-87.364415 +42501,KY,Alcalde,37.073853,-84.604362 +42516,KY,Bethelridge,37.22459,-84.778971 +42518,KY,Bronston,36.952488,-84.631413 +42519,KY,Sloans Valley,36.96145,-84.565237 +42528,KY,Dunnville,37.176894,-84.929507 +42532,KY,Jabez,37.066884,-84.863157 +42539,KY,Liberty,37.314553,-84.971864 +42541,KY,Middleburg,37.359082,-84.832103 +42544,KY,Pointer,37.064216,-84.766245 +42553,KY,Science Hill,37.168333,-84.64865 +42554,KY,Shopville,37.174243,-84.44594 +42555,KY,Sloans Valley,36.968617,-84.376201 +42558,KY,Tateville,36.973892,-84.438364 +42566,KY,Yosemite,37.307355,-84.812412 +42567,KY,Pulaski,37.247038,-84.605593 +42601,KY,Aaron,36.812827,-85.199114 +42602,KY,Albany,36.68569,-85.140677 +42603,KY,Alpha,36.779735,-85.092405 +42611,KY,Coopersville,36.722168,-84.718717 +42613,KY,Delta,36.801658,-84.684024 +42629,KY,Jamestown,36.967955,-85.096844 +42633,KY,Pueblo,36.842723,-84.839251 +42634,KY,Parkers Lake,36.834689,-84.443642 +42635,KY,Hollyhill,36.663677,-84.412745 +42638,KY,Revelo,36.673363,-84.472189 +42640,KY,Rockybranch,36.668512,-84.810179 +42642,KY,Webbs Cross Road,37.056683,-85.042873 +42643,KY,Sawyer,36.925337,-84.361745 +42647,KY,Stearns,36.708184,-84.516484 +42649,KY,Strunk,36.619068,-84.430801 +42653,KY,Wiborg,36.738597,-84.468364 +42655,KY,Windy,36.778411,-84.961122 +42701,KY,E Town,37.706973,-85.858977 +42711,KY,Bakerton,36.871151,-85.331723 +42712,KY,Big Clifty,37.527801,-86.139498 +42713,KY,Bonnieville,37.374141,-85.895996 +42714,KY,Bow,36.708119,-85.301935 +42715,KY,Breeding,36.981043,-85.407822 +42716,KY,Buffalo,37.47864,-85.643411 +42717,KY,Burkesville,36.806791,-85.397028 +42718,KY,Campbellsville,37.346618,-85.350755 +42721,KY,Caneyville,37.422168,-86.470207 +42722,KY,Canmer,37.269562,-85.720292 +42723,KY,Casey Creek,37.273479,-85.207648 +42724,KY,Stephensburg,37.660339,-86.006046 +42726,KY,Wax,37.427896,-86.160219 +42728,KY,Montpelier,37.116408,-85.269265 +42729,KY,Cub Run,37.314855,-86.08132 +42730,KY,Cundiff,36.957125,-85.274434 +42731,KY,Dubre,36.891998,-85.568281 +42732,KY,E View,37.61478,-86.119153 +42733,KY,Elk Horn,37.339287,-85.191764 +42735,KY,Fairplay,37.035626,-85.326214 +42736,KY,Finley,37.454549,-85.352449 +42740,KY,Glendale,37.603398,-85.892101 +42741,KY,Glens Fork,37.018195,-85.240117 +42742,KY,Gradyville,37.054438,-85.42753 +42743,KY,Greensburg,37.243009,-85.523639 +42746,KY,Hardyville,37.224905,-85.754174 +42748,KY,Hodgenville,37.574566,-85.723206 +42749,KY,Horse Cave,37.184939,-85.878549 +42752,KY,Kettle,36.694573,-85.40917 +42753,KY,Knifley,37.231886,-85.112844 +42754,KY,Sadler,37.493098,-86.30371 +42757,KY,Magnolia,37.416464,-85.730823 +42761,KY,Milltown,37.103415,-85.444181 +42762,KY,Millwood,37.460879,-86.379821 +42764,KY,Mount Sherman,37.453408,-85.631381 +42765,KY,Munfordville,37.289812,-85.920141 +42768,KY,Peytonsburg,36.646299,-85.371663 +42776,KY,Sonora,37.52207,-85.922969 +42782,KY,Summersville,37.34186,-85.619376 +42784,KY,Upton,37.456802,-85.908619 +42788,KY,White Mills,37.543765,-86.039519 +70001,LA,Metairie,29.987138,-90.169513 +70002,LA,Metairie,30.009843,-90.16303 +70003,LA,Metairie,29.99746,-90.21457 +70005,LA,Metairie,30.000476,-90.13314 +70006,LA,Metairie,30.012885,-90.191483 +70030,LA,Des Allemands,29.821993,-90.447049 +70031,LA,Ama,29.943494,-90.292509 +70032,LA,Arabi,29.961154,-89.996497 +70036,LA,Barataria,29.717859,-90.126232 +70037,LA,Belle Chasse,29.834514,-90.004177 +70039,LA,Boutte,29.897319,-90.393396 +70040,LA,Braithwaite,29.673563,-89.885347 +70041,LA,Buras,29.341056,-89.47568 +70043,LA,Chalmette,29.946611,-89.961137 +70047,LA,New Sarpy,29.96579,-90.373982 +70049,LA,Edgard,30.031863,-90.581678 +70051,LA,Garyville,30.05352,-90.620113 +70052,LA,Gramercy,30.052711,-90.690182 +70053,LA,Gretna,29.910806,-90.053115 +70056,LA,Terrytown,29.892652,-90.029123 +70057,LA,Hahnville,30.000094,-90.488581 +70058,LA,Harvey,29.872535,-90.067259 +70062,LA,Kenner,29.991203,-90.247901 +70065,LA,Kenner,30.025164,-90.252175 +70067,LA,Lafitte,29.562194,-90.056633 +70068,LA,La Place,30.077718,-90.489544 +70070,LA,Luling,29.925116,-90.369261 +70071,LA,Lutcher,30.044679,-90.70084 +70072,LA,Marrero,29.859756,-90.110462 +70075,LA,Meraux,29.933494,-89.921433 +70079,LA,Norco,30.005706,-90.419796 +70080,LA,Paradis,29.877033,-90.435246 +70083,LA,Port Sulphur,29.470011,-89.68475 +70084,LA,Reserve,30.060255,-90.551773 +70085,LA,Saint Bernard,29.861093,-89.836414 +70086,LA,Saint James,30.027598,-90.860549 +70087,LA,Saint Rose,29.958074,-90.312432 +70090,LA,Vacherie,29.969372,-90.709699 +70091,LA,Venice,29.261812,-89.347776 +70092,LA,Violet,29.904347,-89.895992 +70094,LA,Bridge City,29.914386,-90.181305 +70112,LA,New Orleans,29.960484,-90.075301 +70113,LA,New Orleans,29.940511,-90.084777 +70114,LA,New Orleans,29.937934,-90.033126 +70115,LA,New Orleans,29.928863,-90.1005 +70116,LA,New Orleans,29.968608,-90.064614 +70117,LA,New Orleans,29.970298,-90.03124 +70118,LA,New Orleans,29.950352,-90.123598 +70119,LA,New Orleans,29.974552,-90.085156 +70121,LA,Jefferson,29.963071,-90.160953 +70122,LA,New Orleans,30.005637,-90.064409 +70123,LA,Harahan,29.953473,-90.210748 +70124,LA,New Orleans,30.007081,-90.109384 +70125,LA,New Orleans,29.951225,-90.102785 +70126,LA,New Orleans,30.015341,-90.018913 +70127,LA,New Orleans,30.033811,-89.980688 +70128,LA,New Orleans,30.052691,-89.956421 +70129,LA,New Orleans,30.047984,-89.906206 +70130,LA,New Orleans,29.932438,-90.073949 +70131,LA,New Orleans,29.916811,-89.996033 +70301,LA,Thibodaux,29.799213,-90.809605 +70339,LA,Pierre Part,29.95501,-91.200167 +70340,LA,Amelia,29.66046,-91.111105 +70341,LA,Belle Rose,30.025955,-91.044351 +70342,LA,Berwick,29.698786,-91.205662 +70343,LA,Bourg,29.548489,-90.60866 +70344,LA,Chauvin,29.463401,-90.597952 +70345,LA,Cut Off,29.523188,-90.339298 +70346,LA,Donaldsonville,30.101799,-90.997025 +70353,LA,Dulac,29.359814,-90.655655 +70354,LA,Galliano,29.431125,-90.298054 +70355,LA,Gheens,29.707591,-90.484855 +70356,LA,Gibson,29.662522,-90.977637 +70357,LA,Golden Meadow,29.382054,-90.263932 +70358,LA,Grand Isle,29.22973,-90.008801 +70359,LA,Gray,29.69034,-90.78071 +70360,LA,Houma,29.59433,-90.754808 +70363,LA,Houma,29.560137,-90.691668 +70364,LA,Houma,29.629887,-90.726801 +70372,LA,Labadieville,29.834458,-90.961319 +70374,LA,Lockport,29.603493,-90.490614 +70375,LA,Mathews,29.681982,-90.494914 +70377,LA,Montegut,29.474366,-90.543952 +70380,LA,Morgan City,29.723937,-91.116497 +70390,LA,Napoleonville,29.92884,-91.026608 +70392,LA,Patterson,29.69671,-91.281231 +70394,LA,Raceland,29.717835,-90.599908 +70395,LA,Schriever,29.712276,-90.851341 +70397,LA,Theriot,29.451587,-90.765146 +70401,LA,Hammond,30.51908,-90.487856 +70403,LA,Hammond,30.491054,-90.46972 +70420,LA,Abita Springs,30.483696,-90.004072 +70422,LA,Amite,30.718208,-90.570493 +70426,LA,Angie,30.922406,-89.856714 +70427,LA,Bogalusa,30.773303,-89.865329 +70431,LA,Bush,30.613393,-89.955664 +70433,LA,Covington,30.487606,-90.095933 +70436,LA,Fluker,30.812776,-90.52067 +70437,LA,Folsom,30.61447,-90.187927 +70438,LA,Franklinton,30.857735,-90.115479 +70441,LA,Greensburg,30.864693,-90.725561 +70443,LA,Independence,30.635148,-90.527685 +70444,LA,Kentwood,30.889215,-90.472829 +70445,LA,Lacombe,30.322027,-89.929744 +70446,LA,Loranger,30.588407,-90.356723 +70447,LA,Madisonville,30.428743,-90.177282 +70448,LA,Mandeville,30.386096,-90.076846 +70449,LA,Maurepas,30.271587,-90.704255 +70450,LA,Mount Hermon,30.953619,-90.276886 +70452,LA,Pearl River,30.394448,-89.77315 +70453,LA,Pine Grove,30.703202,-90.767235 +70454,LA,Ponchatoula,30.440644,-90.442247 +70455,LA,Robert,30.506327,-90.335171 +70456,LA,Roseland,30.771711,-90.524277 +70458,LA,Slidell,30.278411,-89.771192 +70460,LA,Slidell,30.291611,-89.812895 +70461,LA,Slidell,30.272615,-89.729027 +70462,LA,Springfield,30.415738,-90.577479 +70466,LA,Tickfaw,30.566849,-90.481997 +70467,LA,Varnado,30.982085,-89.7606 +70501,LA,Lafayette,30.236141,-92.008261 +70503,LA,Lafayette,30.184256,-92.049745 +70506,LA,Lafayette,30.207707,-92.065623 +70507,LA,Lafayette,30.281313,-92.015962 +70508,LA,Lafayette,30.158222,-92.023579 +70510,LA,Forked Island,29.958828,-92.142655 +70512,LA,Arnaudville,30.398054,-91.926285 +70514,LA,Baldwin,29.848784,-91.545783 +70515,LA,Basile,30.497787,-92.57357 +70516,LA,Branch,30.328684,-92.334618 +70517,LA,Henderson,30.274955,-91.905899 +70518,LA,Broussard,30.12189,-91.950171 +70520,LA,Carencro,30.324433,-92.042265 +70525,LA,Church Point,30.401287,-92.223954 +70526,LA,Crowley,30.214753,-92.377709 +70528,LA,Delcambre,29.947414,-91.988938 +70529,LA,Duson,30.191216,-92.152455 +70531,LA,Egan,30.250966,-92.500226 +70532,LA,Elton,30.471496,-92.699614 +70533,LA,Erath,29.952237,-92.034266 +70535,LA,Eunice,30.51158,-92.398474 +70537,LA,Evangeline,30.26829,-92.553244 +70538,LA,Franklin,29.785656,-91.502643 +70542,LA,Gueydan,30.025541,-92.533779 +70543,LA,Iota,30.300081,-92.532201 +70544,LA,Jeanerette,29.90324,-91.654397 +70546,LA,Jennings,30.22011,-92.657405 +70548,LA,Kaplan,29.977096,-92.302463 +70549,LA,Lake Arthur,30.09097,-92.682526 +70552,LA,Loreauville,30.068276,-91.659571 +70554,LA,Mamou,30.649648,-92.419646 +70555,LA,Maurice,30.07215,-92.107035 +70559,LA,Midland,30.143437,-92.463153 +70560,LA,New Iberia,30.001027,-91.819959 +70570,LA,Opelousas,30.51442,-92.089668 +70577,LA,Port Barre,30.547788,-91.928576 +70578,LA,Rayne,30.204508,-92.248592 +70581,LA,Roanoke,30.318167,-92.686973 +70582,LA,Saint Martinvill,30.208282,-91.825961 +70583,LA,Scott,30.250401,-92.098079 +70584,LA,Cankton,30.393741,-92.075681 +70586,LA,Ville Platte,30.692376,-92.27371 +70589,LA,Washington,30.709881,-92.039888 +70591,LA,Welsh,30.236259,-92.818972 +70592,LA,Youngsville,30.097498,-92.009629 +70601,LA,Lake Charles,30.228453,-93.187966 +70605,LA,Lake Charles,30.169349,-93.221798 +70611,LA,Lake Charles,30.322031,-93.211082 +70630,LA,Bell City,30.114454,-92.94407 +70631,LA,Cameron,29.86492,-93.277662 +70632,LA,Creole,29.797813,-93.034874 +70633,LA,Dequincy,30.421113,-93.415053 +70634,LA,Deridder,30.828738,-93.268461 +70637,LA,Dry Creek,30.735356,-92.988849 +70639,LA,Evans,31.008817,-93.422171 +70643,LA,Grand Chenier,29.787535,-92.897997 +70645,LA,Hackberry,29.982187,-93.374973 +70647,LA,Iowa,30.221937,-93.02586 +70648,LA,Kinder,30.460653,-92.869332 +70650,LA,Lacassine,30.145587,-92.829262 +70652,LA,Longville,30.579992,-93.254806 +70653,LA,Fields,30.770145,-93.530734 +70654,LA,Mittie,30.678812,-92.932056 +70655,LA,Oberlin,30.6162,-92.752672 +70656,LA,Pitkin,30.932988,-92.954762 +70657,LA,Ragley,30.470262,-93.233652 +70658,LA,Reeves,30.496734,-93.036847 +70660,LA,Singer,30.532906,-93.464986 +70661,LA,Starks,30.308477,-93.661485 +70662,LA,Sugartown,30.827653,-93.017017 +70663,LA,Sulphur,30.219001,-93.363911 +70668,LA,Vinton,30.201523,-93.572808 +70669,LA,Westlake,30.261274,-93.268837 +70710,LA,Addis,30.355699,-91.261348 +70711,LA,Albany,30.514872,-90.596415 +70712,LA,Angola,30.96562,-91.597948 +70714,LA,Baker,30.581395,-91.142893 +70715,LA,Batchelor,30.802631,-91.668675 +70717,LA,Blanks,30.579813,-91.615845 +70719,LA,Brusly,30.387692,-91.252649 +70720,LA,Bueche,30.574894,-91.338303 +70721,LA,Point Clair,30.220759,-91.102484 +70722,LA,Clinton,30.824867,-90.933141 +70723,LA,Convent,30.055251,-90.864988 +70725,LA,Darrow,30.12999,-90.965102 +70726,LA,Port Vincent,30.484623,-90.932588 +70729,LA,Erwinville,30.551252,-91.399444 +70730,LA,Ethel,30.813124,-91.109975 +70732,LA,Fordoche,30.550835,-91.697258 +70733,LA,French Settlemen,30.336394,-90.773225 +70734,LA,Geismar,30.236265,-90.975824 +70736,LA,Glynn,30.637617,-91.342311 +70737,LA,Gonzales,30.247306,-90.918012 +70739,LA,Greenwell Spring,30.52114,-91.007484 +70740,LA,Grosse Tete,30.387935,-91.43829 +70744,LA,Holden,30.555646,-90.665176 +70748,LA,The Bluffs,30.827034,-91.234537 +70749,LA,Jarreau,30.632585,-91.433205 +70750,LA,Krotz Springs,30.537928,-91.756329 +70752,LA,Lakeland,30.579941,-91.421677 +70753,LA,Lettsworth,30.932394,-91.740252 +70754,LA,Livingston,30.474107,-90.767339 +70755,LA,Livonia,30.552353,-91.533219 +70756,LA,Lottie,30.503947,-91.71053 +70757,LA,Ramah,30.482292,-91.516816 +70759,LA,Morganza,30.724491,-91.595935 +70760,LA,New Roads,30.701356,-91.442124 +70761,LA,Norwood,30.951772,-91.062871 +70762,LA,Oscar,30.598759,-91.48458 +70763,LA,Paulina,30.035159,-90.737439 +70764,LA,Plaquemine,30.268414,-91.252361 +70767,LA,Port Allen,30.471983,-91.254088 +70769,LA,Galvez,30.315588,-90.929904 +70770,LA,Pride,30.613321,-90.99429 +70772,LA,Rosedale,30.440776,-91.45616 +70773,LA,Rougon,30.603452,-91.381316 +70774,LA,Saint Amant,30.23849,-90.843527 +70775,LA,Bains,30.858658,-91.392266 +70776,LA,Iberville,30.279873,-91.09162 +70777,LA,Slaughter,30.799139,-91.052251 +70778,LA,Sorrento,30.185388,-90.86314 +70780,LA,Sunshine,30.29824,-91.179922 +70781,LA,Torbert,30.538575,-91.421616 +70783,LA,Ventress,30.681404,-91.403257 +70785,LA,Walker,30.524748,-90.855708 +70788,LA,White Castle,30.15447,-91.177343 +70789,LA,Wilson,30.947325,-91.065511 +70791,LA,Zachary,30.656129,-91.135841 +70792,LA,Uncle Sam,30.021679,-90.771879 +70801,LA,Baton Rouge,30.450731,-91.186954 +70802,LA,Baton Rouge,30.444236,-91.169037 +70805,LA,Baton Rouge,30.48604,-91.148095 +70806,LA,Baton Rouge,30.448486,-91.130046 +70807,LA,Scotlandville,30.533199,-91.178615 +70808,LA,Baton Rouge,30.406596,-91.146765 +70809,LA,Baton Rouge,30.408891,-91.084213 +70810,LA,Baton Rouge,30.363309,-91.091898 +70811,LA,Greenwood,30.53046,-91.126539 +70812,LA,Baton Rouge,30.505159,-91.118111 +70814,LA,Baton Rouge,30.484808,-91.068936 +70815,LA,Baton Rouge,30.455809,-91.059558 +70816,LA,Baton Rouge,30.427289,-91.035645 +70817,LA,Baton Rouge,30.390404,-91.00213 +70818,LA,Baton Rouge,30.540832,-91.049964 +70819,LA,Baton Rouge,30.46679,-91.01565 +70820,LA,Baton Rouge,30.379523,-91.167064 +71001,LA,Arcadia,32.555643,-92.924529 +71003,LA,Athens,32.645073,-93.023875 +71004,LA,Belcher,32.754393,-93.850799 +71006,LA,Benton,32.697617,-93.69095 +71007,LA,Bethany,32.366179,-94.003394 +71008,LA,Bienville,32.252323,-92.908402 +71016,LA,Castor,32.245181,-93.093576 +71018,LA,Cotton Valley,32.819011,-93.425885 +71019,LA,Hanna,32.050099,-93.315644 +71023,LA,Doyline,32.490023,-93.399585 +71024,LA,Dubberly,32.519164,-93.21419 +71027,LA,Frierson,32.244968,-93.691488 +71028,LA,Gibsland,32.529874,-93.070558 +71029,LA,Gilliam,32.825055,-93.829268 +71030,LA,Gloster,32.191705,-93.829309 +71031,LA,Goldonna,31.999988,-92.961056 +71032,LA,Grand Cane,32.105,-93.794064 +71033,LA,Greenwood,32.424025,-93.969252 +71034,LA,Hall Summit,32.175249,-93.30475 +71037,LA,Haughton,32.550732,-93.565742 +71038,LA,Haynesville,32.927807,-93.069137 +71039,LA,Heflin,32.447008,-93.285192 +71040,LA,Homer,32.774883,-93.028834 +71043,LA,Hosston,32.896653,-93.883425 +71044,LA,Ida,32.993393,-93.902186 +71045,LA,Jamestown,32.36127,-93.184758 +71046,LA,Keatchie,32.162173,-93.951046 +71047,LA,Keithville,32.316059,-93.888138 +71048,LA,Lisbon,32.845196,-92.88781 +71049,LA,Logansport,31.994327,-93.962733 +71051,LA,Elm Grove,32.388628,-93.502615 +71052,LA,Mansfield,32.023863,-93.698045 +71055,LA,Minden,32.632281,-93.288587 +71059,LA,Mira,32.922491,-93.918797 +71060,LA,Mooringsport,32.66258,-93.973018 +71061,LA,Oil City,32.745107,-93.983844 +71063,LA,Pelican,31.896563,-93.563361 +71064,LA,Plain Dealing,32.907419,-93.690534 +71065,LA,Pleasant Hill,31.808577,-93.513594 +71067,LA,Princeton,32.579089,-93.522577 +71068,LA,Ringgold,32.326302,-93.298241 +71069,LA,Rodessa,32.970079,-93.988474 +71070,LA,Chestnut,32.156604,-92.948606 +71071,LA,Sarepta,32.943361,-93.440407 +71072,LA,Shongaloo,32.971289,-93.296264 +71073,LA,Sibley,32.509539,-93.300902 +71075,LA,Springhill,33.00054,-93.459563 +71078,LA,Stonewall,32.284758,-93.800277 +71079,LA,Summerfield,32.923802,-92.821516 +71082,LA,Trees,32.866844,-93.987312 +71101,LA,Shreveport,32.503743,-93.748696 +71103,LA,Shreveport,32.494459,-93.772701 +71104,LA,Shreveport,32.482978,-93.734862 +71105,LA,Shreveport,32.458882,-93.714341 +71106,LA,Forbing,32.426251,-93.747922 +71107,LA,Dixie,32.564652,-93.828781 +71108,LA,Shreveport,32.448596,-93.781378 +71109,LA,Shreveport,32.473994,-93.801297 +71110,LA,Barksdale A F B,32.514313,-93.638172 +71111,LA,Bossier City,32.544924,-93.703826 +71112,LA,Bossier City,32.486025,-93.676723 +71115,LA,Caspiana,32.410156,-93.697402 +71118,LA,Shreveport,32.397664,-93.802543 +71119,LA,Shreveport,32.477121,-93.87261 +71129,LA,Shreveport,32.41412,-93.874192 +71201,LA,Monroe,32.528551,-92.106104 +71202,LA,Richwood,32.463327,-92.090231 +71203,LA,Monroe,32.553038,-92.042241 +71219,LA,Baskin,32.289728,-91.713154 +71220,LA,Bastrop,32.789382,-91.90776 +71222,LA,Bernice,32.821024,-92.626269 +71223,LA,Bonita,32.912263,-91.682158 +71225,LA,Calhoun,32.524791,-92.329929 +71226,LA,Chatham,32.292246,-92.437433 +71227,LA,Choudrant,32.555627,-92.522419 +71229,LA,Collinston,32.697143,-91.863419 +71232,LA,Warden,32.450433,-91.512487 +71234,LA,Downsville,32.652508,-92.374471 +71235,LA,Dubach,32.694893,-92.678543 +71237,LA,Epps,32.616099,-91.49135 +71238,LA,Eros,32.398822,-92.34795 +71239,LA,Extension,31.947065,-91.801091 +71241,LA,Farmerville,32.753378,-92.317955 +71243,LA,Fort Necessity,32.043412,-91.825694 +71245,LA,Grambling,32.524398,-92.715785 +71250,LA,Jones,32.966286,-91.596509 +71251,LA,Jonesboro,32.248292,-92.694425 +71254,LA,Lake Providence,32.807067,-91.19057 +71256,LA,Lillie,32.952931,-92.685769 +71259,LA,Mangham,32.333114,-91.797607 +71260,LA,Linville,32.888155,-92.25706 +71261,LA,Mer Rouge,32.77176,-91.771643 +71263,LA,Terry,32.872258,-91.412905 +71264,LA,Oak Ridge,32.624317,-91.761785 +71266,LA,Pioneer,32.715436,-91.464822 +71268,LA,Quitman,32.356423,-92.708532 +71269,LA,Alto,32.468938,-91.7643 +71270,LA,Ruston,32.530823,-92.643927 +71275,LA,Simsboro,32.538388,-92.799484 +71276,LA,Sondheimer,32.577216,-91.248197 +71277,LA,Spearsville,32.955022,-92.58698 +71280,LA,Spencer,32.593268,-92.12134 +71282,LA,Mound,32.402127,-91.190066 +71286,LA,Transylvania,32.670529,-91.228813 +71291,LA,West Monroe,32.531726,-92.175971 +71292,LA,West Monroe,32.456599,-92.185445 +71295,LA,Winnsboro,32.159229,-91.710845 +71301,LA,Alexandria,31.288519,-92.463349 +71302,LA,Alexandria,31.268272,-92.424169 +71303,LA,Alexandria,31.304838,-92.508892 +71316,LA,Acme,31.301618,-91.821563 +71318,LA,Big Bend,31.079347,-91.845065 +71322,LA,Eola,30.949284,-92.182582 +71323,LA,Center Point,31.263068,-92.187868 +71325,LA,Cheneyville,31.020097,-92.295144 +71326,LA,Clayton,31.78857,-91.542547 +71327,LA,Cottonport,30.986168,-92.058124 +71328,LA,Buckeye,31.354506,-92.202287 +71331,LA,Vick,31.189613,-92.194182 +71333,LA,Goudeau,30.951089,-92.090039 +71334,LA,Frogmore,31.647944,-91.571958 +71336,LA,Gilbert,32.034943,-91.592026 +71339,LA,Hamburg,31.073269,-91.916177 +71340,LA,Harrisonburg,31.766926,-91.883971 +71341,LA,Hessmer,31.0534,-92.139933 +71342,LA,Jena,31.674817,-92.113677 +71343,LA,Larto,31.636486,-91.845812 +71344,LA,71344,31.433458,-91.862893 +71346,LA,Lecompte,31.106032,-92.389031 +71350,LA,Mansura,31.061466,-92.054333 +71351,LA,Marksville,31.139614,-92.083145 +71353,LA,Melville,30.662643,-91.75649 +71354,LA,Monterey,31.440287,-91.734455 +71355,LA,Moreauville,31.036766,-91.981814 +71356,LA,Le Moyen,30.824887,-92.040781 +71357,LA,Newellton,32.065621,-91.257771 +71358,LA,Palmetto,30.706543,-91.911384 +71360,LA,Kolin,31.34991,-92.399276 +71362,LA,Plaucheville,30.936484,-91.984673 +71366,LA,Saint Joseph,31.924805,-91.278432 +71367,LA,Saint Landry,30.83812,-92.393846 +71368,LA,Sicily Island,31.850734,-91.680711 +71369,LA,Simmesport,30.977119,-91.825868 +71371,LA,Trout,31.653142,-92.19931 +71372,LA,71372,31.231159,-92.04555 +71373,LA,Vidalia,31.578222,-91.469471 +71375,LA,Waterproof,31.807613,-91.387154 +71378,LA,Wisner,31.991252,-91.676798 +71401,LA,Aimwell,31.761898,-91.992491 +71403,LA,Anacoco,31.221762,-93.358949 +71404,LA,Atlanta,31.873583,-92.764125 +71406,LA,Belmont,31.709956,-93.495863 +71407,LA,Bentley,31.466035,-92.49273 +71409,LA,Boyce,31.321601,-92.686681 +71411,LA,Campti,31.895851,-93.093572 +71412,LA,Chopin,31.541916,-92.949717 +71416,LA,Derry,31.535918,-92.857326 +71417,LA,Colfax,31.507948,-92.656758 +71418,LA,Hebert,32.114794,-92.103653 +71419,LA,Mitchell,31.785153,-93.71569 +71421,LA,71421,31.612239,-92.980409 +71422,LA,Dodson,32.070131,-92.678292 +71423,LA,Dry Prong,31.597921,-92.566479 +71424,LA,Elmer,31.146476,-92.717062 +71425,LA,Enterprise,31.906412,-91.875149 +71426,LA,Fisher,31.493655,-93.460197 +71427,LA,Flatwoods,31.384882,-92.881246 +71429,LA,Florien,31.427455,-93.517916 +71430,LA,Forest Hill,31.024304,-92.510798 +71432,LA,Georgetown,31.745006,-92.395182 +71433,LA,Calcasieu,30.978384,-92.645758 +71435,LA,Grayson,32.012108,-91.974615 +71436,LA,71436,32.206305,-91.992208 +71438,LA,Leander,31.082535,-92.77488 +71439,LA,Hornbeck,31.322639,-93.368306 +71441,LA,Kelly,32.028619,-92.126072 +71444,LA,Lacamp,31.160702,-92.896183 +71445,LA,71445,31.12665,-92.84924 +71446,LA,Hicks,31.144292,-93.223957 +71447,LA,Chopin,31.418481,-92.77185 +71449,LA,Many,31.58508,-93.464113 +71450,LA,Marthaville,31.772583,-93.395428 +71451,LA,Melder,31.11932,-92.662186 +71454,LA,Montgomery,31.667388,-92.841178 +71455,LA,Clifton,31.333927,-92.888915 +71456,LA,Natchez,31.661502,-93.024117 +71457,LA,Natchitoches,31.761688,-93.091572 +71459,LA,Fort Polk,31.032068,-93.22213 +71461,LA,Newllano,31.069396,-93.287899 +71462,LA,Noble,31.693849,-93.716679 +71463,LA,Oakdale,30.817173,-92.663964 +71465,LA,Olla,31.87339,-92.22139 +71466,LA,Otis,31.226442,-92.744478 +71467,LA,Pollock,31.499966,-92.400536 +71468,LA,Provencal,31.580117,-93.140089 +71469,LA,Robeline,31.771453,-93.320972 +71472,LA,Sieper,31.197034,-92.76981 +71473,LA,Sikes,32.068616,-92.442894 +71477,LA,Tioga,31.415732,-92.447116 +71479,LA,Tullos,31.853088,-92.301254 +71483,LA,Winnfield,31.921389,-92.636646 +71485,LA,Woodworth,31.132588,-92.498996 +71486,LA,Zwolle,31.61379,-93.663569 +3901,ME,Berwick,43.28992,-70.855038 +3902,ME,Cape Neddick,43.213318,-70.639685 +3903,ME,Eliot,43.130943,-70.782216 +3904,ME,Kittery,43.092128,-70.742876 +3905,ME,Kittery Point,43.097571,-70.712108 +3906,ME,North Berwick,43.325401,-70.721173 +3907,ME,Ogunquit,43.228457,-70.597176 +3908,ME,South Berwick,43.229201,-70.785949 +3909,ME,York,43.154447,-70.657826 +4001,ME,Acton,43.549405,-70.930687 +4002,ME,Alfred,43.487503,-70.696087 +4003,ME,Bailey Island,43.734147,-69.995175 +4005,ME,Arundel,43.483647,-70.471928 +4006,ME,Biddeford Pool,43.442722,-70.352024 +4008,ME,Bowdoinham,44.036806,-69.918849 +4009,ME,Bridgton,44.052049,-70.724081 +4010,ME,Brownfield,43.971316,-70.903225 +4011,ME,Birch Island,43.897591,-69.955469 +4013,ME,Bustins Island,43.79602,-70.042247 +4015,ME,Casco,43.959623,-70.526013 +4016,ME,Center Lovell,44.168139,-70.883618 +4017,ME,Chebeague Island,43.735363,-70.116878 +4019,ME,Cliff Island,43.695547,-70.107097 +4020,ME,Cornish,43.779612,-70.778433 +4021,ME,Cumberland Cente,43.809818,-70.2484 +4022,ME,Denmark,43.975499,-70.792409 +4024,ME,East Baldwin,43.864604,-70.692159 +4027,ME,West Lebanon,43.410304,-70.910986 +4029,ME,North Sebago,43.882247,-70.633865 +4030,ME,East Waterboro,43.599537,-70.690626 +4032,ME,Freeport,43.851093,-70.113854 +4037,ME,Fryeburg,44.031278,-70.966841 +4038,ME,Gorham,43.684329,-70.467968 +4039,ME,Gray,43.894202,-70.342939 +4040,ME,Harrison,44.107099,-70.653855 +4041,ME,Hiram,43.862217,-70.853076 +4042,ME,Hollis Center,43.594578,-70.605074 +4043,ME,Kennebunk,43.388055,-70.547802 +4046,ME,Kennebunkport,43.392288,-70.472867 +4047,ME,Kezar Falls,43.785361,-70.892717 +4048,ME,Limerick,43.696265,-70.786556 +4049,ME,Limington,43.726031,-70.675178 +4050,ME,Long Island,43.692014,-70.15509 +4051,ME,Lovell,44.161404,-70.929951 +4053,ME,Merepoint,43.843496,-70.00347 +4055,ME,Naples,43.968121,-70.598754 +4058,ME,North Fryeburg,44.132936,-70.981286 +4060,ME,North Shapleigh,43.583458,-70.874392 +4061,ME,North Waterboro,43.639976,-70.729799 +4062,ME,Windham,43.795771,-70.414281 +4064,ME,Old Orchard Beac,43.517449,-70.392053 +4066,ME,Orrs Island,43.77267,-69.966793 +4068,ME,Porter,43.826216,-70.924266 +4069,ME,Pownal,43.890042,-70.195497 +4071,ME,Raymond,43.921917,-70.449834 +4072,ME,Saco,43.520946,-70.454632 +4073,ME,Sanford,43.428541,-70.758479 +4074,ME,Scarborough,43.583476,-70.345668 +4075,ME,Sebago Lake,43.758355,-70.573454 +4076,ME,Shapleigh,43.567353,-70.828619 +4077,ME,South Casco,43.876736,-70.512938 +4079,ME,South Harpswell,43.781932,-69.993709 +4081,ME,South Waterford,44.151256,-70.792061 +4083,ME,Springvale,43.471499,-70.806445 +4084,ME,Standish,43.814211,-70.480657 +4085,ME,Steep Falls,43.757137,-70.645627 +4086,ME,Pejepscot,43.941286,-69.964479 +4087,ME,Waterboro,43.566097,-70.743115 +4090,ME,Wells,43.314352,-70.596883 +4091,ME,West Baldwin,43.829873,-70.749015 +4092,ME,Westbrook,43.684268,-70.358033 +4093,ME,West Buxton,43.661586,-70.601546 +4095,ME,Maplewood,43.643417,-70.913476 +4096,ME,Yarmouth,43.800933,-70.174958 +4101,ME,Portland,43.660564,-70.258864 +4102,ME,Portland,43.660168,-70.28981 +4103,ME,Portland,43.687568,-70.2876 +4105,ME,Falmouth,43.734038,-70.26253 +4106,ME,South Portland,43.631847,-70.270878 +4107,ME,Cape Elizabeth,43.601735,-70.230099 +4108,ME,Peaks Island,43.658921,-70.194017 +4109,ME,Cushing Island,43.674971,-70.202201 +4110,ME,Cumberland Fores,43.774485,-70.188333 +4210,ME,Auburn,44.094785,-70.238978 +4216,ME,Andover,44.663703,-70.79666 +4217,ME,Bethel,44.416176,-70.803685 +4219,ME,Bryant Pond,44.395714,-70.643468 +4220,ME,Buckfield,44.287676,-70.368293 +4221,ME,Canton,44.418894,-70.321719 +4223,ME,Danville,44.036528,-70.272055 +4224,ME,Dixfield,44.554799,-70.424099 +4225,ME,Dryden,44.600218,-70.223962 +4226,ME,East Andover,44.603011,-70.729555 +4228,ME,East Livermore,44.399402,-70.130334 +4231,ME,East Stoneham,44.238201,-70.852936 +4235,ME,Frye,44.599482,-70.565319 +4236,ME,Greene,44.189059,-70.145532 +4237,ME,Hanover,44.495875,-70.716735 +4238,ME,Hebron,44.202136,-70.375369 +4239,ME,Jay,44.515994,-70.209883 +4240,ME,Lewiston,44.098538,-70.191619 +4250,ME,Lisbon,44.025511,-70.113933 +4252,ME,Lisbon Falls,43.997759,-70.073375 +4254,ME,Livermore Falls,44.445756,-70.193614 +4256,ME,Mechanic Falls,44.099957,-70.368206 +4257,ME,Mexico,44.562776,-70.535797 +4259,ME,Monmouth,44.22083,-70.02627 +4260,ME,New Gloucester,43.960835,-70.297381 +4261,ME,Newry,44.407937,-70.792611 +4263,ME,Leeds,44.28343,-70.125277 +4265,ME,North Monmouth,44.275328,-70.036686 +4266,ME,North Turner,44.335031,-70.256147 +4267,ME,North Waterford,44.206511,-70.717393 +4268,ME,Norway,44.212654,-70.560135 +4270,ME,Oxford,44.11183,-70.509799 +4273,ME,Poland,44.059187,-70.411819 +4274,ME,Poland Spring,44.021162,-70.379664 +4275,ME,Roxbury,44.65657,-70.609188 +4276,ME,Rumford,44.543446,-70.564475 +4278,ME,Rumford Center,44.592334,-70.700058 +4279,ME,Rumford Point,44.557104,-70.700276 +4280,ME,Sabattus,44.113269,-70.074792 +4281,ME,South Paris,44.216674,-70.501179 +4282,ME,Turner,44.255669,-70.249444 +4284,ME,Wayne,44.349283,-70.0712 +4285,ME,Weld,44.701624,-70.4249 +4289,ME,West Paris,44.32527,-70.573167 +4290,ME,Peru,44.494408,-70.443459 +4291,ME,West Poland,44.047167,-70.450166 +4292,ME,West Sumner,44.372804,-70.432314 +4294,ME,Wilton,44.59107,-70.296064 +4330,ME,Augusta,44.323228,-69.766548 +4341,ME,Coopers Mills,44.258823,-69.507672 +4342,ME,Dresden,44.078507,-69.745726 +4344,ME,Farmingdale,44.25233,-69.791313 +4345,ME,Gardiner,44.207029,-69.785774 +4346,ME,Randolph,44.228704,-69.774918 +4347,ME,Hallowell,44.286414,-69.805738 +4348,ME,Jefferson,44.189419,-69.483895 +4349,ME,Kents Hill,44.438259,-70.074822 +4350,ME,Litchfield,44.163437,-69.958071 +4351,ME,Manchester,44.308375,-69.884657 +4352,ME,Mount Vernon,44.499342,-69.990336 +4353,ME,North Whitefield,44.217844,-69.602164 +4354,ME,Palermo,44.384282,-69.43337 +4355,ME,Readfield,44.403221,-69.950634 +4357,ME,Richmond,44.104213,-69.821077 +4358,ME,South China,44.395334,-69.58036 +4361,ME,Weeks Mills,44.407543,-69.541738 +4363,ME,Windsor,44.300878,-69.580587 +4364,ME,Winthrop,44.314031,-69.973128 +4401,ME,Bangor,44.824199,-68.791839 +4406,ME,Abbot Village,45.279838,-69.52514 +4408,ME,Aurora,44.886113,-68.295929 +4410,ME,Bradford,45.08552,-68.923491 +4411,ME,Bradley,44.901454,-68.626328 +4412,ME,Brewer,44.787433,-68.753896 +4413,ME,Brookton,45.5686,-67.707828 +4414,ME,Brownville,45.341229,-69.042331 +4416,ME,Bucksport,44.601546,-68.776823 +4417,ME,Burlington,45.218438,-68.442701 +4418,ME,Cardville,45.077599,-68.603277 +4419,ME,Carmel,44.805315,-68.99415 +4422,ME,Charleston,45.067017,-69.086856 +4423,ME,Costigan,44.975336,-68.612969 +4424,ME,Danforth,45.668654,-67.868778 +4426,ME,Dover Foxcroft,45.18774,-69.204472 +4427,ME,East Corinth,44.983655,-69.008532 +4428,ME,East Eddington,44.820642,-68.61883 +4429,ME,East Holden,44.742209,-68.648307 +4430,ME,East Millinocket,45.629967,-68.572822 +4431,ME,East Orland,44.57249,-68.70174 +4433,ME,Enfield,45.266477,-68.605802 +4434,ME,Etna,44.793232,-69.132225 +4435,ME,Exeter,44.967927,-69.107934 +4438,ME,Frankfort,44.59794,-68.933981 +4441,ME,Greenville,45.471566,-69.584376 +4442,ME,Greenville Junct,45.488394,-69.637526 +4443,ME,Guilford,45.173455,-69.397491 +4444,ME,Hampden,44.741073,-68.87305 +4446,ME,Haynesville,45.837991,-67.98858 +4448,ME,Seboeis,45.247813,-68.669252 +4449,ME,Hudson,44.991415,-68.887831 +4450,ME,Kenduskeag,44.918251,-68.934179 +4451,ME,Kingman,45.598433,-68.23662 +4453,ME,Lagrange,45.178918,-68.83448 +4455,ME,Lee,45.363504,-68.290885 +4456,ME,Levant,44.884279,-68.98367 +4457,ME,Lincoln,45.350832,-68.507693 +4458,ME,Lincoln Center,45.431731,-68.457065 +4459,ME,Mattawamkeag,45.526387,-68.35195 +4460,ME,Medway,45.60704,-68.522709 +4461,ME,Milford,44.939263,-68.629597 +4462,ME,Millinocket,45.659563,-68.710117 +4463,ME,Derby,45.250697,-68.977098 +4464,ME,Monson,45.298088,-69.487986 +4465,ME,4465,45.951196,-67.844536 +4468,ME,Old Town,44.943044,-68.67496 +4471,ME,North Amity,45.805639,-67.837741 +4472,ME,Orland,44.545818,-68.731312 +4473,ME,Orono,44.892472,-68.675466 +4474,ME,Orrington,44.726347,-68.787597 +4475,ME,Passadumkeag,45.183687,-68.604328 +4476,ME,Penobscot,44.434371,-68.757409 +4478,ME,Rockwood,45.659329,-69.822442 +4479,ME,Sangerville,45.140571,-69.321772 +4487,ME,Springfield,45.42638,-68.110756 +4488,ME,Stetson,44.884337,-69.106877 +4490,ME,Topsfield,45.430403,-67.747253 +4491,ME,Vanceboro,45.558761,-67.463419 +4492,ME,Waite,45.357741,-67.642812 +4495,ME,Winn,45.456786,-68.357465 +4496,ME,Winterport,44.655247,-68.886174 +4497,ME,Wytopitlock,45.664476,-68.105541 +4530,ME,Bath,43.906155,-69.826565 +4537,ME,Boothbay,43.894497,-69.627322 +4538,ME,Capitol Island,43.854559,-69.61844 +4539,ME,Bristol,43.951864,-69.495367 +4541,ME,Chamberlain,43.884154,-69.498618 +4543,ME,Damariscotta,44.029313,-69.504237 +4544,ME,East Boothbay,43.826241,-69.593903 +4547,ME,Friendship,44.006741,-69.291604 +4548,ME,Mac Mahan,43.819649,-69.747424 +4551,ME,Medomak,44.006292,-69.430664 +4553,ME,Newcastle,44.049866,-69.533113 +4554,ME,New Harbor,43.860541,-69.507934 +4555,ME,Nobleboro,44.094301,-69.482786 +4556,ME,Edgecomb,43.979179,-69.619742 +4558,ME,Pemaquid,43.892389,-69.528919 +4562,ME,Phippsburg,43.768816,-69.814982 +4563,ME,Cushing,43.986741,-69.272061 +4564,ME,Round Pond,43.924983,-69.46617 +4565,ME,Sebasco Estates,43.769342,-69.857557 +4567,ME,Small Point,43.731724,-69.841163 +4568,ME,South Bristol,43.867714,-69.561367 +4570,ME,Squirrel Island,43.809031,-69.630974 +4571,ME,Trevett,43.893508,-69.674601 +4572,ME,Waldoboro,44.104601,-69.374537 +4573,ME,Walpole,43.946235,-69.55165 +4574,ME,Washington,44.269281,-69.384237 +4576,ME,West Southport,43.823775,-69.667343 +4578,ME,Wiscasset,44.007444,-69.682576 +4579,ME,Woolwich,43.950317,-69.789098 +4605,ME,Ellsworth,44.554824,-68.412093 +4606,ME,Addison,44.583038,-67.714573 +4607,ME,Gouldsboro,44.473054,-68.089857 +4609,ME,Bar Harbor,44.373799,-68.244791 +4611,ME,Beals,44.512967,-67.605554 +4612,ME,Bernard,44.241543,-68.35803 +4613,ME,Birch Harbor,44.384195,-68.031686 +4614,ME,Blue Hill,44.434265,-68.588513 +4615,ME,Blue Hill Falls,44.390244,-68.590282 +4616,ME,Brooklin,44.254134,-68.556518 +4617,ME,Brooksville,44.375635,-68.731279 +4618,ME,Bucks Harbor,44.624762,-67.396382 +4619,ME,Calais,45.171478,-67.26408 +4622,ME,Cherryfield,44.622791,-67.943617 +4623,ME,Columbia Falls,44.66988,-67.75341 +4624,ME,Corea,44.405281,-67.985032 +4626,ME,Cutler,44.67531,-67.249869 +4627,ME,Deer Isle,44.233951,-68.644839 +4628,ME,Dennysville,44.896105,-67.224431 +4630,ME,East Machias,44.742362,-67.382066 +4631,ME,Eastport,44.919966,-67.00739 +4634,ME,Franklin,44.608734,-68.241653 +4640,ME,Hancock,44.50459,-68.2402 +4642,ME,Harborside,44.338584,-68.800901 +4643,ME,Harrington,44.612218,-67.814722 +4645,ME,Isle Au Haut,44.056057,-68.620598 +4648,ME,Jonesboro,44.658153,-67.577692 +4649,ME,Jonesport,44.550936,-67.604403 +4650,ME,Little Deer Isle,44.285213,-68.706663 +4652,ME,Lubec,44.834772,-67.046016 +4653,ME,Bass Harbor,44.1993,-68.380387 +4654,ME,Machias,44.72154,-67.481996 +4655,ME,Machiasport,44.682039,-67.407277 +4656,ME,Manset,44.262573,-68.314408 +4657,ME,Meddybemps,45.019306,-67.382852 +4658,ME,Milbridge,44.536601,-67.884433 +4660,ME,Mount Desert,44.311547,-68.352253 +4661,ME,North Brooklin,44.308469,-68.577326 +4666,ME,Pembroke,44.965396,-67.200204 +4667,ME,Perry,44.988824,-67.092882 +4668,ME,Princeton,45.213091,-67.600826 +4669,ME,Prospect Harbor,44.419489,-68.027943 +4671,ME,Robbinston,45.067007,-67.143301 +4673,ME,Sargentville,44.3345,-68.705221 +4676,ME,Sedgwick,44.33552,-68.637659 +4677,ME,Sorrento,44.490696,-68.178665 +4678,ME,South Gouldsboro,44.47163,-68.030406 +4679,ME,Southwest Harbor,44.2823,-68.326471 +4680,ME,Steuben,44.497082,-67.950319 +4681,ME,Stonington,44.175197,-68.674617 +4683,ME,Sunset,44.217404,-68.707002 +4684,ME,Surry,44.488272,-68.506272 +4689,ME,4689,44.538181,-68.195943 +4690,ME,West Tremont,44.252778,-68.380365 +4693,ME,Winter Harbor,44.390038,-68.084316 +4694,ME,Woodland,45.133234,-67.417519 +4730,ME,Houlton,46.11885,-67.863014 +4732,ME,Ashland,46.618438,-68.387608 +4733,ME,Benedicta,45.812484,-68.408855 +4735,ME,Bridgewater,46.422154,-67.841469 +4736,ME,Caribou,46.870569,-68.020352 +4737,ME,Clayton Lake,46.629805,-69.626445 +4740,ME,Easton,46.635697,-67.901777 +4742,ME,Fort Fairfield,46.762272,-67.840204 +4743,ME,Fort Kent,47.196857,-68.590855 +4746,ME,Grand Isle,47.304428,-68.154238 +4747,ME,Island Falls,46.016866,-68.266722 +4749,ME,Lille,47.263623,-68.110393 +4750,ME,Limestone,46.924786,-67.845086 +4751,ME,Loring Afb,46.9416,-67.89858 +4756,ME,Madawaska,47.329447,-68.33281 +4757,ME,Mapleton,46.674634,-68.153584 +4758,ME,Mars Hill,46.522268,-67.862973 +4760,ME,Monticello,46.300658,-67.841439 +4762,ME,New Sweden,46.955916,-68.11545 +4763,ME,Oakfield,46.108753,-68.129805 +4764,ME,Oxbow,46.401955,-68.521792 +4765,ME,Patten,46.01316,-68.464669 +4768,ME,Portage,46.775303,-68.487675 +4769,ME,Presque Isle,46.684151,-68.01179 +4772,ME,Saint Agatha,47.238655,-68.323237 +4773,ME,Saint David,47.334328,-68.231368 +4774,ME,Saint Francis,47.14071,-68.950309 +4776,ME,Sherman Mills,45.877727,-68.369587 +4777,ME,Sherman Station,45.885892,-68.461844 +4779,ME,Sinclair,47.174384,-68.267922 +4780,ME,Smyrna Mills,46.146412,-68.206363 +4781,ME,Soldier Pond,47.151529,-68.598081 +4783,ME,Stockholm,47.064299,-68.208614 +4785,ME,Van Buren,47.158857,-67.94589 +4786,ME,Washburn,46.788271,-68.133836 +4787,ME,Westfield,46.508687,-67.897365 +4841,ME,Rockland,44.112326,-69.113938 +4843,ME,Camden,44.213718,-69.076682 +4847,ME,Hope,44.258902,-69.146743 +4848,ME,Islesboro,44.30823,-68.907346 +4849,ME,Lincolnville,44.304825,-69.082446 +4852,ME,Monhegan,43.764222,-69.316429 +4853,ME,North Haven,44.143598,-68.866744 +4854,ME,Owls Head,44.073186,-69.089416 +4856,ME,Rockport,44.188787,-69.090114 +4857,ME,Saint George,43.998687,-69.201984 +4858,ME,South Thomaston,44.037785,-69.135937 +4859,ME,Spruce Head,44.010405,-69.17071 +4860,ME,Tenants Harbor,43.955473,-69.231501 +4861,ME,Thomaston,44.084568,-69.188803 +4862,ME,Union,44.242404,-69.252435 +4863,ME,Vinalhaven,44.03968,-68.836816 +4864,ME,Warren,44.127066,-69.247894 +4865,ME,West Rockport,44.181966,-69.151049 +4901,ME,Winslow,44.547967,-69.635917 +4910,ME,Albion,44.535527,-69.468286 +4911,ME,Anson,44.783107,-69.930856 +4912,ME,Athens,44.938844,-69.669482 +4915,ME,Belfast,44.435436,-69.014753 +4917,ME,Belgrade,44.46875,-69.860636 +4918,ME,Belgrade Lakes,44.511103,-69.863681 +4920,ME,Bingham,45.068241,-69.885721 +4921,ME,Brooks,44.567807,-69.140393 +4922,ME,Burnham,44.684766,-69.380049 +4923,ME,Cambridge,45.051281,-69.44193 +4924,ME,Canaan,44.744976,-69.549777 +4925,ME,Caratunk,45.240999,-69.938617 +4927,ME,Clinton,44.643995,-69.528405 +4928,ME,Corinna,44.926045,-69.232341 +4929,ME,Detroit,44.777526,-69.316081 +4930,ME,Dexter,45.020347,-69.279654 +4932,ME,Dixmont,44.699078,-69.102532 +4936,ME,Eustis,45.162559,-70.457067 +4937,ME,Benton Station,44.609639,-69.63321 +4938,ME,Farmington,44.665339,-70.132878 +4941,ME,Freedom,44.463311,-69.319045 +4942,ME,Wellington,45.003926,-69.56871 +4943,ME,Hartland,44.878155,-69.471754 +4945,ME,Jackman,45.635081,-70.249227 +4947,ME,Kingfield,44.985403,-70.183177 +4949,ME,Liberty,44.374085,-69.33058 +4950,ME,Madison,44.809623,-69.8449 +4951,ME,Monroe,44.592674,-69.03169 +4952,ME,Morrill,44.410693,-69.147105 +4953,ME,Newport,44.839264,-69.267498 +4954,ME,New Portland,44.885571,-70.092857 +4955,ME,New Sharon,44.645803,-70.013927 +4956,ME,New Vineyard,44.796658,-70.121953 +4957,ME,Norridgewock,44.68994,-69.830583 +4958,ME,North Anson,44.879662,-69.911946 +4961,ME,North New Portla,44.95524,-70.043268 +4962,ME,North Vassalboro,44.477748,-69.57808 +4963,ME,Oakland,44.51729,-69.740082 +4965,ME,Palmyra,44.857578,-69.381084 +4966,ME,Phillips,44.837486,-70.360079 +4967,ME,Pittsfield,44.787109,-69.40223 +4969,ME,Plymouth,44.769938,-69.226562 +4970,ME,Rangeley,44.96306,-70.665844 +4971,ME,Saint Albans,44.929264,-69.399179 +4973,ME,Searsmont,44.377035,-69.219579 +4974,ME,Searsport,44.487672,-68.931125 +4976,ME,Skowhegan,44.777212,-69.697571 +4978,ME,Smithfield,44.630107,-69.807496 +4979,ME,Solon,44.967605,-69.833018 +4981,ME,Stockton Springs,44.514056,-68.855974 +4982,ME,Stratton,45.123197,-70.431928 +4983,ME,Strong,44.82236,-70.222054 +4984,ME,Temple,44.695417,-70.242635 +4985,ME,West Forks,45.383905,-69.984057 +4986,ME,Thorndike,44.574406,-69.248658 +4987,ME,Troy,44.675657,-69.25488 +4988,ME,Unity,44.600676,-69.332778 +4989,ME,Vassalboro,44.440455,-69.651904 +20331,MD,Andrews Afb,38.800324,-76.886695 +20601,MD,Waldorf,38.637065,-76.877787 +20602,MD,Saint Charles,38.601545,-76.903414 +20603,MD,Saint Charles,38.624929,-76.961154 +20606,MD,Abell,38.249554,-76.744104 +20607,MD,Accokeek,38.671992,-77.016217 +20608,MD,Aquasco,38.582496,-76.714947 +20609,MD,Avenue,38.282624,-76.746553 +20611,MD,Bel Alton,38.473141,-76.978873 +20613,MD,Brandywine,38.692203,-76.832033 +20615,MD,Broomes Island,38.417963,-76.547763 +20616,MD,Bryans Road,38.641468,-77.076589 +20617,MD,Bryantown,38.542638,-76.846539 +20618,MD,Bushwood,38.284439,-76.792863 +20619,MD,California,38.300648,-76.531228 +20620,MD,Callaway,38.227521,-76.520963 +20621,MD,Maddox,38.333197,-76.782343 +20622,MD,Charlotte Hall,38.474977,-76.803792 +20623,MD,Cheltenham,38.753094,-76.836852 +20624,MD,Clements,38.340716,-76.726419 +20626,MD,Coltons Point,38.236963,-76.764649 +20628,MD,Dameron,38.153271,-76.357474 +20630,MD,Drayden,38.171875,-76.473095 +20632,MD,Faulkner,38.438221,-76.972937 +20634,MD,Great Mills,38.267431,-76.495365 +20636,MD,Hollywood,38.352356,-76.562644 +20637,MD,Hughesville,38.520712,-76.781677 +20639,MD,Huntingtown,38.609453,-76.600268 +20640,MD,Pisgah,38.588855,-77.148357 +20645,MD,Issue,38.304327,-76.867527 +20646,MD,La Plata,38.525673,-76.986498 +20650,MD,Leonardtown,38.277425,-76.638037 +20653,MD,Lexington Park,38.249452,-76.45293 +20656,MD,Loveville,38.347438,-76.67708 +20657,MD,Lusby,38.366128,-76.43464 +20658,MD,Rison,38.557335,-77.156329 +20659,MD,Mechanicsville,38.429319,-76.725399 +20662,MD,Nanjemoy,38.446161,-77.198296 +20664,MD,Newburg,38.329782,-76.917499 +20667,MD,Park Hall,38.224364,-76.441522 +20670,MD,Patuxent River,38.279089,-76.438061 +20674,MD,Piney Point,38.139667,-76.504716 +20675,MD,Pomfret,38.585541,-77.009314 +20676,MD,Port Republic,38.495237,-76.534865 +20677,MD,Port Tobacco,38.499353,-77.041856 +20678,MD,Prince Frederick,38.533629,-76.595495 +20680,MD,Ridge,38.116883,-76.371071 +20684,MD,Saint Inigoes,38.14406,-76.408328 +20685,MD,Saint Leonard,38.45013,-76.511017 +20687,MD,Scotland,38.082772,-76.347684 +20688,MD,Solomons,38.334067,-76.458886 +20689,MD,Sunderland,38.648968,-76.576697 +20690,MD,Tall Timbers,38.165318,-76.539897 +20692,MD,Valley Lee,38.189937,-76.508689 +20693,MD,Welcome,38.467206,-77.095006 +20695,MD,White Plains,38.594848,-76.980233 +20701,MD,Annapolis Juncti,39.130983,-76.798068 +20705,MD,Beltsville,39.045524,-76.924168 +20706,MD,Lanham,38.967537,-76.8551 +20707,MD,Laurel,39.107687,-76.872043 +20708,MD,Montpelier,39.068376,-76.847725 +20710,MD,Bladensburg,38.945215,-76.920327 +20711,MD,Lothian,38.802933,-76.66281 +20712,MD,Mount Rainier,38.943072,-76.965152 +20714,MD,North Beach,38.711884,-76.536701 +20715,MD,Bowie,38.979696,-76.743497 +20716,MD,Mitchellville,38.927482,-76.731979 +20720,MD,Bowie,38.973733,-76.789526 +20721,MD,Mitchellville,38.919588,-76.80527 +20722,MD,Brentwood,38.940701,-76.953062 +20723,MD,Laurel,39.120806,-76.84345 +20724,MD,Laurel,39.095801,-76.815485 +20732,MD,Chesapeake Beach,38.669798,-76.537629 +20733,MD,Churchton,38.801791,-76.524773 +20735,MD,Clinton,38.754892,-76.902577 +20736,MD,Owings,38.695507,-76.606093 +20737,MD,Riverdale,38.960067,-76.914658 +20740,MD,College Park,38.996303,-76.929891 +20743,MD,Capital Heights,38.88385,-76.906665 +20744,MD,Fort Washington,38.758656,-76.983531 +20745,MD,Oxon Hill,38.810764,-76.989776 +20746,MD,Suitland,38.842453,-76.922156 +20747,MD,District Heights,38.853887,-76.889132 +20748,MD,Temple Hills,38.822159,-76.947786 +20751,MD,Deale,38.782909,-76.551498 +20754,MD,Dunkirk,38.740763,-76.642658 +20755,MD,Fort George G Me,39.112923,-76.745013 +20758,MD,Friendship,38.739077,-76.600093 +20759,MD,Fulton,39.150179,-76.92999 +20763,MD,Savage,39.137962,-76.821818 +20764,MD,Shady Side,38.836794,-76.510884 +20769,MD,Glenn Dale,38.976632,-76.805336 +20770,MD,Greenbelt,38.999559,-76.883964 +20772,MD,Upper Marlboro,38.837717,-76.798028 +20776,MD,Harwood,38.858152,-76.614458 +20777,MD,Highland,39.184252,-76.968643 +20778,MD,West River,38.825194,-76.539113 +20779,MD,Tracys Landing,38.767101,-76.57524 +20781,MD,Hyattsville,38.95063,-76.934652 +20782,MD,West Hyattsville,38.963575,-76.966632 +20783,MD,Adelphi,38.993751,-76.97472 +20784,MD,Landover Hills,38.951541,-76.888829 +20785,MD,Landover,38.91992,-76.882243 +20794,MD,Jessup,39.148399,-76.792239 +20812,MD,Glen Echo,38.969333,-77.143457 +20814,MD,Bethesda,39.000343,-77.102165 +20815,MD,Chevy Chase,38.977955,-77.081984 +20816,MD,Bethesda,38.958485,-77.11528 +20817,MD,West Bethesda,38.999659,-77.137239 +20818,MD,Cabin John,38.974302,-77.15911 +20832,MD,Olney,39.152591,-77.074949 +20833,MD,Brookeville,39.187082,-77.06026 +20837,MD,Poolesville,39.138597,-77.406717 +20838,MD,Barnesville,39.223321,-77.376426 +20839,MD,Beallsville,39.167095,-77.414403 +20841,MD,Boyds,39.210042,-77.316731 +20842,MD,Dickerson,39.212615,-77.419853 +20850,MD,Rockville,39.087037,-77.167973 +20851,MD,Rockville,39.076265,-77.123449 +20852,MD,Rockville,39.049628,-77.120416 +20853,MD,Rockville,39.088738,-77.095037 +20854,MD,Potomac,39.03877,-77.192151 +20855,MD,Derwood,39.134539,-77.147707 +20860,MD,Sandy Spring,39.150319,-77.029071 +20861,MD,Ashton,39.151027,-76.99242 +20862,MD,Brinklow,39.183777,-77.016338 +20866,MD,Burtonsville,39.092151,-76.933851 +20868,MD,Spencerville,39.121343,-76.959802 +20871,MD,Clarksburg,39.263719,-77.273579 +20872,MD,Damascus,39.27606,-77.213088 +20874,MD,Darnestown,39.17039,-77.269935 +20876,MD,Germantown,39.188001,-77.235829 +20877,MD,Gaithersburg,39.14187,-77.188993 +20878,MD,Darnestown,39.115534,-77.236434 +20879,MD,Laytonsville,39.172597,-77.194599 +20882,MD,Laytonsville,39.238345,-77.174718 +20895,MD,Kensington,39.029803,-77.079281 +20901,MD,Silver Spring,39.019106,-77.007613 +20902,MD,Wheaton,39.04158,-77.046348 +20903,MD,Silver Spring,39.009513,-76.984648 +20904,MD,Colesville,39.06524,-76.976399 +20905,MD,Colesville,39.102438,-76.989928 +20906,MD,Aspen Hill,39.081041,-77.063233 +20910,MD,Silver Spring,38.998198,-77.033776 +20912,MD,Takoma Park,38.983214,-77.000715 +21001,MD,Aberdeen,39.510886,-76.18054 +21005,MD,Aberdeen Proving,39.472434,-76.130295 +21009,MD,Abingdon,39.47444,-76.299726 +21010,MD,Gunpowder,39.398249,-76.274261 +21012,MD,Arnold,39.047587,-76.49406 +21013,MD,Baldwin,39.519395,-76.492711 +21014,MD,Bel Air,39.539367,-76.356431 +21015,MD,Bel Air,39.530252,-76.315329 +21017,MD,Belcamp,39.475626,-76.242011 +21021,MD,Bradshaw,39.428113,-76.3894 +21028,MD,Churchville,39.564845,-76.248962 +21029,MD,Clarksville,39.194362,-76.942271 +21030,MD,Cockeysville Hun,39.473554,-76.628655 +21031,MD,Cockeysville Hun,39.502623,-76.659844 +21032,MD,Crownsville,39.048889,-76.593477 +21034,MD,Darlington,39.654032,-76.227795 +21035,MD,Davidsonville,38.937364,-76.637542 +21036,MD,Dayton,39.233882,-76.996755 +21037,MD,Edgewater Beach,38.922511,-76.540374 +21040,MD,Edgewood,39.427725,-76.30555 +21042,MD,Ellicott City,39.272632,-76.861362 +21043,MD,Daniels,39.258216,-76.803929 +21044,MD,Columbia,39.214103,-76.878807 +21045,MD,Columbia,39.205052,-76.83223 +21046,MD,Columbia,39.170236,-76.853796 +21047,MD,Fallston,39.527048,-76.43277 +21048,MD,Patapsco,39.508645,-76.909862 +21050,MD,Forest Hill,39.57549,-76.400767 +21051,MD,Fork,39.472937,-76.450361 +21053,MD,Freeland,39.693957,-76.722349 +21054,MD,Gambrills,39.04069,-76.681877 +21056,MD,Gibson Island,39.07511,-76.432418 +21057,MD,Glen Arm,39.457484,-76.515331 +21061,MD,Glen Burnie,39.158968,-76.618862 +21071,MD,Glyndon,39.492782,-76.787568 +21074,MD,Greenmount,39.61352,-76.849397 +21076,MD,Hanover,39.155069,-76.721535 +21078,MD,Havre De Grace,39.552312,-76.117144 +21082,MD,Hydes,39.474049,-76.469538 +21084,MD,Jarrettsville,39.616241,-76.468427 +21085,MD,Joppa,39.424208,-76.354102 +21087,MD,Kingsville,39.455775,-76.41473 +21088,MD,Lineboro,39.718498,-76.839476 +21090,MD,Linthicum Height,39.208331,-76.657477 +21093,MD,Lutherville,39.438636,-76.633791 +21102,MD,Manchester,39.674746,-76.894073 +21104,MD,Marriottsville,39.334154,-76.913241 +21107,MD,Millers,39.683224,-76.823884 +21108,MD,Millersville,39.104102,-76.61902 +21111,MD,Hereford,39.576611,-76.592957 +21113,MD,Odenton,39.076197,-76.699583 +21114,MD,Crofton,39.011163,-76.680166 +21117,MD,Owings Mills,39.42688,-76.776934 +21120,MD,Bentley Springs,39.649937,-76.677591 +21122,MD,Riviera Beach,39.129284,-76.516248 +21128,MD,Perry Hall,39.401013,-76.450987 +21131,MD,Jacksonville,39.506978,-76.564623 +21132,MD,Pylesville,39.695905,-76.411256 +21133,MD,Randallstown,39.374571,-76.800245 +21136,MD,Reisterstown,39.45996,-76.813452 +21140,MD,Riva,38.950391,-76.585437 +21144,MD,Severn,39.127543,-76.697953 +21146,MD,Severna Park,39.081078,-76.557746 +21152,MD,Glencoe,39.543086,-76.669109 +21154,MD,Rocks,39.649928,-76.330174 +21155,MD,Fowbelsburg,39.56394,-76.81623 +21156,MD,Upper Falls,39.43967,-76.400604 +21157,MD,Carrollton,39.555654,-76.99404 +21158,MD,Uniontown,39.655464,-77.036946 +21160,MD,Whiteford,39.707709,-76.316015 +21161,MD,White Hall,39.66176,-76.566639 +21162,MD,White Marsh,39.392315,-76.413189 +21163,MD,Granite,39.339151,-76.85757 +21201,MD,Baltimore,39.29463,-76.625203 +21202,MD,Baltimore,39.299844,-76.607499 +21204,MD,Eudowood,39.402517,-76.603224 +21205,MD,Baltimore,39.300871,-76.579915 +21206,MD,Baltimore,39.336494,-76.541135 +21207,MD,Gwynn Oak,39.329628,-76.734064 +21208,MD,Pikesville,39.376359,-76.729013 +21209,MD,Baltimore,39.371622,-76.674431 +21210,MD,Baltimore,39.350727,-76.632099 +21211,MD,Baltimore,39.331642,-76.633625 +21212,MD,Baltimore,39.362571,-76.609989 +21213,MD,Baltimore,39.312667,-76.581012 +21214,MD,Baltimore,39.35206,-76.564375 +21215,MD,Baltimore,39.344572,-76.679397 +21216,MD,Baltimore,39.309349,-76.669891 +21217,MD,Baltimore,39.306416,-76.639267 +21218,MD,Baltimore,39.3265,-76.6048 +21219,MD,Dundalk Sparrows,39.229068,-76.446937 +21220,MD,Middle River,39.340098,-76.415255 +21221,MD,Essex,39.308553,-76.453259 +21222,MD,Dundalk Sparrows,39.26486,-76.502484 +21223,MD,Baltimore,39.287,-76.647586 +21224,MD,Baltimore,39.287558,-76.556831 +21225,MD,Brooklyn Curtis,39.233343,-76.615026 +21226,MD,Brooklyn Curtis,39.209315,-76.569147 +21227,MD,Halethorpe,39.230893,-76.696872 +21228,MD,Catonsville,39.27825,-76.740124 +21229,MD,Baltimore,39.285645,-76.689885 +21230,MD,Baltimore,39.269943,-76.626193 +21231,MD,Baltimore,39.289193,-76.589956 +21234,MD,Parkville,39.387581,-76.541767 +21236,MD,Nottingham,39.391412,-76.487106 +21237,MD,Rosedale,39.336054,-76.501387 +21239,MD,Baltimore,39.360977,-76.589082 +21240,MD,Baltimore,39.17185,-76.648287 +21401,MD,Cape Saint Clair,38.999645,-76.503139 +21402,MD,Naval Academy,38.982436,-76.48079 +21403,MD,Annapolis,38.952394,-76.49103 +21502,MD,Cresaptown,39.644796,-78.777442 +21520,MD,Accident,39.635504,-79.308467 +21521,MD,Barton,39.533135,-79.02813 +21522,MD,Bittinger,39.597786,-79.214247 +21523,MD,Bloomington,39.487764,-79.113707 +21530,MD,Flintstone,39.699288,-78.573949 +21531,MD,Friendsville,39.666502,-79.421912 +21532,MD,Frostburg,39.649359,-78.930559 +21536,MD,Jennings,39.684436,-79.151665 +21538,MD,Shallmar,39.396275,-79.202528 +21539,MD,Lonaconing,39.575703,-78.991477 +21540,MD,Luke,39.477392,-79.059365 +21541,MD,Sang Run,39.559709,-79.364134 +21545,MD,Mount Savage,39.699128,-78.873892 +21550,MD,Deer Park,39.399993,-79.38966 +21555,MD,Oldtown,39.584598,-78.604373 +21557,MD,Rawlings,39.521363,-78.906231 +21561,MD,Swanton,39.476361,-79.240165 +21562,MD,Mccoole,39.482625,-79.030726 +21601,MD,Easton,38.77682,-76.075775 +21607,MD,Barclay,39.129871,-75.860079 +21610,MD,Betterton,39.365509,-76.063938 +21612,MD,Bozman,38.751493,-76.27641 +21613,MD,Cambridge,38.564282,-76.087358 +21617,MD,Centreville,39.056423,-76.044975 +21619,MD,Chester,38.958296,-76.284183 +21620,MD,Chestertown,39.212517,-76.080214 +21622,MD,Church Creek,38.427815,-76.169569 +21623,MD,Church Hill,39.145958,-75.988028 +21625,MD,Cordova,38.870426,-76.002879 +21626,MD,Crapo,38.329541,-76.114207 +21628,MD,Crumpton,39.233019,-75.919522 +21629,MD,Denton,38.877928,-75.836071 +21631,MD,East New Market,38.592095,-75.956766 +21632,MD,Federalsburg,38.714681,-75.775376 +21634,MD,Fishing Creek,38.316292,-76.216783 +21635,MD,Galena,39.337417,-75.871673 +21636,MD,Goldsboro,39.022957,-75.792604 +21637,MD,Golts,39.355598,-75.805521 +21638,MD,Grasonville,38.945602,-76.199701 +21639,MD,Greensboro,38.961632,-75.805911 +21640,MD,Henderson,39.067197,-75.794787 +21643,MD,Williamsburg,38.642826,-75.866254 +21644,MD,Ingleside,39.124654,-75.891748 +21645,MD,Kennedyville,39.297835,-75.981797 +21647,MD,Mcdaniel,38.819213,-76.280593 +21649,MD,Marydel,39.108169,-75.762247 +21650,MD,Massey,39.312569,-75.821483 +21651,MD,Millington,39.257989,-75.849966 +21654,MD,Oxford,38.686358,-76.153783 +21655,MD,Preston,38.746456,-75.916284 +21657,MD,Queen Anne,38.945583,-75.977655 +21658,MD,Queenstown,38.956235,-76.152646 +21659,MD,Rhodesdale,38.602985,-75.774945 +21660,MD,Ridgely,38.956787,-75.884825 +21661,MD,Rock Hall,39.134371,-76.230467 +21662,MD,Royal Oak,38.72883,-76.187788 +21663,MD,Saint Michaels,38.782965,-76.221547 +21665,MD,Sherwood,38.73741,-76.327822 +21666,MD,Stevensville,38.939399,-76.337087 +21667,MD,Still Pond,39.327624,-76.052156 +21668,MD,Sudlersville,39.182339,-75.849968 +21669,MD,Taylors Island,38.463095,-76.296406 +21671,MD,Tilghman,38.706309,-76.337653 +21672,MD,Toddville,38.272592,-76.059634 +21673,MD,Trappe,38.66466,-76.05067 +21675,MD,Wingate,38.289898,-76.086303 +21676,MD,Wittman,38.789187,-76.29931 +21677,MD,Woolford,38.5066,-76.204057 +21678,MD,Worton,39.296346,-76.10078 +21679,MD,Wye Mills,38.928114,-76.081366 +21701,MD,Lewistown,39.408235,-77.400875 +21702,MD,Fort Detrick,39.436532,-77.447369 +21710,MD,Doubs,39.306452,-77.447693 +21711,MD,Big Pool,39.645685,-78.010449 +21713,MD,Fahrney Keedy Me,39.532244,-77.683522 +21716,MD,Brunswick,39.316356,-77.623002 +21718,MD,Burkittsville,39.397066,-77.626508 +21719,MD,Fort Ritchie,39.707341,-77.495609 +21722,MD,Big Spring,39.661693,-77.912592 +21723,MD,Cooksville,39.321109,-77.005076 +21725,MD,Detour,39.614661,-77.248272 +21727,MD,Emmitsburg,39.694044,-77.335658 +21733,MD,Fair Play,39.542279,-77.761468 +21737,MD,Glenelg,39.262064,-77.005703 +21738,MD,Glenwood,39.279519,-77.014821 +21740,MD,Hagerstown,39.632022,-77.737215 +21742,MD,Hagerstown,39.657291,-77.692102 +21750,MD,Hancock,39.699083,-78.176246 +21754,MD,Ijamsville,39.326737,-77.296363 +21755,MD,Jefferson,39.365291,-77.544061 +21756,MD,Keedysville,39.456323,-77.694427 +21757,MD,Keymar,39.565619,-77.281661 +21758,MD,Knoxville,39.347891,-77.651286 +21764,MD,Linwood,39.577654,-77.118443 +21766,MD,Little Orleans,39.687593,-78.378139 +21767,MD,Maugansville,39.6996,-77.749915 +21769,MD,Middletown,39.441586,-77.550241 +21770,MD,Monrovia,39.351248,-77.249442 +21771,MD,Mount Airy,39.388131,-77.172347 +21773,MD,Myersville,39.528194,-77.551322 +21776,MD,New Windsor,39.516233,-77.103397 +21777,MD,Point Of Rocks,39.279089,-77.532762 +21778,MD,Rocky Ridge,39.605696,-77.329635 +21779,MD,Rohrersville,39.443052,-77.657977 +21780,MD,Sabillasville,39.682772,-77.469323 +21782,MD,Sharpsburg,39.442394,-77.751072 +21783,MD,Smithsburg,39.647036,-77.570563 +21784,MD,Carrolltowne,39.39887,-76.961439 +21787,MD,Taneytown,39.665798,-77.169058 +21788,MD,Graceham,39.606576,-77.405114 +21790,MD,Tuscarora,39.266689,-77.51011 +21791,MD,Unionville,39.541484,-77.194346 +21793,MD,Walkersville,39.47875,-77.34839 +21794,MD,West Friendship,39.293447,-76.966031 +21795,MD,Williamsport,39.593023,-77.808705 +21797,MD,Woodbine,39.346438,-77.064698 +21798,MD,Woodsboro,39.531121,-77.297187 +21801,MD,Salisbury,38.362996,-75.592238 +21811,MD,Berlin,38.347514,-75.186557 +21813,MD,Bishopville,38.429609,-75.185544 +21814,MD,Bivalve,38.295337,-75.89141 +21816,MD,Chance,38.178504,-75.939192 +21817,MD,Crisfield,37.984496,-75.842882 +21820,MD,Dames Quarter,38.190568,-75.900082 +21821,MD,Deal Island,38.153326,-75.949559 +21822,MD,Eden,38.276155,-75.648167 +21824,MD,Ewell,37.99379,-76.03506 +21826,MD,Fruitland,38.322523,-75.622782 +21829,MD,Girdletree,38.095815,-75.390232 +21830,MD,Hebron,38.402597,-75.696267 +21835,MD,Linkwood,38.540317,-75.963015 +21837,MD,Mardela Springs,38.486386,-75.741442 +21838,MD,Marion Station,38.026637,-75.757903 +21840,MD,Nanticoke,38.267211,-75.902127 +21841,MD,Newark,38.248875,-75.289316 +21842,MD,Ocean City,38.379248,-75.081011 +21849,MD,Parsonsburg,38.391392,-75.473658 +21850,MD,Pittsville,38.375465,-75.407589 +21851,MD,Pocomoke City,38.071369,-75.555038 +21853,MD,Princess Anne,38.191929,-75.707237 +21856,MD,Quantico,38.333888,-75.785102 +21858,MD,21858,37.977403,-76.039838 +21863,MD,Snow Hill,38.186794,-75.404987 +21864,MD,Stockton,38.045155,-75.410762 +21865,MD,Tyaskin,38.30706,-75.869032 +21866,MD,Tylerton,37.967436,-76.023036 +21869,MD,Vienna,38.477376,-75.872926 +21870,MD,Wenona,38.133222,-75.944021 +21871,MD,Westover,38.10099,-75.740563 +21872,MD,Whaleysville,38.404169,-75.288868 +21874,MD,Willards,38.393853,-75.355161 +21875,MD,Delmar,38.44451,-75.55828 +21901,MD,North East,39.604535,-75.953805 +21903,MD,Perryville,39.564894,-76.059227 +21904,MD,Bainbridge,39.622264,-76.083706 +21911,MD,Rising Sun,39.688176,-76.049164 +21912,MD,Warwick,39.428261,-75.799592 +21913,MD,Cecilton,39.40151,-75.865395 +21914,MD,Charlestown,39.57287,-75.979537 +21915,MD,Chesapeake City,39.513308,-75.840581 +21917,MD,Colora,39.669515,-76.093364 +21918,MD,Conowingo,39.67775,-76.157198 +21919,MD,Earleville,39.427105,-75.94031 +21921,MD,Elkton,39.626434,-75.84584 +1001,MA,Agawam,42.070206,-72.622739 +1002,MA,Cushman,42.377017,-72.51565 +1005,MA,Barre,42.409698,-72.108354 +1007,MA,Belchertown,42.275103,-72.410953 +1008,MA,Blandford,42.182949,-72.936114 +1010,MA,Brimfield,42.116543,-72.188455 +1011,MA,Chester,42.279421,-72.988761 +1012,MA,Chesterfield,42.38167,-72.833309 +1013,MA,Chicopee,42.162046,-72.607962 +1020,MA,Chicopee,42.176443,-72.576142 +1022,MA,Westover Afb,42.196672,-72.558657 +1026,MA,Cummington,42.435296,-72.905767 +1027,MA,Mount Tom,42.264319,-72.679921 +1028,MA,East Longmeadow,42.067203,-72.505565 +1030,MA,Feeding Hills,42.07182,-72.675077 +1031,MA,Gilbertville,42.332194,-72.198585 +1032,MA,Goshen,42.466234,-72.844092 +1033,MA,Granby,42.255704,-72.520001 +1034,MA,Tolland,42.070234,-72.908793 +1035,MA,Hadley,42.36062,-72.571499 +1036,MA,Hampden,42.064756,-72.431823 +1038,MA,Hatfield,42.38439,-72.616735 +1039,MA,Haydenville,42.381799,-72.703178 +1040,MA,Holyoke,42.202007,-72.626193 +1050,MA,Huntington,42.265301,-72.873341 +1053,MA,Leeds,42.354292,-72.703403 +1054,MA,Leverett,42.46823,-72.499334 +1056,MA,Ludlow,42.172823,-72.471012 +1057,MA,Monson,42.101017,-72.319634 +1060,MA,Florence,42.324662,-72.654245 +1068,MA,Oakham,42.348033,-72.051265 +1069,MA,Palmer,42.176233,-72.328785 +1070,MA,Plainfield,42.514393,-72.918289 +1071,MA,Russell,42.147063,-72.840343 +1072,MA,Shutesbury,42.481968,-72.421342 +1073,MA,Southampton,42.224697,-72.719381 +1075,MA,South Hadley,42.237537,-72.581137 +1077,MA,Southwick,42.051099,-72.770588 +1080,MA,Three Rivers,42.181894,-72.362352 +1081,MA,Wales,42.062734,-72.204592 +1082,MA,Ware,42.261831,-72.258285 +1085,MA,Montgomery,42.129484,-72.754318 +1089,MA,West Springfield,42.115066,-72.641109 +1092,MA,West Warren,42.20734,-72.203639 +1095,MA,Wilbraham,42.124506,-72.446415 +1096,MA,Williamsburg,42.408522,-72.777989 +1098,MA,Worthington,42.384293,-72.931427 +1103,MA,Springfield,42.1029,-72.588735 +1104,MA,Springfield,42.128848,-72.577769 +1105,MA,Springfield,42.099931,-72.578312 +1106,MA,Longmeadow,42.050658,-72.5676 +1107,MA,Springfield,42.117907,-72.606544 +1108,MA,Springfield,42.085314,-72.558432 +1109,MA,Springfield,42.114455,-72.554349 +1118,MA,Springfield,42.092937,-72.527445 +1119,MA,Springfield,42.12473,-72.51211 +1128,MA,Springfield,42.094397,-72.488903 +1129,MA,Springfield,42.122263,-72.487622 +1151,MA,Indian Orchard,42.153225,-72.505048 +1201,MA,Pittsfield,42.453086,-73.247088 +1220,MA,Adams,42.622319,-73.117225 +1222,MA,Ashley Falls,42.059552,-73.320195 +1223,MA,Becket,42.359363,-73.120325 +1225,MA,Cheshire,42.561059,-73.157964 +1226,MA,Dalton,42.475046,-73.160259 +1230,MA,Great Barrington,42.195922,-73.36065 +1235,MA,Peru,42.434604,-73.092433 +1236,MA,Housatonic,42.265296,-73.374544 +1237,MA,Hancock,42.541961,-73.248737 +1238,MA,Lee,42.298994,-73.231696 +1240,MA,Lenox,42.364241,-73.271322 +1243,MA,Middlefield,42.34795,-73.006226 +1245,MA,West Otis,42.187847,-73.213452 +1247,MA,Clarksburg,42.69865,-73.10999 +1253,MA,Otis,42.18988,-73.082093 +1254,MA,Richmond,42.378398,-73.364457 +1255,MA,Sandisfield,42.109429,-73.116285 +1256,MA,Savoy,42.576964,-73.023281 +1257,MA,Sheffield,42.100102,-73.361091 +1258,MA,South Egremont,42.101153,-73.456575 +1259,MA,Southfield,42.078014,-73.260933 +1262,MA,Stockbridge,42.30104,-73.322263 +1266,MA,West Stockbridge,42.334752,-73.38251 +1267,MA,Williamstown,42.708883,-73.20364 +1270,MA,Windsor,42.509494,-73.04661 +1301,MA,Leyden,42.601222,-72.601847 +1330,MA,Ashfield,42.523207,-72.810998 +1331,MA,New Salem,42.592065,-72.214644 +1337,MA,Leyden,42.683784,-72.563439 +1338,MA,Buckland,42.615174,-72.764124 +1339,MA,Hawley,42.621802,-72.880162 +1340,MA,Colrain,42.67905,-72.726508 +1341,MA,Conway,42.513832,-72.702473 +1342,MA,Deerfield,42.540636,-72.607234 +1344,MA,Erving,42.604957,-72.416638 +1346,MA,Heath,42.685347,-72.839101 +1349,MA,Millers Falls,42.576206,-72.494626 +1350,MA,Monroe,42.723885,-72.960156 +1351,MA,Montague,42.542864,-72.532837 +1355,MA,New Salem,42.514643,-72.306241 +1360,MA,Northfield,42.688705,-72.450995 +1364,MA,New Salem,42.591231,-72.305867 +1366,MA,Petersham,42.489761,-72.189349 +1367,MA,Rowe,42.695289,-72.925776 +1370,MA,Shelburne Falls,42.602203,-72.739059 +1373,MA,South Deerfield,42.475616,-72.615268 +1375,MA,Sunderland,42.453947,-72.567569 +1376,MA,Turners Falls,42.606521,-72.54701 +1379,MA,Wendell,42.565644,-72.400851 +1420,MA,Fitchburg,42.579563,-71.803133 +1430,MA,Ashburnham,42.649614,-71.92666 +1431,MA,Ashby,42.674462,-71.817369 +1432,MA,Ayer,42.55914,-71.578763 +1433,MA,Ft Devens,42.532416,-71.621819 +1436,MA,Baldwinville,42.593568,-72.064647 +1440,MA,Gardner,42.57405,-71.9898 +1450,MA,Groton,42.612351,-71.558371 +1451,MA,Harvard,42.498565,-71.575293 +1452,MA,Hubbardston,42.486538,-72.001159 +1453,MA,Leominster,42.52744,-71.756308 +1460,MA,Littleton,42.540132,-71.487667 +1462,MA,Lunenburg,42.58843,-71.726642 +1463,MA,Pepperell,42.668888,-71.593392 +1464,MA,Shirley Center,42.558653,-71.646444 +1468,MA,Templeton,42.545976,-72.064971 +1469,MA,Townsend,42.652511,-71.689646 +1473,MA,Westminster,42.548319,-71.909599 +1474,MA,W Townsend,42.670404,-71.74057 +1475,MA,Winchendon,42.678943,-72.047524 +1501,MA,Auburn,42.205502,-71.839144 +1503,MA,Berlin,42.384438,-71.635634 +1504,MA,Blackstone,42.028708,-71.52691 +1505,MA,Boylston,42.337727,-71.731042 +1506,MA,Brookfield,42.199141,-72.098887 +1507,MA,Charlton,42.137902,-71.966384 +1510,MA,Clinton,42.418147,-71.682847 +1515,MA,East Brookfield,42.219308,-72.048078 +1516,MA,East Douglas,42.060566,-71.726611 +1518,MA,Fiskdale,42.122762,-72.117764 +1519,MA,Grafton,42.200371,-71.686848 +1520,MA,Holden,42.341983,-71.84142 +1521,MA,Holland,42.040264,-72.154373 +1522,MA,Jefferson,42.375519,-71.87058 +1523,MA,Lancaster,42.450984,-71.686831 +1524,MA,Leicester,42.237047,-71.918829 +1527,MA,Millbury,42.196779,-71.764438 +1529,MA,Millville,42.033102,-71.579813 +1531,MA,New Braintree,42.31977,-72.130642 +1532,MA,Northborough,42.318242,-71.646372 +1534,MA,Northbridge,42.1494,-71.656366 +1535,MA,North Brookfield,42.266455,-72.082129 +1536,MA,North Grafton,42.229726,-71.703691 +1537,MA,North Oxford,42.16549,-71.885953 +1540,MA,Oxford,42.11285,-71.868677 +1541,MA,Princeton,42.450812,-71.876245 +1542,MA,Rochdale,42.199685,-71.906882 +1543,MA,Rutland,42.376199,-71.948951 +1545,MA,Shrewsbury,42.284801,-71.720503 +1550,MA,Southbridge,42.075024,-72.035347 +1560,MA,South Grafton,42.176042,-71.692725 +1562,MA,Spencer,42.244103,-71.990617 +1564,MA,Sterling,42.435351,-71.775192 +1566,MA,Sturbridge,42.112619,-72.084233 +1568,MA,West Upton,42.173275,-71.608014 +1569,MA,Uxbridge,42.074426,-71.632869 +1570,MA,Dudley Hill,42.047574,-71.839467 +1571,MA,Dudley,42.048894,-71.893228 +1581,MA,Westborough,42.267891,-71.617604 +1583,MA,West Boylston,42.35836,-71.783822 +1585,MA,West Brookfield,42.244137,-72.151137 +1588,MA,Whitinsville,42.115319,-71.664357 +1590,MA,Wilkinsonville,42.140586,-71.748416 +1602,MA,Worcester,42.270251,-71.841678 +1603,MA,Worcester,42.245033,-71.837995 +1604,MA,Worcester,42.254084,-71.774626 +1605,MA,Worcester,42.289391,-71.788795 +1606,MA,Worcester,42.311029,-71.795774 +1607,MA,Worcester,42.230294,-71.793837 +1608,MA,Worcester,42.262425,-71.800262 +1609,MA,Worcester,42.275387,-71.817456 +1610,MA,Worcester,42.249186,-71.810798 +1611,MA,Cherry Valley,42.237287,-71.874971 +1612,MA,Paxton,42.306646,-71.920234 +1701,MA,Framingham,42.300665,-71.425486 +1718,MA,Village Of Nagog,42.514941,-71.422354 +1719,MA,Boxboro,42.486876,-71.518229 +1720,MA,Acton,42.475076,-71.448255 +1721,MA,Ashland,42.253909,-71.458347 +1730,MA,Bedford,42.484287,-71.276796 +1740,MA,Bolton,42.436523,-71.607593 +1741,MA,Carlisle,42.528562,-71.351892 +1742,MA,Concord,42.456701,-71.374741 +1745,MA,Southborough,42.293221,-71.502256 +1746,MA,Holliston,42.202641,-71.436059 +1747,MA,Hopedale,42.126796,-71.537601 +1748,MA,Hopkinton,42.219046,-71.530178 +1749,MA,Hudson,42.391796,-71.560896 +1752,MA,Marlborough,42.350861,-71.543355 +1754,MA,Maynard,42.432118,-71.454975 +1756,MA,Mendon,42.096744,-71.549882 +1757,MA,Milford,42.151142,-71.527402 +1760,MA,Natick,42.287476,-71.35741 +1770,MA,Sherborn,42.233088,-71.378717 +1772,MA,Southborough,42.293919,-71.531997 +1773,MA,Lincoln,42.421723,-71.313723 +1775,MA,Stow,42.430785,-71.515019 +1776,MA,Sudbury,42.383655,-71.428159 +1778,MA,Wayland,42.348629,-71.358781 +1801,MA,Woburn,42.482894,-71.157404 +1803,MA,Burlington,42.508942,-71.200437 +1810,MA,Andover,42.64956,-71.156481 +1821,MA,Billerica,42.551874,-71.251754 +1824,MA,South Chelmsford,42.59356,-71.357521 +1826,MA,Dracut,42.676422,-71.318592 +1827,MA,Dunstable,42.673917,-71.495201 +1830,MA,Haverhill,42.785605,-71.072057 +1832,MA,Haverhill,42.779154,-71.109519 +1833,MA,Georgetown,42.728067,-70.982239 +1834,MA,Groveland,42.753027,-71.027018 +1835,MA,Bradford,42.758597,-71.08549 +1840,MA,Lawrence,42.707958,-71.16381 +1841,MA,Lawrence,42.711545,-71.166997 +1843,MA,Lawrence,42.691053,-71.160506 +1844,MA,Methuen,42.728019,-71.181031 +1845,MA,North Andover,42.682583,-71.109004 +1850,MA,Lowell,42.656035,-71.305078 +1851,MA,Lowell,42.631548,-71.332882 +1852,MA,Lowell,42.634413,-71.298331 +1854,MA,Lowell,42.649254,-71.335464 +1860,MA,Merrimac,42.834629,-71.004658 +1862,MA,North Billerica,42.575694,-71.290217 +1863,MA,North Chelmsford,42.634737,-71.390834 +1864,MA,North Reading,42.581898,-71.094711 +1867,MA,Reading,42.527986,-71.109021 +1876,MA,Tewksbury,42.60283,-71.223224 +1879,MA,Tyngsboro,42.672383,-71.415766 +1880,MA,Wakefield,42.500886,-71.068471 +1886,MA,Graniteville,42.589959,-71.438143 +1887,MA,Wilmington,42.558143,-71.172306 +1890,MA,Winchester,42.453028,-71.14407 +1901,MA,Lynn,42.463378,-70.945516 +1902,MA,Lynn,42.469814,-70.941989 +1904,MA,East Lynn,42.487453,-70.962798 +1905,MA,West Lynn,42.46453,-70.973825 +1906,MA,Saugus,42.463344,-71.011093 +1907,MA,Swampscott,42.474611,-70.909774 +1908,MA,Nahant,42.426098,-70.927739 +1913,MA,Amesbury,42.855879,-70.936681 +1915,MA,Beverly,42.560825,-70.875939 +1921,MA,Boxford,42.679719,-71.011372 +1922,MA,Byfield,42.756792,-70.935053 +1923,MA,Danvers,42.569402,-70.942461 +1929,MA,Essex,42.628629,-70.782794 +1930,MA,Gloucester,42.620836,-70.672149 +1938,MA,Ipswich,42.680877,-70.849353 +1940,MA,Lynnfield,42.532711,-71.033873 +1944,MA,Manchester,42.57963,-70.767434 +1945,MA,Marblehead,42.498431,-70.865291 +1949,MA,Middleton,42.594184,-71.013004 +1950,MA,Newburyport,42.812964,-70.884668 +1951,MA,Newbury,42.783475,-70.847377 +1952,MA,Salisbury,42.850678,-70.858822 +1960,MA,Peabody,42.532579,-70.961194 +1966,MA,Rockport,42.657973,-70.619424 +1969,MA,Rowley,42.713753,-70.90696 +1970,MA,Salem,42.515114,-70.900343 +1982,MA,South Hamilton,42.618478,-70.856132 +1983,MA,Topsfield,42.641546,-70.948843 +1984,MA,Wenham,42.60166,-70.878622 +1985,MA,West Newbury,42.794865,-70.977811 +2019,MA,Bellingham,42.074573,-71.476829 +2021,MA,Canton,42.164454,-71.135536 +2025,MA,Cohasset,42.239484,-70.812788 +2026,MA,Dedham,42.243685,-71.163741 +2030,MA,Dover,42.236233,-71.285363 +2032,MA,East Walpole,42.15324,-71.2179 +2035,MA,Foxboro,42.064938,-71.244127 +2038,MA,Franklin,42.09347,-71.405786 +2043,MA,Hingham,42.224485,-70.891051 +2045,MA,Hull,42.285346,-70.875442 +2048,MA,Mansfield,42.021238,-71.217775 +2050,MA,Marshfield,42.106177,-70.69931 +2052,MA,Medfield,42.184525,-71.304813 +2053,MA,Medway,42.151363,-71.421715 +2054,MA,Millis,42.166938,-71.360693 +2056,MA,Norfolk,42.117746,-71.326934 +2061,MA,Norwell,42.159574,-70.82172 +2062,MA,Norwood,42.186843,-71.203313 +2066,MA,Scituate,42.203235,-70.752476 +2067,MA,Sharon,42.109388,-71.175872 +2071,MA,South Walpole,42.099203,-71.275235 +2072,MA,Stoughton,42.125279,-71.107357 +2081,MA,Walpole,42.144413,-71.254391 +2090,MA,Westwood,42.214824,-71.210426 +2093,MA,Wrentham,42.061746,-71.339568 +2108,MA,Boston,42.357603,-71.068432 +2109,MA,Boston,42.362963,-71.053386 +2110,MA,Boston,42.357636,-71.051417 +2111,MA,Boston,42.350348,-71.0629 +2113,MA,Boston,42.365656,-71.055958 +2114,MA,Boston,42.361111,-71.06823 +2115,MA,Boston,42.342706,-71.092215 +2116,MA,Boston,42.349201,-71.076798 +2118,MA,Roxbury,42.340154,-71.075627 +2119,MA,Roxbury,42.322414,-71.086923 +2120,MA,Roxbury,42.332844,-71.097978 +2121,MA,Dorchester,42.307503,-71.08305 +2122,MA,Dorchester,42.297278,-71.058304 +2124,MA,Dorchester,42.287984,-71.072898 +2125,MA,Dorchester,42.315305,-71.061924 +2126,MA,Mattapan,42.273889,-71.093871 +2127,MA,South Boston,42.333454,-71.043792 +2128,MA,East Boston,42.378137,-71.028682 +2129,MA,Charlestown,42.377815,-71.062715 +2130,MA,Jamaica Plain,42.312596,-71.111495 +2131,MA,Roslindale,42.283615,-71.129543 +2132,MA,West Roxbury,42.27868,-71.158868 +2134,MA,Allston,42.353519,-71.132866 +2135,MA,Brighton,42.34779,-71.156599 +2136,MA,Hyde Park,42.253989,-71.126052 +2138,MA,Cambridge,42.377045,-71.125611 +2139,MA,Cambridge,42.364688,-71.104155 +2140,MA,North Cambridge,42.391366,-71.129379 +2141,MA,East Cambridge,42.370701,-71.088277 +2142,MA,Cambridge,42.362025,-71.083011 +2143,MA,Somerville,42.382945,-71.102814 +2144,MA,Somerville,42.40032,-71.122059 +2145,MA,Somerville,42.390678,-71.092944 +2146,MA,Brookline,42.339158,-71.128917 +2148,MA,Malden,42.42911,-71.060507 +2149,MA,Everett,42.411199,-71.051448 +2150,MA,Chelsea,42.396252,-71.032521 +2151,MA,Revere,42.413767,-71.005165 +2152,MA,Winthrop,42.376294,-70.980043 +2154,MA,North Waltham,42.382492,-71.236497 +2155,MA,Medford,42.417335,-71.108686 +2158,MA,Newtonville,42.353835,-71.1902 +2159,MA,Newton Center,42.318889,-71.191839 +2160,MA,Newtonville,42.351961,-71.208771 +2161,MA,Newton Highlands,42.318512,-71.209347 +2162,MA,Newtonville,42.330296,-71.258025 +2163,MA,Cambridge,42.364005,-71.141879 +2164,MA,Newton Upper Fal,42.312562,-71.221615 +2165,MA,Newtonville,42.352366,-71.22795 +2166,MA,Auburndale,42.345928,-71.247598 +2167,MA,Boston College,42.31903,-71.16272 +2168,MA,Waban,42.327049,-71.230703 +2169,MA,Quincy,42.249133,-70.997816 +2170,MA,Quincy,42.26713,-71.018644 +2171,MA,Quincy,42.282519,-71.024141 +2172,MA,East Watertown,42.371497,-71.180266 +2173,MA,Lexington,42.445384,-71.225916 +2174,MA,Arlington,42.417098,-71.162517 +2176,MA,Melrose,42.458066,-71.063191 +2178,MA,Belmont,42.389656,-71.174647 +2180,MA,Stoneham,42.482778,-71.0978 +2181,MA,Wellesley,42.305593,-71.287966 +2184,MA,Braintree,42.209284,-70.996304 +2186,MA,Milton,42.253663,-71.077051 +2188,MA,Weymouth,42.211327,-70.958248 +2189,MA,Weymouth,42.211606,-70.931671 +2190,MA,Weymouth,42.172817,-70.94869 +2191,MA,Weymouth,42.243564,-70.944318 +2192,MA,Needham,42.278908,-71.235172 +2193,MA,Weston,42.359422,-71.300291 +2194,MA,Needham,42.297702,-71.234363 +2199,MA,Boston,42.347873,-71.082543 +2210,MA,Boston,42.348921,-71.046511 +2215,MA,Boston,42.347088,-71.102689 +2322,MA,Avon,42.125825,-71.043738 +2324,MA,Bridgewater,41.977341,-70.97234 +2330,MA,Carver,41.888265,-70.767754 +2332,MA,Duxbury,42.039936,-70.716257 +2333,MA,East Bridgewater,42.031478,-70.944964 +2338,MA,Halifax,42.000159,-70.844794 +2339,MA,Hanover,42.121406,-70.857006 +2341,MA,Hanson,42.061627,-70.865053 +2343,MA,Holbrook,42.14641,-71.008273 +2346,MA,Middleboro,41.888396,-70.892965 +2347,MA,Lakeville,41.837377,-70.958195 +2351,MA,Abington,42.116715,-70.954293 +2356,MA,North Easton,42.058956,-71.112337 +2359,MA,Pembroke,42.062072,-70.804404 +2360,MA,Plymouth,41.910404,-70.642004 +2364,MA,Kingston,41.995022,-70.740993 +2367,MA,Plympton,41.96549,-70.804582 +2368,MA,Randolph,42.173587,-71.051392 +2370,MA,Rockland,42.129286,-70.913263 +2375,MA,South Easton,42.025704,-71.098814 +2379,MA,West Bridgewater,42.025511,-71.016054 +2382,MA,Whitman,42.081603,-70.938127 +2401,MA,Brockton,42.081571,-71.034348 +2402,MA,Brockton,42.088396,-71.001947 +2532,MA,Onset,41.752918,-70.593168 +2535,MA,Chilmark,41.357523,-70.741613 +2536,MA,Teaticket,41.58504,-70.565174 +2537,MA,East Sandwich,41.684603,-70.46822 +2538,MA,East Wareham,41.768247,-70.653237 +2539,MA,Edgartown,41.388856,-70.533893 +2540,MA,Falmouth,41.564754,-70.621663 +2542,MA,Otis A F B,41.660927,-70.57383 +2543,MA,Woods Hole,41.526272,-70.66431 +2554,MA,Nantucket,41.272529,-70.093216 +2556,MA,North Falmouth,41.641677,-70.623043 +2559,MA,Pocasset,41.688115,-70.610512 +2563,MA,Sandwich,41.698304,-70.469325 +2568,MA,Vineyard Haven,41.449955,-70.593737 +2571,MA,Wareham,41.754084,-70.711594 +2575,MA,West Tisbury,41.413717,-70.655802 +2576,MA,West Wareham,41.779617,-70.764179 +2601,MA,West Yarmouth,41.653682,-70.298176 +2630,MA,Barnstable,41.698289,-70.300067 +2631,MA,Brewster,41.749179,-70.069868 +2632,MA,Centerville,41.660585,-70.353196 +2633,MA,South Chatham,41.687634,-69.980758 +2635,MA,Cotuit,41.696025,-70.433431 +2638,MA,Dennis,41.732166,-70.191054 +2639,MA,Dennis Port,41.664873,-70.132711 +2642,MA,Eastham,41.840781,-69.984865 +2644,MA,Forestdale,41.682695,-70.514317 +2645,MA,Harwich,41.70082,-70.057929 +2646,MA,Harwich Port,41.67128,-70.076755 +2648,MA,Marstons Mills,41.670274,-70.416321 +2649,MA,Mashpee,41.618116,-70.485361 +2650,MA,North Chatham,41.70298,-69.966607 +2652,MA,North Truro,42.033779,-70.08751 +2653,MA,Orleans,41.779161,-69.982198 +2655,MA,Osterville,41.63005,-70.383726 +2657,MA,Provincetown,42.053364,-70.186504 +2659,MA,South Chatham,41.680126,-70.024106 +2660,MA,South Dennis,41.709711,-70.15851 +2664,MA,Bass River,41.672805,-70.19731 +2666,MA,Truro,41.998792,-70.056362 +2667,MA,Wellfleet,41.928934,-70.018587 +2668,MA,West Barnstable,41.700212,-70.371985 +2670,MA,West Dennis,41.662557,-70.168092 +2671,MA,West Harwich,41.669367,-70.113501 +2673,MA,West Yarmouth,41.661367,-70.236297 +2675,MA,Yarmouth Port,41.705149,-70.227014 +2702,MA,Assonet,41.797458,-71.060736 +2703,MA,Attleboro,41.929599,-71.30092 +2713,MA,Cuttyhunk,41.443601,-70.87854 +2715,MA,Dighton,41.812505,-71.142723 +2717,MA,East Freetown,41.763455,-70.967709 +2718,MA,East Taunton,41.873585,-71.019225 +2719,MA,Fairhaven,41.640924,-70.889608 +2720,MA,Fall River,41.718221,-71.139991 +2721,MA,Fall River,41.688305,-71.157424 +2723,MA,Fall River,41.692612,-71.133214 +2724,MA,Fall River,41.684975,-71.174822 +2725,MA,Somerset,41.722299,-71.177971 +2726,MA,Somerset,41.756012,-71.149206 +2738,MA,Marion,41.709526,-70.761261 +2739,MA,Mattapoisett,41.661845,-70.816357 +2740,MA,New Bedford,41.634749,-70.9372 +2743,MA,Acushnet,41.6997,-70.908652 +2744,MA,New Bedford,41.612716,-70.916746 +2745,MA,New Bedford,41.691337,-70.935545 +2746,MA,New Bedford,41.659972,-70.93243 +2747,MA,North Dartmouth,41.633789,-70.995769 +2748,MA,Padanaram Villag,41.591728,-70.956521 +2760,MA,North Attleboro,41.977542,-71.329757 +2762,MA,Plainville,42.012403,-71.327454 +2763,MA,North Attleboro,41.970979,-71.310353 +2764,MA,North Dighton,41.852874,-71.148523 +2766,MA,Norton,41.971801,-71.189441 +2767,MA,Raynham,41.932361,-71.046856 +2769,MA,Rehoboth,41.85152,-71.254453 +2770,MA,Rochester,41.759082,-70.852257 +2771,MA,Seekonk,41.837835,-71.322406 +2777,MA,Swansea,41.74734,-71.212167 +2779,MA,Berkley,41.835325,-71.076534 +2780,MA,Taunton,41.905007,-71.10261 +2790,MA,Westport,41.621127,-71.089003 +48001,MI,Pearl Beach,42.630704,-82.560159 +48002,MI,Berlin,42.919864,-82.886809 +48003,MI,Almont,42.926007,-83.036221 +48004,MI,Anchorville,42.711817,-82.709392 +48005,MI,Armada,42.840903,-82.889905 +48006,MI,Greenwood,43.056424,-82.678141 +48009,MI,Birmingham,42.544396,-83.213255 +48014,MI,Mussey,43.019976,-82.925188 +48015,MI,Center Line,42.47879,-83.02477 +48017,MI,Clawson,42.536468,-83.150317 +48021,MI,Eastpointe,42.465756,-82.945896 +48022,MI,Emmett,42.987239,-82.785402 +48023,MI,Ira,42.680651,-82.637673 +48025,MI,Franklin,42.521891,-83.251852 +48026,MI,Fraser,42.542252,-82.946964 +48027,MI,Wales,43.000058,-82.621728 +48028,MI,Harsens Island,42.585043,-82.586049 +48030,MI,Hazel Park,42.460768,-83.098182 +48032,MI,Grant Township,43.134584,-82.554734 +48034,MI,Southfield,42.477676,-83.288295 +48039,MI,Cottrellville,42.721291,-82.514034 +48040,MI,Marysville,42.913534,-82.481344 +48041,MI,Riley,42.905955,-82.769623 +48043,MI,Mount Clemens,42.577562,-82.894052 +48044,MI,Macomb,42.616456,-82.946845 +48045,MI,Selfridge A N G,42.602743,-82.836395 +48047,MI,Chesterfield,42.675344,-82.780102 +48048,MI,Lenox,42.732958,-82.820248 +48049,MI,Ruby,43.026861,-82.538252 +48060,MI,Port Huron,42.995843,-82.459938 +48062,MI,Richmond,42.812743,-82.730052 +48065,MI,Bruce,42.803513,-83.019204 +48066,MI,Roseville,42.503423,-82.93868 +48067,MI,Royal Oak,42.490579,-83.136584 +48069,MI,Pleasant Ridge,42.47104,-83.143771 +48070,MI,Huntington Woods,42.482538,-83.174906 +48071,MI,Madison Heights,42.501605,-83.102699 +48072,MI,Berkley,42.502755,-83.188683 +48073,MI,Royal Oak,42.519047,-83.157027 +48074,MI,Kimball,42.922072,-82.574516 +48075,MI,Southfield,42.463831,-83.225539 +48076,MI,Lathrup Village,42.499915,-83.22971 +48079,MI,Saint Clair,42.825453,-82.513256 +48080,MI,Saint Clair Shor,42.463474,-82.900674 +48081,MI,Saint Clair Shor,42.49538,-82.899954 +48082,MI,Saint Clair Shor,42.526627,-82.886538 +48083,MI,Troy,42.559668,-83.113771 +48084,MI,Troy,42.562696,-83.179947 +48089,MI,Warren,42.468494,-82.997385 +48091,MI,Warren,42.466463,-83.059263 +48092,MI,Warren,42.512459,-83.064278 +48093,MI,Warren,42.514943,-82.996764 +48094,MI,Washington,42.726202,-83.026805 +48097,MI,Brockway,43.122429,-82.797899 +48098,MI,Troy,42.598118,-83.145001 +48101,MI,Allen Park,42.25223,-83.212001 +48103,MI,Ann Arbor,42.279379,-83.783998 +48104,MI,Ann Arbor,42.26939,-83.728156 +48105,MI,Ann Arbor,42.304247,-83.706756 +48108,MI,Ann Arbor,42.232782,-83.701481 +48109,MI,Ann Arbor,42.293,-83.715363 +48111,MI,Belleville,42.194858,-83.485425 +48116,MI,Brighton,42.537069,-83.775628 +48117,MI,Carleton,42.052941,-83.375502 +48118,MI,Chelsea,42.320692,-84.033392 +48120,MI,Dearborn,42.305295,-83.160488 +48122,MI,Melvindale,42.281229,-83.182573 +48124,MI,Dearborn,42.294141,-83.253565 +48125,MI,Dearborn Heights,42.276824,-83.260603 +48126,MI,Dearborn,42.334882,-83.180065 +48127,MI,Dearborn Heights,42.335317,-83.286383 +48128,MI,Dearborn,42.319981,-83.270131 +48130,MI,Dexter,42.35832,-83.900028 +48131,MI,Dundee,41.951435,-83.652165 +48133,MI,Erie,41.782935,-83.495797 +48134,MI,Flat Rock,42.105521,-83.279525 +48135,MI,Garden City,42.32415,-83.340236 +48137,MI,Gregory,42.450671,-84.046588 +48138,MI,Grosse Ile,42.13465,-83.153828 +48140,MI,Ida,41.854928,-83.591561 +48141,MI,Inkster,42.294041,-83.31463 +48144,MI,Lambertville,41.753055,-83.625865 +48145,MI,La Salle,41.858489,-83.471488 +48146,MI,Lincoln Park,42.242211,-83.180688 +48150,MI,Livonia,42.361503,-83.36494 +48152,MI,Livonia,42.425793,-83.363603 +48154,MI,Livonia,42.395796,-83.377157 +48157,MI,Luna Pier,41.815368,-83.436165 +48158,MI,Manchester,42.155545,-84.033247 +48159,MI,Maybee,42.028822,-83.517902 +48160,MI,Milan,42.091373,-83.677636 +48161,MI,Detroit Beach,41.92751,-83.404848 +48164,MI,New Boston,42.144899,-83.358855 +48165,MI,New Hudson,42.507647,-83.634233 +48166,MI,Newport,41.976582,-83.280438 +48167,MI,Northville,42.426245,-83.479355 +48169,MI,Pinckney,42.459579,-83.909918 +48170,MI,Plymouth,42.36882,-83.479946 +48173,MI,Gibraltar,42.07918,-83.216196 +48174,MI,Romulus,42.220304,-83.358288 +48176,MI,Saline,42.169844,-83.784936 +48178,MI,South Lyon,42.456678,-83.658951 +48179,MI,South Rockwood,42.062405,-83.266302 +48180,MI,Taylor,42.231738,-83.267269 +48182,MI,Temperance,41.768229,-83.579739 +48183,MI,Woodhaven,42.134304,-83.218142 +48184,MI,Wayne,42.276805,-83.375812 +48185,MI,Westland,42.318882,-83.374908 +48187,MI,Canton,42.332013,-83.469524 +48188,MI,Canton,42.290997,-83.465007 +48189,MI,Whitmore Lake,42.428904,-83.78282 +48191,MI,Willis,42.129249,-83.568741 +48192,MI,Riverview,42.196065,-83.182112 +48195,MI,Southgate,42.204434,-83.199919 +48197,MI,Ypsilanti,42.232544,-83.633621 +48198,MI,Ypsilanti,42.24388,-83.582972 +48201,MI,Detroit,42.347429,-83.060398 +48202,MI,Detroit,42.377033,-83.079613 +48203,MI,Highland Park,42.421155,-83.100909 +48204,MI,Detroit,42.366098,-83.142151 +48205,MI,Detroit,42.431259,-82.981279 +48206,MI,Detroit,42.374893,-83.108695 +48207,MI,Detroit,42.352373,-83.027101 +48208,MI,Detroit,42.34947,-83.092711 +48209,MI,Detroit,42.309746,-83.115464 +48210,MI,Detroit,42.337603,-83.130281 +48211,MI,Detroit,42.380922,-83.040945 +48212,MI,Hamtramck,42.408117,-83.058265 +48213,MI,Detroit,42.39816,-82.99253 +48214,MI,Detroit,42.366944,-82.993798 +48215,MI,Detroit,42.377272,-82.951319 +48216,MI,Detroit,42.327467,-83.082656 +48217,MI,Detroit,42.271914,-83.154545 +48218,MI,River Rouge,42.269229,-83.136432 +48219,MI,Detroit,42.426033,-83.249495 +48220,MI,Ferndale,42.458564,-83.13626 +48221,MI,Detroit,42.425998,-83.149976 +48223,MI,Detroit,42.394453,-83.245403 +48224,MI,Detroit,42.409808,-82.944061 +48225,MI,Harper Woods,42.437658,-82.928885 +48226,MI,Detroit,42.333346,-83.048432 +48227,MI,Detroit,42.388303,-83.193732 +48228,MI,Detroit,42.35473,-83.216753 +48229,MI,Ecorse,42.251881,-83.148943 +48230,MI,Grosse Pointe,42.384694,-82.924394 +48234,MI,Detroit,42.4337,-83.043383 +48235,MI,Detroit,42.426098,-83.195124 +48236,MI,Grosse Pointe,42.427404,-82.900248 +48237,MI,Oak Park,42.466151,-83.183993 +48238,MI,Detroit,42.395932,-83.141145 +48239,MI,Redford,42.375554,-83.28895 +48240,MI,Redford,42.426354,-83.30166 +48242,MI,Detroit,42.220718,-83.377081 +48301,MI,Bloomfield Towns,42.545044,-83.2771 +48302,MI,Bloomfield Towns,42.583237,-83.296271 +48304,MI,Bloomfield Towns,42.593764,-83.234011 +48306,MI,Rochester Hills,42.710684,-83.164215 +48307,MI,Rochester Hills,42.660185,-83.129124 +48309,MI,Rochester Hills,42.666848,-83.181842 +48310,MI,Sterling Heights,42.564782,-83.070135 +48312,MI,Sterling Heights,42.559203,-83.002896 +48313,MI,Sterling Heights,42.600498,-82.999766 +48314,MI,Sterling Heights,42.612352,-83.034455 +48315,MI,Shelby Township,42.663694,-82.996547 +48316,MI,Shelby Township,42.682668,-83.060928 +48317,MI,Shelby Township,42.640462,-83.048109 +48320,MI,Sylvan Lake,42.610449,-83.339551 +48322,MI,West Bloomfield,42.542366,-83.379313 +48323,MI,Orchard Lake,42.570171,-83.369342 +48324,MI,Orchard Lake,42.598109,-83.395536 +48326,MI,Auburn Hills,42.658345,-83.237489 +48327,MI,Waterford,42.643751,-83.407602 +48328,MI,Waterford,42.642944,-83.354624 +48329,MI,Waterford,42.687663,-83.387869 +48331,MI,Farmington Hills,42.510042,-83.405433 +48334,MI,Farmington Hills,42.506798,-83.35198 +48335,MI,Farmington Hills,42.463055,-83.400134 +48336,MI,Farmington Hills,42.460938,-83.345465 +48340,MI,Pontiac,42.667955,-83.289335 +48341,MI,Pontiac,42.629449,-83.304149 +48342,MI,Pontiac,42.643856,-83.279236 +48346,MI,Independence,42.721637,-83.405658 +48348,MI,Independence,42.772414,-83.390568 +48350,MI,Springfield,42.75413,-83.520022 +48353,MI,Hartland,42.63561,-83.714674 +48356,MI,Highland,42.669187,-83.58951 +48357,MI,Highland,42.659453,-83.637013 +48359,MI,Orion,42.720779,-83.291701 +48360,MI,Orion,42.742212,-83.282792 +48362,MI,Orion,42.780598,-83.253208 +48363,MI,Oakland,42.773179,-83.171116 +48367,MI,Addison Township,42.836423,-83.138089 +48370,MI,Oxford,42.826451,-83.200455 +48371,MI,Oxford,42.822272,-83.282892 +48374,MI,Novi,42.473495,-83.522423 +48375,MI,Novi,42.460354,-83.457741 +48377,MI,Novi,42.513616,-83.472838 +48380,MI,Milford,42.601951,-83.650796 +48381,MI,Milford,42.575841,-83.592404 +48382,MI,Commerce Townshi,42.589424,-83.49467 +48383,MI,White Lake,42.658004,-83.539838 +48386,MI,White Lake,42.641003,-83.473809 +48390,MI,Wolverine Lake,42.550384,-83.479623 +48393,MI,Wixom,42.534037,-83.528486 +48401,MI,Applegate,43.361899,-82.647865 +48412,MI,Attica,43.054673,-83.166842 +48413,MI,Bad Axe,43.806745,-83.005378 +48414,MI,Bancroft,42.881957,-84.120725 +48415,MI,Birch Run,43.264868,-83.790287 +48416,MI,Brown City,43.217073,-82.997836 +48417,MI,Burt,43.24043,-83.951073 +48418,MI,Byron,42.805928,-83.97297 +48419,MI,Carsonville,43.425805,-82.602169 +48420,MI,Clio,43.177885,-83.724949 +48421,MI,Columbiaville,43.150334,-83.381055 +48422,MI,Croswell,43.262245,-82.633721 +48423,MI,Davison,43.034777,-83.526771 +48426,MI,Decker,43.477532,-83.063791 +48427,MI,Deckerville,43.515087,-82.719118 +48428,MI,Dryden,42.937772,-83.150066 +48429,MI,Durand,42.91171,-83.987651 +48430,MI,Fenton,42.785098,-83.729351 +48432,MI,Filion,43.901362,-82.982483 +48433,MI,Flushing,43.071954,-83.842391 +48435,MI,Fostoria,43.264504,-83.379593 +48436,MI,Gaines,42.881333,-83.885488 +48438,MI,Goodrich,42.914734,-83.484459 +48439,MI,Grand Blanc,42.928163,-83.626414 +48441,MI,Harbor Beach,43.831249,-82.688608 +48442,MI,Holly,42.790494,-83.612737 +48444,MI,Imlay City,43.042512,-83.070799 +48445,MI,Kinde,43.948003,-82.975529 +48446,MI,Lapeer,43.057879,-83.333153 +48449,MI,Lennon,42.969323,-83.927908 +48450,MI,Lexington,43.24348,-82.530103 +48451,MI,Linden,42.810379,-83.799281 +48453,MI,Marlette,43.339882,-83.057253 +48454,MI,Melvin,43.19304,-82.839277 +48455,MI,Metamora,42.942365,-83.318371 +48456,MI,Minden City,43.681393,-82.729863 +48457,MI,Montrose,43.175381,-83.882411 +48458,MI,Mount Morris,43.11601,-83.689523 +48460,MI,New Lothrop,43.138781,-83.985144 +48461,MI,North Branch,43.206887,-83.226664 +48462,MI,Ortonville,42.840943,-83.428811 +48463,MI,Otisville,43.170584,-83.517187 +48464,MI,Otter Lake,43.218334,-83.424219 +48465,MI,Palms,43.625671,-82.701737 +48466,MI,Peck,43.26938,-82.81929 +48467,MI,Port Austin,44.022292,-82.998427 +48468,MI,Port Hope,43.927989,-82.752893 +48469,MI,Port Sanilac,43.43292,-82.546794 +48470,MI,Ruth,43.740436,-82.741396 +48471,MI,Sandusky,43.405541,-82.840939 +48472,MI,Snover,43.488649,-82.930063 +48473,MI,Swartz Creek,42.946776,-83.817005 +48475,MI,Ubly,43.689631,-82.964013 +48502,MI,Flint,43.012321,-83.687768 +48503,MI,Flint,43.012836,-83.691429 +48504,MI,Northwest,43.04247,-83.729908 +48505,MI,Flint,43.063369,-83.700093 +48506,MI,Northeast,43.052596,-83.640192 +48507,MI,Flint,42.97303,-83.688999 +48509,MI,Northeast,43.024493,-83.606295 +48519,MI,Southeast,42.993847,-83.610424 +48529,MI,Southeast,42.97268,-83.671064 +48532,MI,Northwest,43.01021,-83.768576 +48601,MI,Saginaw,43.404692,-83.915626 +48602,MI,Saginaw,43.424838,-83.974455 +48603,MI,Saginaw,43.43251,-84.03028 +48604,MI,Saginaw,43.473223,-83.951421 +48607,MI,Saginaw,43.430141,-83.931872 +48610,MI,Alger,44.139488,-84.18719 +48611,MI,Auburn,43.607988,-84.10267 +48612,MI,Beaverton,43.886576,-84.424059 +48613,MI,Bentley,43.886028,-84.144738 +48614,MI,Brant,43.25484,-84.297849 +48615,MI,Breckenridge,43.393463,-84.502319 +48616,MI,Chesaning,43.182387,-84.112156 +48617,MI,Clare,43.822318,-84.763463 +48618,MI,Coleman,43.749397,-84.591058 +48619,MI,Comins,44.826354,-84.026061 +48620,MI,Edenville,43.802757,-84.396227 +48621,MI,Fairview,44.72046,-84.052532 +48622,MI,Farwell,43.834163,-84.875402 +48623,MI,Freeland,43.516134,-84.182173 +48624,MI,Gladwin,44.029618,-84.496801 +48625,MI,Harrison,44.028478,-84.77289 +48626,MI,Hemlock,43.409911,-84.226563 +48628,MI,Hope,43.788167,-84.329605 +48629,MI,Houghton Lake,44.341327,-84.742175 +48631,MI,Kawkawlin,43.679399,-83.992657 +48632,MI,Lake,43.850164,-84.978597 +48634,MI,Linwood,43.737448,-84.013341 +48635,MI,Lupton,44.397578,-83.990473 +48636,MI,Luzerne,44.629594,-84.246742 +48637,MI,Merrill,43.393892,-84.330757 +48640,MI,Midland,43.637562,-84.26796 +48642,MI,Midland,43.637488,-84.197941 +48647,MI,Mio,44.666481,-84.135264 +48649,MI,Oakley,43.150533,-84.209379 +48650,MI,Pinconning,43.849079,-84.008162 +48651,MI,Prudenville,44.297394,-84.662747 +48652,MI,Rhodes,43.851745,-84.213402 +48653,MI,Roscommon,44.483908,-84.660092 +48654,MI,Rose City,44.41672,-84.125562 +48655,MI,Saint Charles,43.286271,-84.159785 +48656,MI,Saint Helen,44.366489,-84.424704 +48657,MI,Sanford,43.720352,-84.395446 +48658,MI,Standish,43.973287,-83.943297 +48659,MI,Sterling,44.067837,-84.012567 +48661,MI,West Branch,44.279032,-84.228623 +48662,MI,Wheeler,43.396224,-84.424335 +48701,MI,Akron,43.584373,-83.539262 +48703,MI,Au Gres,44.033802,-83.702024 +48705,MI,Barton City,44.701956,-83.599372 +48706,MI,University Cente,43.612165,-83.919885 +48708,MI,Bay City,43.58205,-83.878073 +48720,MI,Bay Port,43.837744,-83.352461 +48721,MI,Black River,44.813842,-83.34071 +48722,MI,Bridgeport,43.355309,-83.854906 +48723,MI,Caro,43.483272,-83.383469 +48725,MI,Caseville,43.94292,-83.265924 +48726,MI,Cass City,43.579677,-83.173264 +48727,MI,Clifford,43.309953,-83.174105 +48728,MI,Curran,44.733606,-83.831989 +48729,MI,Deford,43.473482,-83.170244 +48730,MI,East Tawas,44.300823,-83.477629 +48731,MI,Elkton,43.834437,-83.178642 +48732,MI,Essexville,43.606908,-83.821659 +48733,MI,Fairgrove,43.512574,-83.583534 +48734,MI,Frankenmuth,43.340965,-83.747482 +48735,MI,Gagetown,43.654251,-83.262788 +48737,MI,Glennie,44.558234,-83.689948 +48738,MI,Greenbush,44.548044,-83.326883 +48739,MI,Hale,44.38189,-83.835941 +48740,MI,Harrisville,44.654595,-83.34243 +48741,MI,Kingston,43.398153,-83.184727 +48742,MI,Lincoln,44.711124,-83.394669 +48743,MI,Long Lake,44.448465,-83.817058 +48744,MI,Mayville,43.356156,-83.372529 +48745,MI,Mikado,44.583275,-83.435518 +48746,MI,Millington,43.271772,-83.561944 +48747,MI,Munger,43.528585,-83.767221 +48748,MI,National City,44.313746,-83.683948 +48749,MI,Omer,44.049939,-83.842956 +48750,MI,Oscoda,44.446485,-83.361908 +48754,MI,Owendale,43.720648,-83.230703 +48755,MI,Pigeon,43.817909,-83.275508 +48756,MI,Prescott,44.20999,-84.021197 +48757,MI,Reese,43.453094,-83.701529 +48759,MI,Sebewaing,43.728888,-83.436622 +48760,MI,Silverwood,43.31413,-83.271974 +48761,MI,South Branch,44.501403,-83.868574 +48762,MI,Spruce,44.822443,-83.504391 +48763,MI,Tawas City,44.267485,-83.544905 +48765,MI,Turner,44.10543,-83.650679 +48766,MI,Twining,44.12929,-83.849118 +48767,MI,Unionville,43.647341,-83.469898 +48768,MI,Vassar,43.369052,-83.584449 +48770,MI,Whittemore,44.232514,-83.806842 +48801,MI,Alma,43.380877,-84.663484 +48806,MI,Ashley,43.189103,-84.48796 +48807,MI,Bannister,43.161537,-84.359679 +48808,MI,Bath,42.820563,-84.454547 +48809,MI,Belding,43.088546,-85.231272 +48811,MI,Carson City,43.169496,-84.865334 +48813,MI,Charlotte,42.570169,-84.835181 +48815,MI,Clarksville,42.830177,-85.249384 +48817,MI,Corunna,43.041402,-84.027618 +48818,MI,Crystal,43.262382,-84.899328 +48819,MI,Dansville,42.550485,-84.293932 +48820,MI,Dewitt,42.842784,-84.579654 +48821,MI,Dimondale,42.650094,-84.648593 +48822,MI,Eagle,42.826306,-84.758971 +48823,MI,East Lansing,42.738805,-84.476409 +48827,MI,Eaton Rapids,42.516624,-84.656545 +48829,MI,Edmore,43.411578,-85.028003 +48831,MI,Carland,43.086918,-84.390965 +48832,MI,Elwell,43.410565,-84.763103 +48834,MI,Fenwick,43.149682,-85.066566 +48835,MI,Fowler,42.994144,-84.759969 +48836,MI,Fowlerville,42.661438,-84.072085 +48837,MI,Grand Ledge,42.752924,-84.737314 +48838,MI,Greenville,43.17926,-85.249705 +48840,MI,Haslett,42.753088,-84.398887 +48841,MI,Henderson,43.081708,-84.185777 +48842,MI,Holt,42.639401,-84.524232 +48843,MI,Howell,42.615933,-83.92481 +48845,MI,Hubbardston,43.082776,-84.817282 +48846,MI,Ionia,42.98592,-85.070985 +48847,MI,Ithaca,43.282808,-84.60883 +48848,MI,Laingsburg,42.86271,-84.352991 +48849,MI,Lake Odessa,42.786335,-85.135667 +48850,MI,Lakeview,43.42694,-85.292421 +48851,MI,Lyons,42.963429,-84.920943 +48854,MI,Mason,42.579588,-84.45609 +48856,MI,Middleton,43.168911,-84.755221 +48857,MI,Morrice,42.83851,-84.176771 +48858,MI,Mount Pleasant,43.601295,-84.773571 +48860,MI,Muir,43.043864,-84.93909 +48861,MI,Mulliken,42.737657,-84.897911 +48864,MI,Okemos,42.705341,-84.418696 +48865,MI,Orleans,43.089459,-85.116547 +48866,MI,Ovid,42.996927,-84.364939 +48867,MI,Owosso,42.993407,-84.159486 +48871,MI,Perrinton,43.16492,-84.665984 +48872,MI,Perry,42.820012,-84.231346 +48873,MI,Pewamo,43.000747,-84.849217 +48875,MI,Portland,42.862414,-84.913933 +48876,MI,Potterville,42.639779,-84.734589 +48877,MI,Riverdale,43.409817,-84.826607 +48878,MI,Rosebush,43.68427,-84.783299 +48879,MI,Saint Johns,43.005924,-84.571934 +48880,MI,Saint Louis,43.42777,-84.595239 +48881,MI,Saranac,42.928534,-85.229938 +48883,MI,Shepherd,43.565668,-84.587317 +48884,MI,Sheridan,43.212632,-85.046838 +48885,MI,Sidney,43.23579,-85.120671 +48886,MI,Six Lakes,43.433714,-85.141569 +48888,MI,Stanton,43.305841,-85.099548 +48889,MI,Sumner,43.309144,-84.790662 +48890,MI,Sunfield,42.769314,-84.981305 +48891,MI,Vestaburg,43.387025,-84.908168 +48892,MI,Webberville,42.662981,-84.17013 +48893,MI,Weidman,43.645284,-85.004567 +48894,MI,Westphalia,42.912308,-84.785567 +48895,MI,Williamston,42.696652,-84.292596 +48897,MI,Woodland,42.705654,-85.13261 +48906,MI,Lansing,42.763464,-84.558043 +48910,MI,Lansing,42.700784,-84.549005 +48911,MI,Lansing,42.679727,-84.577168 +48912,MI,Lansing,42.737115,-84.524414 +48915,MI,Lansing,42.739074,-84.570398 +48917,MI,Lansing,42.737621,-84.62439 +48933,MI,Lansing,42.733429,-84.557142 +49001,MI,Kalamazoo,42.273565,-85.545653 +49002,MI,Kalamazoo,42.207482,-85.595691 +49004,MI,Parchment,42.326538,-85.541959 +49007,MI,Kalamazoo,42.295688,-85.613722 +49008,MI,Kalamazoo,42.262432,-85.609645 +49009,MI,Kalamazoo,42.280947,-85.686333 +49010,MI,Allegan,42.525609,-85.86608 +49011,MI,Athens,42.102962,-85.231742 +49012,MI,Augusta,42.356313,-85.354012 +49013,MI,Bangor,42.33122,-86.131096 +49015,MI,Battle Creek,42.302806,-85.212825 +49017,MI,Battle Creek,42.332218,-85.181106 +49021,MI,Bellevue,42.452474,-85.048867 +49022,MI,Benton Harbor,42.108594,-86.423417 +49026,MI,Bloomingdale,42.384232,-85.956757 +49028,MI,Bronson,41.864316,-85.183767 +49029,MI,Burlington,42.123859,-85.105 +49030,MI,Burr Oak,41.845898,-85.334536 +49031,MI,Cassopolis,41.896805,-85.992273 +49032,MI,Centreville,41.921685,-85.496299 +49033,MI,Ceresco,42.212741,-85.11285 +49034,MI,Climax,42.233979,-85.323832 +49036,MI,Coldwater,41.925464,-85.005682 +49038,MI,Coloma,42.202952,-86.32247 +49040,MI,Colon,41.957605,-85.330588 +49042,MI,Constantine,41.846029,-85.657094 +49043,MI,Covert,42.291074,-86.274294 +49045,MI,Decatur,42.101219,-86.033808 +49046,MI,Delton,42.514102,-85.406706 +49047,MI,Dowagiac,41.990965,-86.116766 +49050,MI,Dowling,42.501478,-85.249452 +49051,MI,East Leroy,42.196125,-85.231083 +49052,MI,Fulton,42.139086,-85.322659 +49053,MI,Galesburg,42.294843,-85.423665 +49055,MI,Gobles,42.370182,-85.853649 +49056,MI,Grand Junction,42.376081,-86.054052 +49057,MI,Hartford,42.208807,-86.168703 +49058,MI,Hastings,42.643007,-85.293687 +49060,MI,Hickory Corners,42.423682,-85.399784 +49061,MI,Jones,41.912903,-85.834111 +49064,MI,Lawrence,42.207635,-86.052543 +49065,MI,Lawton,42.154462,-85.828966 +49066,MI,Leonidas,42.029394,-85.349683 +49067,MI,Marcellus,42.027461,-85.798776 +49068,MI,Marshall,42.272047,-84.95828 +49070,MI,Martin,42.548321,-85.610646 +49071,MI,Mattawan,42.245069,-85.794281 +49072,MI,Mendon,42.014262,-85.472697 +49073,MI,Nashville,42.593721,-85.122029 +49076,MI,Olivet,42.445947,-84.897312 +49078,MI,Otsego,42.472334,-85.703497 +49079,MI,Paw Paw,42.234931,-85.900488 +49080,MI,Plainwell,42.454379,-85.59936 +49082,MI,Quincy,41.970694,-84.849295 +49083,MI,Richland,42.375689,-85.444651 +49085,MI,Saint Joseph,42.063959,-86.478341 +49087,MI,Schoolcraft,42.132857,-85.663741 +49088,MI,Scotts,42.181892,-85.468492 +49089,MI,Sherwood,42.010736,-85.240797 +49090,MI,South Haven,42.404096,-86.254207 +49091,MI,Sturgis,41.808934,-85.426357 +49092,MI,Tekonsha,42.086326,-84.992602 +49093,MI,Three Rivers,41.959598,-85.637125 +49094,MI,Union City,42.055134,-85.135637 +49095,MI,Vandalia,41.895506,-85.875546 +49096,MI,Vermontville,42.63921,-85.010984 +49097,MI,Vicksburg,42.120896,-85.502376 +49098,MI,Watervliet,42.193804,-86.26037 +49099,MI,White Pigeon,41.792891,-85.67501 +49101,MI,Baroda,41.948818,-86.491274 +49102,MI,Berrien Center,41.948439,-86.285039 +49103,MI,Berrien Springs,41.948002,-86.354013 +49106,MI,Bridgman,41.936199,-86.554334 +49107,MI,Buchanan,41.83269,-86.370844 +49111,MI,Eau Claire,42.015134,-86.297154 +49112,MI,Edwardsburg,41.791258,-86.026252 +49113,MI,Galien,41.819758,-86.503544 +49116,MI,Lakeside,41.848459,-86.669354 +49117,MI,Grand Beach,41.785591,-86.74663 +49120,MI,Niles,41.820168,-86.236789 +49125,MI,Sawyer,41.882866,-86.588508 +49126,MI,Sodus,42.052082,-86.3921 +49127,MI,Stevensville,42.021968,-86.511862 +49128,MI,Three Oaks,41.814976,-86.615411 +49129,MI,Union Pier,41.82555,-86.691146 +49130,MI,Union,41.782678,-85.852905 +49201,MI,Jackson,42.254522,-84.387476 +49202,MI,Jackson,42.263431,-84.408348 +49203,MI,Jackson,42.228963,-84.41321 +49220,MI,Addison,42.003604,-84.312229 +49221,MI,Adrian,41.900516,-84.044556 +49224,MI,Albion,42.258073,-84.756052 +49227,MI,Allen,41.926419,-84.760782 +49228,MI,Blissfield,41.827636,-83.877257 +49229,MI,Britton,41.988713,-83.837722 +49230,MI,Brooklyn,42.10436,-84.241353 +49232,MI,Camden,41.736149,-84.724497 +49233,MI,Cement City,42.060395,-84.325423 +49234,MI,Clarklake,42.123503,-84.352056 +49235,MI,Clayton,41.868648,-84.177519 +49236,MI,Clinton,42.063886,-83.944152 +49237,MI,Concord,42.187501,-84.652928 +49238,MI,Deerfield,41.890912,-83.784739 +49240,MI,Grass Lake,42.271071,-84.194041 +49241,MI,Hanover,42.102521,-84.584809 +49242,MI,Hillsdale,41.923954,-84.620812 +49245,MI,Homer,42.141561,-84.81572 +49246,MI,Horton,42.119092,-84.497593 +49247,MI,Hudson,41.858101,-84.338031 +49248,MI,Jasper,41.758956,-83.951549 +49249,MI,Jerome,42.048375,-84.445483 +49250,MI,Jonesville,41.979833,-84.645083 +49251,MI,Leslie,42.460279,-84.420653 +49252,MI,Litchfield,42.054039,-84.636095 +49253,MI,Manitou Beach,41.967055,-84.276706 +49254,MI,Michigan Center,42.226294,-84.321315 +49255,MI,Montgomery,41.792764,-84.849641 +49256,MI,Morenci,41.738612,-84.219204 +49259,MI,Munith,42.370317,-84.248486 +49262,MI,North Adams,41.971484,-84.520824 +49264,MI,Onondaga,42.448726,-84.553501 +49265,MI,Onsted,42.029533,-84.183892 +49266,MI,Osseo,41.838413,-84.597388 +49267,MI,Ottawa Lake,41.768276,-83.685559 +49268,MI,Palmyra,41.872976,-83.965679 +49269,MI,Parma,42.273879,-84.599886 +49270,MI,Petersburg,41.875655,-83.687673 +49271,MI,Pittsford,41.896262,-84.444016 +49272,MI,Pleasant Lake,42.390343,-84.342791 +49274,MI,Reading,41.844194,-84.76475 +49275,MI,Ridgeway,42.010554,-83.778429 +49276,MI,Riga,41.795309,-83.801144 +49277,MI,Rives Junction,42.38871,-84.458868 +49279,MI,Sand Creek,41.77928,-84.075502 +49281,MI,Somerset,42.044732,-84.39472 +49283,MI,Spring Arbor,42.206861,-84.550127 +49284,MI,Springport,42.38055,-84.703888 +49285,MI,Stockbridge,42.460404,-84.175178 +49286,MI,Tecumseh,41.995297,-83.955485 +49287,MI,Tipton,42.036911,-84.07684 +49288,MI,Waldron,41.738608,-84.449636 +49301,MI,Ada,42.95661,-85.480959 +49302,MI,Alto,42.824312,-85.425554 +49303,MI,Bailey,43.276768,-85.831318 +49304,MI,Baldwin,43.889409,-85.881874 +49305,MI,Barryton,43.750651,-85.154654 +49306,MI,Belmont,43.077934,-85.586769 +49307,MI,Big Rapids,43.689679,-85.479705 +49309,MI,Bitely,43.732132,-85.877799 +49310,MI,Blanchard,43.522778,-85.058856 +49315,MI,Byron Center,42.801614,-85.713602 +49316,MI,Dutton,42.796395,-85.562167 +49318,MI,Casnovia,43.23815,-85.825394 +49319,MI,Cedar Springs,43.22148,-85.545238 +49321,MI,Comstock Park,43.057813,-85.684468 +49322,MI,Coral,43.364458,-85.379245 +49323,MI,Dorr,42.723113,-85.762798 +49325,MI,Freeport,42.729703,-85.279134 +49326,MI,Gowen,43.223884,-85.315941 +49327,MI,Grant,43.339197,-85.836827 +49328,MI,Hopkins,42.64209,-85.732195 +49329,MI,Howard City,43.408326,-85.485609 +49330,MI,Kent City,43.236235,-85.739949 +49331,MI,Lowell,42.95497,-85.365305 +49332,MI,Mecosta,43.681317,-85.228034 +49333,MI,Middleville,42.693247,-85.475901 +49336,MI,Morley,43.505951,-85.447318 +49337,MI,Newaygo,43.419799,-85.759381 +49338,MI,Paris,43.767704,-85.521348 +49339,MI,Pierson,43.335514,-85.513359 +49340,MI,Remus,43.603249,-85.157365 +49341,MI,Rockford,43.115217,-85.513606 +49342,MI,Rodney,43.73791,-85.321884 +49343,MI,Sand Lake,43.298109,-85.536655 +49344,MI,Shelbyville,42.593581,-85.628239 +49345,MI,Sparta,43.161867,-85.687668 +49346,MI,Stanwood,43.601728,-85.444607 +49347,MI,Trufant,43.315611,-85.368489 +49348,MI,Wayland,42.664268,-85.619112 +49349,MI,White Cloud,43.539803,-85.75864 +49401,MI,Allendale,42.971066,-85.924913 +49402,MI,Branch,43.923296,-86.131369 +49403,MI,Conklin,43.149399,-85.853753 +49404,MI,Coopersville,43.06013,-85.951722 +49405,MI,Custer,43.94424,-86.220437 +49408,MI,Fennville,42.577669,-86.124876 +49410,MI,Fountain,44.036342,-86.216861 +49411,MI,Free Soil,44.112036,-86.265158 +49412,MI,Fremont,43.465196,-85.962554 +49415,MI,Fruitport,43.144282,-86.138832 +49417,MI,Grand Haven,43.037838,-86.191227 +49418,MI,Grandville,42.89387,-85.761874 +49419,MI,Hamilton,42.688097,-85.974731 +49420,MI,Hart,43.70676,-86.314152 +49421,MI,Hesperia,43.596513,-86.060739 +49423,MI,Holland,42.769211,-86.116362 +49424,MI,Holland,42.813514,-86.142631 +49425,MI,Holton,43.441454,-86.150853 +49426,MI,Hudsonville,42.874805,-85.8751 +49428,MI,Jenison,42.910423,-85.827603 +49431,MI,Ludington,43.968823,-86.440253 +49435,MI,Marne,43.053185,-85.841958 +49436,MI,Mears,43.682494,-86.453307 +49437,MI,Montague,43.424163,-86.373992 +49440,MI,Muskegon,43.232589,-86.249191 +49441,MI,Muskegon,43.196184,-86.273819 +49442,MI,Muskegon,43.232876,-86.188467 +49444,MI,Muskegon Heights,43.195046,-86.216208 +49445,MI,North Muskegon,43.282873,-86.273297 +49446,MI,New Era,43.555578,-86.344803 +49447,MI,New Richmond,42.662383,-86.037985 +49448,MI,Nunica,43.088306,-86.102768 +49449,MI,Pentwater,43.823713,-86.386818 +49450,MI,Pullman,42.465131,-86.079909 +49451,MI,Ravenna,43.209128,-85.964816 +49452,MI,Rothbury,43.511633,-86.34464 +49453,MI,Saugatuck,42.642562,-86.194093 +49454,MI,Scottville,43.976692,-86.315615 +49455,MI,Shelby,43.607942,-86.361503 +49456,MI,Spring Lake,43.088741,-86.19151 +49457,MI,Twin Lake,43.341378,-86.163316 +49459,MI,Walkerville,43.762559,-86.082991 +49460,MI,West Olive,42.909912,-86.131726 +49461,MI,Whitehall,43.390358,-86.331453 +49464,MI,Zeeland,42.825586,-86.010408 +49503,MI,Grand Rapids,42.965879,-85.65273 +49504,MI,Walker,42.98392,-85.725543 +49505,MI,Grand Rapids,43.012025,-85.630931 +49506,MI,Grand Rapids,42.943978,-85.621317 +49507,MI,Grand Rapids,42.931788,-85.65417 +49508,MI,Kentwood,42.875653,-85.624179 +49509,MI,Wyoming,42.900867,-85.705775 +49512,MI,Kentwood,42.89269,-85.578156 +49546,MI,Grand Rapids,42.928029,-85.548346 +49548,MI,Kentwood,42.867048,-85.660767 +49601,MI,Cadillac,44.250447,-85.430046 +49612,MI,Alden,44.877887,-85.2241 +49613,MI,Arcadia,44.523157,-86.206057 +49614,MI,Bear Lake,44.431125,-86.142497 +49615,MI,Bellaire,44.976469,-85.226495 +49616,MI,Benzonia,44.595502,-86.096091 +49617,MI,Beulah,44.646002,-86.038346 +49618,MI,Boon,44.291555,-85.614383 +49619,MI,Brethren,44.296596,-85.996396 +49620,MI,Buckley,44.519856,-85.693541 +49621,MI,Cedar,44.836953,-85.745344 +49622,MI,Central Lake,45.074796,-85.267285 +49623,MI,Chase,43.868172,-85.619639 +49625,MI,Copemish,44.450276,-85.887859 +49629,MI,Elk Rapids,44.895473,-85.408226 +49630,MI,Empire,44.84106,-85.992533 +49631,MI,Evart,43.888772,-85.264935 +49632,MI,Falmouth,44.252861,-85.017002 +49633,MI,Fife Lake,44.572064,-85.253122 +49635,MI,Frankfort,44.631122,-86.221201 +49636,MI,Glen Arbor,44.842927,-86.035339 +49637,MI,Grawn,44.642779,-85.71129 +49638,MI,Harrietta,44.297163,-85.739573 +49639,MI,Hersey,43.84806,-85.405926 +49640,MI,Honor,44.69539,-86.037582 +49642,MI,Idlewild,43.912621,-85.716036 +49643,MI,Interlochen,44.651769,-85.802156 +49644,MI,Irons,44.096638,-85.939008 +49645,MI,Kaleva,44.369168,-86.046737 +49646,MI,Kalkaska,44.73546,-85.120655 +49647,MI,Karlin,44.569128,-85.79406 +49648,MI,Kewadin,45.012574,-85.353941 +49649,MI,Kingsley,44.575644,-85.526235 +49650,MI,Lake Ann,44.731736,-85.85284 +49651,MI,Moorestown,44.361932,-85.207352 +49653,MI,Lake Leelanau,44.985602,-85.732866 +49654,MI,Leland,45.010215,-86.092924 +49655,MI,Leroy,44.045656,-85.430001 +49656,MI,Luther,44.054494,-85.682631 +49657,MI,Mc Bain,44.21718,-85.228252 +49659,MI,Mancelona,44.911596,-85.063399 +49660,MI,Stronach,44.228323,-86.28503 +49663,MI,Manton,44.415222,-85.42017 +49664,MI,Maple City,44.859035,-85.881392 +49665,MI,Marion,44.046314,-85.155031 +49667,MI,Merritt,44.36843,-85.015508 +49668,MI,Mesick,44.407451,-85.706122 +49670,MI,Northport,45.115699,-85.617287 +49675,MI,Onekama,44.364576,-86.209959 +49676,MI,Rapid City,44.844863,-85.294318 +49677,MI,Reed City,43.886808,-85.513028 +49679,MI,Sears,43.901747,-85.188246 +49680,MI,South Boardman,44.640143,-85.2472 +49682,MI,Suttons Bay,44.965613,-85.642264 +49683,MI,Thompsonville,44.519833,-85.945973 +49684,MI,Traverse City,44.74365,-85.618869 +49688,MI,Tustin,44.107181,-85.490143 +49689,MI,Wellston,44.213266,-85.955475 +49690,MI,Williamsburg,44.801952,-85.434732 +49705,MI,Afton,45.363684,-84.469453 +49706,MI,Alanson,45.440545,-84.792421 +49707,MI,Alpena,45.079018,-83.4602 +49709,MI,Atlanta,44.992371,-84.147982 +49710,MI,Barbeau,46.284753,-84.217332 +49712,MI,Boyne City,45.205203,-85.018294 +49713,MI,Boyne Falls,45.211563,-84.891584 +49715,MI,Raco,46.411117,-84.563841 +49716,MI,Brutus,45.506785,-84.746693 +49718,MI,Carp Lake,45.742364,-84.773453 +49719,MI,Cedarville,46.002449,-84.348823 +49720,MI,Charlevoix,45.29934,-85.245298 +49721,MI,Cheboygan,45.608038,-84.48672 +49724,MI,Dafter,46.349196,-84.399679 +49725,MI,De Tour Village,45.993852,-83.939628 +49726,MI,Drummond Island,46.005521,-83.736706 +49727,MI,East Jordan,45.153858,-85.138655 +49728,MI,Eckerman,46.346638,-85.162606 +49729,MI,Ellsworth,45.159929,-85.263292 +49730,MI,Elmira,45.034582,-84.830321 +49733,MI,Frederic,44.838217,-84.68241 +49735,MI,Gaylord,45.012523,-84.67228 +49736,MI,Goetzville,46.100976,-84.059271 +49738,MI,Grayling,44.670959,-84.691321 +49740,MI,Harbor Point,45.464535,-84.980303 +49743,MI,Hawks,45.297467,-83.854219 +49744,MI,Herron,45.012367,-83.65348 +49746,MI,Hillman,45.069104,-83.946781 +49747,MI,Hubbard Lake,44.89467,-83.605905 +49749,MI,Indian River,45.426984,-84.595578 +49751,MI,Johannesburg,45.015207,-84.385708 +49752,MI,Kinross,46.416612,-84.751122 +49753,MI,Lachine,45.042946,-83.749071 +49755,MI,Levering,45.637711,-84.798597 +49756,MI,Lewiston,44.853758,-84.297281 +49757,MI,Mackinac Island,45.857837,-84.624527 +49759,MI,Millersburg,45.402164,-84.122246 +49760,MI,Moran,46.044106,-85.007835 +49762,MI,Naubinway,46.126021,-85.44619 +49765,MI,Onaway,45.33654,-84.212272 +49766,MI,Ossineke,44.91038,-83.459186 +49768,MI,Paradise,46.598321,-85.056247 +49769,MI,Pellston,45.570285,-84.842502 +49770,MI,Bay View,45.361268,-84.940263 +49774,MI,Pickford,46.155858,-84.366312 +49775,MI,Pointe Aux Pins,45.754888,-84.447035 +49776,MI,Posen,45.223335,-83.639271 +49779,MI,Rogers City,45.412306,-83.835483 +49780,MI,Fibre,46.200568,-84.549343 +49781,MI,Saint Ignace,45.921527,-84.709409 +49782,MI,Saint James,45.722061,-85.531581 +49783,MI,Sault Sainte Mar,46.473932,-84.346746 +49788,MI,Kincheloe,46.26271,-84.462584 +49789,MI,Stalwart,46.138876,-84.155861 +49792,MI,Tower,45.341619,-84.303496 +49795,MI,Vanderbilt,45.153247,-84.651134 +49799,MI,Wolverine,45.286148,-84.606477 +49801,MI,Iron Mountain,45.821894,-88.068257 +49806,MI,Au Train,46.428231,-86.779327 +49807,MI,Hardwood,45.705411,-87.240522 +49812,MI,Carney,45.591738,-87.543896 +49813,MI,Cedar River,45.448475,-87.365994 +49814,MI,Champion,46.468497,-87.830587 +49815,MI,Channing,46.154562,-88.077221 +49816,MI,Limestone,46.294821,-86.758934 +49817,MI,Cooks,45.899665,-86.530718 +49818,MI,Cornell,45.910373,-87.223702 +49820,MI,Curtis,46.204763,-85.786466 +49821,MI,Daggett,45.488738,-87.607858 +49822,MI,Deerton,46.483979,-87.04064 +49825,MI,Eben Junction,46.351726,-87.032799 +49826,MI,Rumely,46.341867,-86.935068 +49827,MI,Engadine,46.204009,-85.600468 +49829,MI,Escanaba,45.76587,-87.088985 +49833,MI,Little Lake,46.053711,-87.411448 +49834,MI,Foster City,46.004769,-87.804768 +49835,MI,Garden,45.754867,-86.577576 +49836,MI,Germfask,46.236261,-85.91589 +49837,MI,Brampton,45.856402,-87.027284 +49838,MI,Gould City,46.134544,-85.725889 +49839,MI,Grand Marais,46.652916,-85.983633 +49840,MI,Gulliver,46.011491,-86.021433 +49841,MI,Princeton,46.291938,-87.43016 +49843,MI,K I Sawyer A F B,46.330811,-87.37593 +49847,MI,Hermansville,45.714902,-87.622659 +49848,MI,Ingalls,45.374774,-87.620607 +49849,MI,North Lake,46.490165,-87.682638 +49853,MI,Mc Millan,46.297027,-85.730715 +49854,MI,Thompson,45.982978,-86.275513 +49855,MI,Beaver Grove,46.53124,-87.389443 +49858,MI,Menominee,45.13427,-87.621475 +49861,MI,Michigamme,46.668143,-87.892386 +49862,MI,Christmas,46.413863,-86.626846 +49866,MI,Negaunee,46.500662,-87.582915 +49868,MI,Newberry,46.343763,-85.514951 +49870,MI,Norway,45.786186,-87.904693 +49873,MI,Perronville,45.826409,-87.398903 +49874,MI,Powers,45.679238,-87.531853 +49876,MI,Quinnesec,45.799866,-87.992151 +49878,MI,Rapid River,45.910662,-86.88449 +49879,MI,Republic,46.368046,-87.993823 +49880,MI,Rock,46.050262,-87.133068 +49881,MI,Sagola,46.081274,-88.067644 +49883,MI,Seney,46.387989,-85.970847 +49884,MI,Shingleton,46.351202,-86.482261 +49885,MI,Skandia,46.349049,-87.248094 +49886,MI,Spalding,45.695747,-87.4964 +49887,MI,Stephenson,45.416594,-87.62579 +49890,MI,Traunik,46.258534,-86.988891 +49891,MI,Trenary,46.194738,-86.950183 +49892,MI,Vulcan,45.762257,-87.816811 +49893,MI,Wallace,45.301657,-87.580457 +49894,MI,Wells,45.784866,-87.073443 +49895,MI,Wetmore,46.353518,-86.634537 +49896,MI,Wilson,45.664855,-87.399734 +49905,MI,Atlantic Mine,47.093663,-88.661318 +49908,MI,Keweenaw Bay,46.790213,-88.495489 +49910,MI,Bergland,46.588124,-89.597296 +49911,MI,Bessemer,46.480188,-90.051544 +49912,MI,Bruce Crossing,46.527956,-89.168028 +49913,MI,Laurium,47.242721,-88.44272 +49916,MI,Chassell,47.002038,-88.554554 +49919,MI,Covington,46.557194,-88.524452 +49920,MI,Crystal Falls,46.109255,-88.350517 +49921,MI,Dodgeville,47.091443,-88.580874 +49925,MI,Ewen,46.540412,-89.314494 +49927,MI,Gaastra,46.052638,-88.591728 +49930,MI,Hancock,47.136731,-88.565385 +49931,MI,Houghton,47.115801,-88.558024 +49935,MI,Iron River,46.093017,-88.645974 +49938,MI,Ironwood,46.463793,-90.158844 +49943,MI,Kenton,46.491565,-88.812933 +49945,MI,Gay,47.171387,-88.411829 +49946,MI,Lanse,46.770407,-88.420959 +49947,MI,Marenisco,46.355107,-89.677422 +49948,MI,Mass City,46.747447,-89.064864 +49950,MI,Eagle Harbor,47.320067,-88.332572 +49952,MI,Nisula,46.76952,-88.83397 +49953,MI,Ontonagon,46.827484,-89.348474 +49958,MI,Pelkie,46.794932,-88.625083 +49962,MI,Skanee,46.874732,-88.173189 +49965,MI,Toivola,46.985447,-88.860657 +49967,MI,Trout Creek,46.486426,-89.026962 +49968,MI,Wakefield,46.475184,-89.942446 +49969,MI,Watersmeet,46.25416,-89.210836 +49970,MI,Watton,46.513698,-88.599298 +55001,MN,Afton,44.86965,-92.823358 +55003,MN,Bayport,45.021405,-92.784375 +55005,MN,East Bethel,45.394114,-93.233088 +55006,MN,Braham,45.717547,-93.203695 +55007,MN,Quamba,45.938694,-92.98347 +55008,MN,Cambridge,45.557591,-93.288935 +55009,MN,Cannon Falls,44.495985,-92.863995 +55010,MN,Castle Rock,44.594216,-93.109241 +55011,MN,Cedar East Bethe,45.336494,-93.265834 +55013,MN,Chisago City,45.361144,-92.892134 +55014,MN,Circle Pines,45.152841,-93.143984 +55016,MN,Cottage Grove,44.830824,-92.939283 +55017,MN,Dalbo,45.678735,-93.441918 +55018,MN,Stanton,44.423884,-92.974779 +55019,MN,Dundas,44.395537,-93.20369 +55020,MN,Elko,44.58945,-93.383555 +55021,MN,Faribault,44.294457,-93.28179 +55024,MN,Farmington,44.662799,-93.153891 +55025,MN,Forest Lake,45.268499,-92.974894 +55026,MN,Frontenac,44.487176,-92.328103 +55027,MN,Goodhue,44.402178,-92.571743 +55030,MN,Grasston,45.772926,-93.196226 +55031,MN,Hampton,44.602848,-92.946673 +55032,MN,Harris,45.596205,-93.039545 +55033,MN,Welch,44.718932,-92.862566 +55037,MN,Hinckley,46.018876,-92.899333 +55038,MN,Centerville,45.1628,-93.003493 +55040,MN,Isanti,45.468212,-93.226565 +55041,MN,Lake City,44.430493,-92.283778 +55042,MN,Lake Elmo,44.994609,-92.90565 +55043,MN,Lakeland,44.939384,-92.771592 +55044,MN,Lakeville,44.674865,-93.257802 +55045,MN,Lindstrom,45.387265,-92.842076 +55046,MN,Veseli,44.462888,-93.423594 +55047,MN,Marine On Saint,45.183119,-92.822952 +55048,MN,55048,46.076684,-92.450672 +55049,MN,Medford,44.17415,-93.243721 +55051,MN,Mora,45.895786,-93.294234 +55052,MN,Morristown,44.234183,-93.452512 +55053,MN,Nerstrand,44.353769,-93.0855 +55055,MN,Newport,44.872522,-92.998603 +55056,MN,North Branch,45.516479,-92.937097 +55057,MN,Northfield,44.458724,-93.166826 +55060,MN,Owatonna,44.080478,-93.21914 +55063,MN,Beroun,45.832273,-92.982604 +55065,MN,Randolph,44.527386,-93.019619 +55066,MN,Red Wing,44.552779,-92.548559 +55067,MN,Rock Creek,45.762404,-92.930826 +55068,MN,Rosemount,44.728919,-93.158844 +55069,MN,Rush City,45.684496,-92.997876 +55070,MN,Saint Francis,45.390284,-93.359832 +55071,MN,Saint Paul Park,44.834404,-92.987331 +55072,MN,Markville,46.121355,-92.871001 +55073,MN,Scandia,45.269666,-92.829158 +55074,MN,Shafer,45.357561,-92.760889 +55075,MN,South Saint Paul,44.888128,-93.046013 +55076,MN,Inver Grove Heig,44.841966,-93.034746 +55077,MN,Inver Grove Heig,44.850123,-93.073938 +55079,MN,Stacy,45.397509,-93.017743 +55080,MN,Stanchfield,45.667513,-93.243302 +55082,MN,Oak Park Heights,45.050007,-92.830032 +55084,MN,Taylors Falls,45.41825,-92.690593 +55087,MN,Warsaw,44.250439,-93.364181 +55088,MN,Webster,44.502633,-93.334418 +55089,MN,Welch,44.603006,-92.726259 +55092,MN,East Bethel,45.324337,-93.068565 +55101,MN,Saint Paul,44.969963,-93.083167 +55102,MN,Saint Paul,44.937228,-93.120852 +55103,MN,Saint Paul,44.960798,-93.121594 +55104,MN,Saint Paul,44.953179,-93.15797 +55105,MN,Saint Paul,44.934723,-93.165148 +55106,MN,Saint Paul,44.968384,-93.048817 +55107,MN,West Saint Paul,44.927235,-93.086157 +55108,MN,Lauderdale,44.982217,-93.17458 +55109,MN,North Saint Paul,45.011859,-93.017072 +55110,MN,White Bear Lake,45.074527,-93.011299 +55111,MN,Fort Snelling,44.901548,-93.202579 +55112,MN,New Brighton,45.074129,-93.199691 +55113,MN,Roseville,45.012876,-93.149245 +55114,MN,Saint Paul,44.967968,-93.198067 +55115,MN,White Bear Lake,45.061132,-92.954847 +55116,MN,Saint Paul,44.914007,-93.172747 +55117,MN,Little Canada,44.992165,-93.103659 +55118,MN,West Saint Paul,44.902691,-93.096435 +55119,MN,Maplewood,44.955384,-93.008019 +55120,MN,Eagan,44.873825,-93.12902 +55121,MN,Eagan,44.843039,-93.16753 +55122,MN,Eagan,44.803593,-93.196937 +55123,MN,Eagan,44.809764,-93.14135 +55124,MN,Apple Valley,44.746147,-93.20776 +55125,MN,Woodbury,44.916195,-92.951413 +55126,MN,Shoreview,45.083334,-93.134367 +55127,MN,Vadnais Heights,45.070839,-93.07875 +55128,MN,Oakdale,44.984648,-92.968128 +55150,MN,Mendota,44.885796,-93.161221 +55301,MN,Albertville,45.253425,-93.646899 +55302,MN,Annandale,45.248272,-94.106072 +55303,MN,Ramsey,45.238537,-93.407822 +55304,MN,Ham Lake,45.25068,-93.284531 +55307,MN,Arlington,44.615279,-94.076195 +55308,MN,Becker,45.436539,-93.840966 +55309,MN,Big Lake,45.350648,-93.739917 +55310,MN,Bird Island,44.750729,-94.871634 +55312,MN,Brownton,44.728145,-94.330611 +55313,MN,Buffalo,45.181371,-93.863479 +55314,MN,Buffalo Lake,44.770885,-94.591207 +55315,MN,Carver,44.716898,-93.687949 +55316,MN,Champlin,45.170042,-93.381927 +55317,MN,Chanhassen,44.867924,-93.535906 +55318,MN,Chaska,44.806071,-93.608314 +55319,MN,Clear Lake,45.479477,-93.968391 +55320,MN,Clearwater,45.387694,-94.045246 +55321,MN,Cokato,45.074761,-94.191054 +55322,MN,Cologne,44.764591,-93.798249 +55324,MN,Darwin,45.102949,-94.424926 +55325,MN,Dassel,45.103208,-94.330475 +55327,MN,Dayton,45.198164,-93.466795 +55328,MN,Delano,45.034222,-93.801644 +55329,MN,Eden Valley,45.302006,-94.603911 +55330,MN,Elk River,45.313601,-93.5814 +55331,MN,Excelsior,44.900704,-93.579132 +55332,MN,Fairfax,44.532942,-94.725626 +55333,MN,Franklin,44.542132,-94.893094 +55334,MN,Gaylord,44.546298,-94.195543 +55335,MN,Gibbon,44.560587,-94.54668 +55336,MN,Glencoe,44.778001,-94.161554 +55337,MN,Burnsville,44.76086,-93.275283 +55338,MN,Green Isle,44.668665,-93.932635 +55339,MN,Hamburg,44.731452,-93.964317 +55340,MN,Hamel,45.079951,-93.575957 +55342,MN,Hector,44.748489,-94.705824 +55343,MN,Eden Prairie,44.933318,-93.416452 +55344,MN,Eden Prairie,44.857426,-93.437573 +55345,MN,Minnetonka,44.913808,-93.484997 +55346,MN,Eden Prairie,44.877106,-93.483028 +55347,MN,Eden Prairie,44.834217,-93.438934 +55349,MN,Howard Lake,45.061594,-94.069515 +55350,MN,Hutchinson,44.894554,-94.384691 +55352,MN,Jordan,44.671321,-93.61946 +55353,MN,Kimball,45.343584,-94.302837 +55354,MN,Lester Prairie,44.873898,-94.055094 +55355,MN,Litchfield,45.126272,-94.526805 +55356,MN,Long Lake,44.991228,-93.581798 +55357,MN,Loretto,45.106099,-93.669165 +55358,MN,Maple Lake,45.220236,-93.963793 +55359,MN,Maple Plain,44.978686,-93.700214 +55360,MN,Mayer,44.902231,-93.885925 +55362,MN,Monticello,45.295557,-93.802252 +55363,MN,Montrose,45.089737,-93.931762 +55364,MN,Mound,44.938158,-93.656087 +55366,MN,New Auburn,44.675919,-94.20567 +55367,MN,New Germany,44.899431,-93.970131 +55368,MN,Norwood,44.766786,-93.930067 +55369,MN,Maple Grove,45.108636,-93.43987 +55370,MN,Plato,44.765728,-94.050583 +55371,MN,Princeton,45.585115,-93.596143 +55372,MN,Prior Lake,44.710694,-93.410057 +55373,MN,Rockford,45.103074,-93.765832 +55374,MN,Rogers,45.171484,-93.581445 +55376,MN,Saint Michael,45.206409,-93.659253 +55378,MN,Savage,44.761547,-93.343445 +55379,MN,Shakopee,44.7793,-93.519748 +55380,MN,Silver Creek,45.326474,-93.949622 +55381,MN,Silver Lake,44.913945,-94.197383 +55382,MN,South Haven,45.346008,-94.162768 +55384,MN,Spring Park,44.935566,-93.634104 +55385,MN,Stewart,44.725928,-94.451572 +55386,MN,Victoria,44.858223,-93.656094 +55387,MN,Waconia,44.851029,-93.7784 +55388,MN,Watertown,44.959533,-93.848159 +55389,MN,Watkins,45.308652,-94.429677 +55390,MN,Waverly,45.041265,-93.954538 +55391,MN,Wayzata,44.958189,-93.520581 +55395,MN,Winsted,44.958459,-94.055168 +55396,MN,Winthrop,44.543566,-94.369847 +55397,MN,Young America,44.792905,-93.918049 +55398,MN,Zimmerman,45.455321,-93.587859 +55401,MN,Minneapolis,44.983473,-93.268251 +55402,MN,Minneapolis,44.976184,-93.275871 +55403,MN,Minneapolis,44.967345,-93.282841 +55404,MN,Minneapolis,44.960891,-93.26416 +55405,MN,Minneapolis,44.968734,-93.299096 +55406,MN,Minneapolis,44.938359,-93.221357 +55407,MN,Minneapolis,44.937787,-93.2545 +55408,MN,Minneapolis,44.946575,-93.286173 +55409,MN,Minneapolis,44.926378,-93.28182 +55410,MN,Edina,44.915366,-93.318187 +55411,MN,Minneapolis,44.999601,-93.300548 +55412,MN,Minneapolis,45.024236,-93.302033 +55413,MN,Minneapolis,44.997994,-93.255194 +55414,MN,Minneapolis,44.977908,-93.219904 +55415,MN,Minneapolis,44.971455,-93.264403 +55416,MN,Saint Louis Park,44.946899,-93.340344 +55417,MN,Minneapolis,44.905371,-93.23606 +55418,MN,Minneapolis,45.01923,-93.240108 +55419,MN,Minneapolis,44.902567,-93.288618 +55420,MN,Bloomington,44.837284,-93.276034 +55421,MN,Columbia Heights,45.049582,-93.246095 +55422,MN,Robbinsdale,45.016722,-93.339769 +55423,MN,Richfield,44.875731,-93.281351 +55424,MN,Edina,44.904385,-93.335005 +55425,MN,Bloomington,44.843198,-93.249413 +55426,MN,Saint Louis Park,44.954448,-93.379627 +55427,MN,Golden Valley,45.010374,-93.381585 +55428,MN,Crystal,45.060299,-93.376908 +55429,MN,Brooklyn Center,45.067667,-93.340203 +55430,MN,Brooklyn Center,45.061106,-93.299068 +55431,MN,Bloomington,44.827776,-93.312322 +55432,MN,Fridley,45.095695,-93.253905 +55433,MN,Coon Rapids,45.168192,-93.326253 +55434,MN,Blaine,45.168083,-93.242557 +55435,MN,Edina,44.877143,-93.371452 +55436,MN,Edina,44.902305,-93.370997 +55437,MN,Bloomington,44.823279,-93.343499 +55438,MN,Bloomington,44.823924,-93.380141 +55439,MN,Edina,44.873716,-93.332169 +55441,MN,Plymouth,45.009836,-93.422782 +55442,MN,Plymouth,45.045151,-93.426316 +55443,MN,Brooklyn Center,45.105586,-93.340184 +55444,MN,Brooklyn Center,45.100172,-93.302455 +55445,MN,Brooklyn Park,45.103956,-93.373495 +55446,MN,Plymouth,45.032446,-93.472323 +55447,MN,Plymouth,44.998593,-93.494695 +55448,MN,Coon Rapids,45.180626,-93.289699 +55450,MN,Minneapolis,44.865883,-93.247414 +55454,MN,Minneapolis,44.968161,-93.242898 +55455,MN,Minneapolis,44.981562,-93.23928 +55599,MN,Loretto,45.05604,-93.664534 +55602,MN,Brimson,47.314162,-91.862521 +55603,MN,Finland,47.419716,-91.209597 +55604,MN,Grand Marais,47.77577,-90.339114 +55605,MN,Grand Portage,47.959065,-89.698862 +55606,MN,Hovland,47.83415,-90.04757 +55607,MN,Isabella,47.626719,-91.517327 +55612,MN,Lutsen,47.683066,-90.638059 +55613,MN,Schroeder,47.542185,-90.933807 +55614,MN,Little Marais,47.299905,-91.277753 +55615,MN,Tofte,47.760792,-90.783135 +55616,MN,Two Harbors,47.039364,-91.678264 +55702,MN,Alborn,46.978229,-92.557937 +55703,MN,Angora,47.757738,-92.641332 +55704,MN,Askov,46.196408,-92.752812 +55705,MN,Aurora,47.495096,-92.241486 +55706,MN,Babbitt,47.709121,-91.956951 +55707,MN,Barnum,46.519616,-92.629167 +55709,MN,Bovey,47.286788,-93.372322 +55710,MN,Britt,47.65496,-92.632062 +55711,MN,Brookston,46.838425,-92.643005 +55712,MN,Bruno,46.284496,-92.618994 +55717,MN,Canyon,47.078525,-92.459361 +55718,MN,Carlton,46.6484,-92.470984 +55719,MN,Chisholm,47.500744,-92.861693 +55720,MN,Cloquet,46.726041,-92.45282 +55721,MN,Cohasset,47.269112,-93.639154 +55723,MN,Cook,47.844193,-92.721038 +55724,MN,Kelsey,47.163803,-92.444921 +55725,MN,Crane Lake,48.259387,-92.489596 +55726,MN,Cromwell,46.671784,-92.873942 +55727,MN,Culver,46.911886,-92.552403 +55731,MN,Ely,47.903435,-91.857042 +55732,MN,Embarrass,47.665847,-92.21011 +55733,MN,Esko,46.712551,-92.356918 +55734,MN,Eveleth,47.451047,-92.528037 +55735,MN,Finlayson,46.212111,-92.938924 +55736,MN,Floodwood,46.907589,-92.916682 +55740,MN,Gheen,47.946475,-92.906892 +55741,MN,Gilbert,47.488487,-92.402464 +55742,MN,Goodland,47.192426,-93.146914 +55744,MN,La Prairie,47.223472,-93.527672 +55746,MN,Hibbing,47.4156,-92.935582 +55748,MN,Hill City,46.996817,-93.599397 +55749,MN,Holyoke,46.466445,-92.374955 +55750,MN,Hoyt Lakes,47.514957,-92.140046 +55751,MN,Iron,47.411455,-92.619502 +55752,MN,Jacobson,46.977187,-93.306359 +55755,MN,55755,47.157817,-92.612956 +55756,MN,Kerrick,46.379151,-92.578 +55757,MN,Kettle River,46.502899,-92.904746 +55760,MN,Mc Gregor,46.686424,-93.29562 +55762,MN,Mahtowa,46.582588,-92.606505 +55763,MN,Makinen,47.341603,-92.344584 +55765,MN,Meadowlands,47.102064,-92.788357 +55766,MN,Melrude,47.242318,-92.42644 +55767,MN,Moose Lake,46.44724,-92.746648 +55768,MN,Mountain Iron,47.513336,-92.624274 +55769,MN,Nashwauk,47.42003,-93.216818 +55771,MN,Buyck,47.933881,-92.845555 +55773,MN,Parkville,47.510296,-92.584051 +55775,MN,Pengilly,47.315089,-93.193667 +55779,MN,Saginaw,46.879462,-92.391723 +55780,MN,Sawyer,46.711799,-92.609612 +55783,MN,Sturgeon Lake,46.383685,-92.818246 +55784,MN,Swan River,47.07394,-93.196436 +55785,MN,Swatara,46.929871,-93.668483 +55787,MN,Tamarack,46.617873,-93.1342 +55788,MN,Togo,47.76843,-93.201545 +55790,MN,Tower,47.808926,-92.287781 +55792,MN,Virginia,47.537078,-92.528525 +55793,MN,Warba,47.13611,-93.276417 +55795,MN,Willow River,46.294883,-92.830931 +55797,MN,Wrenshall,46.592114,-92.371772 +55798,MN,Wright,46.675324,-93.002863 +55799,MN,Zim,47.317591,-92.629606 +55801,MN,Duluth,47.094431,-91.846731 +55802,MN,Duluth,46.768475,-92.086497 +55803,MN,Duluth,46.874913,-92.094057 +55804,MN,Duluth,46.855131,-92.007433 +55805,MN,Duluth,46.798733,-92.094553 +55806,MN,Duluth,46.771457,-92.127871 +55807,MN,Duluth,46.740783,-92.169821 +55808,MN,Duluth,46.681002,-92.22261 +55810,MN,Proctor,46.74459,-92.232332 +55811,MN,Hermantown,46.81341,-92.168225 +55812,MN,Duluth,46.810598,-92.076693 +55901,MN,Rochester,44.049572,-92.48962 +55902,MN,Rochester,44.003217,-92.483519 +55904,MN,Rochester,44.010545,-92.397276 +55906,MN,Rochester,44.021001,-92.446874 +55909,MN,Adams,43.559119,-92.730494 +55910,MN,Altura,44.136114,-91.974474 +55912,MN,Austin,43.669538,-92.978374 +55917,MN,Blooming Prairie,43.897732,-93.06081 +55918,MN,Brownsdale,43.724761,-92.873752 +55919,MN,Brownsville,43.670732,-91.301226 +55920,MN,Byron,44.037333,-92.630753 +55921,MN,Caledonia,43.622079,-91.483657 +55922,MN,Canton,43.566687,-91.912957 +55923,MN,Chatfield,43.836201,-92.157351 +55924,MN,Claremont,44.05223,-92.988839 +55925,MN,Dakota,43.914806,-91.39404 +55926,MN,Dexter,43.715962,-92.726764 +55927,MN,Dodge Center,44.032514,-92.855376 +55929,MN,Dover,44.001457,-92.141511 +55932,MN,Elgin,44.135837,-92.253493 +55933,MN,Elkton,43.634806,-92.710407 +55934,MN,Viola,44.004294,-92.244068 +55935,MN,Fountain,43.728404,-92.142288 +55936,MN,Grand Meadow,43.710065,-92.569203 +55937,MN,Granger,43.544873,-92.156115 +55939,MN,Harmony,43.566268,-92.014511 +55940,MN,Hayfield,43.892259,-92.817489 +55941,MN,Hokah,43.750856,-91.345472 +55943,MN,Houston,43.792904,-91.562565 +55944,MN,Kasson,44.024029,-92.74642 +55945,MN,Theilman,44.305396,-92.00839 +55946,MN,Kenyon,44.255237,-93.019661 +55947,MN,La Crescent,43.830686,-91.326325 +55949,MN,Lanesboro,43.717447,-91.987719 +55951,MN,Le Roy,43.531533,-92.506464 +55952,MN,Lewiston,43.970193,-91.866162 +55953,MN,Lyle,43.530868,-92.932818 +55954,MN,Mabel,43.544611,-91.780636 +55955,MN,Mantorville,44.070195,-92.757962 +55956,MN,Mazeppa,44.264568,-92.520683 +55957,MN,Millville,44.235862,-92.267188 +55959,MN,Minnesota City,44.083222,-91.741808 +55960,MN,Oronoco,44.148861,-92.48496 +55961,MN,Ostrander,43.597188,-92.415744 +55962,MN,Peterson,43.77691,-91.844338 +55963,MN,Pine Island,44.211009,-92.661347 +55964,MN,Plainview,44.16373,-92.162125 +55965,MN,Preston,43.664132,-92.096039 +55967,MN,Racine,43.78997,-92.531013 +55969,MN,Rollingstone,44.102501,-91.815795 +55970,MN,Rose Creek,43.627423,-92.862082 +55971,MN,Rushford,43.821626,-91.75365 +55972,MN,Saint Charles,43.958481,-92.051738 +55973,MN,Sargeant,43.808976,-92.759517 +55974,MN,Spring Grove,43.562339,-91.636788 +55975,MN,Spring Valley,43.682288,-92.367985 +55976,MN,Stewartville,43.867345,-92.454654 +55977,MN,Taopi,43.545783,-92.633455 +55978,MN,Theilman,44.30278,-92.211579 +55979,MN,Utica,43.958727,-91.941737 +55981,MN,Wabasha,44.370273,-92.036058 +55982,MN,Waltham,43.806958,-92.873446 +55983,MN,Wanamingo,44.31214,-92.810258 +55985,MN,West Concord,44.151954,-92.882495 +55986,MN,Whalan,43.716528,-91.918863 +55987,MN,Goodview,44.039132,-91.653348 +55990,MN,Wykoff,43.71464,-92.267921 +55991,MN,Hammond,44.248812,-92.403967 +55992,MN,Zumbrota,44.303179,-92.671863 +56001,MN,Mankato,44.153809,-93.996044 +56003,MN,North Mankato,44.177541,-94.031476 +56007,MN,Albert Lea,43.653678,-93.370672 +56009,MN,Alden,43.646586,-93.582307 +56010,MN,Amboy,43.890326,-94.177353 +56011,MN,Belle Plaine,44.613852,-93.760394 +56013,MN,Blue Earth,43.639426,-94.092379 +56014,MN,Bricelyn,43.574628,-93.821081 +56016,MN,Clarks Grove,43.762971,-93.323222 +56017,MN,Cleveland,44.32014,-93.828622 +56019,MN,Comfrey,44.111069,-94.91345 +56020,MN,Conger,43.611417,-93.522358 +56021,MN,Courtland,44.279083,-94.348229 +56022,MN,Darfur,44.061034,-94.813416 +56023,MN,Delavan,43.771859,-94.022488 +56024,MN,Eagle Lake,44.154587,-93.871912 +56025,MN,Easton,43.758126,-93.933994 +56026,MN,Ellendale,43.882591,-93.319492 +56027,MN,Elmore,43.520065,-94.098368 +56028,MN,Elysian,44.22313,-93.696498 +56029,MN,Emmons,43.508851,-93.482441 +56030,MN,Essig,44.323754,-94.56823 +56031,MN,Fairmont,43.637592,-94.45095 +56032,MN,Freeborn,43.784763,-93.574543 +56033,MN,Frost,43.563796,-93.936099 +56034,MN,Garden City,44.046748,-94.179084 +56035,MN,Geneva,43.82354,-93.267096 +56036,MN,Glenville,43.557749,-93.261761 +56037,MN,Good Thunder,43.995187,-94.067662 +56039,MN,Granada,43.706082,-94.330731 +56041,MN,Hanska,44.152678,-94.493267 +56042,MN,Hartland,43.803989,-93.476953 +56043,MN,Hayward,43.63864,-93.237727 +56044,MN,Henderson,44.534398,-93.934487 +56045,MN,Hollandale,43.752842,-93.167989 +56046,MN,Hope,43.979723,-93.345823 +56047,MN,Huntley,43.723746,-94.201567 +56048,MN,Janesville,44.116778,-93.709462 +56050,MN,Kasota,44.284188,-93.945319 +56051,MN,Kiester,43.541445,-93.710191 +56052,MN,Kilkenny,44.318532,-93.516397 +56054,MN,Lafayette,44.407315,-94.436463 +56055,MN,Lake Crystal,44.120189,-94.218385 +56057,MN,Le Center,44.385348,-93.721428 +56058,MN,Le Sueur,44.458154,-93.885588 +56060,MN,Lewisville,43.920922,-94.428854 +56061,MN,London,43.543455,-93.116527 +56062,MN,Madelia,44.049949,-94.410994 +56063,MN,Madison Lake,44.222074,-93.828893 +56064,MN,Manchester,43.716762,-93.460654 +56065,MN,Mapleton,43.933065,-93.954247 +56067,MN,Meriden,44.069875,-93.351167 +56068,MN,Minnesota Lake,43.829465,-93.828201 +56069,MN,Montgomery,44.435591,-93.581024 +56071,MN,New Prague,44.540239,-93.580473 +56072,MN,New Richland,43.893724,-93.499541 +56073,MN,New Ulm,44.304378,-94.464421 +56074,MN,Nicollet,44.272373,-94.186701 +56075,MN,Northrop,43.721164,-94.43495 +56076,MN,Oakland,43.632981,-93.111325 +56077,MN,Otisco,43.981513,-93.474097 +56078,MN,Pemberton,43.959955,-93.818449 +56080,MN,Saint Clair,44.077775,-93.844932 +56081,MN,Saint James,43.987519,-94.622935 +56082,MN,Saint Peter,44.335107,-93.981061 +56083,MN,Sanborn,44.218291,-95.132793 +56085,MN,Sleepy Eye,44.282089,-94.727251 +56087,MN,Springfield,44.232905,-94.979204 +56088,MN,Truman,43.820008,-94.431862 +56089,MN,Twin Lakes,43.553951,-93.388667 +56090,MN,Vernon Center,43.970557,-94.214212 +56091,MN,Waldorf,43.939868,-93.704264 +56092,MN,Walters,43.623868,-93.70102 +56093,MN,Waseca,44.0834,-93.510828 +56096,MN,Waterville,44.223796,-93.575063 +56097,MN,Wells,43.743396,-93.732069 +56098,MN,Winnebago,43.77549,-94.16324 +56101,MN,Wilder,43.879022,-95.151531 +56110,MN,Adrian,43.619683,-95.927261 +56111,MN,Alpha,43.594594,-94.905088 +56112,MN,Amiret,44.325134,-95.719046 +56113,MN,Arco,44.409147,-96.199913 +56114,MN,Avoca,43.970553,-95.600152 +56115,MN,Balaton,44.225253,-95.88377 +56116,MN,Beaver Creek,43.622343,-96.369771 +56117,MN,Bigelow,43.533612,-95.651527 +56118,MN,Bingham Lake,43.894155,-95.04571 +56119,MN,Brewster,43.703223,-95.480676 +56120,MN,Butterfield,43.965417,-94.795627 +56121,MN,Ceylon,43.538243,-94.614908 +56122,MN,Chandler,43.916308,-95.929616 +56123,MN,Currie,44.094616,-95.695323 +56124,MN,Delft,43.978502,-95.047234 +56125,MN,Dovray,44.05967,-95.527082 +56126,MN,Dundee,43.819052,-95.499286 +56127,MN,Dunnell,43.553052,-94.787558 +56128,MN,Edgerton,43.882419,-96.146333 +56129,MN,Ellsworth,43.526539,-96.011248 +56130,MN,56130,44.240346,-96.032692 +56131,MN,Fulda,43.875298,-95.597937 +56132,MN,Garvin,44.229318,-95.767215 +56133,MN,Hadley,44.03105,-95.869025 +56134,MN,Hardwick,43.791072,-96.21607 +56135,MN,56135,43.958423,-96.19247 +56136,MN,Hendricks,44.499514,-96.407753 +56137,MN,Heron Lake,43.79788,-95.326736 +56138,MN,Hills,43.533548,-96.364527 +56139,MN,Holland,44.075904,-96.190277 +56141,MN,Iona,43.902631,-95.771769 +56142,MN,Ivanhoe,44.507119,-96.226059 +56143,MN,Jackson,43.645732,-94.993827 +56144,MN,Jasper,43.856827,-96.385035 +56145,MN,Jeffers,44.073678,-95.154664 +56146,MN,Kanaranzi,43.54979,-96.111306 +56147,MN,Kenneth,43.763738,-96.10886 +56149,MN,Lake Benton,44.278211,-96.291035 +56150,MN,Lakefield,43.654456,-95.184834 +56151,MN,Lake Wilson,44.009529,-95.97973 +56152,MN,Lamberton,44.237776,-95.273946 +56153,MN,Leota,43.822628,-96.005392 +56155,MN,Lismore,43.733857,-95.968178 +56156,MN,Luverne,43.661366,-96.221562 +56157,MN,Lynd,44.40322,-95.923284 +56158,MN,Magnolia,43.638211,-96.100825 +56159,MN,Mountain Lake,43.938998,-94.927313 +56160,MN,Odin,43.882402,-94.77402 +56161,MN,Okabena,43.72302,-95.338112 +56162,MN,Ormsby,43.861639,-94.687255 +56164,MN,Hatfield,44.009516,-96.322762 +56165,MN,Reading,43.713604,-95.738945 +56166,MN,Revere,44.271326,-95.399588 +56167,MN,Round Lake,43.562045,-95.450151 +56168,MN,Rushmore,43.624011,-95.776728 +56169,MN,Russell,44.320129,-95.942564 +56170,MN,Florence,44.163836,-96.079028 +56171,MN,Sherburn,43.661089,-94.726877 +56172,MN,Slayton,43.985596,-95.755448 +56173,MN,Steen,43.531728,-96.243868 +56174,MN,Storden,44.052383,-95.301926 +56175,MN,Tracy,44.234201,-95.621301 +56176,MN,Trimont,43.782702,-94.71863 +56178,MN,Tyler,44.277342,-96.130235 +56179,MN,Verdi,44.234078,-96.372429 +56180,MN,Walnut Grove,44.229375,-95.496451 +56181,MN,Welcome,43.67052,-94.588593 +56183,MN,Westbrook,44.065381,-95.423208 +56185,MN,Wilmont,43.7692,-95.832421 +56186,MN,Woodstock,43.987338,-96.119198 +56187,MN,Worthington,43.628626,-95.605907 +56201,MN,Willmar,45.139264,-95.052315 +56207,MN,Alberta,45.557086,-96.049772 +56208,MN,Appleton,45.20543,-95.994872 +56209,MN,Atwater,45.111645,-94.793779 +56210,MN,Barry,45.547446,-96.560527 +56211,MN,Beardsley,45.553855,-96.706013 +56212,MN,Bellingham,45.155626,-96.32235 +56214,MN,Belview,44.605486,-95.317757 +56215,MN,Benson,45.312904,-95.576644 +56216,MN,Svea,44.939512,-95.063955 +56218,MN,Boyd,44.850725,-95.942102 +56219,MN,Browns Valley,45.606934,-96.80625 +56220,MN,Canby,44.720187,-96.278394 +56221,MN,Chokio,45.552369,-96.17331 +56222,MN,Clara City,44.963912,-95.349902 +56223,MN,Clarkfield,44.774261,-95.830405 +56224,MN,Clements,44.39432,-95.047447 +56225,MN,Clinton,45.457659,-96.418161 +56226,MN,Clontarf,45.373418,-95.678629 +56227,MN,Correll,45.290742,-96.175266 +56228,MN,Cosmos,44.958969,-94.697827 +56229,MN,Cottonwood,44.600251,-95.692508 +56230,MN,Danube,44.795567,-95.078366 +56231,MN,Danvers,45.341853,-95.886194 +56232,MN,Dawson,44.931737,-96.015014 +56233,MN,De Graff,45.270845,-95.446588 +56235,MN,Donnelly,45.70137,-96.064937 +56236,MN,Dumont,45.671742,-96.406123 +56237,MN,Echo,44.631046,-95.418223 +56238,MN,Evan,44.351114,-94.816956 +56239,MN,Ghent,44.507843,-95.893642 +56240,MN,Graceville,45.560248,-96.420925 +56241,MN,Granite Falls,44.808749,-95.551557 +56243,MN,Grove City,45.153172,-94.687843 +56244,MN,Hancock,45.498464,-95.800775 +56245,MN,Hanley Falls,44.678862,-95.682492 +56246,MN,Hawick,45.361775,-94.820762 +56247,MN,Hazel Run,44.749688,-95.712187 +56248,MN,Herman,45.807104,-96.099188 +56249,MN,Holloway,45.270805,-95.916374 +56250,MN,Johnson,45.573007,-96.266277 +56251,MN,Kandiyohi,45.123162,-94.947274 +56252,MN,Kerkhoven,45.209626,-95.311465 +56253,MN,Lake Lillian,44.96603,-94.901443 +56254,MN,Louisburg,45.130556,-96.171539 +56255,MN,Lucan,44.413237,-95.411934 +56256,MN,Madison,44.994618,-96.164507 +56257,MN,Marietta,44.963582,-96.409448 +56258,MN,Marshall,44.448127,-95.779454 +56260,MN,Maynard,44.922615,-95.484508 +56262,MN,Milan,45.114317,-95.869045 +56263,MN,Milroy,44.436494,-95.554471 +56264,MN,Minneota,44.558732,-95.976714 +56265,MN,Montevideo,44.968829,-95.676473 +56266,MN,Morgan,44.392554,-94.921783 +56267,MN,Morris,45.592095,-95.917234 +56270,MN,Morton,44.566189,-95.026817 +56271,MN,Murdock,45.216147,-95.404897 +56272,MN,Nassau,45.107554,-96.413307 +56273,MN,New London,45.294936,-94.948008 +56274,MN,Norcross,45.885839,-96.134168 +56276,MN,Odessa,45.299766,-96.310154 +56277,MN,Olivia,44.770627,-94.972747 +56278,MN,Ortonville,45.329621,-96.45965 +56279,MN,Pennock,45.131031,-95.175333 +56280,MN,Porter,44.656532,-96.15812 +56281,MN,Prinsburg,44.937088,-95.18654 +56282,MN,Raymond,45.018097,-95.220788 +56283,MN,Delhi,44.531753,-95.10713 +56284,MN,Renville,44.777609,-95.198879 +56285,MN,Sacred Heart,44.797536,-95.353801 +56286,MN,Saint Leo,44.711091,-96.042546 +56287,MN,Seaforth,44.490536,-95.297768 +56288,MN,Spicer,45.224112,-94.911572 +56289,MN,Sunburg,45.358316,-95.204915 +56290,MN,56290,45.019708,-95.052128 +56291,MN,Taunton,44.595076,-96.052594 +56292,MN,Vesta,44.505052,-95.411801 +56293,MN,Wabasso,44.405865,-95.2632 +56294,MN,Wanda,44.32295,-95.178 +56295,MN,Watson,45.019443,-95.794203 +56296,MN,Wheaton,45.811104,-96.486598 +56297,MN,Wood Lake,44.637915,-95.540908 +56301,MN,Saint Cloud,45.540972,-94.181857 +56303,MN,Saint Cloud,45.571298,-94.203634 +56304,MN,Saint Cloud,45.552113,-94.128447 +56307,MN,Albany,45.615114,-94.574022 +56308,MN,Alexandria,45.881747,-95.381994 +56309,MN,Ashby,46.078066,-95.821417 +56310,MN,Avon,45.612168,-94.436029 +56311,MN,Barrett,45.899555,-95.875391 +56312,MN,Belgrade,45.486522,-94.969877 +56313,MN,Bock,45.784427,-93.553658 +56314,MN,Bowlus,45.81212,-94.417533 +56315,MN,Brandon,46.0039,-95.578769 +56316,MN,Brooten,45.493171,-95.090049 +56318,MN,Burtrum,45.88803,-94.696214 +56319,MN,Carlos,45.972572,-95.310468 +56320,MN,Cold Spring,45.449976,-94.437823 +56323,MN,Cyrus,45.569483,-95.706965 +56324,MN,Dalton,46.154414,-95.850017 +56326,MN,Evansville,46.01525,-95.695067 +56327,MN,Farwell,45.724424,-95.665583 +56328,MN,Flensburg,45.950899,-94.530767 +56329,MN,Foley,45.708687,-93.868459 +56330,MN,Foreston,45.702842,-93.695755 +56331,MN,Freeport,45.673146,-94.678529 +56332,MN,Garfield,45.995309,-95.450044 +56333,MN,Gilman,45.774178,-93.946876 +56334,MN,Glenwood,45.642911,-95.38681 +56336,MN,Grey Eagle,45.81069,-94.832075 +56338,MN,Hillman,46.06776,-93.881224 +56339,MN,Hoffman,45.823292,-95.795482 +56340,MN,Holdingford,45.724924,-94.458091 +56341,MN,Holmes City,45.810706,-95.56464 +56342,MN,Isle,46.169605,-93.474062 +56343,MN,Kensington,45.81761,-95.694452 +56345,MN,Little Falls,45.98108,-94.360428 +56347,MN,Little Sauk,45.962417,-94.898389 +56349,MN,Lowry,45.710469,-95.53221 +56350,MN,Mc Grath,46.244116,-93.241619 +56352,MN,Melrose,45.658183,-94.819768 +56353,MN,Milaca,45.779481,-93.645266 +56354,MN,Miltona,46.054519,-95.325767 +56355,MN,Nelson,45.8516,-95.226032 +56357,MN,Oak Park,45.671403,-93.921417 +56358,MN,Ogilvie,45.847632,-93.435921 +56359,MN,Onamia,46.09022,-93.68668 +56360,MN,Osakis,45.876836,-95.13317 +56361,MN,Parkers Prairie,46.176925,-95.360764 +56362,MN,Paynesville,45.398798,-94.715709 +56363,MN,Pease,45.697872,-93.649247 +56364,MN,Pierz,46.008059,-94.085306 +56367,MN,Rice,45.736383,-94.165752 +56368,MN,Richmond,45.423817,-94.546072 +56373,MN,Royalton,45.858928,-94.221063 +56374,MN,Saint Joseph,45.565124,-94.336688 +56375,MN,Saint Stephen,45.711815,-94.281662 +56377,MN,Sartell,45.631827,-94.213569 +56378,MN,Sauk Centre,45.728079,-94.968166 +56379,MN,Sauk Rapids,45.604032,-94.159088 +56380,MN,Sedan,45.51069,-95.263989 +56381,MN,Starbuck,45.592587,-95.542125 +56382,MN,Swanville,45.943148,-94.628921 +56384,MN,Upsala,45.809723,-94.575531 +56385,MN,Villard,45.711823,-95.241439 +56386,MN,Wahkon,46.11214,-93.497174 +56387,MN,Waite Park,45.54972,-94.224481 +56389,MN,West Union,45.798451,-95.08328 +56401,MN,East Gull Lake,46.357219,-94.201873 +56431,MN,Aitkin,46.479929,-93.645413 +56433,MN,Akeley,47.000987,-94.72343 +56434,MN,Aldrich,46.402538,-94.992017 +56435,MN,Backus,46.869905,-94.395918 +56437,MN,Bertha,46.251457,-95.035733 +56438,MN,Browerville,46.090525,-94.834581 +56440,MN,Clarissa,46.137305,-94.95719 +56441,MN,Crosby,46.509084,-93.987448 +56442,MN,Crosslake,46.678644,-94.114256 +56443,MN,Cushing,46.202194,-94.618452 +56444,MN,Deerwood,46.444571,-93.884863 +56446,MN,Eagle Bend,46.117017,-95.096061 +56447,MN,Emily,46.747791,-93.948385 +56448,MN,Fifty Lakes,46.746997,-94.065555 +56449,MN,Fort Ripley,46.20988,-94.252696 +56450,MN,Garrison,46.263725,-93.936343 +56452,MN,Hackensack,46.988442,-94.503324 +56453,MN,Hewitt,46.32497,-95.050361 +56455,MN,Ironton,46.464135,-94.043655 +56456,MN,Jenkins,46.650983,-94.332485 +56458,MN,Lake George,47.214992,-95.002148 +56460,MN,Lake Itasca,47.275725,-95.252149 +56461,MN,Laporte,47.236752,-94.777161 +56463,MN,Manhattan Beach,46.733563,-94.140068 +56464,MN,Menahga,46.757233,-95.071429 +56465,MN,Merrifield,46.494309,-94.204268 +56466,MN,Leader,46.321568,-94.628086 +56467,MN,Nevis,46.931892,-94.846005 +56468,MN,Lake Shore,46.484828,-94.296562 +56469,MN,Palisade,46.689492,-93.562741 +56470,MN,Park Rapids,46.937682,-95.038299 +56472,MN,Pequot Lakes,46.62569,-94.268426 +56473,MN,Pillager,46.398395,-94.392287 +56474,MN,Pine River,46.693796,-94.447691 +56475,MN,Randall,46.073361,-94.500543 +56477,MN,Sebeka,46.630615,-95.068055 +56479,MN,Staples,46.353552,-94.763299 +56481,MN,Verndale,46.426995,-94.853268 +56482,MN,Wadena,46.440121,-95.128283 +56484,MN,Walker,47.08775,-94.584675 +56485,MN,Whipholt,47.040953,-94.350974 +56501,MN,Detroit Lakes,46.834877,-95.800606 +56510,MN,Lockhart,47.315597,-96.503569 +56511,MN,Audubon,46.871887,-95.988136 +56513,MN,Baker,46.685764,-96.604955 +56514,MN,Downer,46.677296,-96.37269 +56515,MN,Battle Lake,46.314175,-95.714395 +56516,MN,Bejou,47.44909,-95.945423 +56517,MN,Beltrami,47.572118,-96.454864 +56518,MN,Bluffton,46.491795,-95.223592 +56519,MN,Borup,47.189641,-96.552969 +56520,MN,Breckenridge,46.27966,-96.56222 +56521,MN,Callaway,47.007642,-95.943964 +56522,MN,Doran,46.129645,-96.437169 +56523,MN,Eldred,47.653011,-96.802647 +56524,MN,Clitherall,46.31693,-95.585822 +56525,MN,Comstock,46.666703,-96.739752 +56527,MN,Deer Creek,46.411193,-95.267265 +56528,MN,Dent,46.555417,-95.764357 +56529,MN,Dilworth,46.878168,-96.70222 +56531,MN,Elbow Lake,45.995267,-95.967149 +56533,MN,Elizabeth,46.406218,-96.085093 +56534,MN,Erhard,46.494817,-96.059264 +56535,MN,Erskine,47.661817,-96.012173 +56536,MN,Felton,47.070528,-96.505225 +56537,MN,Carlisle,46.289723,-96.064338 +56540,MN,Fertile,47.521367,-96.237127 +56542,MN,Fosston,47.581584,-95.743082 +56543,MN,Foxhome,46.258366,-96.317579 +56544,MN,Frazee,46.756469,-95.521159 +56545,MN,Gary,47.367491,-96.215233 +56546,MN,Georgetown,47.099865,-96.726996 +56547,MN,Glyndon,46.882023,-96.558338 +56548,MN,Halstad,47.355114,-96.798038 +56549,MN,Rollag,46.884185,-96.31115 +56550,MN,Hendrum,47.26889,-96.79875 +56551,MN,Henning,46.325606,-95.385162 +56552,MN,Hitterdal,47.001354,-96.28884 +56553,MN,Kent,46.437811,-96.685181 +56554,MN,Lake Park,46.817623,-96.067047 +56556,MN,Mcintosh,47.652165,-95.886252 +56557,MN,Mahnomen,47.336155,-95.885609 +56560,MN,Moorhead,46.867748,-96.757197 +56565,MN,Nashua,46.053731,-96.316009 +56566,MN,Naytahwaush,47.26007,-95.628324 +56567,MN,New York Mills,46.555867,-95.404717 +56568,MN,Nielsville,47.537336,-96.757433 +56569,MN,Ogema,47.102865,-95.915124 +56570,MN,Osage,46.932896,-95.235284 +56571,MN,Ottertail,46.417722,-95.543571 +56572,MN,Pelican Rapids,46.599444,-96.066227 +56573,MN,Perham,46.603106,-95.581763 +56574,MN,Perley,47.18308,-96.777722 +56575,MN,Ponsford,47.013348,-95.319717 +56576,MN,Richville,46.500807,-95.592891 +56577,MN,Richwood,46.93609,-95.850094 +56578,MN,Rochert,46.855904,-95.600443 +56579,MN,Rothsay,46.509412,-96.288726 +56580,MN,Sabin,46.770257,-96.59852 +56581,MN,Shelly,47.455375,-96.783802 +56583,MN,Tenney,45.990196,-96.387049 +56584,MN,Twin Valley,47.250905,-96.246382 +56585,MN,Ulen,47.090263,-96.28239 +56586,MN,Underwood,46.32652,-95.84155 +56587,MN,Vergas,46.670645,-95.794812 +56588,MN,Vining,46.256135,-95.588263 +56589,MN,Waubun,47.192009,-95.887125 +56590,MN,Wendell,46.056174,-96.114407 +56592,MN,Winger,47.537516,-95.994085 +56593,MN,Wolf Lake,46.833417,-95.360706 +56594,MN,Wolverton,46.555017,-96.61487 +56601,MN,Bemidji,47.488071,-94.848809 +56621,MN,Bagley,47.487024,-95.41334 +56623,MN,Baudette,48.692724,-94.599479 +56625,MN,56625,47.357339,-95.039719 +56626,MN,Bena,47.347732,-94.251921 +56627,MN,Big Falls,48.156028,-93.729629 +56628,MN,Bigfork,47.750227,-93.670699 +56629,MN,Birchdale,48.624696,-94.167652 +56630,MN,Blackduck,47.738136,-94.496072 +56632,MN,Boy River,47.181841,-94.102587 +56633,MN,Cass Lake,47.35155,-94.611896 +56634,MN,Clearbrook,47.714581,-95.375185 +56636,MN,Deer River,47.382867,-93.84979 +56637,MN,Talmoon,47.588764,-93.774913 +56639,MN,Effie,47.847187,-93.579905 +56641,MN,Federal Dam,47.206914,-94.257519 +56644,MN,Gonvick,47.749009,-95.499014 +56646,MN,Gully,47.769745,-95.641034 +56647,MN,Hines,47.732429,-94.647666 +56649,MN,International Fa,48.583398,-93.40609 +56650,MN,Kelliher,47.927173,-94.538166 +56651,MN,Lengby,47.536998,-95.627475 +56652,MN,Leonard,47.628905,-95.370775 +56653,MN,Littlefork,48.385233,-93.539932 +56654,MN,Loman,48.516406,-93.840673 +56655,MN,Longville,47.024842,-94.198182 +56657,MN,Marcell,47.634527,-93.678425 +56659,MN,Max,47.628919,-93.972031 +56660,MN,Mizpah,47.949525,-94.146748 +56661,MN,Northome,47.844039,-94.204274 +56662,MN,Outing,46.837528,-93.944252 +56663,MN,Pennington,47.465121,-94.483361 +56665,MN,Pitt,48.782986,-94.728252 +56666,MN,Ponemah,48.037168,-94.917048 +56667,MN,Puposky,47.7436,-94.980294 +56668,MN,Ranier,48.611847,-93.312457 +56669,MN,Ray,48.421834,-93.089549 +56670,MN,Redby,47.868888,-94.940409 +56671,MN,Redlake,47.865378,-95.06432 +56672,MN,Remer,47.087422,-93.919647 +56673,MN,Roosevelt,48.814807,-95.179389 +56674,MN,Saum,47.974492,-94.651203 +56676,MN,Shevlin,47.500364,-95.245021 +56678,MN,Solway,47.547972,-95.120475 +56680,MN,Spring Lake,47.588811,-93.838215 +56681,MN,Squaw Lake,47.636162,-94.1475 +56682,MN,Swift,48.847573,-95.297499 +56683,MN,Tenstrike,47.661146,-94.682432 +56684,MN,Trail,47.747769,-95.760668 +56685,MN,Waskish,48.176971,-94.503707 +56686,MN,Williams,48.802218,-94.955586 +56687,MN,Wilton,47.535254,-94.986238 +56688,MN,Wirt,47.716428,-93.981079 +56701,MN,Thief River Fall,48.110391,-96.167019 +56710,MN,Alvarado,48.201968,-96.991457 +56711,MN,Angle Inlet,49.324924,-95.090248 +56712,MN,Angus,48.092675,-96.656978 +56713,MN,Argyle,48.331418,-96.867096 +56714,MN,Badger,48.791294,-96.096523 +56715,MN,Brooks,47.812942,-96.011663 +56716,MN,Crookston,47.779694,-96.593078 +56720,MN,Donaldson,48.579792,-96.857894 +56721,MN,East Grand Forks,47.931802,-97.021262 +56722,MN,Euclid,48.033804,-96.921496 +56723,MN,Fisher,47.838145,-96.880312 +56724,MN,Gatzke,48.410416,-95.790305 +56725,MN,Goodridge,48.068586,-95.728344 +56726,MN,Greenbush,48.695667,-96.187091 +56727,MN,Grygla,48.307068,-95.639805 +56728,MN,Hallock,48.774855,-96.944486 +56729,MN,Halma,48.666895,-96.596899 +56732,MN,Karlstad,48.591592,-96.551116 +56733,MN,Kennedy,48.633686,-96.961407 +56734,MN,Lake Bronson,48.77868,-96.643145 +56735,MN,Orleans,48.881968,-96.813729 +56736,MN,Mentor,47.657597,-96.177823 +56737,MN,Middle River,48.442593,-96.12325 +56738,MN,Newfolden,48.28945,-96.255018 +56740,MN,Noyes,48.969223,-97.149032 +56741,MN,Oak Island,49.313466,-94.849209 +56742,MN,Oklee,47.82861,-95.861693 +56744,MN,Oslo,48.20657,-97.116252 +56748,MN,Plummer,47.911324,-95.964558 +56750,MN,Red Lake Falls,47.882285,-96.268097 +56751,MN,Pencer,48.826809,-95.756709 +56754,MN,Saint Hilaire,48.010871,-96.224914 +56755,MN,Saint Vincent,48.945825,-97.170307 +56756,MN,Salol,48.852213,-95.535594 +56757,MN,Stephen,48.452488,-96.867392 +56758,MN,Strandquist,48.45256,-96.472266 +56759,MN,Strathcona,48.626556,-96.109604 +56760,MN,Viking,48.234881,-96.474926 +56761,MN,Wannaska,48.64515,-95.7072 +56762,MN,Radium,48.20784,-96.759702 +56763,MN,Warroad,48.911144,-95.353843 +38601,MS,Abbeville,34.455553,-89.568835 +38603,MS,Cannon,34.79456,-89.205428 +38606,MS,Batesville,34.331651,-89.91418 +38610,MS,Blue Mountain,34.670986,-89.008775 +38611,MS,Byhalia,34.885351,-89.676332 +38614,MS,Stovall,34.204984,-90.577755 +38617,MS,Coahoma,34.36247,-90.472748 +38618,MS,Coldwater,34.692362,-89.986882 +38619,MS,Como,34.513728,-89.915508 +38620,MS,Courtland,34.25958,-89.939591 +38621,MS,Askew,34.453966,-90.185524 +38625,MS,Dumas,34.64915,-88.807229 +38626,MS,Dundee,34.528181,-90.38907 +38627,MS,Etta,34.435231,-89.176706 +38629,MS,Falkner,34.841682,-88.952493 +38632,MS,Hernando,34.809588,-90.009487 +38633,MS,Hickory Flat,34.624362,-89.186229 +38635,MS,Holly Springs,34.747061,-89.489714 +38637,MS,Horn Lake,34.9519,-90.050719 +38641,MS,Lake Cormorant,34.893733,-90.160795 +38642,MS,Lamar,34.927072,-89.31633 +38643,MS,Lambert,34.183719,-90.262991 +38645,MS,Lyon,34.247369,-90.498147 +38646,MS,Marks,34.260735,-90.281602 +38647,MS,Michigan City,34.931849,-89.136173 +38650,MS,Myrtle,34.540209,-89.115701 +38651,MS,Nesbit,34.899189,-90.012199 +38652,MS,New Albany,34.485051,-89.003058 +38654,MS,Olive Branch,34.94414,-89.854427 +38655,MS,Lafayette,34.354354,-89.49692 +38657,MS,Pleasant Grove,34.469951,-90.102494 +38658,MS,Pope,34.190559,-90.002735 +38659,MS,Potts Camp,34.604742,-89.315073 +38661,MS,Red Banks,34.875039,-89.519839 +38663,MS,Ripley,34.750912,-88.923973 +38664,MS,Robinsonville,34.809329,-90.305174 +38665,MS,Savage,34.611981,-90.138193 +38666,MS,Sardis,34.427573,-89.922083 +38668,MS,Senatobia,34.632306,-89.885501 +38670,MS,Sledge,34.382347,-90.20904 +38671,MS,Southaven,34.977074,-89.999173 +38673,MS,Taylor,34.284878,-89.627278 +38674,MS,Tiplersville,34.90294,-88.915684 +38676,MS,Tunica,34.688355,-90.368515 +38677,MS,University,34.364513,-89.582742 +38680,MS,Walls,34.964051,-90.120789 +38683,MS,Walnut,34.952732,-88.905337 +38685,MS,Waterford,34.640248,-89.468298 +38701,MS,Greenville,33.378737,-91.046793 +38703,MS,Greenville,33.408494,-91.022795 +38720,MS,Alligator,34.129425,-90.738214 +38721,MS,Anguilla,33.01213,-90.809535 +38725,MS,Benoit,33.644795,-91.033765 +38726,MS,Beulah,33.787954,-90.979545 +38730,MS,Boyle,33.685369,-90.733503 +38732,MS,Cleveland,33.743002,-90.730871 +38736,MS,Doddsville,33.630045,-90.52637 +38737,MS,Drew,33.867031,-90.540606 +38740,MS,Duncan,34.046966,-90.765191 +38744,MS,Glen Allan,33.025361,-91.009193 +38746,MS,Gunnison,33.943886,-90.931899 +38748,MS,Percy,33.177917,-90.84857 +38751,MS,Baird,33.449075,-90.654144 +38753,MS,Inverness,33.348964,-90.605065 +38754,MS,Isola,33.247112,-90.604027 +38756,MS,Elizabeth,33.410025,-90.892801 +38759,MS,Merigold,33.837252,-90.725571 +38761,MS,Moorhead,33.478325,-90.51425 +38762,MS,Mound Bayou,33.886023,-90.730247 +38769,MS,Rosedale,33.843166,-90.992289 +38771,MS,Ruleville,33.724052,-90.552657 +38773,MS,Shaw,33.587388,-90.814275 +38774,MS,Shelby,33.949058,-90.762461 +38778,MS,Sunflower,33.584696,-90.638732 +38780,MS,Wayside,33.261023,-91.024801 +38801,MS,Tupelo,34.253834,-88.720853 +38821,MS,Amory,33.9844,-88.470917 +38824,MS,Baldwyn,34.527959,-88.63748 +38826,MS,Belden,34.278663,-88.816011 +38827,MS,Belmont,34.51025,-88.230912 +38828,MS,Blue Springs,34.427286,-88.859004 +38829,MS,Booneville,34.669431,-88.544299 +38833,MS,Burnsville,34.857885,-88.306962 +38834,MS,Kossuth,34.93236,-88.543884 +38838,MS,Dennis,34.549735,-88.21167 +38841,MS,Ecru,34.337106,-88.955956 +38843,MS,Fulton,34.274543,-88.379262 +38844,MS,Gattman,33.87417,-88.258779 +38846,MS,Glen,34.877981,-88.435859 +38847,MS,Golden,34.481214,-88.184159 +38848,MS,Greenwood Spring,33.99344,-88.312333 +38849,MS,Guntown,34.429882,-88.701059 +38850,MS,Houlka,34.056145,-89.053114 +38851,MS,Houston,33.902554,-88.967005 +38852,MS,Iuka,34.808891,-88.198289 +38855,MS,Mantachie,34.358677,-88.496034 +38856,MS,Marietta,34.501089,-88.449764 +38857,MS,Mooreville,34.280792,-88.59504 +38858,MS,Nettleton,34.082065,-88.605201 +38859,MS,New Site,34.561693,-88.435021 +38860,MS,Egypt,33.989015,-88.759843 +38862,MS,Plantersville,34.201073,-88.633456 +38863,MS,Pontotoc,34.217004,-88.986829 +38864,MS,Sarepta,34.178943,-89.163625 +38865,MS,Rienzi,34.796789,-88.579454 +38866,MS,Saltillo,34.383128,-88.66736 +38868,MS,Shannon,34.121035,-88.734206 +38870,MS,Smithville,34.064813,-88.390027 +38871,MS,Thaxton,34.313563,-89.151468 +38873,MS,Tishomingo,34.647753,-88.219395 +38876,MS,Tremont,34.233516,-88.239212 +38878,MS,Vardaman,33.919042,-89.192117 +38901,MS,Grenada,33.775094,-89.808738 +38912,MS,Avalon,33.633683,-90.022077 +38913,MS,Banner,34.094911,-89.415383 +38914,MS,Big Creek,33.851359,-89.437833 +38915,MS,Bruce,34.006628,-89.348387 +38916,MS,Calhoun City,33.840776,-89.317809 +38917,MS,Carrollton,33.520765,-89.950633 +38920,MS,Cascilla,33.907905,-90.036163 +38921,MS,Charleston,33.972621,-90.111559 +38922,MS,Coffeeville,33.921468,-89.678177 +38923,MS,Coila,33.373111,-89.991516 +38924,MS,Cruger,33.310977,-90.231577 +38925,MS,Duck Hill,33.686475,-89.733425 +38927,MS,Enid,34.126345,-90.004392 +38929,MS,Gore Springs,33.724529,-89.575449 +38930,MS,Greenwood,33.515884,-90.172589 +38940,MS,Holcomb,33.760385,-89.901958 +38941,MS,Itta Bena,33.479838,-90.339421 +38943,MS,Mc Carley,33.586383,-89.851281 +38944,MS,Minter City,33.751525,-90.31327 +38948,MS,Oakland,34.075552,-89.887748 +38949,MS,Water Valley,34.176817,-89.421408 +38950,MS,Philipp,33.757391,-90.209086 +38951,MS,Pittsboro,33.944326,-89.337622 +38952,MS,Schlater,33.624439,-90.361976 +38953,MS,Scobey,33.92526,-89.891019 +38954,MS,Sidon,33.40946,-90.177937 +38961,MS,Tillatoba,33.985229,-89.894461 +38963,MS,Tutwiler,33.98195,-90.375341 +38964,MS,Vance,34.093639,-90.375246 +38965,MS,Water Valley,34.152466,-89.637986 +38967,MS,Winona,33.485753,-89.727655 +39038,MS,Belzoni,33.18421,-90.492435 +39039,MS,Benton,32.815772,-90.281516 +39040,MS,Bentonia,32.700015,-90.372156 +39041,MS,Bolton,32.377751,-90.447436 +39042,MS,Brandon,32.303803,-89.964029 +39044,MS,Braxton,32.001581,-89.967225 +39045,MS,Camden,32.794832,-89.892838 +39046,MS,Canton,32.620543,-90.006079 +39049,MS,Carlisle,32.101322,-90.779904 +39051,MS,Edinburg,32.788635,-89.535274 +39055,MS,Church Hill,31.67864,-91.214903 +39056,MS,Clinton,32.341079,-90.322893 +39057,MS,Conehatta,32.466974,-89.268956 +39059,MS,Crystal Springs,31.993329,-90.374439 +39063,MS,Durant,33.082756,-89.86116 +39066,MS,Edwards,32.316008,-90.598392 +39067,MS,Ethel,33.152587,-89.494707 +39069,MS,Fayette,31.712058,-91.058226 +39071,MS,Flora,32.557832,-90.323506 +39073,MS,Florence,32.153002,-90.121672 +39074,MS,Forest,32.346999,-89.467201 +39078,MS,Georgetown,31.855198,-90.212736 +39079,MS,Goodman,32.972133,-89.982145 +39082,MS,Harrisville,31.967552,-90.105359 +39083,MS,Hazlehurst,31.856188,-90.405078 +39086,MS,Hermanville,31.956374,-90.844588 +39088,MS,Holly Bluff,32.824216,-90.704486 +39090,MS,Kosciusko,33.0446,-89.572351 +39092,MS,Lake,32.345909,-89.341354 +39094,MS,Lena,32.644588,-89.549435 +39095,MS,Lexington,33.125043,-90.055674 +39096,MS,Lorman,31.838257,-91.095691 +39097,MS,Louise,32.991945,-90.589321 +39108,MS,Mc Cool,33.163206,-89.326806 +39109,MS,Madden,32.708665,-89.381701 +39110,MS,Madison,32.467065,-90.108744 +39111,MS,Magee,31.849513,-89.750325 +39113,MS,Mayersville,32.901276,-91.028628 +39114,MS,Mendenhall,31.949425,-89.809494 +39116,MS,Mize,31.847285,-89.574135 +39117,MS,Morton,32.436105,-89.551222 +39119,MS,Mount Olive,31.734582,-89.672387 +39120,MS,Natchez,31.54924,-91.364214 +39140,MS,Newhebron,31.73004,-90.01526 +39144,MS,Pattison,31.851025,-90.828306 +39145,MS,Pelahatchie,32.317994,-89.79135 +39146,MS,Pickens,32.890519,-89.973707 +39149,MS,Pinola,31.827732,-90.008775 +39150,MS,Port Gibson,31.926604,-91.02303 +39152,MS,Pulaski,32.270845,-89.650521 +39153,MS,Raleigh,32.05084,-89.508818 +39154,MS,Learned,32.23922,-90.424088 +39156,MS,Redwood,32.486699,-90.785899 +39157,MS,Ridgeland,32.412165,-90.120697 +39159,MS,Rolling Fork,32.873317,-90.883274 +39160,MS,Sallis,33.000981,-89.755182 +39162,MS,Satartia,32.612515,-90.596458 +39166,MS,Silver City,33.05071,-90.492798 +39168,MS,Taylorsville,31.839388,-89.404875 +39169,MS,Tchula,33.162388,-90.250012 +39170,MS,Terry,32.114683,-90.324143 +39175,MS,Utica,32.122897,-90.604724 +39176,MS,Vaiden,33.33433,-89.757023 +39177,MS,Valley Park,32.632258,-90.854209 +39179,MS,Pickens,32.817424,-90.085477 +39180,MS,Vicksburg,32.325824,-90.85065 +39189,MS,Walnut Grove,32.613418,-89.410538 +39191,MS,Wesson,31.690055,-90.413106 +39192,MS,West,33.1883,-89.769526 +39194,MS,Yazoo City,32.85937,-90.403145 +39201,MS,Jackson,32.293502,-90.186655 +39202,MS,Jackson,32.314883,-90.178194 +39203,MS,Jackson,32.308145,-90.202064 +39204,MS,Jackson,32.283162,-90.230579 +39206,MS,Jackson,32.369956,-90.173787 +39208,MS,Pearl,32.276837,-90.102714 +39209,MS,Jackson,32.318422,-90.244626 +39211,MS,Jackson,32.373924,-90.129297 +39212,MS,Jackson,32.24347,-90.261201 +39213,MS,Jackson,32.355288,-90.217099 +39216,MS,Jackson,32.338574,-90.170814 +39218,MS,Richland,32.215224,-90.156231 +39269,MS,Jackson,32.30085,-90.188503 +39301,MS,Meridian,32.357441,-88.655973 +39305,MS,Meridian,32.440129,-88.678322 +39307,MS,Meridian,32.373591,-88.743598 +39320,MS,Bailey,32.475417,-88.699086 +39322,MS,Buckatunna,31.507976,-88.52573 +39323,MS,Chunky,32.247156,-88.946968 +39325,MS,Collinsville,32.518278,-88.815532 +39326,MS,Daleville,32.551124,-88.660942 +39327,MS,Decatur,32.435798,-89.116832 +39328,MS,De Kalb,32.716235,-88.733158 +39330,MS,Enterprise,32.156266,-88.84735 +39332,MS,Hickory,32.320012,-89.009254 +39335,MS,Lauderdale,32.502186,-88.495569 +39336,MS,Lawrence,32.287614,-89.272432 +39337,MS,Little Rock,32.540288,-89.181382 +39338,MS,Louin,32.099713,-89.219935 +39339,MS,Louisville,33.105824,-89.028653 +39341,MS,Macon,33.102674,-88.578093 +39345,MS,Newton,32.324448,-89.183951 +39346,MS,Noxapater,32.97895,-89.122076 +39347,MS,Pachuta,32.008105,-88.865293 +39348,MS,Paulding,32.016744,-89.058441 +39350,MS,Philadelphia,32.757224,-89.115371 +39352,MS,Porterville,32.636833,-88.498425 +39354,MS,Preston,32.853659,-88.813013 +39355,MS,Quitman,32.066845,-88.678803 +39356,MS,Rose Hill,32.148931,-89.001053 +39358,MS,Scooba,32.840197,-88.488272 +39360,MS,Matherville,31.903082,-88.725866 +39361,MS,Shuqualak,32.976933,-88.559393 +39362,MS,State Line,31.391619,-88.51711 +39363,MS,Stonewall,32.156396,-88.774827 +39364,MS,Toomsuba,32.429583,-88.489225 +39365,MS,Union,32.537329,-89.049522 +39366,MS,Vossburg,31.972301,-88.969598 +39367,MS,Waynesboro,31.675447,-88.678221 +39401,MS,Hattiesburg,31.314553,-89.306471 +39402,MS,Hattiesburg,31.309753,-89.37751 +39421,MS,Bassfield,31.503695,-89.702735 +39422,MS,Bay Springs,31.944939,-89.233768 +39423,MS,Beaumont,31.136763,-88.905492 +39425,MS,Brooklyn,30.998852,-89.23372 +39426,MS,Carriere,30.617772,-89.57793 +39427,MS,Carson,31.558501,-89.775821 +39428,MS,Collins,31.670712,-89.543809 +39429,MS,Columbia,31.255877,-89.799785 +39437,MS,Ellisville,31.579663,-89.223073 +39439,MS,Heidelberg,31.882031,-88.998052 +39440,MS,Laurel,31.705444,-89.131155 +39451,MS,Leakesville,31.123825,-88.559546 +39452,MS,Agricola,30.866722,-88.593391 +39455,MS,Lumberton,31.053356,-89.454254 +39456,MS,Leaf,31.078449,-88.81947 +39459,MS,Moselle,31.483626,-89.320633 +39461,MS,Neely,31.179325,-88.71983 +39462,MS,New Augusta,31.130907,-89.028611 +39464,MS,Ovett,31.47377,-89.039613 +39465,MS,Petal,31.347181,-89.222239 +39466,MS,Picayune,30.541796,-89.691021 +39470,MS,Poplarville,30.852362,-89.564751 +39474,MS,Prentiss,31.605655,-89.873497 +39475,MS,Purvis,31.149562,-89.462301 +39476,MS,Richton,31.343364,-88.910079 +39478,MS,Sandy Hook,31.047904,-89.818343 +39479,MS,Seminary,31.528485,-89.481585 +39480,MS,Soso,31.75941,-89.308223 +39481,MS,Stringer,31.844721,-89.262144 +39482,MS,Sumrall,31.359972,-89.577723 +39483,MS,Foxworth,31.247325,-89.931075 +39501,MS,Gulfport,30.382556,-89.097618 +39503,MS,Gulfport,30.460105,-89.088552 +39507,MS,Gulfport,30.396248,-89.035347 +39520,MS,Diamondhead,30.324275,-89.397356 +39530,MS,Biloxi,30.403478,-88.897143 +39531,MS,Biloxi,30.40334,-88.960499 +39532,MS,North Bay,30.452031,-88.918846 +39553,MS,Gautier,30.398032,-88.641173 +39560,MS,Long Beach,30.359756,-89.164577 +39561,MS,Mc Henry,30.697463,-89.153631 +39563,MS,Kreole,30.402773,-88.526015 +39564,MS,Ocean Springs,30.440433,-88.780099 +39567,MS,Pascagoula,30.530301,-88.516472 +39571,MS,Pass Christian,30.398918,-89.284269 +39573,MS,Perkinston,30.76686,-89.139985 +39574,MS,Saucier,30.596082,-89.147729 +39576,MS,Waveland,30.29138,-89.383679 +39577,MS,Wiggins,30.86095,-89.132369 +39581,MS,Pascagoula,30.366377,-88.52886 +39601,MS,Brookhaven,31.58581,-90.451995 +39629,MS,Bogue Chitto,31.456344,-90.473183 +39631,MS,Centreville,31.089329,-91.095985 +39633,MS,Crosby,31.299406,-91.023712 +39638,MS,Gloster,31.19033,-90.924045 +39641,MS,Jayess,31.403577,-90.186386 +39643,MS,Kokomo,31.177688,-89.982419 +39645,MS,Liberty,31.138427,-90.713349 +39647,MS,Mc Call Creek,31.490772,-90.783581 +39648,MS,Mc Comb,31.221594,-90.432449 +39652,MS,Magnolia,31.121745,-90.48311 +39653,MS,Meadville,31.428489,-90.857835 +39654,MS,Monticello,31.523776,-90.12796 +39656,MS,Oak Vale,31.441953,-89.98273 +39657,MS,Osyka,31.021747,-90.478977 +39661,MS,Roxie,31.504043,-91.062475 +39662,MS,Ruth,31.379495,-90.286673 +39663,MS,Silver Creek,31.575535,-90.017332 +39664,MS,Smithdale,31.367203,-90.675236 +39665,MS,Sontag,31.645313,-90.180125 +39666,MS,Summit,31.29752,-90.465427 +39667,MS,Tylertown,31.146552,-90.116918 +39668,MS,Union Church,31.710474,-90.825922 +39669,MS,Woodville,31.145913,-91.307596 +39701,MS,Columbus,33.537699,-88.426194 +39702,MS,Columbus,33.481175,-88.355387 +39730,MS,Aberdeen,33.828439,-88.538033 +39735,MS,Ackerman,33.351684,-89.20139 +39739,MS,Brooksville,33.213961,-88.501351 +39740,MS,Caledonia,33.686461,-88.314537 +39741,MS,Cedarbluff,33.61616,-88.826712 +39743,MS,Crawford,33.321922,-88.567119 +39744,MS,Tomnolen,33.568908,-89.304542 +39745,MS,French Camp,33.338319,-89.394585 +39746,MS,Hamilton,33.801141,-88.44784 +39747,MS,Kilmichael,33.416476,-89.569577 +39750,MS,Maben,33.526179,-89.065887 +39751,MS,Mantee,33.665493,-89.122906 +39752,MS,Mathiston,33.541493,-89.127479 +39755,MS,Pheba,33.596056,-88.951842 +39756,MS,Prairie,33.795113,-88.633463 +39759,MS,Sessums,33.450125,-88.817637 +39766,MS,Steens,33.56708,-88.327755 +39767,MS,Stewart,33.510097,-89.479 +39769,MS,Sturgis,33.35702,-89.04727 +39772,MS,Weir,33.264464,-89.280419 +39773,MS,West Point,33.626496,-88.68226 +39776,MS,Woodland,33.80661,-89.025557 +63005,MO,Chesterfield,38.631832,-90.614185 +63010,MO,Arnold,38.430484,-90.387046 +63011,MO,Manchester,38.604132,-90.55213 +63012,MO,Barnhart,38.338425,-90.41417 +63013,MO,Beaufort,38.429352,-91.170929 +63014,MO,Berger,38.644449,-91.337412 +63015,MO,Catawissa,38.436161,-90.761703 +63016,MO,Cedar Hill,38.357319,-90.649777 +63017,MO,Town And Country,38.647241,-90.53969 +63019,MO,Crystal City,38.23002,-90.382525 +63020,MO,De Soto,38.120421,-90.554621 +63021,MO,Ballwin,38.577032,-90.525527 +63023,MO,Dittmer,38.315465,-90.691101 +63025,MO,Crescent,38.484832,-90.626277 +63026,MO,Fenton,38.501489,-90.468299 +63028,MO,Festus,38.187889,-90.42859 +63030,MO,Fletcher,38.180141,-90.734456 +63031,MO,Florissant,38.806865,-90.340097 +63033,MO,Florissant,38.794711,-90.283062 +63034,MO,Florissant,38.833841,-90.293617 +63036,MO,French Village,37.996101,-90.400507 +63037,MO,Gerald,38.350719,-91.293062 +63038,MO,Glencoe,38.5745,-90.643971 +63039,MO,Gray Summit,38.503044,-90.829184 +63040,MO,Grover,38.573316,-90.646112 +63042,MO,Hazelwood,38.780875,-90.366925 +63043,MO,Maryland Heights,38.722896,-90.447403 +63044,MO,Bridgeton,38.750627,-90.416101 +63045,MO,Bridgeton,38.7561,-90.458062 +63048,MO,Herculaneum,38.260087,-90.387095 +63049,MO,High Ridge,38.472783,-90.528127 +63050,MO,Hillsboro,38.258582,-90.578196 +63051,MO,House Springs,38.413068,-90.557539 +63052,MO,Antonia,38.392733,-90.431134 +63055,MO,Labadie,38.520031,-90.876966 +63056,MO,Leslie,38.458228,-91.195164 +63060,MO,Lonedell,38.274982,-90.822216 +63061,MO,Luebbering,38.261499,-90.802713 +63068,MO,New Haven,38.573995,-91.22905 +63069,MO,Pacific,38.492168,-90.747968 +63070,MO,Pevely,38.279911,-90.411075 +63071,MO,Richwoods,38.149639,-90.83099 +63072,MO,Robertsville,38.381602,-90.801619 +63074,MO,Saint Ann,38.725928,-90.386418 +63077,MO,Saint Clair,38.329927,-90.971346 +63080,MO,Sullivan,38.230706,-91.156662 +63084,MO,Union,38.445629,-91.020596 +63088,MO,Valley Park,38.557619,-90.492422 +63089,MO,Villa Ridge,38.460108,-90.882198 +63090,MO,Washington,38.545851,-91.019346 +63091,MO,Rosebud,38.385301,-91.397407 +63101,MO,Saint Louis,38.634616,-90.191313 +63102,MO,Saint Louis,38.630803,-90.18736 +63103,MO,Saint Louis,38.633176,-90.216444 +63104,MO,Saint Louis,38.612819,-90.218512 +63105,MO,Clayton,38.642574,-90.324189 +63106,MO,Saint Louis,38.644246,-90.208198 +63107,MO,Saint Louis,38.664522,-90.21249 +63108,MO,Saint Louis,38.644526,-90.254397 +63109,MO,Saint Louis,38.585452,-90.292918 +63110,MO,Saint Louis,38.618534,-90.256381 +63111,MO,Saint Louis,38.563349,-90.249452 +63112,MO,Saint Louis,38.661619,-90.28187 +63113,MO,Saint Louis,38.65896,-90.249633 +63114,MO,Overland,38.704425,-90.363304 +63115,MO,Saint Louis,38.675618,-90.238478 +63116,MO,Saint Louis,38.581356,-90.262543 +63117,MO,Richmond Heights,38.629202,-90.324817 +63118,MO,Saint Louis,38.594265,-90.230911 +63119,MO,Webster Groves,38.588853,-90.350807 +63120,MO,Saint Louis,38.690914,-90.25945 +63121,MO,Normandy,38.705086,-90.296719 +63122,MO,Kirkwood,38.58486,-90.410042 +63123,MO,Affton,38.550594,-90.325304 +63124,MO,Ladue,38.642383,-90.375468 +63125,MO,Lemay,38.521899,-90.295909 +63126,MO,Sappington,38.550349,-90.378679 +63127,MO,Sappington,38.540369,-90.405967 +63128,MO,Sappington,38.498285,-90.372275 +63129,MO,South County,38.468864,-90.32139 +63130,MO,University City,38.663941,-90.321896 +63131,MO,Des Peres,38.612479,-90.44264 +63132,MO,Olivette,38.672823,-90.369642 +63133,MO,Saint Louis,38.6779,-90.303272 +63134,MO,Berkeley,38.739614,-90.337834 +63135,MO,Ferguson,38.748429,-90.302241 +63136,MO,Jennings,38.738878,-90.260189 +63137,MO,North County,38.74885,-90.217778 +63138,MO,North County,38.787041,-90.211582 +63139,MO,Saint Louis,38.610776,-90.292045 +63140,MO,Berkeley,38.738482,-90.322846 +63141,MO,Creve Coeur,38.661741,-90.457072 +63143,MO,Maplewood,38.613116,-90.319611 +63144,MO,Brentwood,38.620839,-90.350944 +63146,MO,West County,38.688418,-90.448251 +63147,MO,Saint Louis,38.713889,-90.237512 +63301,MO,Saint Charles,38.801424,-90.506503 +63303,MO,Saint Charles,38.762237,-90.547059 +63304,MO,Saint Charles,38.737769,-90.623443 +63330,MO,Annada,39.255758,-90.822355 +63332,MO,Augusta,38.572767,-90.881471 +63333,MO,Bellflower,39.0012,-91.348915 +63334,MO,Bowling Green,39.334639,-91.196232 +63336,MO,Clarksville,39.346477,-90.936205 +63339,MO,Curryville,39.325702,-91.349301 +63341,MO,Defiance,38.661557,-90.830231 +63343,MO,Elsberry,39.158953,-90.815956 +63344,MO,Eolia,39.243097,-91.009322 +63345,MO,Farber,39.27424,-91.579843 +63347,MO,Foley,39.053019,-90.777468 +63348,MO,Foristell,38.762557,-90.934328 +63349,MO,Hawk Point,38.976576,-91.121067 +63350,MO,High Hill,38.890238,-91.371473 +63351,MO,Jonesburg,38.871658,-91.30193 +63352,MO,Laddonia,39.259328,-91.689348 +63353,MO,Louisiana,39.43359,-91.066385 +63357,MO,Lake Sherwood,38.648619,-91.055459 +63359,MO,Middletown,39.105494,-91.387312 +63361,MO,Montgomery City,38.983949,-91.508486 +63362,MO,Moscow Mills,38.922927,-90.963001 +63363,MO,New Florence,38.902309,-91.490861 +63364,MO,New Hartford,39.188103,-91.292984 +63366,MO,Saint Paul,38.800101,-90.720159 +63367,MO,Lake Saint Louis,38.79355,-90.785407 +63369,MO,Old Monroe,38.934581,-90.778196 +63370,MO,Olney,39.087509,-91.211314 +63371,MO,Paynesville,39.258679,-90.907268 +63373,MO,Portage Des Siou,38.927629,-90.353115 +63376,MO,Saint Peters,38.78024,-90.622765 +63377,MO,Silex,39.116617,-91.036988 +63379,MO,Troy,39.001212,-90.962449 +63381,MO,Truxton,38.967002,-91.212618 +63382,MO,Vandalia,39.294937,-91.488299 +63383,MO,Warrenton,38.805042,-91.174047 +63384,MO,Wellsville,39.076482,-91.564519 +63385,MO,Wentzville,38.801963,-90.85344 +63386,MO,West Alton,38.875796,-90.238363 +63388,MO,Williamsburg,38.898143,-91.679188 +63389,MO,Winfield,38.989727,-90.821319 +63390,MO,Wright City,38.809677,-91.03293 +63401,MO,Hannibal,39.70636,-91.38387 +63430,MO,Alexandria,40.344514,-91.515437 +63431,MO,Anabel,39.736793,-92.351142 +63432,MO,Arbela,40.486299,-92.004741 +63433,MO,Ashburn,39.52904,-91.187651 +63434,MO,Bethel,39.892199,-92.031619 +63435,MO,Canton,40.143695,-91.547987 +63436,MO,Center,39.515397,-91.539842 +63437,MO,Clarence,39.736648,-92.25297 +63438,MO,Durham,39.962486,-91.670415 +63439,MO,Emden,39.85013,-91.880926 +63440,MO,Ewing,39.996237,-91.721627 +63441,MO,Frankford,39.489246,-91.303086 +63443,MO,Hunnewell,39.701831,-91.883231 +63445,MO,Kahoka,40.426576,-91.725033 +63446,MO,Knox City,40.138357,-92.007703 +63447,MO,La Belle,40.116383,-91.917125 +63448,MO,La Grange,40.039126,-91.518247 +63450,MO,Lentner,39.712269,-92.148916 +63451,MO,Leonard,39.907577,-92.194679 +63452,MO,Lewistown,40.086666,-91.815663 +63453,MO,Luray,40.493096,-91.891227 +63454,MO,Maywood,39.933289,-91.614769 +63456,MO,Monroe City,39.654586,-91.722999 +63457,MO,Monticello,40.10402,-91.712267 +63458,MO,Newark,39.997428,-91.99236 +63459,MO,New London,39.591672,-91.39599 +63460,MO,Novelty,40.035997,-92.243783 +63461,MO,Palmyra,39.791309,-91.536817 +63462,MO,Perry,39.420721,-91.664125 +63463,MO,Philadelphia,39.835931,-91.753803 +63464,MO,Plevna,39.992561,-92.111716 +63466,MO,Saint Patrick,40.319851,-91.654677 +63468,MO,Shelbina,39.694718,-92.03706 +63469,MO,Shelbyville,39.810792,-92.049782 +63470,MO,Steffenville,39.993976,-91.85945 +63471,MO,Taylor,39.914486,-91.527834 +63472,MO,Wayland,40.442574,-91.607864 +63473,MO,Williamstown,40.21559,-91.854809 +63474,MO,Wyaconda,40.372083,-91.907077 +63501,MO,Kirksville,40.190765,-92.585634 +63530,MO,Atlanta,39.914639,-92.475019 +63531,MO,Baring,40.250864,-92.231074 +63532,MO,Bevier,39.749707,-92.561925 +63533,MO,Brashear,40.195891,-92.433253 +63534,MO,Callao,39.744849,-92.635144 +63535,MO,Coatsville,40.566473,-92.638801 +63536,MO,Downing,40.479828,-92.391762 +63537,MO,Edina,40.179452,-92.145549 +63538,MO,Elmer,39.941456,-92.642413 +63539,MO,Ethel,39.914605,-92.766396 +63540,MO,Gibbs,40.083962,-92.443495 +63541,MO,Glenwood,40.514935,-92.588642 +63543,MO,Gorin,40.362217,-92.01397 +63544,MO,Green Castle,40.270325,-92.877966 +63545,MO,Green City,40.260125,-92.953244 +63546,MO,Greentop,40.344593,-92.55667 +63547,MO,Hurdland,40.160909,-92.279066 +63548,MO,Lancaster,40.525265,-92.526403 +63549,MO,La Plata,40.020831,-92.507669 +63551,MO,Livonia,40.511237,-92.724084 +63552,MO,Macon,39.748089,-92.462163 +63555,MO,Memphis,40.46191,-92.185083 +63556,MO,Milan,40.184435,-93.136149 +63557,MO,New Boston,39.933234,-92.915967 +63558,MO,New Cambria,39.75509,-92.769469 +63559,MO,Novinger,40.268513,-92.717236 +63560,MO,Pollock,40.33852,-93.111506 +63561,MO,Queen City,40.415175,-92.566263 +63563,MO,Rutledge,40.328984,-92.097559 +63565,MO,Unionville,40.481464,-92.995094 +63566,MO,Winigan,40.03706,-92.93007 +63567,MO,Worthington,40.424001,-92.740139 +63601,MO,Desloge,37.85555,-90.52735 +63620,MO,Annapolis,37.39809,-90.670235 +63621,MO,Arcadia,37.570054,-90.592768 +63622,MO,Belgrade,37.78886,-90.861308 +63623,MO,Belleview,37.681981,-90.799075 +63624,MO,Desloge,37.769865,-90.620732 +63625,MO,Black,37.547275,-90.991735 +63626,MO,Blackwell,38.071694,-90.709538 +63627,MO,Bloomsdale,38.045112,-90.280548 +63628,MO,Bonne Terre,37.931423,-90.525052 +63629,MO,Bunker,37.477227,-91.192735 +63630,MO,Cadet,38.012534,-90.743932 +63631,MO,Caledonia,37.763881,-90.740936 +63633,MO,Centerville,37.428537,-90.975657 +63636,MO,Des Arc,37.29546,-90.62787 +63637,MO,Doe Run,37.734818,-90.496842 +63638,MO,Ellington,37.239797,-90.958851 +63640,MO,Farmington,37.777299,-90.409377 +63645,MO,Millcreek,37.543716,-90.310527 +63648,MO,Irondale,37.82962,-90.698389 +63650,MO,Iron Mountain,37.614702,-90.635635 +63653,MO,Leadwood,37.864081,-90.591007 +63654,MO,Lesterville,37.482004,-90.842544 +63655,MO,Marquand,37.427403,-90.174092 +63656,MO,Middle Brook,37.670161,-90.673504 +63660,MO,Mineral Point,37.915555,-90.719324 +63662,MO,Patton,37.473347,-90.050045 +63664,MO,Potosi,37.954942,-90.841467 +63665,MO,Redford,37.323518,-90.921994 +63670,MO,Lake Forest Esta,37.950356,-90.09604 +63673,MO,Saint Mary,37.832481,-89.976989 +63675,MO,Vulcan,37.305963,-90.710608 +63701,MO,Cape Girardeau,37.31685,-89.545861 +63730,MO,Advance,37.092219,-89.910614 +63732,MO,New Wells,37.630633,-89.581453 +63733,MO,Arab,37.064804,-90.080448 +63735,MO,Bell City,37.011608,-89.798417 +63736,MO,Benton,37.069674,-89.566404 +63739,MO,Burfordville,37.363231,-89.820632 +63740,MO,Chaffee,37.172612,-89.64565 +63743,MO,Daisy,37.515064,-89.821327 +63744,MO,Delta,37.184417,-89.76086 +63747,MO,Friedheim,37.566904,-89.837552 +63748,MO,Frohna,37.66855,-89.661903 +63750,MO,Gipsy,37.131092,-90.194077 +63751,MO,Glenallen,37.323119,-90.051495 +63753,MO,Grassy,37.259347,-90.160838 +63755,MO,Jackson,37.387885,-89.651939 +63760,MO,Leopold,37.260903,-89.922735 +63763,MO,Mc Gee,37.044139,-90.190847 +63764,MO,Scopus,37.313464,-89.962732 +63766,MO,Millersville,37.440138,-89.795035 +63768,MO,63768,37.488177,-89.612833 +63769,MO,Oak Ridge,37.525787,-89.750818 +63770,MO,Old Appleton,37.583014,-89.707091 +63771,MO,Oran,37.086977,-89.673364 +63775,MO,Perryville,37.717437,-89.873664 +63780,MO,Scott City,37.20771,-89.518081 +63781,MO,Sedgewickville,37.536962,-89.927246 +63782,MO,Sturdivant,37.071011,-90.009215 +63783,MO,Uniontown,37.610708,-89.723744 +63785,MO,Whitewater,37.286495,-89.736338 +63786,MO,Wittenberg,37.679256,-89.564261 +63787,MO,Zalma,37.13648,-90.075711 +63801,MO,Sikeston,36.891111,-89.58197 +63821,MO,Arbyrd,36.050104,-90.228355 +63822,MO,Bernie,36.672703,-89.987758 +63823,MO,Bertrand,36.892746,-89.448259 +63825,MO,Bloomfield,36.898892,-89.945564 +63827,MO,Bragg City,36.273236,-89.873624 +63829,MO,Cardwell,36.04345,-90.290696 +63830,MO,Caruthersville,36.180237,-89.668306 +63833,MO,Catron,36.687578,-89.770647 +63834,MO,Charleston,36.921341,-89.334207 +63837,MO,Clarkton,36.447812,-89.972852 +63841,MO,Dexter,36.788458,-89.963933 +63845,MO,East Prairie,36.777609,-89.372629 +63846,MO,Essex,36.810859,-89.836649 +63848,MO,Gideon,36.45378,-89.913546 +63849,MO,Gobler,36.158987,-89.934907 +63851,MO,Hayti Heights,36.239475,-89.751607 +63852,MO,Holcomb,36.38846,-90.020795 +63855,MO,Hornersville,36.062694,-90.081643 +63857,MO,Kennett,36.240656,-90.049057 +63862,MO,Lilbourn,36.585313,-89.611241 +63863,MO,Malden,36.567209,-89.973679 +63866,MO,Marston,36.508448,-89.628819 +63867,MO,Matthews,36.807528,-89.576833 +63868,MO,Morehouse,36.819041,-89.685191 +63869,MO,New Madrid,36.607284,-89.536645 +63870,MO,Parma,36.585629,-89.818971 +63873,MO,Portageville,36.427945,-89.700234 +63876,MO,Senath,36.132428,-90.163224 +63877,MO,Steele,36.091528,-89.834585 +63879,MO,Homestown,36.347215,-89.816362 +63901,MO,Poplar Bluff,36.766235,-90.416647 +63931,MO,Briar,36.639115,-90.92777 +63932,MO,Broseley,36.707553,-90.240472 +63933,MO,Campbell,36.519714,-90.082859 +63934,MO,Clubb,37.2302,-90.359638 +63935,MO,Poynor,36.621094,-90.81953 +63936,MO,Dudley,36.810981,-90.120974 +63937,MO,Ellsinore,36.945263,-90.74853 +63939,MO,Fairdealing,36.670404,-90.633515 +63940,MO,Fisk,36.783625,-90.216758 +63941,MO,Fremont,36.917164,-91.143984 +63942,MO,Gatewood,36.562608,-91.070333 +63943,MO,Grandin,36.827961,-90.794175 +63944,MO,Greenville,37.110838,-90.451362 +63945,MO,Harviell,36.672318,-90.558304 +63947,MO,Hiram,37.228158,-90.289556 +63950,MO,Lodi,37.242046,-90.463225 +63951,MO,Lowndes,37.134318,-90.254437 +63952,MO,Mill Spring,37.067477,-90.674625 +63953,MO,Naylor,36.584337,-90.612354 +63954,MO,Neelyville,36.571005,-90.499491 +63955,MO,Oxly,36.587385,-90.691973 +63956,MO,Patterson,37.195992,-90.577171 +63957,MO,Piedmont,37.15727,-90.69902 +63959,MO,63959,36.528175,-90.901556 +63960,MO,Puxico,36.942163,-90.162258 +63961,MO,Qulin,36.581769,-90.261674 +63963,MO,Shook,37.076976,-90.30059 +63964,MO,Silva,37.211892,-90.437472 +63965,MO,Van Buren,37.00153,-91.000681 +63966,MO,Wappapello,36.976566,-90.284805 +63967,MO,Williamsville,36.963789,-90.487851 +64001,MO,Alma,39.10484,-93.542853 +64011,MO,Bates City,39.021887,-94.07984 +64012,MO,Belton,38.816118,-94.532785 +64014,MO,Blue Springs,39.015186,-94.260429 +64015,MO,Lake Tapawingo,39.018378,-94.292848 +64016,MO,Buckner,39.130328,-94.206219 +64017,MO,Camden,39.204806,-94.025913 +64018,MO,Camden Point,39.451549,-94.744438 +64019,MO,Centerview,38.78971,-93.870234 +64020,MO,Concordia,38.977553,-93.581205 +64021,MO,Corder,39.102401,-93.639127 +64022,MO,Dover,39.192619,-93.668377 +64024,MO,Excelsior Spring,39.33491,-94.223614 +64029,MO,Grain Valley,39.027361,-94.20874 +64030,MO,Grandview,38.881936,-94.520542 +64034,MO,Lake Winnebago,38.842813,-94.334767 +64035,MO,Hardin,39.350433,-93.840869 +64036,MO,Henrietta,39.236732,-93.936873 +64037,MO,Higginsville,39.070504,-93.713265 +64040,MO,Holden,38.718595,-93.985571 +64048,MO,Holt,39.428867,-94.368876 +64050,MO,Independence,39.098288,-94.411072 +64052,MO,Independence,39.074984,-94.449945 +64053,MO,Independence,39.105041,-94.462461 +64054,MO,Sugar Creek,39.107234,-94.441496 +64055,MO,Independence,39.054504,-94.403902 +64056,MO,Independence,39.11773,-94.359637 +64057,MO,Independence,39.073099,-94.353284 +64058,MO,Independence,39.141233,-94.351526 +64060,MO,Kearney,39.365175,-94.362104 +64061,MO,Kingsville,38.817755,-94.046188 +64062,MO,Lawson,39.440129,-94.196588 +64063,MO,Lake Lotawana,38.921094,-94.348744 +64064,MO,Lees Summit,38.995336,-94.365192 +64067,MO,Lexington,39.174249,-93.871438 +64068,MO,Pleasant Valley,39.241916,-94.433664 +64070,MO,Lone Jack,38.891837,-94.161453 +64071,MO,Mayview,39.045898,-93.835306 +64074,MO,Napoleon,39.114034,-94.070911 +64075,MO,Oak Grove,38.998456,-94.139946 +64076,MO,Odessa,38.982938,-93.975731 +64077,MO,Orrick,39.211577,-94.123863 +64078,MO,Peculiar,38.716453,-94.44053 +64079,MO,Platte City,39.360171,-94.788972 +64080,MO,Pleasant Hill,38.785856,-94.243961 +64081,MO,Lees Summit,38.914169,-94.407302 +64082,MO,Lees Summit,38.851803,-94.394368 +64083,MO,Raymore,38.801896,-94.452893 +64084,MO,Rayville,39.385291,-94.02841 +64085,MO,Richmond,39.279298,-93.979163 +64088,MO,Sibley,39.162658,-94.199019 +64089,MO,Smithville,39.391739,-94.559239 +64093,MO,Warrensburg,38.766695,-93.727341 +64096,MO,Waverly,39.205523,-93.525652 +64097,MO,Wellington,39.125845,-93.985513 +64098,MO,Weston,39.445294,-94.914453 +64101,MO,Kansas City,39.10005,-94.601849 +64102,MO,Kansas City,39.086067,-94.606596 +64105,MO,Kansas City,39.102459,-94.590092 +64106,MO,Kansas City,39.105186,-94.569858 +64108,MO,Kansas City,39.0837,-94.586826 +64109,MO,Kansas City,39.066286,-94.567372 +64110,MO,Kansas City,39.036088,-94.572206 +64111,MO,Kansas City,39.056483,-94.592942 +64112,MO,Kansas City,39.038191,-94.592873 +64113,MO,Kansas City,39.01234,-94.593828 +64114,MO,Kansas City,38.962147,-94.595941 +64116,MO,North Kansas Cit,39.163189,-94.569882 +64117,MO,Randolph,39.168111,-94.527367 +64118,MO,Gladstone,39.213842,-94.570448 +64119,MO,Kansas City,39.19785,-94.519873 +64120,MO,Kansas City,39.122206,-94.54873 +64123,MO,Kansas City,39.113593,-94.523545 +64124,MO,Kansas City,39.106832,-94.539402 +64125,MO,Kansas City,39.104157,-94.492328 +64126,MO,Kansas City,39.092255,-94.50466 +64127,MO,Kansas City,39.088303,-94.536636 +64128,MO,Kansas City,39.065932,-94.538634 +64129,MO,Kansas City,39.040093,-94.49513 +64130,MO,Kansas City,39.035106,-94.546674 +64131,MO,Kansas City,38.971303,-94.57741 +64132,MO,Kansas City,38.991073,-94.552156 +64133,MO,Raytown,39.014909,-94.459229 +64134,MO,Kansas City,38.929633,-94.500908 +64136,MO,Kansas City,39.018684,-94.400774 +64137,MO,Kansas City,38.92988,-94.540487 +64138,MO,Raytown,38.96871,-94.479361 +64139,MO,Kansas City,38.965891,-94.406086 +64145,MO,Kansas City,38.89767,-94.597607 +64146,MO,Kansas City,38.897264,-94.57638 +64147,MO,Martin City,38.861352,-94.529717 +64149,MO,Kansas City,38.860646,-94.463554 +64150,MO,Kansas City,39.177927,-94.616669 +64151,MO,Lake Waukomis,39.213876,-94.63318 +64152,MO,Parkville,39.220954,-94.691313 +64153,MO,Kansas City,39.262746,-94.697008 +64154,MO,Kansas City,39.254728,-94.635444 +64155,MO,Kansas City,39.275831,-94.570401 +64156,MO,Kansas City,39.290052,-94.533614 +64157,MO,Kansas City,39.276673,-94.459456 +64158,MO,Kansas City,39.228428,-94.472036 +64161,MO,Randolph,39.161506,-94.459829 +64163,MO,Ferrelview,39.359756,-94.719315 +64164,MO,Kansas City,39.3426,-94.644643 +64165,MO,Kansas City,39.340054,-94.572966 +64166,MO,Kansas City,39.329399,-94.519858 +64167,MO,Kansas City,39.309643,-94.465291 +64401,MO,Agency,39.666229,-94.717017 +64402,MO,Albany,40.251282,-94.326977 +64421,MO,Amazonia,39.909197,-94.911344 +64422,MO,Amity,39.883697,-94.513558 +64423,MO,Barnard,40.186176,-94.805558 +64424,MO,Bethany,40.260055,-94.018863 +64425,MO,64425,40.095518,-95.328892 +64426,MO,Blythedale,40.502352,-93.895447 +64427,MO,Bolckow,40.100673,-94.884741 +64428,MO,Burlington Junct,40.442125,-95.051663 +64429,MO,Cameron,39.730892,-94.243723 +64430,MO,Clarksdale,39.813675,-94.54212 +64431,MO,Clearmont,40.517489,-95.005478 +64432,MO,Clyde,40.264475,-94.654563 +64433,MO,Conception,40.230929,-94.684302 +64434,MO,Conception Junct,40.266017,-94.696797 +64435,MO,Corning,40.24463,-95.436128 +64436,MO,Cosby,39.855534,-94.697678 +64437,MO,Bigelow,40.193873,-95.377047 +64438,MO,Darlington,40.195517,-94.404899 +64439,MO,Dearborn,39.517248,-94.766368 +64440,MO,De Kalb,39.583361,-94.927027 +64441,MO,Denver,40.418074,-94.306624 +64442,MO,Eagleville,40.491197,-93.995058 +64443,MO,Easton,39.751709,-94.658194 +64444,MO,Edgerton,39.474213,-94.635217 +64445,MO,Elmo,40.518492,-95.123564 +64446,MO,Fairfax,40.330193,-95.375075 +64448,MO,Faucett,39.589124,-94.791276 +64449,MO,Fillmore,40.014212,-94.955496 +64451,MO,Forest City,39.989708,-95.191594 +64452,MO,Fortescue,40.054712,-95.331584 +64453,MO,Gentry,40.341112,-94.414198 +64454,MO,Gower,39.602009,-94.596526 +64455,MO,Graham,40.201204,-95.012118 +64456,MO,Grant City,40.492358,-94.397908 +64457,MO,Guilford,40.174614,-94.695076 +64458,MO,Hatfield,40.521853,-94.169059 +64459,MO,Helena,39.925122,-94.69212 +64461,MO,Hopkins,40.548328,-94.818948 +64463,MO,King City,40.065184,-94.523412 +64465,MO,Lathrop,39.517727,-94.309271 +64466,MO,Maitland,40.199111,-95.092706 +64467,MO,Martinsville,40.366206,-94.164463 +64468,MO,Maryville,40.343399,-94.873479 +64469,MO,Maysville,39.911189,-94.354821 +64470,MO,Mound City,40.136238,-95.213837 +64471,MO,New Hampton,40.244439,-94.178565 +64473,MO,Oregon,39.980906,-95.123358 +64474,MO,Osborn,39.768436,-94.247677 +64475,MO,Parnell,40.472288,-94.659519 +64476,MO,Pickering,40.459073,-94.841119 +64477,MO,Plattsburg,39.57047,-94.433814 +64478,MO,Quitman,40.3701,-95.072909 +64479,MO,Ravenwood,40.357902,-94.68051 +64480,MO,Rea,40.059263,-94.700184 +64481,MO,Ridgeway,40.399896,-93.957527 +64482,MO,Rock Port,40.430581,-95.527403 +64483,MO,Rosendale,40.039853,-94.832808 +64484,MO,Rushville,39.565272,-95.041259 +64485,MO,Savannah,39.916774,-94.826733 +64486,MO,Sheridan,40.492822,-94.570149 +64487,MO,Skidmore,40.28961,-95.079241 +64489,MO,Stanberry,40.229285,-94.538691 +64490,MO,Hemple,39.745465,-94.51779 +64491,MO,Tarkio,40.441841,-95.378586 +64492,MO,Trimble,39.487067,-94.551234 +64493,MO,Turney,39.631772,-94.297241 +64494,MO,Union Star,39.984645,-94.578732 +64496,MO,Watson,40.477985,-95.61931 +64497,MO,Weatherby,39.888699,-94.254959 +64498,MO,Westboro,40.535748,-95.313419 +64499,MO,Worth,40.4173,-94.437084 +64501,MO,Saint Joseph,39.768755,-94.838488 +64503,MO,Saint Joseph,39.733987,-94.817125 +64504,MO,Saint Joseph,39.707566,-94.867749 +64505,MO,Saint Joseph,39.796532,-94.844341 +64506,MO,Saint Joseph,39.789292,-94.804314 +64507,MO,Saint Joseph,39.755052,-94.817303 +64601,MO,Chillicothe,39.796569,-93.550887 +64620,MO,Altamont,39.905017,-94.128155 +64621,MO,Avalon,39.668183,-93.47288 +64622,MO,Bogard,39.499354,-93.537387 +64623,MO,Bosworth,39.476692,-93.333521 +64624,MO,Braymer,39.591454,-93.78868 +64625,MO,Breckenridge,39.758205,-93.806794 +64628,MO,Brookfield,39.784612,-93.071948 +64630,MO,Browning,40.028983,-93.160661 +64631,MO,Bucklin,39.800563,-92.89281 +64632,MO,Cainsville,40.457768,-93.759047 +64633,MO,Carrollton,39.367334,-93.492626 +64635,MO,Chula,39.922606,-93.484095 +64636,MO,Coffey,40.099928,-94.025151 +64637,MO,Cowgill,39.564314,-93.929469 +64638,MO,Dawn,39.666506,-93.596405 +64639,MO,De Witt,39.358978,-93.301583 +64640,MO,Gallatin,39.902486,-93.978748 +64641,MO,Galt,40.14398,-93.395261 +64642,MO,Gilman City,40.145005,-93.831979 +64643,MO,Hale,39.595302,-93.34448 +64644,MO,Hamilton,39.736412,-93.990898 +64645,MO,Harris,40.307519,-93.350106 +64646,MO,Humphreys,40.114448,-93.301455 +64647,MO,Jameson,40.004615,-93.959747 +64648,MO,Jamesport,39.983724,-93.780048 +64649,MO,Kidder,39.757039,-94.130005 +64650,MO,Kingston,39.6508,-94.082694 +64651,MO,Laclede,39.7837,-93.167971 +64652,MO,Laredo,40.014397,-93.440676 +64653,MO,Linneus,39.909945,-93.188529 +64654,MO,Lock Springs,39.907396,-93.797697 +64655,MO,Lucerne,40.438182,-93.286654 +64656,MO,Ludlow,39.655064,-93.704578 +64657,MO,Mc Fall,40.105071,-94.300259 +64658,MO,Marceline,39.712485,-92.945502 +64659,MO,Meadville,39.779468,-93.301389 +64660,MO,Mendon,39.582849,-93.089168 +64661,MO,Mercer,40.516917,-93.524197 +64664,MO,Mooresville,39.74249,-93.71693 +64665,MO,Mount Moriah,40.329164,-93.814252 +64667,MO,Newtown,40.361227,-93.307279 +64668,MO,Norborne,39.329903,-93.67609 +64670,MO,Pattonsburg,40.042756,-94.134295 +64671,MO,Polo,39.564697,-94.074303 +64672,MO,Powersville,40.527155,-93.284436 +64673,MO,Princeton,40.385533,-93.577394 +64674,MO,Purdin,39.952948,-93.17002 +64676,MO,Rothville,39.662666,-93.046683 +64677,MO,Saint Catharine,39.800017,-92.99295 +64679,MO,Spickard,40.239985,-93.550291 +64681,MO,Sumner,39.654992,-93.224128 +64682,MO,Tina,39.551751,-93.46475 +64683,MO,Trenton,40.082335,-93.608634 +64686,MO,Utica,39.741742,-93.628897 +64688,MO,Wheeling,39.801137,-93.386835 +64689,MO,Winston,39.84995,-94.148747 +64701,MO,Harrisonville,38.64193,-94.32852 +64720,MO,Adrian,38.412473,-94.368336 +64722,MO,Amoret,38.260508,-94.573423 +64723,MO,Amsterdam,38.395385,-94.576282 +64724,MO,Appleton City,38.184779,-94.0229 +64725,MO,Archie,38.498612,-94.362992 +64726,MO,Blairstown,38.522701,-93.964102 +64728,MO,Bronaugh,37.69,-94.48603 +64730,MO,Butler,38.271245,-94.31375 +64733,MO,Chilhowee,38.612604,-93.865325 +64734,MO,Cleveland,38.68977,-94.5695 +64735,MO,Tightwad,38.368811,-93.758906 +64738,MO,Collins,37.880998,-93.660849 +64739,MO,Creighton,38.507754,-94.092604 +64740,MO,Deepwater,38.243164,-93.730281 +64741,MO,Deerfield,37.82109,-94.484845 +64742,MO,Drexel,38.495625,-94.592765 +64744,MO,El Dorado Spring,37.858517,-94.030091 +64745,MO,Foster,38.17338,-94.537067 +64746,MO,Freeman,38.624549,-94.495561 +64747,MO,Garden City,38.568082,-94.182532 +64748,MO,Golden City,37.399535,-94.102683 +64750,MO,Harwood,37.953028,-94.140194 +64751,MO,Horton,37.995078,-94.396438 +64752,MO,Stotesbury,38.059635,-94.561 +64755,MO,Jasper,37.318224,-94.273126 +64756,MO,Jerico Springs,37.661343,-94.012912 +64759,MO,Iantha,37.500221,-94.270253 +64760,MO,Latour,38.634847,-94.045721 +64761,MO,Leeton,38.614113,-93.712321 +64762,MO,Liberal,37.572453,-94.520377 +64763,MO,Lowry City,38.140443,-93.711352 +64767,MO,Milo,37.744559,-94.304632 +64769,MO,Mindenmines,37.451987,-94.575573 +64770,MO,Montrose,38.259702,-93.995239 +64771,MO,Moundville,37.747637,-94.449645 +64772,MO,Nevada,37.840853,-94.357127 +64776,MO,Osceola,38.028553,-93.753621 +64778,MO,Richards,37.906111,-94.559227 +64779,MO,Rich Hill,38.09438,-94.363454 +64780,MO,Rockville,38.076583,-94.129904 +64783,MO,Schell City,38.009403,-94.15791 +64784,MO,Sheldon,37.683969,-94.254835 +64788,MO,Urich,38.44489,-93.97847 +64790,MO,Walker,37.893023,-94.229301 +64801,MO,Joplin,37.096858,-94.505144 +64804,MO,Joplin,37.046454,-94.510252 +64831,MO,Anderson,36.669224,-94.476648 +64832,MO,Asbury,37.294168,-94.565484 +64833,MO,Avilla,37.194709,-94.117043 +64834,MO,Carl Junction,37.179479,-94.55502 +64835,MO,Carterville,37.150734,-94.435938 +64836,MO,Carthage,37.159686,-94.311232 +64840,MO,Diamond,37.005993,-94.32041 +64842,MO,Fairview,36.825419,-94.091203 +64843,MO,Goodman,36.732335,-94.39855 +64844,MO,Granby,36.906562,-94.264349 +64847,MO,Lanagan,36.605956,-94.4551 +64848,MO,La Russell,37.17387,-94.032874 +64850,MO,Neosho,36.870634,-94.386218 +64854,MO,Noel,36.541668,-94.490627 +64855,MO,Oronogo,37.243288,-94.446246 +64856,MO,Jane,36.580243,-94.351461 +64859,MO,Reeds,37.122477,-94.161272 +64861,MO,Rocky Comfort,36.717546,-94.109066 +64862,MO,Sarcoxie,37.072382,-94.11514 +64863,MO,South West City,36.531924,-94.596141 +64865,MO,Seneca,36.844169,-94.559367 +64866,MO,Stark City,36.878538,-94.154811 +64867,MO,Stella,36.751553,-94.20858 +64868,MO,Tiff City,36.664447,-94.593437 +64870,MO,Webb City,37.144,-94.472683 +64873,MO,Wentworth,36.980702,-94.132169 +64874,MO,Wheaton,36.765145,-94.04916 +65001,MO,Argyle,38.298619,-92.015456 +65010,MO,Ashland,38.787771,-92.253662 +65011,MO,Barnett,38.396696,-92.668594 +65013,MO,Belle,38.271108,-91.730299 +65014,MO,Bland,38.307383,-91.626334 +65016,MO,Bonnots Mill,38.553282,-91.929341 +65017,MO,Brumley,38.070914,-92.474732 +65018,MO,California,38.622369,-92.545558 +65020,MO,Camdenton,38.018534,-92.767744 +65023,MO,Centertown,38.629705,-92.399521 +65024,MO,Chamois,38.652683,-91.76968 +65025,MO,Clarksburg,38.643156,-92.672925 +65026,MO,Eldon,38.340127,-92.573619 +65032,MO,Eugene,38.359849,-92.368853 +65034,MO,Fortuna,38.574391,-92.784948 +65035,MO,Freeburg,38.355085,-91.927605 +65037,MO,Gravois Mills,38.258445,-92.823029 +65039,MO,Hartsburg,38.715902,-92.286377 +65040,MO,Henley,38.388133,-92.312303 +65041,MO,Bay,38.668381,-91.467717 +65042,MO,High Point,38.478237,-92.600514 +65043,MO,Holts Summit,38.632784,-92.116345 +65046,MO,Jamestown,38.779292,-92.480651 +65047,MO,Kaiser,38.163673,-92.579869 +65048,MO,Koeltztown,38.323526,-92.048365 +65049,MO,Four Seasons,38.209127,-92.677555 +65050,MO,Latham,38.550035,-92.653647 +65051,MO,Linn,38.473855,-91.81945 +65052,MO,Linn Creek,38.060524,-92.683077 +65053,MO,Lohman,38.548434,-92.384216 +65054,MO,Loose Creek,38.471715,-91.959126 +65058,MO,Meta,38.250039,-92.135797 +65059,MO,Mokane,38.699839,-91.886815 +65061,MO,Morrison,38.605967,-91.657972 +65062,MO,Mount Sterling,38.538786,-91.610315 +65063,MO,New Bloomfield,38.709996,-92.082983 +65064,MO,Olean,38.400059,-92.53031 +65065,MO,Osage Beach,38.13805,-92.666427 +65066,MO,Owensville,38.351119,-91.486679 +65067,MO,Portland,38.784701,-91.700567 +65068,MO,Prairie Home,38.825331,-92.597376 +65069,MO,Rhineland,38.763811,-91.515105 +65072,MO,Rocky Mount,38.291057,-92.705921 +65074,MO,Russellville,38.500534,-92.429122 +65075,MO,Saint Elizabeth,38.271244,-92.263503 +65076,MO,Saint Thomas,38.391246,-92.189382 +65077,MO,Steedman,38.756604,-91.788837 +65078,MO,Stover,38.441352,-92.994667 +65079,MO,Sunrise Beach,38.155845,-92.785395 +65080,MO,Tebbetts,38.640193,-91.967316 +65081,MO,Tipton,38.654839,-92.781448 +65082,MO,Tuscumbia,38.238881,-92.491739 +65083,MO,Ulman,38.134141,-92.463979 +65084,MO,Versailles,38.436491,-92.825835 +65085,MO,Westphalia,38.426968,-92.039221 +65101,MO,Jefferson City,38.546212,-92.152462 +65109,MO,Jefferson City,38.577272,-92.244298 +65201,MO,Columbia,38.938176,-92.304865 +65202,MO,Columbia,38.995019,-92.311204 +65203,MO,Columbia,38.93482,-92.363865 +65230,MO,Armstrong,39.256585,-92.708976 +65231,MO,Auxvasse,39.012184,-91.885801 +65232,MO,Benton City,39.120886,-91.766124 +65233,MO,Boonville,38.95364,-92.744973 +65236,MO,Brunswick,39.437424,-93.118694 +65237,MO,Bunceton,38.746754,-92.792695 +65239,MO,Cairo,39.51141,-92.440027 +65240,MO,Centralia,39.196089,-92.147244 +65243,MO,Clark,39.315293,-92.382706 +65244,MO,Clifton Hill,39.425985,-92.667676 +65246,MO,Dalton,39.40346,-92.994366 +65247,MO,Excello,39.645543,-92.475705 +65248,MO,Fayette,39.143041,-92.658287 +65250,MO,Franklin,39.066818,-92.831596 +65251,MO,Fulton,38.851821,-91.96055 +65254,MO,Glasgow,39.225736,-92.831812 +65255,MO,Hallsville,39.105429,-92.223855 +65256,MO,Harrisburg,39.120312,-92.440955 +65257,MO,Higbee,39.305521,-92.516309 +65258,MO,Holliday,39.490436,-92.131759 +65259,MO,Huntsville,39.435371,-92.552992 +65260,MO,Jacksonville,39.579076,-92.431536 +65261,MO,Keytesville,39.479388,-92.930187 +65262,MO,Kingdom City,38.95508,-91.952008 +65263,MO,Madison,39.461543,-92.228715 +65264,MO,Martinsburg,39.09675,-91.66463 +65265,MO,Mexico,39.171233,-91.889473 +65270,MO,Moberly,39.420239,-92.435793 +65274,MO,New Franklin,39.020042,-92.738601 +65275,MO,Paris,39.493219,-92.011323 +65276,MO,Pilot Grove,38.871168,-92.930461 +65279,MO,Rocheport,38.975578,-92.507854 +65280,MO,Rush Hill,39.193163,-91.688825 +65281,MO,Salisbury,39.431853,-92.80144 +65282,MO,Santa Fe,39.398929,-91.829377 +65283,MO,Stoutsville,39.559425,-91.829661 +65284,MO,Sturgeon,39.205705,-92.295264 +65285,MO,Thompson,39.20258,-92.025945 +65286,MO,Triplett,39.501098,-93.192771 +65287,MO,Wooldridge,38.919475,-92.582584 +65301,MO,Sedalia,38.696076,-93.232268 +65305,MO,Whiteman Afb,38.731683,-93.572514 +65321,MO,Blackburn,39.098776,-93.428124 +65322,MO,Blackwater,38.972659,-92.968291 +65323,MO,Calhoun,38.485842,-93.645929 +65324,MO,Climax Springs,38.139586,-92.95371 +65325,MO,Cole Camp,38.453124,-93.191529 +65326,MO,Edwards,38.190564,-93.147104 +65329,MO,Florence,38.610056,-92.998606 +65330,MO,Gilliam,39.244708,-92.993222 +65332,MO,Green Ridge,38.618983,-93.437395 +65333,MO,Houstonia,38.910581,-93.332531 +65334,MO,Hughesville,38.84944,-93.215895 +65335,MO,Ionia,38.501887,-93.322358 +65336,MO,Knob Noster,38.746932,-93.556422 +65337,MO,La Monte,38.775256,-93.431266 +65338,MO,Lincoln,38.407271,-93.3668 +65339,MO,Grand Pass,39.195108,-93.381325 +65340,MO,Napton,39.10983,-93.196017 +65344,MO,Miami,39.282095,-93.19678 +65345,MO,Mora,38.520726,-93.227232 +65347,MO,Nelson,39.010447,-93.031102 +65348,MO,Otterville,38.71607,-93.010819 +65349,MO,Slater,39.216273,-93.054674 +65350,MO,Smithton,38.649973,-93.108072 +65351,MO,Sweet Springs,38.965953,-93.424683 +65354,MO,Syracuse,38.637423,-92.882265 +65355,MO,Warsaw,38.250186,-93.337279 +65360,MO,Windsor,38.52719,-93.526864 +65401,MO,Rolla,37.948527,-91.760348 +65433,MO,Bendavis,37.246803,-92.228174 +65436,MO,Beulah,37.644469,-91.878714 +65438,MO,Birch Tree,36.947589,-91.50082 +65439,MO,Bixby,37.672244,-91.083461 +65440,MO,Boss,37.637282,-91.210905 +65441,MO,Bourbon,38.172039,-91.22254 +65443,MO,Brinktown,38.067282,-92.123106 +65444,MO,Bucyrus,37.397197,-92.046536 +65446,MO,Cherryville,37.806601,-91.234807 +65449,MO,Cook Station,37.855234,-91.461631 +65451,MO,65451,37.7904,-91.001597 +65452,MO,Crocker,37.944611,-92.269998 +65453,MO,Cuba,38.092553,-91.40814 +65456,MO,Davisville,37.792596,-91.132872 +65457,MO,Devils Elbow,37.85026,-92.085693 +65459,MO,Dixon,37.984766,-92.089662 +65461,MO,Duke,37.655001,-91.993063 +65462,MO,Edgar Springs,37.736505,-91.890579 +65463,MO,Eldridge,37.83456,-92.738202 +65464,MO,Elk Creek,37.217087,-91.998812 +65466,MO,Eminence,37.162556,-91.451933 +65468,MO,Eunice,37.212277,-91.723191 +65470,MO,Falcon,37.606099,-92.346562 +65473,MO,Fort Leonard Woo,37.759856,-92.126345 +65479,MO,Hartshorn,37.284306,-91.683418 +65483,MO,Houston,37.321829,-91.952982 +65484,MO,Huggins,37.266224,-92.148605 +65486,MO,Iberia,38.121926,-92.298897 +65501,MO,Jadwin,37.473619,-91.515887 +65529,MO,Jerome,37.92543,-91.99057 +65534,MO,Laquey,37.749378,-92.337901 +65535,MO,Leasburg,38.081054,-91.2488 +65536,MO,Lebanon,37.685049,-92.655029 +65540,MO,Anutt,37.743731,-91.715862 +65541,MO,Lenox,37.640757,-91.727735 +65542,MO,Licking,37.509082,-91.855585 +65543,MO,Lynchburg,37.505357,-92.320196 +65548,MO,Mountain View,36.989197,-91.709937 +65550,MO,Newburg,37.900778,-91.880683 +65552,MO,Plato,37.512231,-92.170913 +65555,MO,Raymondville,37.356913,-91.813089 +65556,MO,Richland,37.852752,-92.396245 +65557,MO,Roby,37.496993,-92.122188 +65559,MO,Saint James,38.005622,-91.607565 +65560,MO,Salem,37.616952,-91.525809 +65564,MO,Solo,37.167052,-91.959905 +65565,MO,Berryman,37.962998,-91.329337 +65566,MO,Viburnum,37.715066,-91.128922 +65567,MO,Stoutland,37.869338,-92.511373 +65570,MO,Success,37.480533,-92.003621 +65571,MO,Summersville,37.148352,-91.68277 +65573,MO,Teresita,36.999728,-91.596553 +65580,MO,Vichy,38.097958,-91.77875 +65582,MO,Vienna,38.191926,-91.942208 +65583,MO,Saint Robert,37.817515,-92.198944 +65586,MO,Wesco,37.873185,-91.349028 +65588,MO,Winona,37.016869,-91.312059 +65589,MO,Yukon,37.231108,-91.824377 +65590,MO,Long Lane,37.580769,-92.930853 +65591,MO,Montreal,37.985108,-92.547031 +65601,MO,Aldrich,37.505667,-93.557642 +65603,MO,Arcola,37.531254,-93.858718 +65604,MO,Ash Grove,37.315972,-93.57813 +65605,MO,Jenkins,36.947661,-93.71238 +65606,MO,Riverton,36.702543,-91.392743 +65608,MO,Ava,36.940717,-92.676544 +65609,MO,Bakersfield,36.53323,-92.150679 +65610,MO,Billings,37.062841,-93.547629 +65611,MO,Blue Eye,36.54321,-93.429944 +65612,MO,Bois D Arc,37.221417,-93.544722 +65613,MO,Bolivar,37.608502,-93.412631 +65614,MO,Bradleyville,36.765908,-92.915116 +65616,MO,Marvel Cave Park,36.655755,-93.243789 +65617,MO,Brighton,37.472807,-93.360279 +65618,MO,Brixey,36.758966,-92.402645 +65619,MO,Brookline Statio,37.127184,-93.383467 +65620,MO,Bruner,36.999002,-92.969241 +65622,MO,Buffalo,37.549842,-93.104228 +65623,MO,Butterfield,36.745066,-93.912609 +65624,MO,Cape Fair,36.693776,-93.524255 +65625,MO,Cassville,36.678386,-93.84667 +65626,MO,Caulfield,36.60353,-92.067773 +65627,MO,Cedarcreek,36.571013,-93.017239 +65629,MO,Chadwick,36.922041,-93.045082 +65630,MO,Chestnutridge,36.835283,-93.101217 +65631,MO,Clever,37.034796,-93.44747 +65632,MO,Conway,37.508472,-92.7891 +65633,MO,Crane,36.925771,-93.530339 +65634,MO,Cross Timbers,38.023873,-93.19781 +65635,MO,Dadeville,37.510458,-93.695562 +65637,MO,Dora,36.756009,-92.237796 +65638,MO,Drury,36.93193,-92.366396 +65640,MO,Dunnegan,37.703137,-93.521605 +65641,MO,Eagle Rock,36.548035,-93.733609 +65644,MO,Elkland,37.433591,-93.020983 +65646,MO,Everton,37.235428,-93.689434 +65647,MO,Exeter,36.681498,-93.970209 +65648,MO,Fair Grove,37.372143,-93.142824 +65649,MO,Fair Play,37.633496,-93.606355 +65650,MO,Flemington,37.780268,-93.447131 +65652,MO,Fordland,37.14474,-92.911148 +65653,MO,Forsyth,36.69548,-93.114968 +65654,MO,Freistatt,37.017563,-93.896144 +65655,MO,Gainesville,36.590101,-92.416151 +65656,MO,Galena,36.819835,-93.48113 +65657,MO,Garrison,36.860997,-92.9985 +65658,MO,Golden,36.562486,-93.622988 +65659,MO,Goodson,37.707534,-93.237528 +65660,MO,Graff,37.326214,-92.264726 +65661,MO,Greenfield,37.419662,-93.840689 +65662,MO,Grovespring,37.494667,-92.600141 +65663,MO,Half Way,37.601795,-93.241989 +65666,MO,Hardenville,36.592625,-92.367766 +65667,MO,Hartville,37.273453,-92.518058 +65668,MO,Hermitage,37.896853,-93.297902 +65669,MO,Highlandville,36.94077,-93.26802 +65672,MO,Hollister,36.610727,-93.228585 +65674,MO,Humansville,37.792282,-93.579531 +65675,MO,Hurley,36.925425,-93.476803 +65676,MO,Isabella,36.574924,-92.605277 +65679,MO,Kirbyville,36.642615,-93.168256 +65680,MO,Kissee Mills,36.670446,-93.037733 +65681,MO,Lampe,36.576725,-93.451602 +65682,MO,Lockwood,37.386605,-93.86715 +65685,MO,Louisburg,37.682843,-93.100699 +65686,MO,Kimberling City,36.63928,-93.43721 +65688,MO,Brandsville,36.584925,-91.735536 +65689,MO,Cabool,37.131366,-92.114409 +65690,MO,Couch,36.565268,-91.330991 +65692,MO,Koshkonong,36.605553,-91.630411 +65701,MO,Mc Clurg,36.751465,-92.818018 +65702,MO,Macomb,37.104947,-92.48207 +65704,MO,Mansfield,37.1273,-92.593553 +65705,MO,Marionville,37.000906,-93.641345 +65706,MO,Marshfield,37.331178,-92.925033 +65707,MO,Miller,37.222454,-93.842188 +65708,MO,Monett,36.921242,-93.925766 +65710,MO,Morrisville,37.468588,-93.427486 +65711,MO,Mountain Grove,37.162638,-92.283893 +65712,MO,Mount Vernon,37.104466,-93.797632 +65713,MO,Niangua,37.398537,-92.776337 +65714,MO,Nixa,37.051154,-93.297176 +65715,MO,Noble,36.744052,-92.57686 +65717,MO,Norwood,37.068696,-92.408209 +65720,MO,Oldfield,36.970416,-93.032526 +65721,MO,Ozark,37.016926,-93.202211 +65722,MO,Phillipsburg,37.583177,-92.741631 +65723,MO,Pierce City,36.972992,-94.00241 +65724,MO,Pittsburg,37.8442,-93.335615 +65725,MO,Pleasant Hope,37.4615,-93.261733 +65727,MO,Polk,37.752928,-93.294065 +65728,MO,Ponce De Leon,36.89054,-93.367055 +65729,MO,Pontiac,36.524804,-92.561221 +65730,MO,Powell,36.556252,-94.167541 +65731,MO,Powersite,36.630656,-93.090015 +65732,MO,Preston,37.939025,-93.171295 +65733,MO,Protem,36.546336,-92.829689 +65734,MO,Purdy,36.806917,-93.916376 +65735,MO,Quincy,38.002925,-93.471281 +65737,MO,Branson West,36.694658,-93.372182 +65738,MO,Republic,37.123017,-93.480041 +65739,MO,Ridgedale,36.524662,-93.277808 +65740,MO,Rockaway Beach,36.713686,-93.171535 +65742,MO,Rogersville,37.131047,-93.096449 +65744,MO,Rueter,36.631415,-92.918792 +65745,MO,Seligman,36.527593,-93.935851 +65746,MO,Seymour,37.166726,-92.785659 +65747,MO,Shell Knob,36.616672,-93.624855 +65751,MO,65751,36.735365,-92.503184 +65752,MO,South Greenfield,37.374256,-93.844482 +65753,MO,Sparta,36.977524,-93.106483 +65754,MO,Spokane,36.863639,-93.275447 +65755,MO,Squires,36.850406,-92.584443 +65756,MO,Stotts City,37.103148,-93.954329 +65757,MO,Strafford,37.279718,-93.10663 +65758,MO,Sycamore,36.67179,-92.354355 +65759,MO,Taneyville,36.740497,-93.027951 +65760,MO,Tecumseh,36.58751,-92.259782 +65761,MO,Dugginsville,36.569019,-92.701861 +65762,MO,Nottinghill,36.707546,-92.657789 +65764,MO,Tunas,37.839196,-92.980788 +65766,MO,Udall,36.525291,-92.23345 +65767,MO,Urbana,37.85233,-93.150972 +65768,MO,Vanzant,36.977829,-92.210068 +65769,MO,Verona,36.936964,-93.800505 +65770,MO,Walnut Grove,37.394253,-93.504356 +65771,MO,Walnut Shade,36.770395,-93.214824 +65772,MO,Washburn,36.580703,-93.991974 +65773,MO,Souder,36.782631,-92.58991 +65774,MO,Weaubleau,37.880393,-93.534355 +65775,MO,West Plains,36.728418,-91.871681 +65776,MO,South Fork,36.629312,-91.912484 +65777,MO,Moody,36.533018,-91.989756 +65778,MO,Myrtle,36.521697,-91.270584 +65779,MO,Wheatland,37.910283,-93.398129 +65781,MO,Willard,37.296153,-93.425861 +65783,MO,Windyville,37.718209,-92.937891 +65784,MO,Zanoni,36.692518,-92.304677 +65785,MO,Stockton,37.72408,-93.796013 +65786,MO,Macks Creek,37.961563,-92.960349 +65787,MO,Roach,38.008825,-92.807456 +65788,MO,Peace Valley,36.837974,-91.769598 +65789,MO,Pomona,36.84409,-91.913668 +65790,MO,Pottersville,36.706822,-92.044044 +65791,MO,Thayer,36.532714,-91.541803 +65793,MO,Willow Springs,36.995812,-91.940545 +65802,MO,Springfield,37.211663,-93.29903 +65803,MO,Springfield,37.259327,-93.291232 +65804,MO,Springfield,37.165361,-93.252154 +65806,MO,Springfield,37.203057,-93.297108 +65807,MO,Springfield,37.166799,-93.308457 +65809,MO,Springfield,37.185223,-93.205742 +65810,MO,Springfield,37.113647,-93.289594 +59001,MT,Absarokee,45.515356,-109.469171 +59002,MT,Acton,45.936997,-108.680975 +59003,MT,Ashland,45.58275,-106.279722 +59006,MT,Ballantine,45.954699,-108.123133 +59007,MT,Bearcreek,45.15226,-109.044704 +59008,MT,Belfry,45.049827,-109.078777 +59010,MT,Bighorn,46.238286,-107.205942 +59011,MT,Big Timber,45.82827,-109.963094 +59012,MT,Birney,45.286204,-106.509496 +59014,MT,Bridger,45.285682,-108.908217 +59015,MT,Broadview,46.082101,-108.809062 +59016,MT,Busby,45.554139,-106.872311 +59017,MT,Cat Creek,47.154789,-108.259094 +59019,MT,Columbus,45.626171,-109.257126 +59022,MT,Crow Agency,45.629594,-107.497251 +59024,MT,Custer,46.13019,-107.59585 +59025,MT,Decker,45.179698,-106.87206 +59027,MT,Emigrant,45.127557,-110.798928 +59028,MT,Fishtail,45.400217,-109.582078 +59029,MT,Fromberg,45.40269,-108.905658 +59030,MT,Gardiner,45.0493,-110.196258 +59031,MT,Garryowen,45.508557,-107.364925 +59032,MT,Grass Range,47.025894,-108.827059 +59033,MT,Greycliff,45.792631,-109.674601 +59034,MT,Hardin,45.749843,-107.607457 +59037,MT,Huntley,45.89049,-108.284981 +59038,MT,Hysham,46.276483,-107.307196 +59039,MT,Ingomar,46.654196,-107.551749 +59041,MT,Silesia,45.498763,-108.94804 +59043,MT,Lame Deer,45.603167,-106.565424 +59044,MT,Laurel,45.67451,-108.769008 +59046,MT,Lavina,46.329058,-108.995853 +59047,MT,Livingston,45.654587,-110.560907 +59050,MT,Lodge Grass,45.33218,-107.734105 +59051,MT,Luther,45.279485,-109.475326 +59052,MT,Mc Leod,45.596334,-109.935698 +59053,MT,Martinsdale,46.458149,-110.432397 +59055,MT,Melville,46.036446,-109.880885 +59057,MT,Molt,45.861503,-108.973073 +59058,MT,Mosby,46.900453,-107.789149 +59059,MT,Musselshell,46.517125,-108.003122 +59061,MT,Nye,45.441022,-109.827137 +59062,MT,Otter,45.445803,-106.008667 +59063,MT,Park City,45.632864,-108.929279 +59064,MT,Pompeys Pillar,45.983847,-107.915406 +59065,MT,Pray,45.419315,-110.686399 +59067,MT,Rapelje,45.97948,-109.276093 +59068,MT,Red Lodge,45.196522,-109.268812 +59069,MT,Reedpoint,45.648462,-109.468889 +59070,MT,Roberts,45.367235,-109.176888 +59071,MT,Roscoe,45.377232,-109.44644 +59072,MT,Roundup,46.422487,-108.543846 +59074,MT,Ryegate,46.272367,-109.276121 +59075,MT,Saint Xavier,45.488996,-107.709242 +59077,MT,Sand Springs,47.032287,-107.288623 +59078,MT,Shawmut,46.386921,-109.597361 +59079,MT,Shepherd,45.94608,-108.342634 +59080,MT,59080,45.577707,-108.835978 +59085,MT,Twodot,46.446513,-109.899483 +59086,MT,Wilsall,45.948351,-110.606147 +59087,MT,Winnett,46.943788,-108.318373 +59088,MT,Worden,45.977937,-108.153284 +59089,MT,Wyola,45.108904,-107.430258 +59101,MT,Billings,45.774489,-108.500452 +59102,MT,Billings,45.781265,-108.572662 +59105,MT,Billings Heights,45.828443,-108.474726 +59106,MT,Billings,45.775306,-108.65191 +59201,MT,Wolf Point,48.111879,-105.629318 +59211,MT,Antelope,48.696813,-104.452883 +59212,MT,Bainville,48.157989,-104.199532 +59213,MT,Brockton,48.210063,-104.85479 +59214,MT,Brockway,47.248497,-105.777649 +59215,MT,Circle,47.426389,-105.614771 +59218,MT,Culbertson,48.149536,-104.513212 +59219,MT,Dagmar,48.609337,-104.240123 +59221,MT,Fairview,47.891598,-104.230194 +59222,MT,Flaxville,48.747222,-105.163746 +59223,MT,Fort Peck,48.053844,-106.516646 +59225,MT,Lustre,48.161166,-105.991929 +59226,MT,Froid,48.320113,-104.451765 +59230,MT,Glasgow,48.203385,-106.609419 +59241,MT,Hinsdale,48.400705,-107.009836 +59242,MT,Homestead,48.429616,-104.591805 +59243,MT,Lambert,47.745908,-104.598746 +59244,MT,Larslan,48.58218,-106.283503 +59247,MT,Medicine Lake,48.485179,-104.437545 +59248,MT,Nashua,48.18653,-106.24407 +59250,MT,Opheim,48.87016,-106.365832 +59252,MT,Outlook,48.881673,-104.741526 +59253,MT,Peerless,48.780767,-105.800567 +59254,MT,Plentywood,48.778825,-104.560032 +59255,MT,Poplar,48.130713,-105.187021 +59256,MT,Raymond,48.968612,-104.629763 +59257,MT,Redstone,48.835511,-104.935259 +59258,MT,Reserve,48.590519,-104.627875 +59259,MT,Richey,47.622874,-105.017017 +59260,MT,Richland,48.727326,-106.223696 +59261,MT,Saco,48.638938,-107.429324 +59262,MT,Savage,47.519375,-104.284487 +59263,MT,Scobey,48.785356,-105.417016 +59270,MT,Sidney,47.713017,-104.163445 +59274,MT,Vida,47.894727,-105.599595 +59275,MT,Westby,48.858695,-104.124708 +59276,MT,Whitetail,48.924968,-105.297667 +59301,MT,Miles City,46.407459,-105.833193 +59311,MT,Alzada,45.156244,-104.261747 +59312,MT,Angela,46.771929,-106.315732 +59313,MT,Baker,46.355219,-104.266707 +59314,MT,Biddle,45.256977,-105.290138 +59315,MT,Bloomfield,47.340813,-104.878235 +59316,MT,Boyes,45.490003,-104.884118 +59317,MT,Belle Creek,45.46057,-105.424968 +59318,MT,Brusett,47.342341,-107.599864 +59319,MT,Capitol,45.473162,-104.146212 +59322,MT,Cohagen,47.126296,-106.498065 +59324,MT,Ekalaka,45.88054,-104.503958 +59326,MT,Fallon,46.786632,-105.116055 +59327,MT,Forsyth,46.2819,-106.699086 +59330,MT,Glendive,47.100813,-104.728716 +59332,MT,Hammond,45.291872,-104.615444 +59336,MT,Ismay,46.413223,-105.209064 +59337,MT,Jordan,47.369419,-106.922076 +59338,MT,Kinsey,46.577008,-105.74458 +59339,MT,Lindsay,47.202383,-105.208878 +59341,MT,Mildred,46.751671,-104.7891 +59343,MT,Olive,45.546641,-105.668741 +59344,MT,Plevna,46.411225,-104.571289 +59345,MT,Powderville,45.739183,-105.276098 +59347,MT,Rosebud,45.935826,-106.598123 +59349,MT,Terry,46.828972,-105.37059 +59351,MT,Volborg,46.073609,-105.721444 +59353,MT,Wibaux,46.964596,-104.189715 +59354,MT,Willard,46.114064,-104.446662 +59401,MT,Great Falls,47.509812,-111.273397 +59404,MT,Great Falls,47.509755,-111.340496 +59405,MT,Great Falls,47.495016,-111.250227 +59410,MT,Augusta,47.453739,-112.388304 +59411,MT,Babb,48.878781,-113.368132 +59412,MT,Belt,47.38211,-110.908099 +59414,MT,Black Eagle,47.526197,-111.276366 +59416,MT,Brady,48.031244,-111.755013 +59417,MT,Saint Mary,48.54926,-113.019697 +59418,MT,Buffalo,46.805593,-109.723122 +59419,MT,Bynum,47.990017,-112.276177 +59420,MT,Carter,47.780964,-110.978593 +59421,MT,Cascade,47.29117,-111.722321 +59422,MT,Choteau,47.837951,-112.202136 +59424,MT,Coffee Creek,47.339642,-110.052784 +59425,MT,Conrad,48.178346,-111.939665 +59427,MT,Cut Bank,48.660284,-112.365354 +59430,MT,Denton,47.319081,-109.878877 +59433,MT,Dutton,47.860082,-111.689967 +59434,MT,East Glacier Par,48.45998,-113.317304 +59436,MT,Fairfield,47.614255,-112.001502 +59440,MT,Floweree,47.658441,-111.121384 +59441,MT,Forestgrove,46.913727,-109.023294 +59442,MT,Fort Benton,47.809406,-110.671487 +59443,MT,Fort Shaw,47.563862,-111.805655 +59444,MT,Galata,48.458657,-111.419772 +59446,MT,Geraldine,47.602365,-110.276537 +59447,MT,Geyser,47.259816,-110.483877 +59448,MT,Heart Butte,48.277743,-112.845591 +59450,MT,Highwood,47.581587,-110.788656 +59451,MT,Hilger,47.269546,-109.456246 +59452,MT,Utica,46.947633,-109.951824 +59453,MT,Judith Gap,46.662301,-109.675475 +59454,MT,Kevin,48.750786,-111.970829 +59456,MT,Ledger,48.277569,-111.756384 +59457,MT,Lewistown,47.056324,-109.420297 +59460,MT,Loma,47.954576,-110.499487 +59462,MT,Moccasin,47.09164,-109.890066 +59463,MT,Monarch,47.07223,-110.871027 +59464,MT,Moore,46.989811,-109.653838 +59465,MT,Neihart,46.939086,-110.732827 +59467,MT,Pendroy,48.087892,-112.326082 +59468,MT,Power,47.679846,-111.716898 +59469,MT,Raynesford,47.260425,-110.704747 +59471,MT,Roy,47.367821,-108.863422 +59472,MT,Sand Coulee,47.402117,-111.16606 +59474,MT,Shelby,48.503666,-111.839122 +59479,MT,Stanford,47.14886,-110.196111 +59480,MT,Stockett,47.321712,-111.12868 +59482,MT,Sunburst,48.851585,-111.744195 +59483,MT,Sun River,47.480975,-111.724214 +59484,MT,Sweetgrass,48.971305,-112.020436 +59486,MT,Valier,48.279504,-112.303275 +59487,MT,Vaughn,47.562445,-111.576955 +59489,MT,Winifred,47.589903,-109.340931 +59501,MT,Havre,48.556121,-109.687974 +59520,MT,Big Sandy,48.149677,-110.07762 +59521,MT,Box Elder,48.284066,-109.820548 +59522,MT,Chester,48.454125,-110.97982 +59523,MT,Chinook,48.57985,-109.22246 +59524,MT,Dodson,48.207526,-108.629967 +59525,MT,Gildford,48.592716,-110.283633 +59526,MT,Harlem,48.539802,-108.769253 +59527,MT,Hays,48.380374,-108.768422 +59528,MT,Hingham,48.587029,-110.427548 +59529,MT,Hogeland,48.857071,-108.667704 +59530,MT,Inverness,48.593009,-110.68796 +59531,MT,Joplin,48.649795,-110.79145 +59532,MT,Kremlin,48.559955,-110.051315 +59535,MT,Lloyd,48.148632,-109.294264 +59537,MT,Loring,48.798333,-107.868603 +59538,MT,Malta,48.369167,-107.840784 +59540,MT,Rudyard,48.586001,-110.555235 +59542,MT,Turner,48.832766,-108.396079 +59544,MT,Whitewater,48.834909,-107.40543 +59545,MT,Whitlash,48.911037,-111.107512 +59546,MT,Zortman,47.874326,-108.349523 +59601,MT,Helena,46.613066,-112.021283 +59632,MT,Boulder,46.230647,-112.113757 +59633,MT,Canyon Creek,46.762662,-112.279496 +59634,MT,Montana City,46.474492,-111.992565 +59635,MT,East Helena,46.597324,-111.905089 +59639,MT,Lincoln,46.957458,-112.66514 +59641,MT,Radersburg,46.079317,-111.572186 +59642,MT,Ringling,46.285468,-110.824214 +59643,MT,Toston,46.20437,-111.425974 +59644,MT,Townsend,46.334571,-111.491906 +59645,MT,White Sulphur Sp,46.566323,-110.934413 +59647,MT,Winston,46.431485,-111.644671 +59648,MT,Wolf Creek,46.839567,-111.883316 +59701,MT,Walkerville,45.991579,-112.517807 +59711,MT,Anaconda,46.129863,-112.97388 +59714,MT,Belgrade,45.780126,-111.143927 +59715,MT,Bozeman,45.669269,-111.043057 +59720,MT,Cameron,45.139021,-111.650778 +59721,MT,Cardwell,45.894071,-111.780946 +59722,MT,Deer Lodge,46.38807,-112.747589 +59724,MT,Dell,44.95877,-112.950401 +59725,MT,Dillon,45.23394,-112.640452 +59727,MT,Divide,45.716055,-112.719551 +59729,MT,Ennis,45.354456,-111.687033 +59730,MT,Gallatin Gateway,45.609963,-111.173407 +59731,MT,Garrison,46.572363,-112.617322 +59733,MT,Gold Creek,46.590025,-112.97057 +59735,MT,Harrison,45.742333,-111.846135 +59736,MT,Jackson,45.430725,-113.465862 +59739,MT,Lima,44.644057,-112.562492 +59741,MT,Manhattan,45.79799,-111.314577 +59745,MT,Norris,45.532271,-111.694284 +59747,MT,Pony,45.574502,-111.961859 +59748,MT,Ramsay,46.119573,-112.619628 +59749,MT,Sheridan,45.422968,-112.173543 +59750,MT,Butte,46.003281,-112.71586 +59751,MT,Silver Star,45.757105,-112.177604 +59752,MT,Three Forks,45.881068,-111.543643 +59754,MT,Twin Bridges,45.531055,-112.349461 +59755,MT,Virginia City,45.247216,-112.002619 +59756,MT,Warmsprings,46.162593,-112.820041 +59758,MT,West Yellowstone,44.912502,-111.18595 +59759,MT,Whitehall,45.877146,-112.124535 +59761,MT,Wisdom,45.651915,-113.472926 +59762,MT,Wise River,45.742397,-112.996285 +59801,MT,Missoula,46.856274,-114.025207 +59802,MT,Missoula,46.900615,-114.002732 +59803,MT,Missoula,46.822362,-114.026528 +59820,MT,Alberton,46.98061,-114.492139 +59821,MT,Arlee,47.186035,-114.075978 +59823,MT,Bonner,46.860138,-113.746254 +59824,MT,Moiese,47.433449,-114.15931 +59825,MT,Clinton,46.767281,-113.703764 +59826,MT,Condon,47.509696,-113.707477 +59827,MT,Conner,45.912762,-114.179966 +59828,MT,Corvallis,46.314193,-114.095995 +59829,MT,Darby,46.028033,-114.193784 +59831,MT,Dixon,47.31313,-114.30557 +59832,MT,Drummond,46.664676,-113.242649 +59833,MT,Florence,46.63102,-114.094487 +59834,MT,Frenchtown,47.047112,-114.268308 +59836,MT,Greenough,46.943361,-113.427017 +59837,MT,Hall,46.582539,-113.208725 +59840,MT,Hamilton,46.23953,-114.167869 +59843,MT,Helmville,46.829968,-112.941296 +59844,MT,Heron,48.053668,-115.940668 +59845,MT,Hot Springs,47.591408,-114.659712 +59846,MT,Huson,47.065953,-114.421939 +59847,MT,Lolo,46.7585,-114.109732 +59848,MT,Lonepine,47.711209,-114.63718 +59852,MT,Niarada,47.8031,-114.656218 +59853,MT,Noxon,48.030166,-115.780658 +59854,MT,Ovando,47.006719,-113.090528 +59858,MT,Philipsburg,46.318899,-113.3126 +59859,MT,Plains,47.473448,-114.893014 +59860,MT,Polson,47.687574,-114.140444 +59864,MT,Ronan,47.552457,-114.105385 +59865,MT,Saint Ignatius,47.330014,-114.075822 +59866,MT,Saint Regis,47.336899,-115.170323 +59868,MT,Seeley Lake,47.178928,-113.481019 +59870,MT,Stevensville,46.526723,-114.047846 +59871,MT,Sula,45.827701,-114.042968 +59872,MT,Superior,47.172103,-114.888483 +59873,MT,Thompson Falls,47.601572,-115.360236 +59874,MT,Trout Creek,47.811138,-115.559185 +59875,MT,Victor,46.400489,-114.166534 +59901,MT,Evergreen,48.220939,-114.289163 +59910,MT,Big Arm,47.758514,-114.207049 +59911,MT,Swan Lake,48.039725,-114.01993 +59912,MT,Columbia Falls,48.353394,-114.178394 +59914,MT,Dayton,47.860749,-114.280918 +59915,MT,Elmo,47.818541,-114.343938 +59916,MT,Essex,48.494028,-113.946678 +59917,MT,Eureka,48.842766,-115.004938 +59920,MT,Kila,48.074437,-114.510402 +59922,MT,Lakeside,48.021469,-114.226562 +59923,MT,Libby,48.377311,-115.539101 +59925,MT,Marion,48.083596,-114.744625 +59928,MT,Polebridge,48.820585,-114.383558 +59929,MT,Proctor,47.940371,-114.383193 +59930,MT,Rexford,48.917947,-115.212859 +59931,MT,Rollins,47.918207,-114.224986 +59932,MT,Somers,48.079329,-114.23548 +59935,MT,Troy,48.479119,-115.881684 +59937,MT,Whitefish,48.403999,-114.350859 +68001,NE,Abie,41.347901,-96.956282 +68002,NE,Arlington,41.441654,-96.306974 +68003,NE,Ashland,41.05411,-96.39041 +68004,NE,Bancroft,42.026716,-96.617146 +68005,NE,Bellevue,41.149663,-95.909932 +68007,NE,Bennington,41.362262,-96.157525 +68008,NE,Blair,41.545376,-96.161666 +68014,NE,Bruno,41.271771,-96.964612 +68015,NE,Cedar Bluffs,41.383492,-96.569115 +68017,NE,Ceresco,41.06807,-96.639769 +68018,NE,Colon,41.288261,-96.614132 +68019,NE,Craig,41.771497,-96.392398 +68020,NE,Decatur,41.996553,-96.259456 +68022,NE,Elkhorn,41.275647,-96.24308 +68023,NE,Fort Calhoun,41.437281,-96.032375 +68025,NE,Fremont,41.441637,-96.494468 +68028,NE,Gretna,41.134458,-96.245837 +68029,NE,Herman,41.652381,-96.286942 +68031,NE,Hooper,41.641371,-96.523231 +68033,NE,Ithaca,41.174849,-96.529785 +68034,NE,Kennard,41.471139,-96.161927 +68035,NE,Leshara,41.346597,-96.449805 +68036,NE,Linwood,41.412926,-96.939873 +68037,NE,Louisville,40.996667,-96.194817 +68038,NE,Lyons,41.94416,-96.466136 +68039,NE,Macy,42.117739,-96.358865 +68040,NE,Malmo,41.298424,-96.732718 +68041,NE,Mead,41.23929,-96.496141 +68044,NE,Nickerson,41.523293,-96.490423 +68045,NE,Oakland,41.838426,-96.467064 +68046,NE,Papillion,41.152257,-96.037052 +68047,NE,Pender,42.117719,-96.718907 +68048,NE,Plattsmouth,40.999194,-95.913933 +68050,NE,Prague,41.303598,-96.830084 +68054,NE,Richfield,41.090522,-96.045627 +68055,NE,Rosalie,42.057435,-96.492866 +68057,NE,Scribner,41.663035,-96.644095 +68059,NE,Springfield,41.07649,-96.143811 +68061,NE,Tekamah,41.781898,-96.228144 +68062,NE,Thurston,42.188161,-96.690356 +68064,NE,Valley,41.318581,-96.346288 +68065,NE,Valparaiso,41.084304,-96.809149 +68066,NE,Wahoo,41.211723,-96.621946 +68067,NE,Walthill,42.148543,-96.480294 +68069,NE,Waterloo,41.27024,-96.306318 +68070,NE,Weston,41.181083,-96.769075 +68071,NE,Winnebago,42.233851,-96.468507 +68073,NE,Yutan,41.23403,-96.393247 +68102,NE,Omaha,41.258961,-95.940909 +68104,NE,Omaha,41.29186,-95.999888 +68105,NE,Omaha,41.243502,-95.962938 +68106,NE,Omaha,41.240322,-95.997972 +68107,NE,Omaha,41.206783,-95.955877 +68108,NE,Omaha,41.238198,-95.933557 +68110,NE,Omaha,41.293342,-95.936072 +68111,NE,Omaha,41.296212,-95.965045 +68112,NE,Omaha,41.329614,-95.959684 +68113,NE,Offutt A F B,41.114755,-95.907601 +68114,NE,Omaha,41.265624,-96.049306 +68116,NE,Omaha,41.287854,-96.149462 +68117,NE,Omaha,41.206403,-95.995301 +68118,NE,Omaha,41.260636,-96.166118 +68122,NE,Omaha,41.333312,-96.045772 +68123,NE,Omaha,41.122265,-95.95599 +68124,NE,Omaha,41.233814,-96.049515 +68127,NE,Ralston,41.201782,-96.055019 +68128,NE,Papillion,41.171983,-96.040256 +68130,NE,Omaha,41.235452,-96.168815 +68131,NE,Omaha,41.264658,-95.963891 +68132,NE,Omaha,41.265746,-95.995954 +68133,NE,Papillion,41.141564,-96.013076 +68134,NE,Omaha,41.294917,-96.054569 +68135,NE,Omaha,41.210419,-96.169827 +68136,NE,Omaha,41.168343,-96.209633 +68137,NE,Millard,41.201067,-96.124462 +68138,NE,Papillion,41.177724,-96.129718 +68142,NE,Omaha,41.335904,-96.090109 +68144,NE,Millard,41.235599,-96.116772 +68147,NE,Omaha,41.181508,-95.959156 +68152,NE,Omaha,41.334557,-96.000295 +68154,NE,Omaha,41.264167,-96.120611 +68157,NE,Papillion,41.183423,-95.995378 +68164,NE,Omaha,41.29552,-96.100793 +68301,NE,Adams,40.457571,-96.53956 +68303,NE,Alexandria,40.261446,-97.403855 +68304,NE,Alvo,40.899185,-96.403557 +68305,NE,Auburn,40.378889,-95.852646 +68307,NE,Avoca,40.815941,-96.095736 +68310,NE,Beatrice,40.270509,-96.743494 +68313,NE,Beaver Crossing,40.788658,-97.291356 +68314,NE,Bee,41.000675,-97.074469 +68315,NE,Belvidere,40.25101,-97.555416 +68316,NE,Benedict,41.003268,-97.602921 +68317,NE,Bennet,40.63822,-96.5134 +68318,NE,Blue Springs,40.140684,-96.659037 +68319,NE,Bradshaw,40.920718,-97.760699 +68320,NE,Brock,40.477227,-95.980145 +68321,NE,Brownville,40.399447,-95.69348 +68322,NE,Bruning,40.330157,-97.557276 +68323,NE,Burchard,40.105743,-96.348806 +68324,NE,Burr,40.560057,-96.238401 +68325,NE,Byron,40.02688,-97.761236 +68326,NE,Carleton,40.300534,-97.671909 +68327,NE,Chester,40.028954,-97.61969 +68328,NE,Clatonia,40.47236,-96.855513 +68329,NE,Cook,40.498628,-96.15262 +68330,NE,Cordova,40.718477,-97.340721 +68331,NE,Cortland,40.497599,-96.716627 +68332,NE,Crab Orchard,40.316648,-96.411569 +68333,NE,Crete,40.619302,-96.956676 +68335,NE,Davenport,40.310782,-97.80496 +68336,NE,Davey,41.002543,-96.641379 +68337,NE,Dawson,40.137697,-95.834097 +68338,NE,Daykin,40.31916,-97.304306 +68339,NE,Denton,40.700905,-96.853157 +68340,NE,Deshler,40.138668,-97.730007 +68341,NE,De Witt,40.39438,-96.933766 +68342,NE,Diller,40.119201,-96.949487 +68343,NE,Dorchester,40.649858,-97.105562 +68344,NE,Douglas,40.583824,-96.396958 +68345,NE,Du Bois,40.037486,-96.057477 +68346,NE,Dunbar,40.659156,-96.013575 +68347,NE,Eagle,40.816909,-96.428965 +68348,NE,Elk Creek,40.2977,-96.142128 +68349,NE,Elmwood,40.837811,-96.294395 +68350,NE,Endicott,40.073407,-97.093787 +68351,NE,Exeter,40.634062,-97.442388 +68352,NE,Fairbury,40.148817,-97.183918 +68354,NE,Fairmont,40.6404,-97.58729 +68355,NE,Falls City,40.074193,-95.593148 +68357,NE,Filley,40.294606,-96.530132 +68358,NE,Firth,40.558595,-96.614023 +68359,NE,Friend,40.636792,-97.273928 +68360,NE,Garland,40.941189,-96.97019 +68361,NE,Geneva,40.527731,-97.609625 +68362,NE,Gilead,40.146986,-97.42714 +68364,NE,Goehner,40.830208,-97.205456 +68365,NE,Grafton,40.640193,-97.740263 +68366,NE,Greenwood,40.97064,-96.42584 +68367,NE,Gresham,41.020952,-97.407937 +68368,NE,Hallam,40.554734,-96.754518 +68370,NE,Hebron,40.172807,-97.605228 +68371,NE,Henderson,40.781374,-97.797865 +68372,NE,Holland,40.624558,-96.624924 +68374,NE,Holmesville,40.220245,-96.632635 +68375,NE,Hubbell,40.045581,-97.473467 +68376,NE,Humboldt,40.156595,-95.931079 +68377,NE,Jansen,40.207425,-97.024426 +68378,NE,Johnson,40.401623,-95.988276 +68379,NE,Julian,40.486056,-95.85046 +68380,NE,Lewiston,40.230879,-96.404941 +68381,NE,Liberty,40.075286,-96.523668 +68401,NE,Mc Cool Junction,40.744181,-97.593666 +68402,NE,Malcolm,40.90913,-96.859966 +68404,NE,Martell,40.651434,-96.744227 +68405,NE,Milford,40.763153,-97.05763 +68406,NE,Milligan,40.495163,-97.399684 +68407,NE,Murdock,40.919034,-96.284827 +68409,NE,Murray,40.91999,-95.922668 +68410,NE,Nebraska City,40.674746,-95.8619 +68413,NE,Nehawka,40.832978,-95.993045 +68414,NE,Nemaha,40.319818,-95.69133 +68415,NE,Odell,40.045128,-96.801924 +68416,NE,Ohiowa,40.406507,-97.442712 +68417,NE,Otoe,40.735485,-96.132867 +68418,NE,Palmyra,40.704964,-96.399903 +68420,NE,Pawnee City,40.109291,-96.150926 +68421,NE,Peru,40.476643,-95.731166 +68422,NE,Pickrell,40.382117,-96.734444 +68423,NE,Pleasant Dale,40.813329,-96.95128 +68424,NE,Plymouth,40.303896,-97.001169 +68428,NE,Agnew,40.985331,-96.782942 +68429,NE,Reynolds,40.059372,-97.318243 +68430,NE,Roca,40.670195,-96.639085 +68431,NE,Rulo,40.053619,-95.429218 +68432,NE,Saint Mary,40.444756,-96.289972 +68433,NE,Salem,40.061953,-95.727261 +68434,NE,Seward,40.906609,-97.096618 +68436,NE,Shickley,40.407677,-97.714298 +68437,NE,Shubert,40.232479,-95.689454 +68439,NE,Staplehurst,40.984455,-97.185859 +68440,NE,Steele City,40.042492,-96.990712 +68441,NE,Steinauer,40.216885,-96.230215 +68442,NE,Stella,40.230345,-95.767989 +68443,NE,Sterling,40.463743,-96.386655 +68444,NE,Strang,40.398105,-97.552132 +68445,NE,Swanton,40.384389,-97.08055 +68446,NE,Syracuse,40.661386,-96.182407 +68447,NE,Table Rock,40.187437,-96.081822 +68448,NE,Talmage,40.558646,-96.013814 +68450,NE,Tecumseh,40.369702,-96.204951 +68452,NE,Ong,40.396806,-97.861018 +68453,NE,Tobias,40.426171,-97.318444 +68454,NE,Unadilla,40.691675,-96.282454 +68455,NE,Union,40.824452,-95.903739 +68456,NE,Utica,40.91685,-97.334431 +68457,NE,Verdon,40.142507,-95.716157 +68458,NE,Virginia,40.230877,-96.512145 +68460,NE,Waco,40.919826,-97.453352 +68461,NE,Walton,40.797467,-96.535943 +68462,NE,Waverly,40.92224,-96.525988 +68463,NE,Weeping Water,40.873096,-96.152825 +68464,NE,Western,40.415157,-97.197649 +68465,NE,Wilber,40.482141,-96.975713 +68466,NE,Wymore,40.112955,-96.661326 +68467,NE,York,40.866678,-97.582482 +68502,NE,Lincoln,40.789282,-96.693763 +68503,NE,Lincoln,40.823339,-96.676623 +68504,NE,Lincoln,40.839226,-96.653248 +68505,NE,Lincoln,40.824674,-96.625193 +68506,NE,Lincoln,40.784796,-96.643052 +68507,NE,Lincoln,40.847265,-96.628874 +68508,NE,Lincoln,40.814503,-96.700907 +68510,NE,Lincoln,40.806345,-96.654458 +68512,NE,Lincoln,40.756487,-96.694606 +68514,NE,Lincoln,40.925792,-96.661082 +68516,NE,Lincoln,40.756807,-96.652304 +68517,NE,Lincoln,40.931743,-96.604509 +68520,NE,Lincoln,40.774441,-96.569341 +68521,NE,Lincoln,40.851044,-96.711006 +68522,NE,Lincoln,40.793407,-96.747871 +68523,NE,Lincoln,40.740766,-96.758339 +68524,NE,Lincoln,40.852913,-96.794345 +68526,NE,Lincoln,40.731386,-96.587817 +68527,NE,Lincoln,40.834708,-96.540053 +68528,NE,Lincoln,40.819541,-96.754496 +68531,NE,Lincoln,40.899397,-96.715572 +68532,NE,Lincoln,40.792159,-96.85509 +68601,NE,Richland,41.437225,-97.356469 +68620,NE,Albion,41.704947,-97.999116 +68621,NE,Ames,41.461253,-96.646344 +68622,NE,Bartlett,41.8697,-98.556668 +68623,NE,Belgrade,41.461077,-98.086638 +68624,NE,Bellwood,41.347389,-97.274657 +68626,NE,Brainard,41.183151,-96.988226 +68627,NE,Cedar Rapids,41.556407,-98.15538 +68628,NE,Clarks,41.232797,-97.846143 +68629,NE,Clarkson,41.696064,-97.105059 +68631,NE,Creston,41.660695,-97.368692 +68632,NE,Garrison,41.237315,-97.126229 +68633,NE,Dodge,41.681609,-96.818077 +68635,NE,Dwight,41.089388,-96.993143 +68636,NE,Elgin,41.973239,-98.075082 +68637,NE,Ericson,41.782804,-98.645323 +68638,NE,Fullerton,41.366042,-98.005362 +68640,NE,Genoa,41.446776,-97.764011 +68641,NE,Howells,41.696441,-96.985811 +68642,NE,Humphrey,41.670184,-97.498649 +68643,NE,Leigh,41.673877,-97.232001 +68644,NE,Lindsay,41.692634,-97.671134 +68647,NE,Monroe,41.478255,-97.606075 +68648,NE,Morse Bluff,41.417831,-96.786171 +68649,NE,North Bend,41.468924,-96.781328 +68650,NE,Octavia,41.355323,-97.07021 +68651,NE,Osceola,41.196565,-97.557079 +68652,NE,Petersburg,41.858954,-98.084791 +68653,NE,Platte Center,41.524114,-97.457616 +68654,NE,Polk,41.117671,-97.752372 +68655,NE,Primrose,41.64054,-98.235455 +68658,NE,Rising City,41.208219,-97.303174 +68659,NE,Rogers,41.469536,-96.949735 +68660,NE,Saint Edward,41.57076,-97.880116 +68661,NE,Schuyler,41.459128,-97.062832 +68662,NE,Shelby,41.243544,-97.429536 +68663,NE,Silver Creek,41.318999,-97.667106 +68665,NE,Spalding,41.687409,-98.371468 +68666,NE,Stromsburg,41.111834,-97.574183 +68667,NE,Ulysses,41.089922,-97.309013 +68669,NE,Ulysses,41.079059,-97.198388 +68701,NE,Norfolk,42.032914,-97.422898 +68710,NE,Allen,42.443667,-96.8574 +68711,NE,Amelia,42.18088,-99.008036 +68713,NE,Atkinson,42.548279,-98.976087 +68714,NE,Bassett,42.576293,-99.538732 +68715,NE,Battle Creek,41.994283,-97.598153 +68716,NE,Beemer,41.937422,-96.815008 +68717,NE,Belden,42.402185,-97.195628 +68718,NE,Bloomfield,42.597824,-97.654494 +68719,NE,Bristow,42.880575,-98.60267 +68720,NE,Brunswick,42.351023,-97.944008 +68722,NE,Butte,42.912377,-98.845903 +68723,NE,Carroll,42.277009,-97.192612 +68724,NE,Center,42.602451,-97.883567 +68725,NE,Chambers,42.191606,-98.737846 +68726,NE,Clearwater,42.126562,-98.186761 +68727,NE,Coleridge,42.522992,-97.178564 +68728,NE,Concord,42.381982,-96.981035 +68729,NE,Creighton,42.468053,-97.89323 +68730,NE,Crofton,42.737028,-97.540589 +68731,NE,Dakota City,42.38074,-96.453608 +68732,NE,Dixon,42.41853,-96.977381 +68733,NE,Emerson,42.285247,-96.71587 +68734,NE,Emmet,42.474708,-98.823777 +68735,NE,Ewing,42.185107,-98.398137 +68736,NE,Fordyce,42.730889,-97.356665 +68737,NE,Foster,42.269932,-97.658038 +68739,NE,Hartington,42.623494,-97.283678 +68740,NE,Hoskins,42.140839,-97.308435 +68741,NE,Hubbard,42.413139,-96.622425 +68742,NE,Inman,42.376149,-98.538366 +68743,NE,Jackson,42.452877,-96.574335 +68745,NE,Laurel,42.427036,-97.087381 +68746,NE,Lynch,42.837275,-98.450433 +68747,NE,Mclean,42.392082,-97.475113 +68748,NE,Madison,41.830786,-97.47195 +68749,NE,Magnet,42.475294,-97.440722 +68751,NE,Maskell,42.670245,-96.966978 +68752,NE,Meadow Grove,42.010184,-97.733426 +68753,NE,Mills,42.922527,-99.446647 +68755,NE,Naper,42.952091,-99.071027 +68756,NE,Neligh,42.138926,-98.01507 +68757,NE,Newcastle,42.620672,-96.87085 +68758,NE,Newman Grove,41.74977,-97.773966 +68759,NE,Newport,42.600089,-99.335887 +68760,NE,Verdel,42.776942,-97.912734 +68761,NE,Oakdale,42.053585,-97.918644 +68762,NE,Obert,42.65767,-97.070709 +68763,NE,Oneill,42.485733,-98.645565 +68764,NE,Orchard,42.33987,-98.240853 +68765,NE,Osmond,42.353936,-97.581998 +68766,NE,Page,42.411882,-98.39639 +68767,NE,Pierce,42.194323,-97.525604 +68768,NE,Pilger,42.040413,-97.268472 +68769,NE,Plainview,42.346701,-97.778615 +68770,NE,Ponca,42.56931,-96.712793 +68771,NE,Randolph,42.379778,-97.346443 +68772,NE,Rose,42.256782,-99.444755 +68773,NE,Royal,42.294614,-98.124626 +68774,NE,Saint Helena,42.818145,-97.358616 +68776,NE,South Sioux City,42.465615,-96.418161 +68777,NE,Spencer,42.884936,-98.705853 +68778,NE,Springview,42.848785,-99.806148 +68779,NE,Stanton,41.907559,-97.213955 +68780,NE,Stuart,42.571307,-99.139563 +68781,NE,Tilden,42.049629,-97.822297 +68782,NE,68782,42.78358,-98.17297 +68783,NE,Verdigre,42.610111,-98.079278 +68784,NE,Wakefield,42.273271,-96.877645 +68785,NE,Waterbury,42.460431,-96.74478 +68786,NE,Wausa,42.497265,-97.557616 +68787,NE,Wayne,42.230439,-97.018579 +68788,NE,West Point,41.84503,-96.731763 +68789,NE,Winnetoon,42.494565,-98.025408 +68790,NE,Winside,42.167817,-97.182505 +68791,NE,Wisner,41.997994,-96.916975 +68792,NE,Wynot,42.739304,-97.167809 +68801,NE,Grand Island,40.921858,-98.341062 +68803,NE,Grand Island,40.928608,-98.387271 +68810,NE,Alda,40.856923,-98.455135 +68812,NE,Amherst,40.849494,-99.260949 +68813,NE,Milburn,41.636214,-99.799149 +68814,NE,Ansley,41.30193,-99.36452 +68815,NE,Arcadia,41.429305,-99.120468 +68816,NE,Archer,41.178156,-98.118151 +68817,NE,Ashton,41.267184,-98.803352 +68818,NE,Aurora,40.852838,-98.020107 +68819,NE,Berwyn,41.347015,-99.501573 +68820,NE,Boelus,41.100278,-98.697551 +68821,NE,Brewster,41.946705,-99.829196 +68822,NE,Broken Bow,41.412586,-99.635452 +68823,NE,Burwell,41.807982,-99.099527 +68824,NE,Cairo,41.000183,-98.616538 +68825,NE,Callaway,41.248499,-99.993185 +68826,NE,Central City,41.121259,-98.001693 +68827,NE,Chapman,40.985592,-98.221723 +68828,NE,Comstock,41.555254,-99.275281 +68829,NE,Cotesfield,41.34301,-98.655344 +68831,NE,Dannebrog,41.119156,-98.554564 +68832,NE,Doniphan,40.770031,-98.37901 +68833,NE,Dunning,41.813107,-100.087271 +68834,NE,Eddyville,41.0079,-99.681009 +68835,NE,Elba,41.28644,-98.575622 +68836,NE,Elm Creek,40.730079,-99.372786 +68837,NE,Elyria,41.695655,-99.046656 +68838,NE,Farwell,41.220378,-98.648144 +68840,NE,Gibbon,40.744445,-98.85435 +68841,NE,Giltner,40.765402,-98.14344 +68842,NE,Greeley,41.552578,-98.529951 +68843,NE,Hampton,40.923609,-97.884146 +68844,NE,Hazard,41.093368,-99.071859 +68846,NE,Hordville,41.081253,-97.888145 +68847,NE,Kearney,40.713608,-99.077883 +68850,NE,Lexington,40.785002,-99.751515 +68852,NE,Litchfield,41.168639,-99.141452 +68853,NE,Loup City,41.284531,-98.975149 +68854,NE,Marquette,41.010017,-97.999955 +68855,NE,Mason City,41.185319,-99.304937 +68856,NE,Merna,41.443482,-99.803595 +68858,NE,Miller,40.942236,-99.373987 +68859,NE,North Loup,41.49717,-98.785836 +68860,NE,Oconto,41.138075,-99.695112 +68861,NE,Odessa,40.709726,-99.254082 +68862,NE,Ord,41.596187,-98.941783 +68863,NE,Overton,40.751875,-99.527824 +68864,NE,Palmer,41.178757,-98.241146 +68865,NE,Phillips,40.898197,-98.21286 +68866,NE,Pleasanton,40.981848,-99.128278 +68868,NE,Prosser,40.659175,-98.559471 +68869,NE,Ravenna,41.023271,-98.904129 +68870,NE,Riverdale,40.762684,-99.138147 +68871,NE,Rockville,41.110832,-98.857757 +68872,NE,Saint Libory,41.08669,-98.35888 +68873,NE,Saint Paul,41.224212,-98.443987 +68874,NE,Sargent,41.650845,-99.381624 +68875,NE,Scotia,41.483724,-98.689256 +68876,NE,Shelton,40.771703,-98.743453 +68878,NE,Sumner,40.950384,-99.519951 +68879,NE,Almeria,41.822859,-99.415404 +68881,NE,Westerville,41.419282,-99.384369 +68882,NE,Wolbach,41.424373,-98.399456 +68883,NE,Wood River,40.810635,-98.606509 +68901,NE,Hastings,40.587654,-98.391146 +68920,NE,Alma,40.118853,-99.360073 +68922,NE,Arapahoe,40.302662,-99.899697 +68923,NE,Atlanta,40.384901,-99.484354 +68924,NE,Axtell,40.526907,-99.116903 +68925,NE,Ayr,40.441054,-98.438982 +68926,NE,Beaver City,40.129036,-99.806532 +68927,NE,Bertrand,40.560843,-99.575891 +68928,NE,Bladen,40.298996,-98.604625 +68929,NE,Bloomington,40.138257,-99.009438 +68930,NE,Blue Hill,40.31102,-98.426955 +68932,NE,Campbell,40.296684,-98.737012 +68933,NE,Clay Center,40.511301,-98.038649 +68934,NE,Deweese,40.379234,-98.177199 +68935,NE,Edgar,40.365166,-97.972679 +68936,NE,Edison,40.280176,-99.785988 +68937,NE,Elwood,40.574738,-99.825812 +68938,NE,Fairfield,40.428511,-98.106272 +68939,NE,Franklin,40.105172,-98.946862 +68940,NE,Funk,40.502031,-99.244992 +68941,NE,Glenvil,40.493145,-98.246475 +68942,NE,Guide Rock,40.081186,-98.339064 +68943,NE,Hardy,40.028452,-97.927057 +68944,NE,Harvard,40.626463,-98.084574 +68945,NE,Heartwell,40.571601,-98.78514 +68946,NE,Hendley,40.106312,-99.971537 +68947,NE,Hildreth,40.321743,-99.057128 +68948,NE,Holbrook,40.301893,-100.013593 +68949,NE,Holdrege,40.447527,-99.367233 +68950,NE,Holstein,40.454169,-98.653777 +68951,NE,Huntley,40.210254,-99.284786 +68952,NE,Inavale,40.095886,-98.661191 +68954,NE,Inland,40.589934,-98.223379 +68955,NE,Juniata,40.586652,-98.515017 +68956,NE,Kenesaw,40.61645,-98.657241 +68957,NE,Lawrence,40.27672,-98.240243 +68958,NE,Loomis,40.479155,-99.497851 +68959,NE,Minden,40.509142,-98.938297 +68960,NE,Naponee,40.125807,-99.127725 +68961,NE,Nora,40.209739,-98.058417 +68964,NE,Oak,40.260489,-97.884114 +68966,NE,Orleans,40.148435,-99.457186 +68967,NE,Oxford,40.256049,-99.630197 +68969,NE,Ragan,40.309594,-99.24891 +68970,NE,Red Cloud,40.09516,-98.518655 +68971,NE,Republican City,40.103401,-99.232189 +68972,NE,Riverton,40.101626,-98.785819 +68973,NE,Roseland,40.459058,-98.555059 +68974,NE,Ruskin,40.138318,-97.87203 +68975,NE,Saronville,40.600625,-97.87385 +68976,NE,Smithfield,40.583567,-99.823862 +68977,NE,Stamford,40.11625,-99.581405 +68978,NE,Superior,40.031537,-98.077872 +68979,NE,Sutton,40.653955,-97.873476 +68980,NE,Trumbull,40.66918,-98.257414 +68981,NE,Upland,40.317073,-98.896577 +68982,NE,Wilcox,40.373523,-99.153927 +69001,NE,Mc Cook,40.204905,-100.627948 +69020,NE,Bartley,40.258113,-100.29075 +69021,NE,Benkelman,40.098049,-101.534354 +69022,NE,Cambridge,40.280767,-100.167579 +69023,NE,Champion,40.460039,-101.74849 +69024,NE,Culbertson,40.223707,-100.850043 +69025,NE,Curtis,40.613067,-100.510406 +69026,NE,Danbury,40.037689,-100.424228 +69027,NE,Enders,40.465492,-101.522156 +69028,NE,Eustis,40.626745,-100.054694 +69029,NE,Farnam,40.712881,-100.206878 +69030,NE,Haigler,40.064179,-101.937106 +69031,NE,Hamlet,40.399363,-101.234106 +69032,NE,Hayes Center,40.517316,-101.025208 +69033,NE,Imperial,40.525124,-101.646775 +69034,NE,Indianola,40.235718,-100.429758 +69035,NE,Lamar,40.538653,-101.903297 +69036,NE,Lebanon,40.07522,-100.26122 +69037,NE,Max,40.106884,-101.391607 +69038,NE,Maywood,40.589262,-100.642135 +69039,NE,Moorefield,40.57856,-100.310773 +69040,NE,Palisade,40.338668,-101.129464 +69041,NE,Parks,40.139837,-101.739879 +69042,NE,Stockville,40.494834,-100.384886 +69043,NE,Stratton,40.144462,-101.218275 +69044,NE,Trenton,40.168096,-101.020073 +69045,NE,Wauneta,40.440906,-101.381195 +69046,NE,Wilsonville,40.108895,-100.1211 +69101,NE,North Platte,41.132595,-100.774631 +69120,NE,Arnold,41.445583,-100.156731 +69121,NE,Arthur,41.573952,-101.693123 +69122,NE,Big Springs,41.069621,-102.093273 +69123,NE,Brady,41.051525,-100.373649 +69125,NE,Broadwater,41.582547,-102.822521 +69127,NE,Brule,41.100186,-101.909933 +69128,NE,Bushnell,41.213876,-103.907494 +69129,NE,Chappell,41.096586,-102.452344 +69130,NE,Cozad,40.861934,-99.992091 +69131,NE,Dalton,41.406778,-102.972609 +69132,NE,Dickens,40.804089,-101.01495 +69133,NE,Dix,41.226993,-103.479603 +69134,NE,Elsie,40.859647,-101.369994 +69135,NE,Elsmere,42.264974,-100.282412 +69138,NE,Gothenburg,40.940035,-100.154707 +69140,NE,Grant,40.851069,-101.719589 +69141,NE,Gurley,41.28771,-102.982325 +69142,NE,Halsey,41.929095,-100.295515 +69143,NE,Hershey,41.155303,-101.001157 +69144,NE,Keystone,41.262129,-101.628218 +69145,NE,Kimball,41.23208,-103.660236 +69146,NE,Lemoyne,41.304017,-101.894677 +69147,NE,Lewellen,41.343461,-102.139622 +69148,NE,Lisco,41.511398,-102.54983 +69149,NE,Lodgepole,41.169745,-102.657034 +69150,NE,Madrid,40.85443,-101.537067 +69151,NE,Maxwell,41.058831,-100.526993 +69152,NE,Mullen,42.016292,-101.054185 +69153,NE,Ogallala,41.127505,-101.710742 +69154,NE,Oshkosh,41.445057,-102.345699 +69155,NE,Paxton,41.126763,-101.358544 +69156,NE,Potter,41.234688,-103.306112 +69157,NE,Purdum,41.966475,-100.15685 +69161,NE,Seneca,41.99012,-100.807315 +69162,NE,Sidney,41.138001,-102.985573 +69163,NE,Stapleton,41.48877,-100.483105 +69165,NE,Sutherland,41.15575,-101.136029 +69166,NE,Brownlee,41.973575,-100.573834 +69167,NE,Tryon,41.573175,-101.017508 +69168,NE,Venango,40.807324,-101.983894 +69169,NE,Wallace,40.830423,-101.173767 +69170,NE,Wellfleet,40.798776,-100.711915 +69201,NE,Valentine,42.806166,-100.621542 +69210,NE,Ainsworth,42.54027,-99.861491 +69211,NE,Cody,42.614556,-101.379846 +69212,NE,Crookston,42.925506,-100.773473 +69214,NE,Johnstown,42.530857,-100.045322 +69216,NE,Kilgore,42.914587,-100.988447 +69217,NE,Long Pine,42.533379,-99.723042 +69218,NE,Merriman,42.641883,-101.758304 +69221,NE,Wood Lake,42.626394,-100.287175 +69301,NE,Alliance,42.114943,-102.888045 +69331,NE,Angora,41.893434,-103.085019 +69333,NE,Ashby,41.977578,-101.963581 +69334,NE,Bayard,41.757923,-103.301887 +69335,NE,Bingham,42.260651,-102.133075 +69336,NE,Bridgeport,41.676556,-103.070134 +69337,NE,Chadron,42.819268,-102.995331 +69339,NE,Crawford,42.67584,-103.405336 +69340,NE,Ellsworth,42.169717,-102.47245 +69341,NE,Gering,41.821993,-103.662896 +69343,NE,Gordon,42.806843,-102.204929 +69345,NE,Harrisburg,41.55306,-103.711141 +69346,NE,Harrison,42.394594,-103.831803 +69347,NE,Hay Springs,42.640122,-102.675641 +69348,NE,Hemingford,42.33117,-103.064412 +69349,NE,Henry,41.993392,-104.034933 +69350,NE,Hyannis,42.006967,-101.748296 +69351,NE,Lakeside,42.049595,-102.443655 +69352,NE,Lyman,41.891765,-104.006569 +69354,NE,Marsland,42.598842,-103.051857 +69356,NE,Minatare,41.849333,-103.489011 +69357,NE,Mitchell,41.945851,-103.795996 +69358,NE,Morrill,41.96807,-103.918216 +69360,NE,Rushville,42.737934,-102.465738 +69361,NE,Scottsbluff,41.871975,-103.661914 +69366,NE,Whitman,41.958355,-101.521623 +69367,NE,Whitney,42.755881,-103.239552 +89001,NV,Alamo,37.325866,-115.308032 +89005,NV,Boulder City,35.972711,-114.834413 +89008,NV,Caliente,37.612817,-114.509727 +89013,NV,Goldfield,37.834364,-117.269379 +89014,NV,Henderson,36.056435,-115.077968 +89015,NV,Henderson,36.035705,-114.971809 +89017,NV,Hiko,37.651695,-115.177158 +89018,NV,Indian Springs,36.407223,-115.581067 +89019,NV,Goodsprings,35.854839,-115.469154 +89020,NV,Amargosa Valley,36.944007,-116.57755 +89029,NV,Laughlin,35.132138,-114.636769 +89030,NV,North Las Vegas,36.4475,-114.851389 +89031,NV,North Las Vegas,36.206228,-115.124832 +89040,NV,Overton,36.637236,-114.378202 +89041,NV,Pahrump,36.204039,-116.014661 +89043,NV,Pioche,37.898097,-114.396824 +89045,NV,Round Mountain,38.682886,-117.127989 +89046,NV,Cottonwood Cove,35.447601,-114.924182 +89047,NV,Silverpeak,37.76444,-117.94592 +89049,NV,Tonopah,38.204273,-117.089886 +89101,NV,Las Vegas,36.172082,-115.122366 +89102,NV,Las Vegas,36.143303,-115.200351 +89103,NV,Las Vegas,36.114865,-115.216072 +89104,NV,Las Vegas,36.15197,-115.109195 +89106,NV,Las Vegas,36.184673,-115.161703 +89107,NV,Las Vegas,36.170457,-115.217638 +89108,NV,Las Vegas,36.204399,-115.223259 +89109,NV,Las Vegas,36.125991,-115.145378 +89110,NV,Las Vegas,36.173031,-115.066892 +89113,NV,Las Vegas,36.085366,-115.256614 +89115,NV,Las Vegas,36.215818,-115.067062 +89117,NV,Las Vegas,36.130196,-115.275518 +89118,NV,Las Vegas,36.081052,-115.216856 +89119,NV,Las Vegas,36.100836,-115.136463 +89120,NV,Las Vegas,36.091423,-115.088485 +89121,NV,Las Vegas,36.12318,-115.090219 +89122,NV,Las Vegas,36.120501,-115.052322 +89123,NV,Las Vegas,36.038273,-115.146182 +89124,NV,Las Vegas,35.963391,-115.095067 +89128,NV,Las Vegas,36.175992,-115.256252 +89129,NV,Las Vegas,36.245004,-115.274254 +89130,NV,Las Vegas,36.247137,-115.221032 +89131,NV,Las Vegas,36.295604,-115.241942 +89134,NV,Las Vegas,36.209234,-115.294123 +89301,NV,Ely,39.309356,-114.878011 +89310,NV,Austin,39.507986,-117.081063 +89311,NV,Baker,39.065996,-114.246165 +89316,NV,Eureka,39.589661,-115.994308 +89317,NV,Lund,38.904633,-115.044026 +89403,NV,Dayton,39.280594,-119.52872 +89404,NV,Denio,41.704263,-118.731962 +89405,NV,Empire,40.357703,-119.655265 +89406,NV,Fallon,39.470254,-118.786112 +89408,NV,Fernley,39.601888,-119.235044 +89409,NV,Gabbs,38.880226,-117.868556 +89410,NV,Gardnerville,38.898268,-119.726902 +89412,NV,Gerlach,40.674645,-119.377441 +89413,NV,Glenbrook,38.993752,-119.927776 +89414,NV,Golconda,40.968325,-117.334929 +89415,NV,Hawthorne,38.534658,-118.641143 +89418,NV,Unionville,40.652217,-118.02115 +89419,NV,Lovelock,40.1819,-118.468915 +89420,NV,Luning,38.406072,-118.157114 +89423,NV,Minden,39.021766,-119.731363 +89424,NV,Nixon,39.885388,-119.464262 +89425,NV,Orovada,41.822001,-117.775458 +89426,NV,Paradise Valley,41.505726,-117.572848 +89427,NV,Schurz,38.957527,-118.775578 +89429,NV,Silver Springs,39.380045,-119.270503 +89430,NV,Smith,38.917166,-119.389005 +89431,NV,Sparks,39.547254,-119.755588 +89433,NV,Sun Valley,39.595477,-119.775363 +89434,NV,Sparks,39.550229,-119.717754 +89436,NV,Sparks,39.626861,-119.708125 +89440,NV,Virginia City,39.387282,-119.596063 +89442,NV,Wadsworth,39.648069,-119.291778 +89444,NV,Wellington,38.78762,-119.344901 +89445,NV,Winnemucca,40.966418,-117.746693 +89447,NV,Yerington,38.986567,-119.159558 +89451,NV,Incline Village,39.256352,-119.95206 +89501,NV,Reno,39.526812,-119.811275 +89502,NV,Reno,39.497239,-119.776395 +89503,NV,Reno,39.5354,-119.837409 +89506,NV,Reno,39.641168,-119.873505 +89509,NV,Reno,39.498042,-119.823932 +89510,NV,Reno,39.769919,-119.602678 +89511,NV,Reno,39.41512,-119.766846 +89512,NV,Reno,39.548312,-119.795699 +89523,NV,Reno,39.524917,-119.903065 +89701,NV,Carson City,39.150746,-119.745904 +89703,NV,Carson City,39.17036,-119.778242 +89704,NV,Carson City,39.089756,-119.828624 +89705,NV,Carson City,39.089147,-119.782899 +89706,NV,Moundhouse,39.210876,-119.742912 +89801,NV,Jiggs,40.826247,-115.724679 +89820,NV,Battle Mountain,40.621985,-116.955439 +89821,NV,Beowawe,40.462398,-116.477387 +89822,NV,Carlin,40.717216,-116.108208 +89823,NV,Deeth,41.431033,-115.371729 +89825,NV,Jackpot,41.839591,-115.112886 +89831,NV,Mountain City,41.870781,-116.113801 +89833,NV,Ruby Valley,40.399514,-115.231219 +89834,NV,Tuscarora,41.171527,-116.931141 +89835,NV,Oasis,41.129798,-114.532752 +3031,NH,Amherst,42.856944,-71.607536 +3032,NH,Auburn,42.992529,-71.344892 +3033,NH,Brookline,42.738442,-71.666254 +3034,NH,Candia,43.058514,-71.304857 +3036,NH,Chester,42.967756,-71.244962 +3037,NH,Deerfield,43.137756,-71.251264 +3038,NH,Derry,42.887404,-71.301971 +3042,NH,Epping,43.041052,-71.076367 +3043,NH,Francestown,42.991952,-71.81131 +3044,NH,Fremont,42.984016,-71.121836 +3045,NH,Dunbarton,43.018224,-71.56264 +3047,NH,Greenfield,42.949277,-71.872755 +3048,NH,Mason,42.7489,-71.784487 +3049,NH,Hollis,42.748513,-71.577206 +3051,NH,Hudson,42.769038,-71.412144 +3053,NH,Londonderry,42.865555,-71.37719 +3054,NH,Merrimack,42.866689,-71.51278 +3055,NH,Milford,42.828497,-71.660569 +3057,NH,Mont Vernon,42.897597,-71.676243 +3060,NH,Nashua,42.756395,-71.466684 +3062,NH,Nashua,42.723472,-71.489282 +3063,NH,Nashua,42.771686,-71.513156 +3070,NH,New Boston,42.97217,-71.686402 +3071,NH,New Ipswich,42.751142,-71.870318 +3076,NH,Pelham,42.72881,-71.304551 +3077,NH,Raymond,43.032512,-71.191159 +3079,NH,Salem,42.78465,-71.21761 +3082,NH,Lyndeborough,42.895449,-71.774373 +3084,NH,Temple,42.820035,-71.852347 +3086,NH,Wilton,42.836761,-71.754066 +3087,NH,Windham,42.805106,-71.306735 +3101,NH,Manchester,42.992858,-71.463255 +3102,NH,Manchester,42.99442,-71.488433 +3103,NH,Manchester,42.965563,-71.449325 +3104,NH,Manchester,43.007307,-71.448233 +3106,NH,Hooksett,43.061708,-71.444446 +3109,NH,Manchester,42.971349,-71.413474 +3110,NH,Bedford,42.940307,-71.52127 +3216,NH,Andover,43.428668,-71.782952 +3217,NH,Ashland,43.703428,-71.612085 +3218,NH,Barnstead,43.36513,-71.286946 +3220,NH,Belmont,43.451189,-71.488991 +3221,NH,Bradford,43.294343,-71.985048 +3222,NH,Bristol,43.611994,-71.750664 +3223,NH,Beebe River,43.888507,-71.636142 +3224,NH,Canterbury,43.357041,-71.557008 +3225,NH,Center Barnstead,43.356563,-71.24244 +3226,NH,Center Harbor,43.710688,-71.47973 +3227,NH,Center Sandwich,43.816169,-71.450614 +3229,NH,Hopkinton,43.218898,-71.696299 +3230,NH,Danbury,43.5115,-71.869074 +3231,NH,East Andover,43.47766,-71.759606 +3232,NH,East Hebron,43.696969,-71.767907 +3234,NH,Epsom,43.217398,-71.354576 +3235,NH,Franklin,43.442569,-71.649122 +3237,NH,Gilmanton,43.417476,-71.412063 +3240,NH,Grafton,43.572743,-71.963389 +3241,NH,Hebron,43.718571,-71.82696 +3242,NH,Henniker,43.179091,-71.815921 +3243,NH,Hill,43.527422,-71.729168 +3244,NH,Hillsboro,43.120709,-71.902818 +3246,NH,Gilford,43.538713,-71.452907 +3251,NH,Lincoln,44.058159,-71.672707 +3253,NH,Meredith,43.650208,-71.511327 +3254,NH,Moultonborough,43.728133,-71.392245 +3256,NH,New Hampton,43.618393,-71.643513 +3257,NH,New London,43.414501,-71.985674 +3259,NH,North Sandwich,43.845182,-71.385025 +3261,NH,Northwood,43.206965,-71.200423 +3262,NH,North Woodstock,44.019831,-71.697684 +3263,NH,Pittsfield,43.287384,-71.33303 +3264,NH,Plymouth,43.763524,-71.684714 +3266,NH,Rumney,43.804389,-71.848019 +3268,NH,Salisbury,43.406652,-71.704468 +3269,NH,Sanbornton,43.549552,-71.600348 +3275,NH,Allenstown,43.147554,-71.439663 +3276,NH,Tilton,43.46033,-71.577413 +3278,NH,Warner,43.303512,-71.835349 +3279,NH,Warren,43.944667,-71.89013 +3280,NH,Washington,43.174705,-72.082407 +3281,NH,Weare,43.071422,-71.70376 +3282,NH,Wentworth,43.868456,-71.909651 +3284,NH,West Springfield,43.491615,-72.057855 +3287,NH,Wilmot Flat,43.432177,-71.900983 +3290,NH,Nottingham,43.119632,-71.110983 +3291,NH,West Nottingham,43.133971,-71.111006 +3301,NH,Concord,43.218525,-71.527734 +3303,NH,Boscawen,43.285285,-71.612723 +3304,NH,Bow,43.138788,-71.544814 +3431,NH,Surry,42.943127,-72.28954 +3440,NH,Antrim,43.059547,-71.938698 +3441,NH,Ashuelot,42.785057,-72.434899 +3442,NH,Bennington,43.010309,-71.91534 +3443,NH,Chesterfield,42.900785,-72.487219 +3444,NH,Dublin,42.897198,-72.050538 +3445,NH,East Sullivan,42.994005,-72.191778 +3446,NH,East Swanzey,42.884137,-72.249298 +3447,NH,Fitzwilliam,42.7611,-72.145014 +3448,NH,Gilsum,43.043105,-72.263272 +3449,NH,Hancock,42.976817,-71.981858 +3450,NH,Harrisville,42.939874,-72.097243 +3451,NH,Hinsdale,42.802714,-72.501474 +3452,NH,Jaffrey,42.81779,-72.027514 +3455,NH,Marlborough,42.898804,-72.201292 +3456,NH,Marlow,43.132585,-72.210879 +3457,NH,Munsonville,42.998646,-72.133702 +3458,NH,Peterborough,42.88559,-71.946964 +3461,NH,Rindge,42.754391,-72.019038 +3462,NH,Spofford,42.911973,-72.410277 +3464,NH,Stoddard,43.073944,-72.108811 +3465,NH,Troy,42.82697,-72.184753 +3466,NH,West Chesterfiel,42.873152,-72.511216 +3467,NH,Westmoreland,42.968999,-72.435784 +3469,NH,West Swanzey,42.870313,-72.297688 +3470,NH,Richmond,42.773922,-72.363672 +3561,NH,Littleton,44.311187,-71.776816 +3570,NH,Berlin,44.48107,-71.189236 +3574,NH,Bethlehem,44.280846,-71.682929 +3576,NH,Colebrook,44.907776,-71.479341 +3579,NH,Errol,44.800273,-71.143612 +3580,NH,Franconia,44.205273,-71.751822 +3581,NH,Gorham,44.399601,-71.179983 +3582,NH,Groveton,44.598367,-71.506421 +3583,NH,Jefferson,44.399907,-71.451834 +3584,NH,Lancaster,44.492074,-71.559115 +3585,NH,Lisbon,44.214837,-71.896565 +3588,NH,Milan,44.586968,-71.181031 +3590,NH,North Stratford,44.714915,-71.564368 +3592,NH,Pittsburg,45.086564,-71.363593 +3598,NH,Whitefield,44.36811,-71.603453 +3602,NH,Alstead,43.126484,-72.328052 +3603,NH,Charlestown,43.257339,-72.40638 +3605,NH,East Lempster,43.21863,-72.166205 +3607,NH,South Acworth,43.176942,-72.341053 +3608,NH,Walpole,43.076533,-72.415489 +3609,NH,North Walpole,43.142759,-72.448253 +3740,NH,Bath,44.173419,-71.956741 +3741,NH,Canaan,43.660092,-72.029724 +3743,NH,Claremont,43.367942,-72.342186 +3745,NH,Cornish,43.496339,-72.339426 +3748,NH,Enfield,43.625584,-72.127014 +3750,NH,Etna,43.711333,-72.212479 +3752,NH,Goshen,43.302623,-72.124117 +3753,NH,Grantham,43.510324,-72.133437 +3755,NH,Hanover,43.704532,-72.28496 +3765,NH,Haverhill,44.039438,-72.057276 +3766,NH,Lebanon,43.644688,-72.242818 +3768,NH,Lyme,43.791327,-72.161993 +3770,NH,Meriden,43.529873,-72.275644 +3771,NH,Monroe,44.273358,-72.025028 +3773,NH,Newport,43.353228,-72.183789 +3774,NH,North Haverhill,44.097841,-72.019112 +3777,NH,Orford,43.894101,-72.097846 +3779,NH,Piermont,43.990572,-72.081299 +3780,NH,Pike,44.025511,-72.009587 +3781,NH,Plainfield,43.551919,-72.270398 +3782,NH,Sunapee,43.386816,-72.095044 +3784,NH,West Lebanon,43.64401,-72.300735 +3785,NH,Woodsville,44.138549,-71.989215 +3801,NH,Newington,43.066524,-70.780412 +3809,NH,Alton,43.46302,-71.229709 +3810,NH,Alton Bay,43.484468,-71.24888 +3811,NH,Atkinson,42.836981,-71.1603 +3812,NH,Bartlett,44.08656,-71.2491 +3813,NH,Center Conway,43.98776,-71.060677 +3814,NH,Center Ossipee,43.768189,-71.134882 +3815,NH,Center Strafford,43.262888,-71.107122 +3816,NH,Center Tuftonbor,43.690205,-71.265059 +3817,NH,Chocorua,43.890851,-71.240716 +3818,NH,Conway,43.974161,-71.15028 +3819,NH,Danville,42.923432,-71.120985 +3820,NH,Madbury,43.190006,-70.884881 +3824,NH,Lee,43.133821,-70.952333 +3825,NH,Barrington,43.2027,-71.037675 +3826,NH,East Hampstead,42.887656,-71.127978 +3827,NH,South Hampton,42.911289,-70.976904 +3830,NH,East Wakefield,43.641022,-71.007712 +3833,NH,Brentwood,42.977169,-70.964306 +3835,NH,Farmington,43.388373,-71.064693 +3836,NH,Freedom,43.817242,-71.062815 +3837,NH,Gilmanton Iron W,43.425281,-71.330315 +3838,NH,Glen,44.101777,-71.192457 +3839,NH,Gonic,43.268374,-70.976642 +3840,NH,Greenland,43.035294,-70.847476 +3841,NH,Hampstead,42.881957,-71.175802 +3842,NH,Hampton,42.935883,-70.824336 +3844,NH,Hampton Falls,42.926323,-70.887608 +3845,NH,Intervale,44.095479,-71.119415 +3846,NH,Jackson,44.166989,-71.187808 +3848,NH,Kingston,42.913258,-71.063914 +3849,NH,Madison,43.915206,-71.125412 +3852,NH,Milton Mills,43.502494,-70.969729 +3853,NH,Mirror Lake,43.636552,-71.272858 +3854,NH,New Castle,43.068114,-70.719922 +3855,NH,New Durham,43.443045,-71.140828 +3857,NH,Newmarket,43.072628,-70.955317 +3858,NH,Newton,42.867805,-71.042021 +3860,NH,North Conway,44.033613,-71.123811 +3862,NH,North Hampton,42.977625,-70.826738 +3864,NH,Ossipee,43.694506,-71.112873 +3865,NH,Plaistow,42.835551,-71.093397 +3867,NH,Rochester,43.309203,-71.055753 +3868,NH,East Rochester,43.31256,-70.968581 +3869,NH,Rollinsford,43.226936,-70.833207 +3870,NH,Rye,43.009468,-70.765153 +3872,NH,Sanbornville,43.551278,-71.020005 +3873,NH,Sandown,42.930819,-71.18606 +3874,NH,Seabrook,42.88536,-70.86464 +3875,NH,Silver Lake,43.878974,-71.190501 +3878,NH,Somersworth,43.252546,-70.875589 +3882,NH,South Effingham,43.721216,-71.002109 +3883,NH,South Tamworth,43.833613,-71.311654 +3884,NH,Strafford,43.250575,-71.162475 +3885,NH,Stratham,43.019432,-70.899714 +3886,NH,Tamworth,43.862049,-71.264454 +3887,NH,Union,43.4382,-71.020857 +3890,NH,West Ossipee,43.835956,-71.205141 +3894,NH,Wolfeboro,43.594996,-71.190843 +7001,NJ,Avenel,40.582568,-74.278522 +7002,NJ,Bayonne,40.666399,-74.119169 +7003,NJ,Bloomfield,40.803456,-74.189074 +7004,NJ,Fairfield,40.882178,-74.296027 +7005,NJ,Boonton,40.911528,-74.414035 +7006,NJ,West Caldwell,40.849059,-74.276771 +7008,NJ,Carteret,40.582278,-74.231345 +7009,NJ,Cedar Grove,40.85344,-74.229672 +7010,NJ,Cliffside Park,40.822168,-73.987982 +7011,NJ,Clifton,40.878876,-74.142459 +7012,NJ,Clifton,40.848835,-74.161172 +7013,NJ,Clifton,40.869334,-74.171144 +7014,NJ,Clifton,40.834375,-74.137682 +7016,NJ,Cranford,40.655357,-74.305685 +7017,NJ,East Orange,40.769614,-74.207723 +7018,NJ,East Orange,40.755799,-74.219822 +7020,NJ,Edgewater,40.831654,-73.973821 +7021,NJ,Essex Fells,40.827924,-74.279705 +7022,NJ,Fairview,40.816985,-73.999967 +7023,NJ,Fanwood,40.641856,-74.386762 +7024,NJ,Fort Lee,40.850312,-73.974455 +7026,NJ,Garfield,40.878886,-74.108141 +7027,NJ,Garwood,40.65121,-74.323864 +7028,NJ,Glen Ridge,40.804015,-74.205477 +7029,NJ,Kearny,40.74754,-74.155871 +7030,NJ,Hoboken,40.7445,-74.032863 +7031,NJ,North Arlington,40.78977,-74.134288 +7032,NJ,Kearny,40.76466,-74.147108 +7033,NJ,Kenilworth,40.675869,-74.294419 +7034,NJ,Lake Hiawatha,40.88252,-74.383013 +7035,NJ,Lincoln Park,40.920769,-74.299512 +7036,NJ,Linden,40.635366,-74.255567 +7039,NJ,Livingston,40.789633,-74.3202 +7040,NJ,Maplewood,40.727906,-74.265573 +7041,NJ,Millburn,40.722798,-74.301469 +7042,NJ,Montclair,40.81307,-74.216467 +7043,NJ,Montclair,40.843023,-74.201104 +7044,NJ,Verona,40.831928,-74.242847 +7045,NJ,Montville,40.904914,-74.36456 +7046,NJ,Mountain Lakes,40.890447,-74.441487 +7047,NJ,North Bergen,40.793019,-74.017715 +7050,NJ,Orange,40.769223,-74.2355 +7052,NJ,West Orange,40.785926,-74.256765 +7054,NJ,Parsippany,40.862106,-74.411663 +7055,NJ,Passaic,40.860132,-74.128348 +7057,NJ,Wallington,40.85356,-74.107937 +7058,NJ,Pine Brook,40.874207,-74.350009 +7059,NJ,Warren,40.631787,-74.510456 +7060,NJ,North Plainfield,40.61978,-74.425298 +7062,NJ,North Plainfield,40.631992,-74.406042 +7063,NJ,North Plainfield,40.604838,-74.445325 +7064,NJ,Port Reading,40.570935,-74.246643 +7065,NJ,Rahway,40.608668,-74.281881 +7066,NJ,Clark,40.620256,-74.310581 +7067,NJ,Colonia,40.593743,-74.316368 +7068,NJ,Roseland,40.82034,-74.304688 +7070,NJ,Rutherford,40.829245,-74.112146 +7071,NJ,Lyndhurst,40.809433,-74.12453 +7072,NJ,Carlstadt,40.840298,-74.092498 +7073,NJ,East Rutherford,40.838527,-74.104069 +7074,NJ,Moonachie,40.839352,-74.056646 +7075,NJ,Wood Ridge,40.849348,-74.087845 +7076,NJ,Scotch Plains,40.642162,-74.381663 +7077,NJ,Sewaren,40.554181,-74.260736 +7078,NJ,Short Hills,40.73678,-74.327085 +7079,NJ,South Orange,40.746453,-74.257532 +7080,NJ,South Plainfield,40.583884,-74.414695 +7081,NJ,Springfield,40.701461,-74.322705 +7082,NJ,Towaco,40.927691,-74.342807 +7083,NJ,Union,40.695184,-74.267653 +7087,NJ,Weehawken,40.768153,-74.030558 +7088,NJ,Vauxhall,40.717927,-74.282874 +7090,NJ,Westfield,40.647851,-74.345056 +7092,NJ,Mountainside,40.678461,-74.358785 +7093,NJ,Guttenberg,40.788192,-74.012859 +7094,NJ,Secaucus,40.79101,-74.063416 +7095,NJ,Woodbridge,40.555973,-74.284542 +7102,NJ,Newark,40.73201,-74.176505 +7103,NJ,Newark,40.736975,-74.196364 +7104,NJ,Newark,40.766446,-74.1695 +7105,NJ,Newark,40.727086,-74.156346 +7106,NJ,Newark,40.741485,-74.233023 +7107,NJ,Newark,40.760656,-74.18816 +7108,NJ,Newark,40.723647,-74.201538 +7109,NJ,Belleville,40.79458,-74.163119 +7110,NJ,Nutley,40.818548,-74.158934 +7111,NJ,Irvington,40.7261,-74.231271 +7112,NJ,Newark,40.71071,-74.213073 +7114,NJ,Newark,40.708246,-74.189105 +7201,NJ,Elizabeth,40.67169,-74.204335 +7202,NJ,Elizabeth,40.65652,-74.221544 +7203,NJ,Roselle,40.652972,-74.261044 +7204,NJ,Roselle Park,40.665134,-74.267003 +7205,NJ,Hillside,40.696811,-74.228065 +7206,NJ,Elizabeth,40.653207,-74.192487 +7208,NJ,Elizabeth,40.674659,-74.22392 +7302,NJ,Jersey City,40.722126,-74.046878 +7304,NJ,Jersey City,40.717973,-74.075358 +7305,NJ,Jersey City,40.702007,-74.088998 +7306,NJ,Jersey City,40.732125,-74.066038 +7307,NJ,Jersey City,40.748167,-74.049752 +7310,NJ,Jersey City,40.732354,-74.043149 +7401,NJ,Allendale,41.032654,-74.134185 +7403,NJ,Bloomingdale,41.012845,-74.333756 +7405,NJ,Kinnelon,40.992118,-74.364065 +7407,NJ,Elmwood Park,40.906896,-74.120896 +7410,NJ,Fair Lawn,40.934297,-74.1166 +7416,NJ,Franklin,41.116355,-74.58649 +7417,NJ,Franklin Lakes,41.008095,-74.211347 +7418,NJ,Glenwood,41.235618,-74.488481 +7419,NJ,Hamburg,41.146714,-74.587379 +7420,NJ,Haskell,41.030111,-74.296542 +7421,NJ,Hewitt,41.170867,-74.368566 +7422,NJ,Highland Lakes,41.182622,-74.456442 +7423,NJ,Ho Ho Kus,41.000412,-74.102532 +7424,NJ,West Paterson,40.885353,-74.21145 +7430,NJ,Mahwah,41.074473,-74.155974 +7432,NJ,Midland Park,40.995668,-74.140904 +7435,NJ,Newfoundland,41.064691,-74.435857 +7436,NJ,Oakland,41.029436,-74.233754 +7438,NJ,Milton,41.028401,-74.508801 +7439,NJ,Ogdensburg,41.076707,-74.598188 +7440,NJ,Pequannock,40.947308,-74.29601 +7442,NJ,Pompton Lakes,40.999284,-74.287566 +7444,NJ,Pompton Plains,40.965515,-74.301602 +7446,NJ,Ramsey,41.057743,-74.144467 +7450,NJ,Ridgewood,40.982023,-74.113134 +7452,NJ,Glen Rock,40.960183,-74.125367 +7456,NJ,Ringwood,41.092816,-74.265872 +7457,NJ,Riverdale,40.993109,-74.308756 +7458,NJ,Upper Saddle Riv,41.053083,-74.096775 +7460,NJ,Stockholm,41.099204,-74.528256 +7461,NJ,Sussex,41.229211,-74.599156 +7462,NJ,Vernon,41.184981,-74.533196 +7463,NJ,Waldwick,41.012968,-74.124259 +7465,NJ,Wanaque,41.054447,-74.278968 +7470,NJ,Wayne,40.947112,-74.246565 +7480,NJ,West Milford,41.091513,-74.374996 +7481,NJ,Wyckoff,40.997834,-74.166009 +7501,NJ,Paterson,40.914273,-74.167141 +7502,NJ,Paterson,40.919926,-74.193238 +7503,NJ,Paterson,40.897046,-74.157272 +7504,NJ,Paterson,40.912179,-74.145247 +7505,NJ,Paterson,40.915581,-74.171947 +7506,NJ,Hawthorne,40.956355,-74.156897 +7508,NJ,Haledon,40.945689,-74.182599 +7512,NJ,Totowa,40.904811,-74.21675 +7513,NJ,Paterson,40.906994,-74.152862 +7514,NJ,Paterson,40.924764,-74.146717 +7522,NJ,Paterson,40.925168,-74.178078 +7524,NJ,Paterson,40.930916,-74.155457 +7601,NJ,Hackensack,40.888191,-74.050301 +7603,NJ,Bogota,40.874441,-74.028122 +7604,NJ,Hasbrouck Height,40.862241,-74.075971 +7605,NJ,Leonia,40.862929,-73.987873 +7606,NJ,South Hackensack,40.863391,-74.045601 +7607,NJ,Maywood,40.902412,-74.062916 +7608,NJ,Teterboro,40.86175,-74.054204 +7620,NJ,Alpine,40.951097,-73.930842 +7621,NJ,Bergenfield,40.923837,-73.998918 +7624,NJ,Closter,40.972051,-73.958985 +7626,NJ,Cresskill,40.941847,-73.965206 +7627,NJ,Demarest,40.954775,-73.960221 +7628,NJ,Dumont,40.944692,-73.992139 +7630,NJ,Emerson,40.975459,-74.028515 +7631,NJ,Englewood,40.894251,-73.977182 +7632,NJ,Englewood Cliffs,40.882043,-73.954449 +7640,NJ,Harrington Park,40.991791,-73.980017 +7641,NJ,Haworth,40.960808,-73.987376 +7642,NJ,Hillsdale,41.006945,-74.042625 +7643,NJ,Little Ferry,40.849319,-74.040502 +7644,NJ,Lodi,40.876363,-74.083827 +7645,NJ,Montvale,41.049458,-74.038362 +7646,NJ,New Milford,40.933115,-74.019517 +7647,NJ,Rockleigh,41.011196,-73.952375 +7648,NJ,Norwood,40.995231,-73.95817 +7649,NJ,Oradell,40.953456,-74.033525 +7650,NJ,Palisades Park,40.846238,-73.995436 +7652,NJ,Paramus,40.947683,-74.06724 +7656,NJ,Park Ridge,41.034349,-74.039574 +7657,NJ,Ridgefield,40.832568,-74.001531 +7660,NJ,Ridgefield Park,40.856218,-74.022962 +7661,NJ,River Edge,40.926476,-74.03924 +7662,NJ,Saddle Brook,40.904928,-74.091296 +7666,NJ,Teaneck,40.89148,-74.011928 +7670,NJ,Tenafly,40.921596,-73.965906 +7675,NJ,Old Tappan,41.001696,-74.032586 +7701,NJ,Suburban,40.354083,-74.080003 +7702,NJ,Shrewsbury,40.328198,-74.058892 +7703,NJ,Fort Monmouth,40.317667,-74.039001 +7704,NJ,Fair Haven,40.359873,-74.038891 +7711,NJ,Allenhurst,40.236675,-74.006706 +7712,NJ,Ocean,40.235571,-74.029486 +7716,NJ,Atlantic Highlan,40.40772,-74.032411 +7717,NJ,Avon By The Sea,40.191796,-74.016737 +7718,NJ,Belford,40.417281,-74.088887 +7719,NJ,Wall,40.17434,-74.047247 +7720,NJ,Bradley Beach,40.202308,-74.013166 +7721,NJ,Cliffwood,40.435281,-74.235759 +7722,NJ,Colts Neck,40.301225,-74.177988 +7723,NJ,Deal,40.250568,-74.001998 +7724,NJ,Eatontown,40.302815,-74.06978 +7726,NJ,Manalapan,40.306274,-74.330613 +7727,NJ,Farmingdale,40.204312,-74.177864 +7728,NJ,Freehold,40.245776,-74.276822 +7730,NJ,Hazlet,40.422554,-74.179896 +7731,NJ,Howell,40.148096,-74.213683 +7732,NJ,Fort Hancock,40.402377,-73.990912 +7733,NJ,Holmdel,40.385853,-74.173971 +7734,NJ,Keansburg,40.441363,-74.130633 +7735,NJ,Keyport,40.439862,-74.199563 +7737,NJ,Leonardo,40.417704,-74.062265 +7738,NJ,Lincroft,40.33689,-74.120469 +7739,NJ,Little Silver,40.335393,-74.041319 +7740,NJ,Long Branch,40.299204,-73.991176 +7746,NJ,Marlboro,40.31825,-74.263871 +7747,NJ,Matawan,40.410876,-74.237955 +7748,NJ,New Monmouth,40.396018,-74.113908 +7750,NJ,Monmouth Beach,40.333032,-73.98089 +7751,NJ,Morganville,40.352917,-74.277863 +7753,NJ,Neptune City,40.211153,-74.054045 +7755,NJ,Oakhurst,40.26479,-74.018413 +7756,NJ,Ocean Grove,40.211606,-74.009306 +7757,NJ,Oceanport,40.31573,-74.016372 +7758,NJ,Port Monmouth,40.428886,-74.108259 +7760,NJ,Sea Bright,40.371829,-74.000618 +7762,NJ,Spring Lake,40.154198,-74.037885 +7764,NJ,West Long Branch,40.287811,-74.016221 +7801,NJ,Mine Hill,40.887218,-74.559702 +7821,NJ,Andover,40.961386,-74.752418 +7822,NJ,Augusta,41.145086,-74.684753 +7823,NJ,Belvidere,40.830819,-75.050261 +7825,NJ,Blairstown,40.967386,-74.965097 +7826,NJ,Branchville,41.170512,-74.750025 +7827,NJ,Montague,41.302259,-74.753956 +7828,NJ,Budd Lake,40.873108,-74.742552 +7830,NJ,Califon,40.716209,-74.815218 +7832,NJ,Columbia,40.938805,-75.054983 +7834,NJ,Denville,40.889735,-74.484379 +7836,NJ,Flanders,40.845316,-74.70188 +7838,NJ,Great Meadows,40.85196,-74.941806 +7840,NJ,Hackettstown,40.852891,-74.834315 +7843,NJ,Hopatcong,40.938983,-74.66163 +7847,NJ,Kenvil,40.881901,-74.620984 +7848,NJ,Lafayette,41.076099,-74.691223 +7849,NJ,Lake Hopatcong,40.965882,-74.614438 +7850,NJ,Landing,40.908684,-74.655425 +7851,NJ,Layton,41.205913,-74.817219 +7852,NJ,Ledgewood,40.878028,-74.655405 +7853,NJ,Long Valley,40.787817,-74.78698 +7856,NJ,Mount Arlington,40.928267,-74.636331 +7857,NJ,Netcong,40.898497,-74.698454 +7860,NJ,Fredon Township,41.058275,-74.780191 +7863,NJ,Oxford,40.810537,-75.00194 +7865,NJ,Port Murray,40.790615,-74.91675 +7866,NJ,Rockaway,40.922916,-74.50937 +7869,NJ,Randolph,40.845557,-74.572519 +7871,NJ,Sparta,41.027697,-74.640701 +7874,NJ,Stanhope,40.921743,-74.70044 +7876,NJ,Succasunna,40.85385,-74.653601 +7881,NJ,Wallpack Center,41.134332,-74.917595 +7882,NJ,Washington,40.75818,-74.991361 +7885,NJ,Wharton,40.913883,-74.58634 +7901,NJ,Summit,40.71494,-74.364159 +7920,NJ,Basking Ridge,40.678937,-74.560463 +7921,NJ,Bedminster,40.657109,-74.643236 +7922,NJ,Berkeley Heights,40.67522,-74.434599 +7924,NJ,Bernardsville,40.72251,-74.577812 +7927,NJ,Cedar Knolls,40.822335,-74.456861 +7928,NJ,Chatham,40.730526,-74.401701 +7930,NJ,Chester,40.789193,-74.677649 +7931,NJ,Far Hills,40.704035,-74.653959 +7932,NJ,Florham Park,40.775701,-74.392819 +7933,NJ,Gillette,40.687678,-74.468134 +7934,NJ,Gladstone,40.721948,-74.670656 +7935,NJ,Green Village,40.741618,-74.451685 +7936,NJ,East Hanover,40.819165,-74.36357 +7940,NJ,Madison,40.759939,-74.417868 +7945,NJ,Mendham,40.778919,-74.600035 +7946,NJ,Millington,40.672716,-74.518292 +7950,NJ,Greystone Park,40.843982,-74.479645 +7960,NJ,Morristown,40.795236,-74.487288 +7974,NJ,New Providence,40.700403,-74.402291 +7976,NJ,New Vernon,40.734685,-74.484471 +7980,NJ,Stirling,40.677366,-74.49683 +7981,NJ,Whippany,40.821862,-74.419971 +8002,NJ,Cherry Hill,39.930808,-75.017538 +8003,NJ,Cherry Hill,39.880453,-74.970568 +8004,NJ,Winslow,39.770909,-74.879368 +8005,NJ,Barnegat,39.755248,-74.246988 +8007,NJ,Barrington,39.865062,-75.056361 +8008,NJ,Harvey Cedars,39.636347,-74.189033 +8009,NJ,Berlin,39.778839,-74.930808 +8010,NJ,Beverly,40.056452,-74.911363 +8012,NJ,Washington,39.774104,-75.058747 +8014,NJ,Bridgeport,39.801616,-75.34782 +8015,NJ,Browns Mills,39.95974,-74.565549 +8016,NJ,Burlington,40.068015,-74.845353 +8019,NJ,Chatsworth,39.801945,-74.525619 +8020,NJ,Clarksboro,39.799228,-75.223655 +8021,NJ,Laurel Springs,39.80703,-75.003997 +8022,NJ,Columbus,40.064238,-74.68988 +8026,NJ,Gibbsboro,39.836532,-74.970996 +8027,NJ,Gibbstown,39.82314,-75.275128 +8028,NJ,Glassboro,39.706823,-75.117247 +8029,NJ,Glendora,39.840376,-75.069744 +8030,NJ,Gloucester City,39.891105,-75.116962 +8031,NJ,Bellmawr,39.868878,-75.094368 +8033,NJ,Haddonfield,39.895449,-75.041726 +8034,NJ,Cherry Hill,39.9074,-75.000762 +8035,NJ,Haddon Heights,39.878832,-75.06639 +8037,NJ,Batsto,39.638878,-74.790735 +8041,NJ,Jobstown,40.038698,-74.687305 +8043,NJ,Voorhees,39.850422,-74.964614 +8045,NJ,Lawnside,39.867601,-75.031681 +8046,NJ,Willingboro,40.028959,-74.883482 +8048,NJ,Lumberton,39.96512,-74.806736 +8049,NJ,Magnolia,39.853807,-75.039254 +8050,NJ,Manahawkin,39.705017,-74.260391 +8051,NJ,Mantua,39.786983,-75.178531 +8052,NJ,Maple Shade,39.951085,-74.994644 +8053,NJ,Marlton,39.884517,-74.90674 +8054,NJ,Mount Laurel,39.947808,-74.903588 +8055,NJ,Medford Lakes,39.868099,-74.823384 +8056,NJ,Mickleton,39.785653,-75.249777 +8057,NJ,Moorestown,39.9683,-74.953323 +8059,NJ,Mount Ephraim,39.882749,-75.09289 +8060,NJ,Eastampton Twp,39.993028,-74.795522 +8061,NJ,Mount Royal,39.809741,-75.208153 +8062,NJ,Mullica Hill,39.725228,-75.20654 +8063,NJ,National Park,39.866412,-75.179397 +8065,NJ,Palmyra,40.003654,-75.025685 +8066,NJ,Paulsboro,39.831157,-75.224233 +8067,NJ,Pedricktown,39.743451,-75.412046 +8068,NJ,Pemberton,39.971206,-74.667629 +8069,NJ,Carneys Point,39.717938,-75.465623 +8070,NJ,Pennsville,39.649107,-75.51553 +8071,NJ,Pitman,39.731162,-75.129679 +8075,NJ,Delanco,40.024684,-74.956128 +8077,NJ,Cinnaminson,39.996393,-74.995141 +8078,NJ,Runnemede,39.850825,-75.074224 +8079,NJ,Salem,39.559124,-75.452096 +8080,NJ,Sewell,39.747345,-75.089852 +8081,NJ,Sicklerville,39.735385,-74.986385 +8083,NJ,Somerdale,39.839988,-75.030913 +8084,NJ,Stratford,39.828798,-75.014707 +8085,NJ,Swedesboro,39.752853,-75.336202 +8086,NJ,Thorofare,39.859178,-75.176698 +8087,NJ,Tuckerton,39.588149,-74.364586 +8088,NJ,Southampton,39.867631,-74.711025 +8089,NJ,Waterford Works,39.721512,-74.860933 +8090,NJ,Wenonah,39.799283,-75.153644 +8091,NJ,West Berlin,39.81959,-74.941678 +8092,NJ,West Creek,39.662665,-74.288508 +8093,NJ,Westville,39.860494,-75.132278 +8094,NJ,Williamstown,39.665006,-74.971027 +8096,NJ,Deptford,39.829477,-75.137966 +8097,NJ,Woodbury Heights,39.814162,-75.152972 +8098,NJ,Woodstown,39.645663,-75.324806 +8102,NJ,Camden,39.951244,-75.118644 +8103,NJ,Camden,39.935099,-75.111708 +8104,NJ,Camden,39.918575,-75.107835 +8105,NJ,Camden,39.948417,-75.086382 +8106,NJ,Audubon,39.891035,-75.072425 +8107,NJ,Oaklyn,39.90799,-75.08489 +8108,NJ,Collingswood,39.915682,-75.063383 +8109,NJ,Merchantville,39.95193,-75.048204 +8110,NJ,Delair,39.962742,-75.063446 +8201,NJ,Smithville,39.462368,-74.503106 +8202,NJ,Avalon,39.095095,-74.726177 +8203,NJ,Brigantine,39.403709,-74.377644 +8204,NJ,North Cape May,38.969208,-74.92624 +8210,NJ,Cape May Court H,39.101434,-74.826846 +8215,NJ,Egg Harbor City,39.533123,-74.617709 +8221,NJ,Linwood,39.346883,-74.580744 +8223,NJ,Marmora,39.258562,-74.659297 +8225,NJ,Northfield,39.370256,-74.555237 +8226,NJ,Ocean City,39.270894,-74.587514 +8230,NJ,Ocean View,39.215425,-74.707548 +8232,NJ,Pleasantville,39.401518,-74.552365 +8241,NJ,Port Republic,39.527196,-74.490263 +8242,NJ,Rio Grande,39.019583,-74.875642 +8243,NJ,Townsends Inlet,39.144929,-74.701432 +8244,NJ,Somers Point,39.322308,-74.600796 +8247,NJ,Stone Harbor,39.053338,-74.762049 +8248,NJ,Strathmere,39.199246,-74.655446 +8251,NJ,Villas,39.021943,-74.935396 +8260,NJ,North Wildwood,38.989901,-74.819096 +8270,NJ,Corbin City,39.248915,-74.802628 +8302,NJ,Seabrook,39.445294,-75.226728 +8310,NJ,Buena,39.536988,-74.889495 +8311,NJ,Cedarville,39.337028,-75.199362 +8312,NJ,Clayton,39.658969,-75.094188 +8314,NJ,Delmont,39.202258,-74.970505 +8317,NJ,Dorothy,39.40313,-74.831577 +8318,NJ,Elmer,39.569146,-75.163023 +8319,NJ,Estell Manor,39.37825,-74.816512 +8322,NJ,Franklinville,39.615557,-75.04088 +8324,NJ,Heislerville,39.245013,-74.993942 +8326,NJ,Landisville,39.523942,-74.937688 +8327,NJ,Leesburg,39.238724,-75.001211 +8328,NJ,Malaga,39.575495,-75.058155 +8330,NJ,Mays Landing,39.432011,-74.69619 +8332,NJ,Millville,39.367313,-75.029311 +8340,NJ,Milmay,39.445078,-74.866671 +8341,NJ,Minotola,39.515512,-74.946685 +8343,NJ,Monroeville,39.644224,-75.156848 +8344,NJ,Newfield,39.555257,-75.027558 +8345,NJ,Newport,39.283205,-75.171647 +8346,NJ,Newtonville,39.564477,-74.859049 +8349,NJ,Port Norris,39.256263,-75.050608 +8350,NJ,Richland,39.485048,-74.877615 +8360,NJ,Vineland,39.48177,-75.009087 +8401,NJ,Atlantic City,39.366411,-74.431727 +8402,NJ,Margate City,39.328621,-74.509038 +8403,NJ,Longport,39.309712,-74.542143 +8406,NJ,Ventnor City,39.345992,-74.472343 +8501,NJ,Allentown,40.158922,-74.59093 +8502,NJ,Belle Mead,40.467732,-74.628993 +8505,NJ,Bordentown,40.143141,-74.703249 +8510,NJ,Clarksburg,40.199751,-74.434387 +8511,NJ,Cookstown,40.048109,-74.559524 +8512,NJ,Cranbury,40.303868,-74.506531 +8514,NJ,Creamridge,40.127907,-74.499425 +8515,NJ,Crosswicks,40.158353,-74.666838 +8518,NJ,Florence,40.118025,-74.805515 +8520,NJ,Hightstown,40.266885,-74.524993 +8525,NJ,Hopewell,40.390224,-74.770963 +8526,NJ,Imlaystown,40.166215,-74.510939 +8527,NJ,Jackson,40.120964,-74.301709 +8528,NJ,Kingston,40.380465,-74.616071 +8530,NJ,Lambertville,40.373122,-74.926605 +8533,NJ,New Egypt,40.071343,-74.506721 +8534,NJ,Pennington,40.333858,-74.794352 +8535,NJ,Perrineville,40.214971,-74.440381 +8536,NJ,Plainsboro,40.332432,-74.568836 +8540,NJ,Princeton,40.366633,-74.640832 +8542,NJ,Princeton,40.353545,-74.659378 +8544,NJ,Princeton Univer,40.346029,-74.65754 +8550,NJ,Princeton Juncti,40.297684,-74.614596 +8551,NJ,Ringoes,40.44587,-74.828839 +8553,NJ,Rocky Hill,40.400985,-74.640042 +8554,NJ,Roebling,40.115352,-74.777224 +8556,NJ,Rosemont,40.422005,-74.991928 +8558,NJ,Skillman,40.417312,-74.693828 +8559,NJ,Stockton,40.43974,-74.955419 +8560,NJ,Titusville,40.307728,-74.865469 +8562,NJ,Wrightstown,40.071953,-74.573098 +8608,NJ,Trenton,40.220437,-74.762237 +8609,NJ,Hamilton,40.223338,-74.742598 +8610,NJ,Hamilton,40.19894,-74.717205 +8611,NJ,Hamilton,40.207297,-74.751997 +8618,NJ,Trenton,40.237687,-74.782062 +8619,NJ,Mercerville,40.241977,-74.690377 +8620,NJ,Yardville,40.178477,-74.671699 +8628,NJ,West Trenton,40.267232,-74.826186 +8629,NJ,Hamilton,40.219843,-74.732764 +8638,NJ,Trenton,40.251006,-74.762699 +8640,NJ,Fort Dix,40.009946,-74.618296 +8641,NJ,Mc Guire Afb,40.044026,-74.588195 +8648,NJ,Lawrenceville,40.277646,-74.723956 +8690,NJ,Hamilton,40.223852,-74.659138 +8691,NJ,Hamilton,40.231785,-74.606262 +8701,NJ,Lakewood,40.085043,-74.204199 +8721,NJ,Bayville,39.914708,-74.190529 +8722,NJ,Beachwood,39.930246,-74.196145 +8723,NJ,Osbornsville,40.040817,-74.12686 +8724,NJ,Brick,40.087432,-74.115237 +8730,NJ,Brielle,40.107727,-74.063511 +8731,NJ,Forked River,39.844425,-74.197301 +8732,NJ,Island Heights,39.943197,-74.146787 +8733,NJ,Lakehurst Naec,40.020054,-74.290901 +8734,NJ,Lanoka Harbor,39.861993,-74.166765 +8735,NJ,Lavallette,39.977486,-74.070424 +8736,NJ,Manasquan,40.121693,-74.061055 +8738,NJ,Mantoloking,40.026125,-74.056188 +8740,NJ,Ocean Gate,39.925975,-74.135128 +8741,NJ,Pine Beach,39.934746,-74.167992 +8742,NJ,Bay Head,40.080226,-74.065719 +8750,NJ,Sea Girt,40.134522,-74.043604 +8751,NJ,Seaside Heights,39.946639,-74.076479 +8752,NJ,Seaside Park,39.922175,-74.079521 +8753,NJ,Toms River,39.977083,-74.156508 +8755,NJ,Toms River,39.999946,-74.222819 +8757,NJ,Toms River,39.971471,-74.251168 +8758,NJ,Waretown,39.789646,-74.195376 +8759,NJ,Whiting,39.950983,-74.360713 +8801,NJ,Annandale,40.628731,-74.885512 +8802,NJ,Pattenburg,40.650175,-75.01585 +8804,NJ,Bloomsbury,40.64366,-75.09664 +8805,NJ,Bound Brook,40.568115,-74.539735 +8807,NJ,Bridgewater,40.590388,-74.626741 +8809,NJ,Clinton,40.641194,-74.908846 +8810,NJ,Dayton,40.38249,-74.511102 +8812,NJ,Green Brook,40.594237,-74.47187 +8816,NJ,East Brunswick,40.428395,-74.406381 +8817,NJ,Edison,40.517079,-74.397286 +8820,NJ,Edison,40.57804,-74.358863 +8822,NJ,Flemington,40.517976,-74.845316 +8823,NJ,Franklin Park,40.442097,-74.536908 +8824,NJ,Kendall Park,40.4208,-74.552921 +8825,NJ,Frenchtown,40.520795,-75.032468 +8826,NJ,Glen Gardner,40.713437,-74.916207 +8827,NJ,Hampton,40.677351,-74.962221 +8828,NJ,Helmetta,40.377742,-74.420393 +8829,NJ,High Bridge,40.668438,-74.893667 +8830,NJ,Iselin,40.571593,-74.316677 +8831,NJ,Jamesburg,40.342475,-74.433568 +8832,NJ,Keasbey,40.519171,-74.302119 +8833,NJ,Lebanon,40.646623,-74.829035 +8835,NJ,Manville,40.539871,-74.593377 +8836,NJ,Martinsville,40.599962,-74.557191 +8837,NJ,Edison,40.532476,-74.337503 +8840,NJ,Metuchen,40.54493,-74.351721 +8846,NJ,Middlesex,40.575882,-74.500835 +8848,NJ,Milford,40.592942,-75.102519 +8850,NJ,Milltown,40.449346,-74.439046 +8852,NJ,Monmouth Junctio,40.394391,-74.547021 +8853,NJ,Neshanic Station,40.509551,-74.71434 +8854,NJ,Piscataway,40.55152,-74.458996 +8857,NJ,Old Bridge,40.398045,-74.323553 +8859,NJ,Parlin,40.458701,-74.304981 +8861,NJ,Perth Amboy,40.517551,-74.275427 +8863,NJ,Fords,40.53925,-74.311707 +8865,NJ,Alpha,40.692819,-75.1741 +8867,NJ,Pittstown,40.599169,-74.957587 +8869,NJ,Raritan,40.57109,-74.637691 +8872,NJ,Sayreville,40.459958,-74.347808 +8873,NJ,Somerset,40.500743,-74.50126 +8876,NJ,North Branch,40.549393,-74.645926 +8879,NJ,Laurence Harbor,40.464733,-74.278635 +8880,NJ,South Bound Broo,40.552804,-74.529078 +8882,NJ,South River,40.444363,-74.380099 +8884,NJ,Spotswood,40.384679,-74.389377 +8886,NJ,Stewartsville,40.695703,-75.082517 +8887,NJ,Three Bridges,40.52156,-74.799805 +8889,NJ,Whitehouse Stati,40.599872,-74.764129 +8901,NJ,New Brunswick,40.489073,-74.448193 +8902,NJ,North Brunswick,40.453767,-74.482285 +8904,NJ,Highland Park,40.499141,-74.426602 +87001,NM,Algodones,35.428527,-106.616589 +87002,NM,Boys Ranch,34.645562,-106.761215 +87004,NM,Bernalillo,35.328506,-106.530873 +87005,NM,Bluewater,35.164724,-108.191663 +87006,NM,Bosque,34.49956,-106.8038 +87007,NM,Casa Blanca,35.035222,-107.433907 +87008,NM,Cedar Crest,35.128506,-106.361737 +87009,NM,Cedarvale,34.388028,-105.734516 +87010,NM,Cerrillos,35.422965,-106.131683 +87013,NM,Cuba,36.048201,-107.188462 +87014,NM,Cubero,35.117372,-107.856722 +87015,NM,Edgewood,35.077603,-106.187207 +87016,NM,Estancia,34.769983,-106.135024 +87017,NM,Gallina,36.171429,-106.661388 +87018,NM,Counselor,36.118386,-106.949789 +87020,NM,Grants,35.359802,-107.935662 +87023,NM,Jarales,34.648156,-107.029912 +87024,NM,Jemez Pueblo,35.624315,-106.721894 +87025,NM,Jemez Springs,35.892689,-106.771393 +87026,NM,Canoncito,35.085305,-107.105843 +87027,NM,La Jara,36.119383,-106.992335 +87028,NM,Lajoya,34.343444,-106.84279 +87029,NM,Lindrith,36.336141,-106.925352 +87031,NM,Los Lunas,34.780607,-106.711537 +87035,NM,Moriarty,34.988878,-106.060871 +87036,NM,Mountainair,34.515775,-106.257738 +87041,NM,Cochiti Pueblo,35.603104,-106.343472 +87042,NM,Peralta,34.833188,-106.687159 +87043,NM,Placitas,35.309175,-106.529279 +87044,NM,Ponderosa,35.797576,-106.654421 +87045,NM,Prewitt,35.35466,-108.103798 +87046,NM,Regina,36.20283,-107.071932 +87047,NM,Sandia Park,35.168275,-106.323846 +87048,NM,Corrales,35.233888,-106.620034 +87050,NM,San Mateo,35.222614,-107.70498 +87052,NM,Santo Domingo Pu,35.513892,-106.361275 +87053,NM,Zia Pueblo,35.524241,-106.737467 +87055,NM,Seboyeta,35.149322,-107.382281 +87056,NM,Stanley,35.12948,-106.028299 +87059,NM,Tijeras,35.044563,-106.306226 +87062,NM,Veguita,34.485032,-106.759148 +87063,NM,Willard,34.57543,-106.030706 +87068,NM,Bosque Farms,34.876366,-106.697506 +87102,NM,Albuquerque,35.081831,-106.648171 +87104,NM,Albuquerque,35.103822,-106.671215 +87105,NM,Albuquerque,35.044761,-106.689341 +87106,NM,Albuquerque,35.079011,-106.616917 +87107,NM,Albuquerque,35.134742,-106.642747 +87108,NM,Albuquerque,35.072586,-106.574864 +87109,NM,Albuquerque,35.15058,-106.569004 +87110,NM,Albuquerque,35.110417,-106.578052 +87111,NM,Albuquerque,35.134724,-106.522164 +87112,NM,Albuquerque,35.101026,-106.518338 +87113,NM,Albuquerque,35.175906,-106.601467 +87114,NM,Alameda,35.195612,-106.659138 +87115,NM,Kirtland A F B E,34.904876,-106.513896 +87116,NM,Albuquerque,35.056116,-106.550605 +87118,NM,Albuquerque,35.055443,-106.595802 +87120,NM,Albuquerque,35.142146,-106.704137 +87121,NM,Albuquerque,35.051209,-106.726861 +87122,NM,Albuquerque,35.178715,-106.510176 +87123,NM,Albuquerque,35.07166,-106.509003 +87124,NM,Rio Rancho,35.249347,-106.681756 +87301,NM,Gallup,35.506475,-108.741352 +87310,NM,Brimhall,35.800503,-108.581469 +87312,NM,Continental Divi,35.504295,-108.469256 +87313,NM,Crownpoint,35.720557,-108.02709 +87315,NM,Fence Lake,34.734385,-108.693392 +87320,NM,Mexican Springs,35.783727,-108.818964 +87321,NM,Ramah,35.132375,-108.491951 +87323,NM,Thoreau,35.57869,-107.830218 +87324,NM,Toadlena,36.073202,-108.750647 +87325,NM,Tohatchi,35.768609,-108.687818 +87327,NM,Zuni,35.06845,-108.833611 +87328,NM,Navajo,35.894193,-109.022621 +87401,NM,Farmington,36.706514,-108.199531 +87402,NM,Farmington,36.768503,-108.147766 +87410,NM,Aztec,36.820499,-108.010982 +87412,NM,Blanco,36.725612,-107.795276 +87413,NM,Bloomfield,36.695475,-107.978437 +87415,NM,Flora Vista,36.802771,-108.082683 +87416,NM,Fruitland,36.76323,-108.45339 +87417,NM,Kirtland,36.740953,-108.350956 +87418,NM,La Plata,36.957632,-108.179243 +87419,NM,Navajo Dam,36.833838,-107.670991 +87420,NM,Shiprock,36.655981,-108.735479 +87421,NM,Waterflow,36.780092,-108.431083 +87501,NM,Pojoaque Valley,35.702472,-105.974818 +87505,NM,Santa Fe,35.619623,-105.981994 +87510,NM,Abiquiu,36.176923,-106.244859 +87513,NM,Arroyo Hondo,36.531848,-105.621998 +87514,NM,Arroyo Seco,36.504568,-105.594609 +87520,NM,Chama,36.896214,-106.582928 +87521,NM,Chamisal,36.160411,-105.68461 +87522,NM,Cundiyo,36.011906,-105.911441 +87524,NM,Costilla,36.952556,-105.501586 +87527,NM,Dixon,36.179,-105.86148 +87528,NM,Dulce,36.859808,-107.060179 +87530,NM,El Rito,36.364694,-106.21917 +87531,NM,Embudo,36.137028,-106.024187 +87532,NM,Espanola,35.987157,-106.071697 +87535,NM,Glorieta,35.566645,-105.790316 +87537,NM,Hernandez,36.073811,-106.139579 +87539,NM,La Madera,36.246387,-106.13443 +87540,NM,Lamy,35.431057,-105.940906 +87544,NM,Los Alamos,35.866321,-106.267624 +87549,NM,Ojo Caliente,36.40991,-105.915507 +87552,NM,Pecos,35.571011,-105.670104 +87553,NM,Penasco,36.176023,-105.734245 +87556,NM,Questa,36.72572,-105.560984 +87557,NM,Ranchos De Taos,36.335692,-105.608576 +87560,NM,Ribera,35.334448,-105.465228 +87563,NM,Rutheron,36.647146,-106.685267 +87564,NM,San Cristobal,36.611638,-105.635968 +87565,NM,San Jose,35.456949,-105.438341 +87566,NM,San Juan Pueblo,36.048886,-106.079267 +87567,NM,Santa Cruz,35.986011,-106.031839 +87571,NM,Taos,36.395288,-105.584732 +87573,NM,Tererro,35.736881,-105.645725 +87575,NM,Tierra Amarilla,36.680481,-106.556972 +87579,NM,Vadito,36.191305,-105.67818 +87580,NM,Valdez,36.569699,-105.506971 +87581,NM,Vallecitos,36.516284,-106.085942 +87701,NM,Las Vegas,35.594862,-105.227162 +87711,NM,Anton Chico,35.159262,-105.141041 +87713,NM,Chacon,36.138805,-105.385411 +87714,NM,Cimarron,36.457424,-105.069694 +87715,NM,Cleveland,35.989831,-105.43262 +87718,NM,Eagle Nest,36.53255,-105.275561 +87722,NM,Guadalupita,36.113046,-105.127814 +87724,NM,La Loma,35.191562,-105.096864 +87725,NM,Ledoux,35.919118,-105.421555 +87728,NM,Maxwell,36.543393,-104.56395 +87729,NM,Miami,36.28955,-104.811769 +87730,NM,Mills,36.128144,-104.227743 +87731,NM,Montezuma,35.682959,-105.409729 +87732,NM,Mora,36.00405,-105.312837 +87733,NM,Albert,35.715938,-103.746132 +87734,NM,Ocate,36.10366,-105.06595 +87740,NM,Raton,36.895187,-104.434881 +87742,NM,Rociada,35.822648,-105.314716 +87743,NM,Roy,35.952248,-104.149698 +87745,NM,Sapello,35.762012,-105.107735 +87746,NM,Solano,35.837828,-104.1221 +87747,NM,Springer,36.37672,-104.592705 +87750,NM,Valmora,35.794033,-104.911587 +87752,NM,Wagon Mound,35.981361,-104.691 +87801,NM,Socorro,34.047853,-106.890659 +87815,NM,Bingham,34.043864,-106.021163 +87820,NM,Aragon,33.88592,-108.546589 +87821,NM,Datil,34.04269,-108.018284 +87823,NM,Lemitar,34.155999,-106.904381 +87825,NM,Alamo,34.241178,-107.340647 +87827,NM,Pie Town,34.324282,-108.368187 +87828,NM,Polvadera,34.134672,-106.897505 +87829,NM,Quemado,34.265158,-108.757835 +87830,NM,Reserve,33.688074,-108.800918 +87831,NM,San Acacia,34.228328,-106.904884 +87901,NM,Truth Or Consequ,33.139478,-107.248794 +87930,NM,Arrey,32.802057,-107.354368 +87931,NM,Caballo,33.013452,-107.347113 +87932,NM,Cuchillo,33.370269,-107.456536 +87933,NM,Derry,32.808561,-107.284271 +87936,NM,Garfield,32.755749,-107.270409 +87937,NM,Hatch,32.658335,-107.159028 +87940,NM,Rincon,32.65969,-107.064343 +87941,NM,Salem,32.709322,-107.215689 +87942,NM,Williamsburg,33.226498,-107.337583 +87943,NM,Winston,33.306089,-107.667456 +88001,NM,Las Cruces,32.321641,-106.746034 +88002,NM,White Sands Miss,32.382669,-106.49236 +88005,NM,Las Cruces,32.316076,-106.79908 +88020,NM,Animas,31.793696,-108.585695 +88021,NM,Chaparral,31.934505,-106.573452 +88023,NM,Vanadium,32.756334,-108.107667 +88025,NM,Buckhorn,32.813466,-108.477951 +88026,NM,Central,32.779767,-108.162698 +88030,NM,Deming,32.231808,-107.746559 +88039,NM,Glenwood,33.304789,-108.774282 +88041,NM,San Lorenzo,32.853311,-108.082185 +88042,NM,Hillsboro,32.923913,-107.6276 +88043,NM,Hurley,32.64799,-108.15162 +88044,NM,La Mesa,32.082312,-106.701103 +88045,NM,Road Forks,32.314032,-108.754657 +88047,NM,Mesilla Park,32.297725,-106.637016 +88048,NM,Mesquite,32.145958,-106.667626 +88049,NM,Mimbres,32.860936,-107.942326 +88061,NM,Silver City,32.789986,-108.274916 +88101,NM,Clovis,34.412585,-103.221391 +88112,NM,Broadview,34.803956,-103.129235 +88113,NM,Causey,33.892926,-103.150201 +88114,NM,Crossroads,33.527186,-103.356387 +88116,NM,Elida,33.940468,-103.632341 +88118,NM,Floyd,34.251951,-103.582707 +88119,NM,Fort Sumner,34.460018,-104.231689 +88120,NM,Grady,34.810697,-103.298043 +88121,NM,House,34.695156,-103.920256 +88123,NM,Lingo,33.696291,-103.208161 +88124,NM,Melrose,34.44787,-103.632507 +88125,NM,Milnesand,33.60501,-103.278189 +88126,NM,Pep,33.897032,-103.327208 +88130,NM,Portales,34.179915,-103.336311 +88132,NM,Rogers,34.024759,-103.127527 +88133,NM,Saint Vrain,34.465205,-103.453239 +88134,NM,Taiban,34.424829,-104.032899 +88135,NM,Texico,34.395795,-103.061544 +88136,NM,Yeso,34.474962,-104.527582 +88201,NM,Roswell,33.388504,-104.525857 +88210,NM,Artesia,32.838355,-104.407401 +88213,NM,Caprock,33.393855,-103.639009 +88220,NM,Carlsbad,32.411867,-104.239539 +88230,NM,Dexter,33.191006,-104.383285 +88231,NM,Eunice,32.439225,-103.159407 +88232,NM,Hagerman,33.107643,-104.329778 +88240,NM,Hobbs,32.72217,-103.137246 +88250,NM,Hope,32.81561,-104.729921 +88252,NM,Jal,32.112816,-103.199724 +88253,NM,Lake Arthur,33.017106,-104.406412 +88256,NM,Loving,32.274034,-104.091376 +88260,NM,Lovington,32.951166,-103.348849 +88264,NM,Maljamar,32.842281,-103.723401 +88265,NM,Monument,32.587405,-103.270256 +88266,NM,Oil Center,32.490383,-103.301915 +88267,NM,Tatum,33.260018,-103.314 +88301,NM,Carrizozo,33.64962,-105.869617 +88310,NM,Alamogordo,32.893186,-105.948544 +88314,NM,Bent,33.148014,-105.863472 +88316,NM,Capitan,33.560232,-105.526906 +88317,NM,Cloudcroft,32.574067,-105.939028 +88318,NM,Corona,34.169259,-105.533873 +88321,NM,Encino,34.61496,-105.483914 +88324,NM,Glencoe,33.386738,-105.502991 +88330,NM,Holloman Air For,32.862093,-106.07845 +88336,NM,Hondo,33.462518,-105.388854 +88337,NM,La Luz,32.977449,-105.953397 +88338,NM,Lincoln,33.492912,-105.528427 +88339,NM,Mayhill,32.907048,-105.518056 +88340,NM,Mescalero,33.216436,-105.774293 +88341,NM,Nogal,33.499552,-105.703631 +88343,NM,Picacho,33.345642,-105.083382 +88344,NM,Pinon,32.639584,-105.415708 +88345,NM,Ruidoso,33.347406,-105.650994 +88346,NM,Ruidoso Downs,33.357718,-105.538306 +88347,NM,Sacramento,32.805221,-105.621128 +88348,NM,San Patricio,33.38775,-105.349798 +88351,NM,Tinnie,33.337308,-105.202681 +88352,NM,Tularosa,33.065049,-106.010789 +88353,NM,Vaughn,34.624074,-105.192558 +88354,NM,Weed,32.80519,-105.506296 +88401,NM,Tucumcari,35.168003,-103.717935 +88410,NM,Amistad,35.898276,-103.212954 +88411,NM,Bard,35.115364,-103.317778 +88412,NM,Bueyeros,36.013541,-103.666894 +88414,NM,Capulin,36.747453,-103.993599 +88415,NM,Clayton,36.441378,-103.188823 +88416,NM,Conchas Dam,35.378561,-104.205231 +88417,NM,Cuervo,35.01013,-104.399867 +88418,NM,Des Moines,36.729069,-103.873853 +88419,NM,Folsom,36.86896,-103.839925 +88421,NM,Garita,35.350182,-104.441911 +88422,NM,Gladstone,36.307741,-103.893081 +88424,NM,Grenville,36.725396,-103.415521 +88426,NM,Logan,35.368051,-103.438339 +88427,NM,Mc Alister,34.749206,-103.657169 +88429,NM,Mount Dora,36.498795,-103.416667 +88430,NM,Nara Visa,35.617963,-103.131738 +88431,NM,Newkirk,35.084746,-104.243323 +88432,NM,Puerto De Luna,34.847826,-104.619645 +88433,NM,Quay,34.929916,-103.78176 +88434,NM,San Jon,35.119848,-103.284599 +88435,NM,Pastura,34.933276,-104.682155 +88436,NM,Sedan,36.226027,-103.14488 +88437,NM,Seneca,36.6279,-103.089394 +88438,NM,Stead,36.12359,-103.121117 +88439,NM,Trementina,35.584945,-104.616341 +88441,NM,Bell Ranch,35.638425,-104.111991 +6390,NY,Fishers Island,41.263934,-72.017834 +10001,NY,New York,40.74838,-73.996705 +10002,NY,New York,40.715231,-73.987681 +10003,NY,New York,40.731253,-73.989223 +10004,NY,Governors Island,40.693604,-74.019025 +10005,NY,New York,40.705649,-74.008344 +10006,NY,New York,40.708451,-74.013474 +10007,NY,New York,40.713905,-74.007022 +10009,NY,New York,40.726188,-73.979591 +10010,NY,New York,40.737476,-73.981328 +10011,NY,New York,40.740225,-73.99963 +10012,NY,New York,40.72553,-73.998284 +10013,NY,New York,40.718511,-74.002529 +10014,NY,New York,40.73393,-74.005421 +10016,NY,New York,40.744281,-73.978134 +10017,NY,New York,40.75172,-73.970661 +10018,NY,New York,40.754713,-73.992503 +10019,NY,New York,40.765069,-73.985834 +10020,NY,New York,40.759729,-73.982347 +10021,NY,New York,40.768476,-73.958805 +10022,NY,New York,40.757091,-73.965703 +10023,NY,New York,40.77638,-73.982652 +10024,NY,New York,40.786446,-73.976385 +10025,NY,New York,40.797466,-73.968312 +10026,NY,New York,40.801942,-73.953069 +10027,NY,New York,40.811556,-73.954978 +10028,NY,New York,40.776267,-73.952866 +10029,NY,New York,40.791817,-73.94475 +10030,NY,New York,40.818333,-73.942597 +10031,NY,New York,40.82455,-73.950712 +10032,NY,New York,40.83819,-73.941978 +10033,NY,New York,40.84955,-73.935649 +10034,NY,New York,40.866222,-73.922077 +10035,NY,New York,40.801116,-73.937098 +10036,NY,New York,40.759724,-73.991826 +10037,NY,New York,40.813491,-73.9381 +10038,NY,New York,40.710092,-74.001298 +10039,NY,New York,40.826458,-73.938266 +10040,NY,New York,40.858308,-73.929601 +10044,NY,New York,40.762998,-73.949136 +10128,NY,New York,40.781618,-73.951112 +10280,NY,New York,40.710537,-74.016323 +10301,NY,Staten Island,40.631602,-74.092663 +10302,NY,Staten Island,40.630597,-74.137918 +10303,NY,Staten Island,40.630062,-74.160679 +10304,NY,Staten Island,40.610249,-74.087836 +10305,NY,Staten Island,40.597296,-74.076795 +10306,NY,Staten Island,40.568183,-74.118386 +10307,NY,Staten Island,40.508452,-74.244482 +10308,NY,Staten Island,40.55181,-74.152649 +10309,NY,Staten Island,40.535179,-74.211572 +10310,NY,Staten Island,40.632427,-74.11715 +10312,NY,Staten Island,40.545745,-74.179165 +10314,NY,Staten Island,40.603915,-74.147218 +10451,NY,Bronx,40.8222,-73.921735 +10452,NY,Bronx,40.837594,-73.921555 +10453,NY,Bronx,40.852047,-73.912937 +10454,NY,Bronx,40.808549,-73.919821 +10455,NY,Bronx,40.815309,-73.907172 +10456,NY,Bronx,40.831557,-73.909893 +10457,NY,Bronx,40.848635,-73.899907 +10458,NY,Bronx,40.863307,-73.889464 +10459,NY,Bronx,40.824699,-73.894047 +10460,NY,Bronx,40.840949,-73.879409 +10461,NY,Bronx,40.846506,-73.840953 +10462,NY,Bronx,40.843369,-73.860185 +10463,NY,Bronx,40.879812,-73.906737 +10464,NY,Bronx,40.846941,-73.787436 +10465,NY,Bronx,40.826065,-73.819581 +10466,NY,Bronx,40.890375,-73.850333 +10467,NY,Bronx,40.873671,-73.871242 +10468,NY,Bronx,40.866231,-73.900259 +10469,NY,Bronx,40.870193,-73.849465 +10470,NY,Bronx,40.900029,-73.862194 +10471,NY,Bronx,40.901084,-73.905283 +10472,NY,Bronx,40.829464,-73.871557 +10473,NY,Bronx,40.819364,-73.860626 +10474,NY,Bronx,40.801518,-73.886376 +10475,NY,Bronx,40.872903,-73.827817 +10501,NY,Amawalk,41.294618,-73.761079 +10502,NY,Ardsley,41.011332,-73.841311 +10504,NY,Armonk,41.136002,-73.700942 +10506,NY,Bedford,41.190913,-73.635548 +10507,NY,Bedford Hills,41.234439,-73.691517 +10509,NY,Brewster,41.409704,-73.599179 +10510,NY,Briarcliff Manor,41.144364,-73.834956 +10511,NY,Buchanan,41.258285,-73.941238 +10512,NY,Carmel,41.443216,-73.681526 +10514,NY,Chappaqua,41.170497,-73.771458 +10516,NY,Cold Spring,41.44142,-73.933485 +10518,NY,Cross River,41.27218,-73.602027 +10520,NY,Croton On Hudson,41.218037,-73.892408 +10522,NY,Dobbs Ferry,41.011835,-73.866494 +10523,NY,Elmsford,41.057171,-73.813597 +10524,NY,Garrison,41.362065,-73.920003 +10527,NY,Granite Springs,41.309791,-73.753008 +10528,NY,Harrison,40.971876,-73.718068 +10530,NY,Hartsdale,41.019658,-73.807404 +10532,NY,Hawthorne,41.095316,-73.801685 +10533,NY,Irvington,41.038113,-73.859666 +10535,NY,Jefferson Valley,41.338522,-73.794697 +10536,NY,Katonah,41.270884,-73.684115 +10537,NY,Lake Peekskill,41.337437,-73.883787 +10538,NY,Larchmont,40.935055,-73.75715 +10541,NY,Mahopac,41.371708,-73.750755 +10543,NY,Mamaroneck,40.952481,-73.735037 +10546,NY,Millwood,41.201519,-73.792626 +10547,NY,Mohegan Lake,41.314348,-73.850836 +10548,NY,Montrose,41.249585,-73.944593 +10549,NY,Mount Kisco,41.204966,-73.729921 +10550,NY,Mount Vernon,40.907863,-73.837961 +10552,NY,Mount Vernon,40.923056,-73.829919 +10553,NY,Mount Vernon,40.908645,-73.822111 +10560,NY,North Salem,41.341388,-73.592947 +10562,NY,Ossining,41.167344,-73.853791 +10566,NY,Cortlandt Manor,41.293722,-73.902562 +10570,NY,Pleasantville,41.134977,-73.784484 +10573,NY,Rye Brook,41.007755,-73.672045 +10576,NY,Pound Ridge,41.204196,-73.573215 +10577,NY,Purchase,41.038396,-73.715629 +10578,NY,Purdys,41.322427,-73.654313 +10579,NY,Putnam Valley,41.372815,-73.85024 +10580,NY,Rye,40.973403,-73.690721 +10583,NY,Heathcote,40.988365,-73.797566 +10588,NY,Shrub Oak,41.328608,-73.82732 +10589,NY,Somers,41.334568,-73.695145 +10590,NY,South Salem,41.255261,-73.540224 +10591,NY,North Tarrytown,41.078108,-73.859335 +10594,NY,Thornwood,41.118163,-73.773329 +10595,NY,Valhalla,41.085559,-73.777596 +10597,NY,Waccabuc,41.303208,-73.603207 +10598,NY,Yorktown Heights,41.299947,-73.792398 +10601,NY,White Plains,41.032955,-73.765231 +10603,NY,White Plains,41.049913,-73.77758 +10604,NY,East White Plain,41.043295,-73.750727 +10605,NY,White Plains,41.014053,-73.755247 +10606,NY,White Plains,41.024714,-73.778097 +10607,NY,White Plains,41.039813,-73.811692 +10701,NY,Yonkers,40.940716,-73.888317 +10703,NY,Yonkers,40.951763,-73.885163 +10704,NY,Yonkers,40.917633,-73.859347 +10705,NY,Yonkers,40.917665,-73.895041 +10706,NY,Hastings On Huds,40.99071,-73.875912 +10707,NY,Tuckahoe,40.95691,-73.819771 +10708,NY,Bronxville,40.939133,-73.835332 +10709,NY,Eastchester,40.954966,-73.80858 +10710,NY,Yonkers,40.965574,-73.843435 +10801,NY,New Rochelle,40.916628,-73.787729 +10803,NY,Pelham,40.904455,-73.807304 +10804,NY,New Rochelle,40.948335,-73.786018 +10805,NY,New Rochelle,40.900236,-73.781043 +10901,NY,Suffern,41.117654,-74.124098 +10911,NY,Bear Mountain,41.306734,-73.996108 +10913,NY,Blauvelt,41.062597,-73.962924 +10916,NY,Campbell Hall,41.442993,-74.250466 +10917,NY,Central Valley,41.326836,-74.122036 +10918,NY,Chester,41.355381,-74.265116 +10919,NY,Circleville,41.524387,-74.385044 +10920,NY,Congers,41.148689,-73.94131 +10921,NY,Florida,41.329507,-74.352805 +10923,NY,Garnerville,41.202057,-74.000501 +10924,NY,Goshen,41.394586,-74.330162 +10925,NY,Greenwood Lake,41.212718,-74.300007 +10926,NY,Harriman,41.299681,-74.155805 +10927,NY,Haverstraw,41.197095,-73.968959 +10928,NY,Highland Falls,41.358177,-73.974618 +10930,NY,Highland Mills,41.353592,-74.119678 +10931,NY,Hillburn,41.123981,-74.170195 +10940,NY,Scotchtown,41.457222,-74.412023 +10950,NY,Monroe,41.328578,-74.188521 +10952,NY,Monsey,41.116255,-74.0736 +10954,NY,Bardonia,41.099176,-74.009589 +10956,NY,New City,41.147247,-73.996206 +10958,NY,New Hampton,41.362714,-74.443483 +10960,NY,Nyack,41.091351,-73.925226 +10962,NY,Orangeburg,41.044183,-73.960873 +10963,NY,Otisville,41.481806,-74.529413 +10964,NY,Palisades,41.010263,-73.924985 +10965,NY,Pearl River,41.062939,-74.01587 +10968,NY,Piermont,41.03955,-73.919187 +10969,NY,Pine Island,41.323796,-74.379457 +10970,NY,Pomona,41.190105,-74.043564 +10973,NY,Slate Hill,41.376004,-74.484658 +10974,NY,Sterlington,41.16047,-74.188107 +10975,NY,Southfields,41.247959,-74.176182 +10976,NY,Sparkill,41.025573,-73.92288 +10977,NY,Chestnut Ridge,41.117977,-74.046253 +10980,NY,Stony Point,41.229174,-73.996164 +10983,NY,Tappan,41.027751,-73.949065 +10984,NY,Thiells,41.207826,-74.015441 +10985,NY,Thompson Ridge,41.580957,-74.377445 +10986,NY,Tomkins Cove,41.259763,-73.98916 +10987,NY,Tuxedo Park,41.192486,-74.215912 +10989,NY,Valley Cottage,41.118338,-73.943006 +10990,NY,Warwick,41.265563,-74.36037 +10992,NY,Washingtonville,41.423701,-74.1601 +10993,NY,West Haverstraw,41.209016,-73.982123 +10994,NY,West Nyack,41.097324,-73.976846 +10996,NY,West Point,41.394545,-73.973666 +10998,NY,Westtown,41.321414,-74.552946 +11001,NY,Floral Park,40.723586,-73.70576 +11003,NY,Alden Manor,40.699615,-73.705751 +11004,NY,Glen Oaks,40.7481,-73.711436 +11010,NY,Franklin Square,40.701049,-73.675807 +11020,NY,Great Neck,40.774235,-73.718918 +11021,NY,Great Neck,40.786674,-73.726984 +11023,NY,Great Neck,40.799307,-73.734257 +11024,NY,Kings Point Cont,40.813307,-73.741391 +11030,NY,Plandome,40.798641,-73.688369 +11040,NY,Hillside Manor,40.743926,-73.68042 +11042,NY,New Hyde Park,40.7602,-73.694978 +11050,NY,Port Washington,40.834995,-73.696356 +11101,NY,Astoria,40.750316,-73.939393 +11102,NY,Astoria,40.77063,-73.926462 +11103,NY,Astoria,40.762651,-73.914886 +11104,NY,Sunnyside,40.743641,-73.921556 +11105,NY,Astoria,40.77627,-73.910965 +11106,NY,Astoria,40.760813,-73.929527 +11201,NY,Brooklyn,40.694021,-73.99034 +11203,NY,Brooklyn,40.650496,-73.934888 +11204,NY,Brooklyn,40.617871,-73.985623 +11205,NY,Brooklyn,40.692433,-73.96662 +11206,NY,Brooklyn,40.701195,-73.943617 +11207,NY,Brooklyn,40.670486,-73.893957 +11208,NY,Brooklyn,40.676191,-73.873649 +11209,NY,Brooklyn,40.625106,-74.030304 +11210,NY,Brooklyn,40.628064,-73.946682 +11211,NY,Brooklyn,40.709476,-73.956283 +11212,NY,Brooklyn,40.662474,-73.914483 +11213,NY,Brooklyn,40.669961,-73.93665 +11214,NY,Brooklyn,40.601563,-73.99681 +11215,NY,Brooklyn,40.666863,-73.982783 +11216,NY,Brooklyn,40.67943,-73.949639 +11217,NY,Brooklyn,40.68165,-73.979797 +11218,NY,Brooklyn,40.642373,-73.975806 +11219,NY,Brooklyn,40.633568,-73.996011 +11220,NY,Brooklyn,40.641165,-74.013287 +11221,NY,Brooklyn,40.690695,-73.927373 +11222,NY,Brooklyn,40.727164,-73.949846 +11223,NY,Brooklyn,40.597874,-73.974291 +11224,NY,Brooklyn,40.576729,-73.988395 +11225,NY,Brooklyn,40.662776,-73.954588 +11226,NY,Brooklyn,40.646694,-73.956985 +11228,NY,Brooklyn,40.617441,-74.012067 +11229,NY,Brooklyn,40.601094,-73.94749 +11230,NY,Brooklyn,40.622493,-73.965007 +11231,NY,Brooklyn,40.679437,-74.00141 +11232,NY,Brooklyn,40.652113,-74.001797 +11233,NY,Brooklyn,40.678415,-73.921104 +11234,NY,Brooklyn,40.620475,-73.923915 +11235,NY,Brooklyn,40.583898,-73.953599 +11236,NY,Brooklyn,40.640685,-73.902764 +11237,NY,Brooklyn,40.700616,-73.917979 +11238,NY,Brooklyn,40.679015,-73.964387 +11239,NY,Brooklyn,40.649748,-73.882375 +11251,NY,Brooklyn Navy Ya,40.703578,-73.966511 +11354,NY,Flushing,40.766722,-73.824142 +11355,NY,Flushing,40.753573,-73.822609 +11356,NY,College Point,40.785511,-73.844955 +11357,NY,Whitestone,40.785147,-73.809594 +11358,NY,Flushing,40.760636,-73.796788 +11359,NY,Fort Totten,40.789967,-73.777244 +11360,NY,Bayside,40.780684,-73.781216 +11361,NY,Bayside,40.76268,-73.774457 +11362,NY,Little Neck,40.759131,-73.732622 +11363,NY,Little Neck,40.772166,-73.745401 +11364,NY,Flushing,40.745847,-73.758646 +11365,NY,Fresh Meadows,40.737424,-73.79506 +11366,NY,Fresh Meadows,40.727231,-73.794922 +11367,NY,Flushing,40.727966,-73.81953 +11368,NY,Corona,40.745288,-73.861069 +11369,NY,East Elmhurst,40.761254,-73.873902 +11370,NY,East Elmhurst,40.761111,-73.891586 +11371,NY,Flushing,40.772117,-73.873535 +11372,NY,Jackson Heights,40.751329,-73.882975 +11373,NY,Jackson Heights,40.740388,-73.878551 +11374,NY,Rego Park,40.72775,-73.860191 +11375,NY,Forest Hills,40.722854,-73.847306 +11377,NY,Woodside,40.744972,-73.906911 +11378,NY,Maspeth,40.723865,-73.899682 +11379,NY,Middle Village,40.717286,-73.879228 +11385,NY,Ridgewood,40.703613,-73.896122 +11411,NY,Cambria Heights,40.694741,-73.737445 +11412,NY,Kew Gardens,40.698097,-73.758641 +11413,NY,Springfield Gard,40.67295,-73.75071 +11414,NY,Kew Gardens,40.660603,-73.845041 +11415,NY,Kew Gardens,40.706865,-73.829715 +11416,NY,Ozone Park,40.683753,-73.851397 +11417,NY,Ozone Park,40.676854,-73.844778 +11418,NY,Richmond Hill,40.698171,-73.834484 +11419,NY,S Richmond Hill,40.688113,-73.823871 +11420,NY,S Ozone Park,40.675379,-73.815773 +11421,NY,Woodhaven,40.691345,-73.858514 +11422,NY,Rosedale,40.662141,-73.735265 +11423,NY,Hollis,40.714156,-73.767685 +11426,NY,Bellerose,40.734735,-73.723018 +11427,NY,Queens Village,40.727707,-73.748908 +11428,NY,Queens Village,40.720756,-73.743312 +11429,NY,Queens Village,40.70902,-73.740064 +11430,NY,Jamaica,40.647221,-73.782663 +11432,NY,Jamaica,40.711867,-73.79442 +11433,NY,Jamaica,40.69691,-73.787669 +11434,NY,Jamaica,40.677483,-73.77584 +11435,NY,Jamaica,40.702934,-73.811121 +11436,NY,Jamaica,40.676347,-73.796596 +11501,NY,Mineola,40.746927,-73.639761 +11507,NY,Albertson,40.77032,-73.651419 +11509,NY,Atlantic Beach,40.588652,-73.725545 +11510,NY,Baldwin,40.654755,-73.609688 +11514,NY,Carle Place,40.75115,-73.611941 +11516,NY,Cedarhurst,40.623619,-73.726404 +11518,NY,East Rockaway,40.640445,-73.667376 +11520,NY,Freeport,40.65359,-73.586615 +11530,NY,Garden City,40.72452,-73.648718 +11542,NY,Glen Cove,40.864958,-73.62772 +11545,NY,Glen Head,40.828098,-73.60763 +11548,NY,Greenvale,40.812503,-73.626124 +11550,NY,Hempstead,40.70492,-73.617641 +11552,NY,West Hempstead,40.692915,-73.653859 +11553,NY,Uniondale,40.702029,-73.591995 +11554,NY,East Meadow,40.714915,-73.556088 +11557,NY,Hewlett,40.640392,-73.695667 +11558,NY,Island Park,40.604044,-73.655411 +11559,NY,Lawrence,40.61396,-73.732969 +11560,NY,Locust Valley,40.881728,-73.59271 +11561,NY,Long Beach,40.587697,-73.659467 +11563,NY,Lynbrook,40.657107,-73.674143 +11565,NY,Malverne,40.674982,-73.673073 +11566,NY,North Merrick,40.668312,-73.555001 +11568,NY,Old Westbury,40.78821,-73.587515 +11570,NY,Rockville Centre,40.663745,-73.638 +11572,NY,Oceanside,40.636199,-73.637533 +11575,NY,Roosevelt,40.680171,-73.586697 +11576,NY,Roslyn,40.790668,-73.653362 +11577,NY,Roslyn Heights,40.784497,-73.640292 +11579,NY,Sea Cliff,40.845984,-73.643598 +11580,NY,Valley Stream,40.674184,-73.705738 +11581,NY,North Woodmere,40.651838,-73.710705 +11590,NY,Westbury,40.755749,-73.57226 +11596,NY,Williston Park,40.759198,-73.644892 +11598,NY,Woodmere,40.63262,-73.714146 +11691,NY,Far Rockaway,40.600645,-73.757971 +11692,NY,Far Rockaway,40.59257,-73.797446 +11693,NY,Far Rockaway,40.607644,-73.819804 +11694,NY,Far Rockaway,40.579471,-73.839192 +11696,NY,Inwood,40.617784,-73.746988 +11697,NY,Far Rockaway,40.560032,-73.914873 +11701,NY,Amityville,40.684197,-73.417106 +11702,NY,Oak Beach,40.634183,-73.324583 +11703,NY,North Babylon,40.732102,-73.323581 +11704,NY,West Babylon,40.713476,-73.354591 +11705,NY,Bayport,40.744408,-73.054207 +11706,NY,Kismet,40.733744,-73.252708 +11709,NY,Bayville,40.907382,-73.560141 +11710,NY,North Bellmore,40.677028,-73.534517 +11713,NY,Bellport,40.77327,-72.946891 +11714,NY,Bethpage,40.740014,-73.485727 +11715,NY,Blue Point,40.750089,-73.035213 +11716,NY,Bohemia,40.767788,-73.116339 +11717,NY,West Brentwood,40.777918,-73.248189 +11718,NY,Brightwaters,40.727957,-73.264639 +11719,NY,Brookhaven,40.78428,-72.892125 +11720,NY,Centereach,40.870508,-73.082163 +11721,NY,Centerport,40.892899,-73.3754 +11722,NY,Central Islip,40.786618,-73.196145 +11724,NY,Cold Spring Harb,40.863056,-73.450032 +11725,NY,Commack,40.843032,-73.279924 +11726,NY,Copiague,40.677833,-73.396271 +11727,NY,Coram,40.884988,-73.006881 +11729,NY,Deer Park,40.759083,-73.32572 +11730,NY,East Islip,40.72816,-73.180471 +11731,NY,Elwood,40.867066,-73.319506 +11732,NY,East Norwich,40.847162,-73.534876 +11733,NY,Setauket,40.930004,-73.101467 +11735,NY,South Farmingdal,40.725061,-73.445055 +11738,NY,Farmingville,40.836602,-73.04125 +11740,NY,Greenlawn,40.862121,-73.364641 +11741,NY,Holbrook,40.796426,-73.071789 +11742,NY,Holtsville,40.810478,-73.04161 +11743,NY,Halesite,40.866945,-73.410924 +11746,NY,Dix Hills,40.821754,-73.375472 +11747,NY,Melville,40.794606,-73.402963 +11751,NY,Islip,40.734821,-73.22211 +11752,NY,Islip Terrace,40.75482,-73.182746 +11753,NY,Jericho,40.788118,-73.533067 +11754,NY,Kings Park,40.886121,-73.243763 +11755,NY,Lake Grove,40.856681,-73.116751 +11756,NY,Levittown,40.725428,-73.516578 +11757,NY,Lindenhurst,40.688373,-73.374493 +11758,NY,North Massapequa,40.685738,-73.469727 +11762,NY,Massapequa Park,40.680673,-73.444447 +11763,NY,Medford,40.817416,-72.985214 +11764,NY,Miller Place,40.943572,-72.991349 +11765,NY,Mill Neck,40.88574,-73.552602 +11766,NY,Mount Sinai,40.927092,-73.012732 +11767,NY,Nesconset,40.846206,-73.1482 +11768,NY,Northport,40.905062,-73.330889 +11769,NY,Oakdale,40.738224,-73.12969 +11771,NY,Oyster Bay,40.866012,-73.527212 +11772,NY,Davis Park,40.773501,-72.998108 +11776,NY,Port Jefferson S,40.911722,-73.052136 +11777,NY,Port Jefferson,40.945687,-73.061093 +11778,NY,Rocky Point,40.949206,-72.935681 +11779,NY,Lake Ronkonkoma,40.820763,-73.1208 +11780,NY,Saint James,40.881299,-73.159121 +11782,NY,Cherry Grove,40.74606,-73.082297 +11783,NY,Seaford,40.679513,-73.491015 +11784,NY,Selden,40.869883,-73.044848 +11786,NY,Shoreham,40.948493,-72.892685 +11787,NY,Smithtown,40.854186,-73.213816 +11788,NY,Hauppauge,40.823069,-73.195762 +11789,NY,Sound Beach,40.956707,-72.974172 +11790,NY,Stony Brook,40.900257,-73.125085 +11791,NY,Syosset,40.81462,-73.502397 +11792,NY,Wading River,40.952049,-72.834774 +11793,NY,Wantagh,40.684998,-73.51033 +11794,NY,Suny Stony Brook,40.914127,-73.125456 +11795,NY,West Islip,40.711734,-73.30072 +11796,NY,West Sayville,40.731971,-73.100019 +11797,NY,Woodbury,40.815441,-73.471612 +11798,NY,Wheatley Heights,40.753258,-73.36596 +11801,NY,Hicksville,40.762305,-73.52297 +11803,NY,Plainview,40.778099,-73.481638 +11804,NY,Old Bethpage,40.764991,-73.457481 +11901,NY,Riverhead,40.926202,-72.651966 +11933,NY,Calverton,40.929662,-72.74229 +11934,NY,Center Moriches,40.799657,-72.797048 +11935,NY,Cutchogue,41.013918,-72.480255 +11937,NY,East Hampton,40.992964,-72.178958 +11939,NY,East Marion,41.126425,-72.34186 +11940,NY,East Moriches,40.808975,-72.753778 +11941,NY,Eastport,40.809947,-72.705388 +11942,NY,East Quogue,40.84277,-72.581297 +11944,NY,Greenport,41.103905,-72.367415 +11946,NY,Hampton Bays,40.872596,-72.520209 +11948,NY,Laurel,40.9674,-72.55404 +11949,NY,Manorville,40.842102,-72.800208 +11950,NY,Mastic,40.80644,-72.856608 +11951,NY,Mastic Beach,40.765653,-72.853701 +11952,NY,Mattituck,40.994336,-72.536296 +11953,NY,Middle Island,40.878212,-72.952539 +11954,NY,Montauk,41.045853,-71.943963 +11955,NY,Moriches,40.809502,-72.822918 +11957,NY,Orient,41.143741,-72.287894 +11961,NY,Ridge,40.901846,-72.888135 +11963,NY,Sag Harbor,40.981996,-72.30674 +11964,NY,Shelter Island,41.064046,-72.336616 +11965,NY,Shelter Island H,41.074205,-72.348082 +11967,NY,Shirley,40.743932,-72.876043 +11968,NY,Southampton,40.904341,-72.410271 +11971,NY,Southold,41.05555,-72.429039 +11976,NY,Water Mill,40.920929,-72.349069 +11977,NY,Westhampton,40.818031,-72.669931 +11978,NY,Westhampton Beac,40.822783,-72.644757 +11980,NY,Yaphank,40.837037,-72.917435 +12007,NY,Alcove,42.453818,-74.034721 +12008,NY,Alplaus,42.857329,-73.900188 +12009,NY,Altamont,42.70627,-74.019339 +12010,NY,West Charlton,42.948822,-74.18393 +12015,NY,Athens,42.2736,-73.815175 +12017,NY,Austerlitz,42.322272,-73.454965 +12018,NY,Averill Park,42.636511,-73.550437 +12019,NY,Ballston Lake,42.919176,-73.855171 +12020,NY,Ballston Spa,43.004956,-73.84858 +12022,NY,Berlin,42.691893,-73.370186 +12023,NY,Berne,42.610848,-74.146577 +12024,NY,Brainard,42.405101,-73.615874 +12025,NY,Broadalbin,43.072687,-74.168367 +12027,NY,Burnt Hills,42.932902,-73.896043 +12028,NY,Buskirk,42.960134,-73.449677 +12029,NY,Canaan,42.413168,-73.415889 +12031,NY,Carlisle,42.749754,-74.456284 +12032,NY,Caroga Lake,43.192159,-74.516915 +12033,NY,Castleton On Hud,42.538243,-73.709529 +12035,NY,Central Bridge,42.73696,-74.345107 +12036,NY,Charlotteville,42.533034,-74.681863 +12037,NY,Chatham,42.349578,-73.587281 +12041,NY,Clarksville,42.566974,-73.968775 +12042,NY,Climax,42.370808,-73.862459 +12043,NY,Cobleskill,42.684047,-74.493866 +12046,NY,Coeymans Hollow,42.486537,-73.920588 +12047,NY,Cohoes,42.775362,-73.712356 +12051,NY,Coxsackie,42.350142,-73.819881 +12052,NY,Cropseyville,42.766718,-73.471869 +12053,NY,Delanson,42.74802,-74.18681 +12054,NY,Delmar,42.61579,-73.837329 +12055,NY,Dormansville,42.437859,-74.198966 +12056,NY,Duanesburg,42.770839,-74.083911 +12057,NY,White Creek,42.961527,-73.351974 +12058,NY,Earlton,42.352689,-73.906222 +12059,NY,East Berne,42.61913,-74.055488 +12060,NY,East Chatham,42.433028,-73.49026 +12061,NY,East Greenbush,42.595096,-73.682644 +12062,NY,East Nassau,42.535215,-73.498407 +12064,NY,East Worcester,42.621423,-74.676348 +12065,NY,Clifton Park,42.849865,-73.785094 +12066,NY,Esperance,42.771677,-74.288246 +12067,NY,Feura Bush,42.554998,-73.923743 +12068,NY,Fonda,42.957078,-74.402129 +12070,NY,Fort Johnson,42.976535,-74.248436 +12071,NY,Fultonham,42.585914,-74.38759 +12072,NY,Fultonville,42.903601,-74.359765 +12074,NY,Galway,43.021693,-74.029043 +12075,NY,Ghent,42.303637,-73.64864 +12076,NY,Gilboa,42.410835,-74.400275 +12077,NY,Glenmont,42.597147,-73.795884 +12078,NY,Gloversville,43.061603,-74.337526 +12083,NY,Greenville,42.411342,-74.022222 +12084,NY,Guilderland,42.697273,-73.897454 +12086,NY,Hagaman,42.959715,-74.166764 +12087,NY,Hannacroix,42.428533,-73.868029 +12090,NY,Hoosick Falls,42.893712,-73.358105 +12092,NY,Howes Cave,42.704526,-74.364825 +12093,NY,Jefferson,42.499869,-74.611744 +12094,NY,Johnsonville,42.876875,-73.498899 +12095,NY,Johnstown,43.006923,-74.37149 +12106,NY,Kinderhook,42.376675,-73.718259 +12108,NY,Lake Pleasant,43.472543,-74.422563 +12110,NY,Latham,42.74616,-73.762985 +12113,NY,Lawyersville,42.692682,-74.506969 +12115,NY,Malden Bridge,42.460201,-73.587958 +12116,NY,Maryland,42.537075,-74.903033 +12117,NY,Mayfield,43.141133,-74.244397 +12118,NY,Mechanicville,42.967613,-73.673173 +12120,NY,Medusa,42.451504,-74.131524 +12121,NY,Melrose,42.841163,-73.607667 +12122,NY,Middleburgh,42.563734,-74.329168 +12123,NY,Nassau,42.527141,-73.611753 +12125,NY,New Lebanon,42.475865,-73.377295 +12130,NY,Niverville,42.927575,-73.485614 +12131,NY,North Blenheim,42.489938,-74.428174 +12134,NY,Edinburg,43.237126,-74.168361 +12135,NY,Norton Hill,42.420014,-74.078945 +12136,NY,Old Chatham,42.435692,-73.55447 +12137,NY,Pattersonville,42.84995,-74.123126 +12138,NY,Taconic Lake,42.736367,-73.371033 +12139,NY,Piseco,43.448125,-74.526282 +12140,NY,Poestenkill,42.679548,-73.588846 +12143,NY,Ravena,42.475371,-73.821991 +12144,NY,Rensselaer,42.635855,-73.721895 +12147,NY,Rensselaerville,42.513288,-74.147431 +12148,NY,Rexford,42.852411,-73.8701 +12149,NY,Richmondville,42.642445,-74.571001 +12150,NY,Rotterdam Juncti,42.87296,-74.046857 +12151,NY,Round Lake,42.925994,-73.770127 +12153,NY,Sand Lake,42.637912,-73.498949 +12154,NY,Schaghticoke,42.914356,-73.615428 +12155,NY,Schenevus,42.59004,-74.814863 +12156,NY,Schodack Landing,42.481644,-73.747996 +12157,NY,Schoharie,42.661503,-74.30473 +12158,NY,Selkirk,42.54861,-73.812863 +12159,NY,Slingerlands,42.648461,-73.871065 +12160,NY,Sloansville,42.759852,-74.364174 +12164,NY,Speculator,43.504159,-74.36667 +12165,NY,Spencertown,42.30908,-73.500754 +12166,NY,Sprakers,42.848446,-74.453558 +12167,NY,Stamford,42.417409,-74.609831 +12168,NY,Stephentown,42.523323,-73.422447 +12169,NY,Stephentown,42.556224,-73.374964 +12170,NY,Stillwater,42.905652,-73.697163 +12173,NY,Stuyvesant,42.359572,-73.761329 +12175,NY,Summit,42.587122,-74.574952 +12176,NY,Surprise,42.361171,-73.951541 +12180,NY,Troy,42.728748,-73.668263 +12182,NY,Troy,42.782921,-73.664806 +12183,NY,Green Island,42.743812,-73.693707 +12184,NY,Valatie,42.432051,-73.668322 +12185,NY,Valley Falls,42.885458,-73.543674 +12186,NY,Voorheesville,42.643108,-73.944773 +12187,NY,Warnerville,42.638826,-74.487046 +12188,NY,Waterford,42.809957,-73.699481 +12189,NY,Watervliet,42.729843,-73.712342 +12190,NY,Wells,43.401219,-74.288583 +12192,NY,West Coxsackie,42.415055,-73.817033 +12193,NY,Westerlo,42.515621,-74.039383 +12194,NY,West Fulton,42.550615,-74.463105 +12196,NY,West Sand Lake,42.637969,-73.610896 +12197,NY,Worcester,42.604889,-74.72992 +12198,NY,Wynantskill,42.687785,-73.63826 +12202,NY,Albany,42.641314,-73.764071 +12203,NY,Mc Kownville,42.676757,-73.821988 +12204,NY,Albany,42.684667,-73.735364 +12205,NY,Roessleville,42.713116,-73.820174 +12206,NY,Albany,42.668326,-73.774406 +12207,NY,Albany,42.658133,-73.752327 +12208,NY,Albany,42.655989,-73.796357 +12209,NY,Albany,42.641665,-73.785385 +12210,NY,Albany,42.65677,-73.76052 +12211,NY,Loudonville,42.704693,-73.769982 +12302,NY,Mayfair,42.858839,-73.955051 +12303,NY,Rotterdam,42.769645,-73.938776 +12304,NY,Schenectady,42.784083,-73.909432 +12305,NY,Schenectady,42.816131,-73.939786 +12306,NY,Schenectady,42.790384,-73.980876 +12307,NY,Schenectady,42.804653,-73.936349 +12308,NY,Schenectady,42.817928,-73.920591 +12309,NY,Niskayuna,42.796168,-73.878268 +12401,NY,Eddyville,41.930126,-74.023575 +12404,NY,Accord,41.808308,-74.235336 +12405,NY,Acra,42.330367,-74.085723 +12406,NY,Arkville,42.082262,-74.554453 +12407,NY,Ashland,42.237174,-74.307925 +12409,NY,Shady,42.041991,-74.171298 +12410,NY,Oliverea,42.143884,-74.446655 +12411,NY,Bloomington,41.856165,-74.066889 +12412,NY,Boiceville,42.004761,-74.265808 +12413,NY,Cairo,42.30965,-74.01154 +12414,NY,Catskill,42.227598,-73.898536 +12416,NY,Chichester,42.087965,-74.281565 +12418,NY,Cornwallville,42.362874,-74.163092 +12419,NY,Cottekill,41.846706,-74.103774 +12421,NY,Denver,42.252204,-74.540654 +12422,NY,Durham,42.402037,-74.184926 +12423,NY,East Durham,42.385978,-74.11169 +12424,NY,East Jewett,42.280567,-74.207981 +12427,NY,Elka Park,42.164309,-74.124539 +12428,NY,Ellenville,41.721805,-74.414125 +12430,NY,Halcott Center,42.178765,-74.531908 +12431,NY,Freehold,42.3815,-74.062266 +12433,NY,Glenford,42.005342,-74.153154 +12434,NY,Grand Gorge,42.387358,-74.531173 +12435,NY,Greenfield Park,41.728133,-74.520074 +12439,NY,East Windham,42.259032,-74.213063 +12440,NY,High Falls,41.816749,-74.131122 +12442,NY,Hunter,42.237316,-74.203753 +12443,NY,Hurley,41.932743,-74.06873 +12444,NY,Jewett,42.269383,-74.279274 +12446,NY,Kerhonkson,41.793866,-74.303457 +12448,NY,Lake Hill,42.073271,-74.212338 +12449,NY,Lake Katrine,41.991787,-73.992379 +12450,NY,Lanesville,42.189149,-74.19715 +12451,NY,Leeds,42.304506,-73.945726 +12454,NY,Maplecrest,42.299485,-74.165522 +12455,NY,Kelly Corners,42.163702,-74.648853 +12456,NY,Mount Marion,42.035704,-74.000211 +12457,NY,Mount Tremper,42.043545,-74.248481 +12458,NY,Napanoch,41.758965,-74.380354 +12460,NY,Oak Hill,42.406902,-74.152832 +12461,NY,Krumville,41.895906,-74.246954 +12462,NY,12462,42.026764,-74.444263 +12463,NY,Palenville,42.17294,-74.016674 +12464,NY,Phoenicia,42.054426,-74.339328 +12465,NY,Pine Hill,42.133974,-74.487562 +12466,NY,Port Ewen,41.913113,-73.987161 +12468,NY,Prattsville,42.297904,-74.389502 +12469,NY,Preston Hollow,42.456348,-74.24199 +12470,NY,Purling,42.275497,-74.01138 +12472,NY,Rosendale,41.840248,-74.072999 +12473,NY,Round Top,42.267782,-74.052279 +12474,NY,Roxbury,42.311688,-74.540519 +12477,NY,Saugerties,42.07376,-73.979684 +12480,NY,Shandaken,42.108353,-74.409084 +12481,NY,Shokan,41.976678,-74.211943 +12482,NY,South Cairo,42.27338,-73.963982 +12484,NY,Stone Ridge,41.861562,-74.169748 +12485,NY,Tannersville,42.203179,-74.101441 +12486,NY,Tillson,41.816279,-74.072219 +12487,NY,Ulster Park,41.865109,-73.994843 +12491,NY,West Hurley,41.990816,-74.115232 +12492,NY,West Kill,42.204584,-74.361994 +12494,NY,West Shokan,41.955478,-74.285117 +12495,NY,Willow,42.092318,-74.202537 +12496,NY,Windham,42.317465,-74.262017 +12498,NY,Woodstock,42.034793,-74.111974 +12501,NY,Amenia,41.844695,-73.554158 +12502,NY,Ancram,42.085093,-73.642368 +12503,NY,Ancramdale,42.038103,-73.58187 +12507,NY,Barrytown,42.0006,-73.921484 +12508,NY,Beacon,41.509681,-73.963384 +12513,NY,Claverack,42.2183,-73.722844 +12514,NY,Clinton Corners,41.869262,-73.765867 +12515,NY,Clintondale,41.674939,-74.055713 +12516,NY,Copake,42.111329,-73.552588 +12517,NY,Copake Falls,42.136737,-73.510773 +12518,NY,Cornwall,41.430944,-74.053877 +12520,NY,Cornwall On Huds,41.443031,-74.016411 +12521,NY,Craryville,42.175961,-73.657128 +12522,NY,Dover Plains,41.735054,-73.587024 +12523,NY,Elizaville,42.090173,-73.781814 +12524,NY,Fishkill,41.540352,-73.89791 +12525,NY,Gardiner,41.657615,-74.167155 +12526,NY,Germantown,42.1219,-73.862451 +12528,NY,Highland,41.716691,-73.992825 +12529,NY,Hillsdale,42.186816,-73.548306 +12531,NY,Holmes,41.532461,-73.662751 +12533,NY,Hopewell Junctio,41.576639,-73.797581 +12534,NY,Hudson,42.246978,-73.755248 +12538,NY,Hyde Park,41.788724,-73.906347 +12540,NY,Lagrangeville,41.661471,-73.744955 +12542,NY,Marlboro,41.605612,-73.988017 +12543,NY,Maybrook,41.48865,-74.216312 +12545,NY,Millbrook,41.780334,-73.688491 +12546,NY,Millerton,41.953623,-73.528709 +12547,NY,Milton,41.653487,-73.977194 +12548,NY,Modena,41.650347,-74.103578 +12549,NY,Montgomery,41.53332,-74.253417 +12550,NY,Middle Hope,41.517833,-74.03598 +12553,NY,New Windsor,41.472374,-74.056596 +12561,NY,Mohonk Lake,41.743346,-74.083875 +12563,NY,Patterson,41.488761,-73.58149 +12564,NY,Pawling,41.574893,-73.594847 +12566,NY,Pine Bush,41.617758,-74.326311 +12567,NY,Pine Plains,41.989569,-73.660227 +12569,NY,Pleasant Valley,41.747032,-73.814276 +12570,NY,Poughquag,41.61936,-73.678328 +12571,NY,Red Hook,42.006439,-73.854577 +12572,NY,Rhinebeck,41.927206,-73.888754 +12575,NY,Rock Tavern,41.457523,-74.16588 +12577,NY,Salisbury Mills,41.449714,-74.121378 +12578,NY,Salt Point,41.805041,-73.801329 +12580,NY,Staatsburg,41.850193,-73.898838 +12581,NY,Stanfordville,41.887726,-73.694467 +12582,NY,Stormville,41.551193,-73.725548 +12583,NY,Tivoli,42.057945,-73.902514 +12585,NY,Verbank,41.722664,-73.71841 +12586,NY,Walden,41.559631,-74.176395 +12589,NY,Wallkill,41.615952,-74.143853 +12590,NY,New Hamburg,41.592199,-73.890588 +12592,NY,Wassaic,41.775884,-73.554382 +12594,NY,Wingdale,41.653824,-73.555621 +12601,NY,South Road,41.702082,-73.9218 +12603,NY,Arlington,41.676775,-73.885217 +12701,NY,Monticello,41.65158,-74.700748 +12719,NY,Barryville,41.491162,-74.915234 +12720,NY,Bethel,41.669326,-74.893984 +12721,NY,Bloomingburg,41.564427,-74.430351 +12723,NY,Callicoon,41.7754,-75.025688 +12725,NY,Claryville,41.965666,-74.529287 +12726,NY,Fosterdale,41.698208,-74.980687 +12727,NY,Cochecton Center,41.645776,-74.977116 +12729,NY,Cuddebackville,41.477601,-74.597564 +12732,NY,Eldred,41.532793,-74.896769 +12733,NY,Fallsburg,41.7273,-74.615409 +12734,NY,Grossinger,41.730029,-74.754873 +12736,NY,Fremont Center,41.847134,-75.029635 +12737,NY,Glen Spey,41.48576,-74.799493 +12738,NY,Glen Wild,41.654536,-74.583289 +12739,NY,Godeffroy,41.442347,-74.605716 +12740,NY,Grahamsville,41.880659,-74.512697 +12741,NY,Mileses,41.831288,-75.099809 +12742,NY,Harris,41.714055,-74.7218 +12743,NY,Highland Lake,41.530925,-74.851615 +12745,NY,Hortonville,41.78568,-75.026329 +12746,NY,Huguenot,41.437162,-74.64261 +12747,NY,Hurleyville,41.760882,-74.65344 +12748,NY,Jeffersonville,41.778394,-74.919574 +12750,NY,Kenoza Lake,41.777802,-74.935384 +12751,NY,Kiamesha Lake,41.683825,-74.672402 +12752,NY,Lake Huntington,41.678158,-74.994933 +12753,NY,Lew Beach,42.015762,-74.728835 +12754,NY,Liberty,41.79618,-74.748397 +12758,NY,Livingston Manor,41.87779,-74.827028 +12759,NY,Loch Sheldrake,41.778899,-74.661406 +12760,NY,Long Eddy,41.864359,-75.094157 +12762,NY,Mongaup Valley,41.681017,-74.802772 +12763,NY,Mountain Dale,41.691763,-74.535762 +12764,NY,Narrowsburg,41.592108,-75.010687 +12765,NY,Neversink,41.849205,-74.612726 +12766,NY,North Branch,41.814184,-74.982388 +12768,NY,Parksville,41.851686,-74.735933 +12770,NY,Pond Eddy,41.451068,-74.841029 +12771,NY,Port Jervis,41.378557,-74.669097 +12775,NY,Rock Hill,41.613351,-74.587223 +12776,NY,Cook Falls,41.945774,-74.923704 +12777,NY,Forestburgh,41.569093,-74.724087 +12779,NY,South Fallsburg,41.704192,-74.644401 +12780,NY,Sparrowbush,41.435886,-74.723647 +12782,NY,Sundown,41.823822,-74.550838 +12783,NY,Swan Lake,41.728479,-74.834092 +12786,NY,White Lake,41.648498,-74.865437 +12787,NY,White Sulphur Sp,41.790042,-74.828065 +12788,NY,Woodbourne,41.770807,-74.592828 +12789,NY,Woodridge,41.716955,-74.581518 +12790,NY,Wurtsboro,41.587667,-74.503891 +12791,NY,Youngsville,41.803238,-74.888776 +12792,NY,Yulan,41.538378,-74.926224 +12801,NY,Queensbury,43.312539,-73.648816 +12803,NY,South Glens Fall,43.283911,-73.637947 +12804,NY,Queensbury,43.328983,-73.681846 +12808,NY,Adirondack,43.716479,-73.782486 +12809,NY,Argyle,43.238084,-73.464076 +12810,NY,Athol,43.483872,-73.881695 +12812,NY,Blue Mountain La,43.837499,-74.429831 +12814,NY,Bolton Landing,43.576641,-73.671392 +12815,NY,Brant Lake,43.698875,-73.720458 +12816,NY,Cambridge,43.046585,-73.381375 +12817,NY,Chestertown,43.645053,-73.806641 +12819,NY,Clemons,43.643544,-73.432613 +12821,NY,Comstock,43.456706,-73.360607 +12822,NY,Corinth,43.242569,-73.836901 +12823,NY,Cossayuna,43.175059,-73.41237 +12824,NY,Diamond Point,43.515553,-73.700123 +12826,NY,East Greenwich,43.157918,-73.392425 +12827,NY,Fort Ann,43.428457,-73.478381 +12828,NY,Fort Edward,43.265321,-73.582169 +12831,NY,Gansevoort,43.180343,-73.705267 +12832,NY,Granville,43.377562,-73.297825 +12833,NY,Greenfield Cente,43.122488,-73.860193 +12834,NY,Thomson,43.096183,-73.506658 +12835,NY,Hadley,43.301268,-73.949905 +12836,NY,Hague,43.74631,-73.528172 +12837,NY,Hampton,43.462135,-73.273072 +12838,NY,Hartford,43.349281,-73.404946 +12839,NY,Hudson Falls,43.314863,-73.574607 +12842,NY,Indian Lake,43.760594,-74.276638 +12843,NY,Johnsburg,43.634081,-74.021254 +12844,NY,Pilot Knob,43.515561,-73.629883 +12845,NY,Lake George,43.416725,-73.697547 +12846,NY,Lake Luzerne,43.316487,-73.822821 +12847,NY,Long Lake,43.947653,-74.466243 +12849,NY,Middle Granville,43.450773,-73.303077 +12850,NY,Middle Grove,43.097548,-74.016687 +12851,NY,Minerva,43.781058,-73.983542 +12852,NY,Newcomb,43.945991,-74.129911 +12853,NY,North Creek,43.713802,-73.892802 +12854,NY,North Granville,43.506212,-73.330114 +12855,NY,North Hudson,43.986872,-73.712065 +12857,NY,Olmstedville,43.779931,-73.933479 +12858,NY,Paradox,43.891382,-73.644956 +12859,NY,Porter Corners,43.172358,-73.883918 +12860,NY,Pottersville,43.692956,-73.756438 +12861,NY,Putnam Station,43.755976,-73.412299 +12863,NY,Rock City Falls,43.066248,-73.921523 +12865,NY,Salem,43.182785,-73.332703 +12866,NY,Wilton,43.080094,-73.780644 +12870,NY,Schroon Lake,43.841159,-73.767382 +12871,NY,Schuylerville,43.087778,-73.60068 +12872,NY,Severance,43.876903,-73.730127 +12873,NY,Shushan,43.110575,-73.323148 +12874,NY,Silver Bay,43.697804,-73.507062 +12878,NY,Stony Creek,43.421389,-73.949467 +12883,NY,Ticonderoga,43.846302,-73.442592 +12885,NY,Warrensburg,43.500253,-73.792021 +12886,NY,Wevertown,43.64129,-73.930909 +12887,NY,Whitehall,43.5531,-73.386412 +12901,NY,Plattsburgh,44.692715,-73.465969 +12910,NY,Altona,44.881584,-73.640767 +12911,NY,Au Sable Chasm,44.521594,-73.508976 +12912,NY,Au Sable Forks,44.44994,-73.685672 +12913,NY,Bloomingdale,44.398477,-74.08293 +12914,NY,Bombay,44.947861,-74.594737 +12916,NY,Brushton,44.828212,-74.522274 +12917,NY,Burke,44.917722,-74.173116 +12918,NY,Cadyville,44.686473,-73.670242 +12919,NY,Champlain,44.977292,-73.446603 +12920,NY,Chateaugay,44.908768,-74.074098 +12921,NY,Chazy,44.888379,-73.450076 +12922,NY,Childwold,44.286715,-74.675878 +12923,NY,Churubusco,44.943232,-73.935484 +12924,NY,Keeseville,44.504814,-73.567971 +12926,NY,Constable,44.941688,-74.329713 +12928,NY,Crown Point,43.952633,-73.466486 +12930,NY,Dickinson Center,44.723328,-74.552346 +12932,NY,Elizabethtown,44.224518,-73.601131 +12934,NY,Ellenburg Center,44.844353,-73.868546 +12935,NY,Ellenburg Depot,44.916266,-73.787572 +12936,NY,Essex,44.280695,-73.373147 +12937,NY,Fort Covington,44.973096,-74.492879 +12938,NY,Nicholville,44.638703,-74.536471 +12941,NY,Jay,44.373351,-73.724702 +12942,NY,Keene,44.25548,-73.791457 +12943,NY,Saint Huberts,44.177978,-73.795923 +12944,NY,Keeseville,44.499933,-73.474538 +12945,NY,Upper Saint Regi,44.359392,-74.243336 +12946,NY,North Pole,44.274986,-73.986354 +12949,NY,Lawrenceville,44.758988,-74.662927 +12950,NY,Lewis,44.307507,-73.549129 +12952,NY,Lyon Mountain,44.725491,-73.919452 +12953,NY,Malone,44.848164,-74.292808 +12955,NY,Merrill,44.799364,-73.977832 +12956,NY,Mineville,44.087631,-73.523588 +12957,NY,Moira,44.850412,-74.560273 +12958,NY,Mooers,44.959244,-73.583413 +12959,NY,Mooers Forks,44.960232,-73.672967 +12960,NY,Moriah,44.043755,-73.507862 +12961,NY,Moriah Center,44.066197,-73.511071 +12962,NY,Morrisonville,44.68936,-73.577168 +12964,NY,New Russia,44.159532,-73.605881 +12965,NY,Nicholville,44.708182,-74.653379 +12966,NY,Bangor,44.829997,-74.413369 +12967,NY,North Lawrence,44.774982,-74.665307 +12968,NY,Onchiota,44.458163,-74.170991 +12969,NY,Owls Head,44.730791,-74.134173 +12970,NY,Paul Smiths,44.444967,-74.266432 +12972,NY,Peru,44.585109,-73.529322 +12973,NY,Piercefield,44.234037,-74.573228 +12974,NY,Port Henry,44.04645,-73.470542 +12978,NY,Redford,44.606926,-73.801948 +12979,NY,Rouses Point,44.988413,-73.369083 +12980,NY,Saint Regis Fall,44.677298,-74.66032 +12981,NY,Saranac,44.703168,-73.748135 +12983,NY,Saranac Lake,44.324331,-74.132951 +12985,NY,Schuyler Falls,44.588224,-73.689481 +12986,NY,Sunmount,44.228461,-74.463172 +12987,NY,Upper Jay,44.325586,-73.807864 +12989,NY,Vermontville,44.460134,-74.057278 +12992,NY,West Chazy,44.796967,-73.511188 +12993,NY,Westport,44.204983,-73.470223 +12994,NY,Whallonsburg,44.292637,-73.432205 +12996,NY,Willsboro,44.360396,-73.396292 +12997,NY,Wilmington,44.387976,-73.816553 +13021,NY,Auburn,42.929958,-76.562605 +13026,NY,Aurora,42.747231,-76.67749 +13027,NY,Baldwinsville,43.162039,-76.323718 +13028,NY,Bernhards Bay,43.271722,-75.937299 +13029,NY,Brewerton,43.225194,-76.135132 +13030,NY,Bridgeport,43.159015,-75.970009 +13031,NY,Camillus,43.041651,-76.280728 +13032,NY,Canastota,43.087764,-75.760197 +13033,NY,Cato,43.179443,-76.564791 +13034,NY,Cayuga,42.914198,-76.702402 +13035,NY,Cazenovia,42.937955,-75.839229 +13036,NY,Central Square,43.308986,-76.184852 +13037,NY,Chittenango,43.05524,-75.87684 +13039,NY,Cicero,43.170693,-76.096185 +13040,NY,Cincinnatus,42.538539,-75.903029 +13041,NY,Clay,43.173734,-76.170748 +13042,NY,Cleveland,43.243199,-75.853691 +13044,NY,Constantia,43.272751,-76.004155 +13045,NY,Cortland,42.595175,-76.185675 +13050,NY,Cuyler,42.740571,-75.938367 +13052,NY,De Ruyter,42.749444,-75.858226 +13053,NY,Dryden,42.486118,-76.287224 +13054,NY,Durhamville,43.157912,-75.671409 +13055,NY,East Freetown,42.579845,-75.998924 +13057,NY,East Syracuse,43.073359,-76.05578 +13060,NY,Elbridge,43.025246,-76.435164 +13061,NY,Erieville,42.856166,-75.754255 +13063,NY,Fabius,42.853117,-75.983645 +13066,NY,Fayetteville,43.026774,-76.014503 +13068,NY,Freeville,42.499768,-76.363622 +13069,NY,Fulton,43.321108,-76.40342 +13071,NY,Genoa,42.674624,-76.541755 +13072,NY,Georgetown,42.763059,-75.744279 +13073,NY,Groton,42.58549,-76.363286 +13074,NY,Hannibal,43.311115,-76.546034 +13076,NY,Hastings,43.35268,-76.147708 +13077,NY,Homer,42.672586,-76.18783 +13078,NY,Jamesville,42.982973,-76.076571 +13080,NY,Jordan,43.065141,-76.45978 +13081,NY,King Ferry,42.66351,-76.621603 +13082,NY,Kirkville,43.098095,-75.955003 +13083,NY,Lacona,43.642883,-76.050335 +13084,NY,La Fayette,42.890959,-76.106116 +13085,NY,Lebanon,42.77451,-75.677585 +13088,NY,Liverpool,43.109925,-76.186999 +13090,NY,Bayberry,43.148048,-76.223269 +13092,NY,Locke,42.655789,-76.415436 +13101,NY,Mc Graw,42.594758,-76.081958 +13103,NY,Mallory,43.33782,-76.089208 +13104,NY,Manlius,42.990441,-75.970345 +13108,NY,Marcellus,42.982056,-76.33228 +13110,NY,Marietta,42.897441,-76.28055 +13111,NY,Martville,43.26608,-76.628936 +13112,NY,Memphis,43.093438,-76.40301 +13114,NY,Mexico,43.460533,-76.244588 +13116,NY,Minoa,43.077212,-76.009812 +13118,NY,Moravia,42.735456,-76.39898 +13120,NY,Nedrow,42.955855,-76.152932 +13122,NY,New Woodstock,42.844135,-75.863526 +13124,NY,North Pitcher,42.637243,-75.816359 +13126,NY,Oswego,43.443836,-76.497489 +13131,NY,Parish,43.415295,-76.100023 +13132,NY,Pennellville,43.260946,-76.239466 +13135,NY,Phoenix,43.24679,-76.306449 +13136,NY,Pitcher,42.596941,-75.846464 +13140,NY,Port Byron,43.042653,-76.644919 +13141,NY,Preble,42.79501,-76.214105 +13142,NY,Pulaski,43.55617,-76.125231 +13143,NY,Red Creek,43.229068,-76.714556 +13144,NY,Richland,43.577578,-76.002918 +13145,NY,Sandy Creek,43.651681,-76.126439 +13146,NY,Savannah,43.093439,-76.75647 +13147,NY,Venice Center,42.778472,-76.574175 +13148,NY,Seneca Falls,42.909377,-76.792538 +13152,NY,Skaneateles,42.925751,-76.405174 +13155,NY,South Otselic,42.66256,-75.766919 +13156,NY,Sterling,43.329578,-76.674731 +13158,NY,Truxton,42.708547,-76.018946 +13159,NY,Tully,42.806977,-76.13936 +13160,NY,Union Springs,42.833546,-76.673959 +13164,NY,Warners,43.09317,-76.290413 +13165,NY,Waterloo,42.904515,-76.875498 +13166,NY,Weedsport,43.048882,-76.542502 +13167,NY,West Monroe,43.288235,-76.079747 +13202,NY,Syracuse,43.040988,-76.148856 +13203,NY,Syracuse,43.060703,-76.136931 +13204,NY,Syracuse,43.044398,-76.175767 +13205,NY,Syracuse,43.012314,-76.14518 +13206,NY,Syracuse,43.06773,-76.110226 +13207,NY,Syracuse,43.019482,-76.16501 +13208,NY,Syracuse,43.073007,-76.148616 +13209,NY,Solvay,43.078204,-76.238448 +13210,NY,Syracuse,43.035414,-76.128166 +13211,NY,Mattydale,43.09951,-76.142181 +13212,NY,North Syracuse,43.130623,-76.137295 +13214,NY,De Witt,43.042529,-76.07844 +13215,NY,Onondaga,42.997544,-76.211851 +13219,NY,Syracuse,43.040943,-76.226159 +13224,NY,Syracuse,43.042134,-76.104609 +13301,NY,Alder Creek,43.415659,-75.213748 +13302,NY,Altmar,43.497022,-75.971934 +13303,NY,Ava,43.344519,-75.450919 +13304,NY,Barneveld,43.223697,-75.161156 +13308,NY,Blossvale,43.230293,-75.687313 +13309,NY,Boonville,43.478615,-75.343973 +13310,NY,Bouckville,42.894024,-75.567841 +13314,NY,Brookfield,42.807538,-75.343859 +13315,NY,Burlington Flats,42.75162,-75.169044 +13316,NY,Camden,43.339197,-75.754258 +13317,NY,Ames,42.88239,-74.583522 +13318,NY,Cassville,42.906931,-75.260704 +13319,NY,Chadwicks,43.022563,-75.265645 +13320,NY,Cherry Valley,42.782315,-74.744439 +13322,NY,Clayville,42.97119,-75.206126 +13323,NY,Clinton,43.05856,-75.38079 +13324,NY,Cold Brook,43.302391,-74.997651 +13325,NY,Constableville,43.562982,-75.458406 +13326,NY,Cooperstown,42.70319,-74.918148 +13327,NY,Croghan,43.909461,-75.354192 +13328,NY,Deansboro,42.981788,-75.438309 +13329,NY,Dolgeville,43.104161,-74.764305 +13331,NY,Eagle Bay,43.723659,-74.965381 +13332,NY,Earlville,42.752218,-75.541653 +13333,NY,East Springfield,42.832947,-74.759741 +13334,NY,Eaton,42.848417,-75.631359 +13335,NY,Edmeston,42.730281,-75.252522 +13337,NY,Fly Creek,42.725177,-74.986921 +13338,NY,Forestport,43.473651,-75.178742 +13339,NY,Fort Plain,42.937158,-74.643298 +13340,NY,Frankfort,43.044041,-75.107155 +13342,NY,Garrattsville,42.635634,-75.232701 +13343,NY,Glenfield,43.732306,-75.366902 +13345,NY,Greig,43.689184,-75.312393 +13346,NY,Hamilton,42.82306,-75.543382 +13348,NY,Hartwick,42.695033,-75.055009 +13350,NY,Herkimer,43.030696,-74.98757 +13353,NY,Hoffmeister,43.391545,-74.739974 +13354,NY,Holland Patent,43.248406,-75.253506 +13355,NY,Hubbardsville,42.823663,-75.436707 +13357,NY,Ilion,43.006391,-75.04836 +13360,NY,Inlet,43.748024,-74.784631 +13361,NY,Jordanville,42.89478,-74.820919 +13363,NY,Lee Center,43.314804,-75.505532 +13365,NY,Little Falls,43.047371,-74.860598 +13367,NY,Beaver River,43.801055,-75.475378 +13368,NY,Lyons Falls,43.626165,-75.355312 +13401,NY,Mc Connellsville,43.289552,-75.652477 +13402,NY,Madison,42.896854,-75.507562 +13403,NY,Marcy,43.163926,-75.278335 +13406,NY,Middleville,43.136933,-74.923978 +13407,NY,Mohawk,42.989986,-74.985298 +13408,NY,Morrisville,42.910805,-75.648656 +13409,NY,Munnsville,42.986326,-75.594032 +13411,NY,New Berlin,42.622414,-75.347406 +13413,NY,New Hartford,43.065412,-75.290551 +13415,NY,New Lisbon,42.578968,-75.327436 +13416,NY,Newport,43.180002,-74.986133 +13417,NY,New York Mills,43.100038,-75.29369 +13418,NY,North Brookfield,42.850088,-75.381489 +13420,NY,Old Forge,43.74347,-74.893511 +13421,NY,Oneida,43.086248,-75.650814 +13424,NY,Oriskany,43.152427,-75.343437 +13425,NY,Oriskany Falls,42.957585,-75.483807 +13428,NY,Palatine Bridge,42.922119,-74.570825 +13431,NY,Poland,43.211458,-75.07313 +13433,NY,Port Leyden,43.580245,-75.326257 +13436,NY,Raquette Lake,43.866224,-74.537959 +13437,NY,Redfield,43.565794,-75.82423 +13438,NY,Remsen,43.338456,-75.161618 +13439,NY,Richfield Spring,42.850298,-74.992214 +13440,NY,Rome,43.219349,-75.449758 +13450,NY,Roseboom,42.788246,-74.74161 +13452,NY,Saint Johnsville,43.016995,-74.64604 +13454,NY,Salisbury Center,43.162509,-74.780932 +13456,NY,Sauquoit,43.007291,-75.26259 +13459,NY,Sharon Springs,42.763357,-74.591911 +13460,NY,Sherburne,42.685885,-75.483027 +13461,NY,Sherrill,43.070397,-75.598975 +13464,NY,Smyrna,42.689565,-75.612124 +13466,NY,South Edmeston,42.676754,-75.262919 +13468,NY,Springfield Cent,42.850106,-74.938051 +13469,NY,Stittville,43.222889,-75.289854 +13470,NY,Stratford,43.179101,-74.676786 +13471,NY,Taberg,43.336571,-75.602706 +13473,NY,Turin,43.644074,-75.413199 +13475,NY,Van Hornesville,42.894812,-74.834662 +13476,NY,Vernon,43.094509,-75.56272 +13477,NY,Vernon Center,43.044309,-75.521028 +13478,NY,Verona,43.147311,-75.572399 +13480,NY,Waterville,42.933244,-75.381466 +13482,NY,West Burlington,42.706229,-75.190603 +13483,NY,Westdale,43.411671,-75.822587 +13485,NY,West Edmeston,42.794543,-75.303723 +13486,NY,Westernville,43.329413,-75.315118 +13488,NY,Westford,42.503512,-75.100378 +13489,NY,West Leyden,43.459713,-75.512707 +13490,NY,Westmoreland,43.101686,-75.453259 +13491,NY,West Winfield,42.882566,-75.183491 +13492,NY,Whitesboro,43.115805,-75.309479 +13493,NY,Williamstown,43.410559,-75.904411 +13494,NY,Woodgate,43.54881,-75.119111 +13495,NY,Yorkville,43.111582,-75.275565 +13501,NY,Utica,43.087112,-75.231463 +13502,NY,Utica,43.106723,-75.231383 +13601,NY,Watertown,43.974258,-75.912212 +13602,NY,Fort Drum,44.035434,-75.753972 +13603,NY,Fort Drum,44.072122,-75.791884 +13605,NY,Smithville,43.81614,-76.054302 +13606,NY,Adams Center,43.863106,-76.00415 +13607,NY,Point Vivian,44.326982,-75.930619 +13608,NY,Antwerp,44.235775,-75.600484 +13611,NY,Belleville,43.785373,-76.115053 +13612,NY,Black River,44.004156,-75.795777 +13613,NY,Brasher Falls,44.846718,-74.747303 +13614,NY,Brier Hill,44.552542,-75.672203 +13616,NY,Calcium,44.026484,-75.849884 +13617,NY,Canton,44.592442,-75.162792 +13618,NY,Cape Vincent,44.124419,-76.316443 +13619,NY,Carthage,43.981039,-75.616008 +13620,NY,Castorland,43.88432,-75.460432 +13621,NY,Chase Mills,44.867246,-75.073002 +13622,NY,Chaumont,44.08481,-76.123163 +13624,NY,Frontenac,44.217016,-76.107056 +13625,NY,Colton,44.50156,-74.932672 +13626,NY,Copenhagen,43.880136,-75.683913 +13630,NY,De Kalb Junction,44.489551,-75.287088 +13633,NY,De Peyster,44.541341,-75.432814 +13634,NY,Dexter,44.006923,-76.06499 +13635,NY,Edwards,44.311048,-75.252226 +13636,NY,Ellisburg,43.737202,-76.125871 +13637,NY,Evans Mills,44.081668,-75.830516 +13638,NY,Felts Mills,44.020374,-75.752443 +13642,NY,Gouverneur,44.328302,-75.465061 +13646,NY,Hammond,44.450155,-75.672749 +13648,NY,Harrisville,44.161294,-75.325151 +13650,NY,Henderson,43.846742,-76.235212 +13652,NY,Hermon,44.444845,-75.198664 +13654,NY,Heuvelton,44.593034,-75.420345 +13655,NY,Hogansburg,44.982511,-74.662649 +13656,NY,La Fargeville,44.198709,-75.956902 +13658,NY,Lisbon,44.718424,-75.269364 +13659,NY,Lorraine,43.756845,-75.905339 +13660,NY,Madrid,44.768978,-75.14134 +13661,NY,Mannsville,43.717905,-76.08203 +13662,NY,Massena,44.932411,-74.886205 +13665,NY,Natural Bridge,44.062982,-75.503883 +13666,NY,Newton Falls,44.198584,-74.98456 +13667,NY,Norfolk,44.84235,-74.957736 +13668,NY,Norwood,44.747193,-74.999188 +13669,NY,Ogdensburg,44.690203,-75.477403 +13670,NY,Oswegatchie,44.193328,-75.065947 +13672,NY,Parishville,44.592655,-74.794062 +13673,NY,Philadelphia,44.158896,-75.709917 +13675,NY,Plessis,44.277364,-75.849577 +13676,NY,Potsdam,44.659246,-74.968076 +13679,NY,Redwood,44.321077,-75.814975 +13680,NY,Rensselaer Falls,44.590635,-75.32261 +13681,NY,Richville,44.40454,-75.402455 +13682,NY,Rodman,43.862217,-75.871879 +13684,NY,Degrasse,44.380668,-75.113778 +13685,NY,Sackets Harbor,43.93983,-76.105039 +13687,NY,South Colton,44.504097,-74.860726 +13690,NY,Star Lake,44.157762,-75.033015 +13691,NY,Theresa,44.211288,-75.801419 +13693,NY,Three Mile Bay,44.055102,-76.26893 +13694,NY,Waddington,44.856373,-75.204887 +13695,NY,Wanakena,44.2184,-75.090765 +13696,NY,West Stockholm,44.728951,-74.891932 +13697,NY,Winthrop,44.758289,-74.806586 +13698,NY,Woodville,43.781245,-76.172002 +13730,NY,Afton,42.241737,-75.536604 +13731,NY,Andes,42.156925,-74.788726 +13732,NY,Apalachin,42.055579,-76.15194 +13733,NY,Bainbridge,42.311975,-75.489411 +13734,NY,Barton,42.069534,-76.398349 +13736,NY,Berkshire,42.307435,-76.192008 +13739,NY,Bloomville,42.352236,-74.807118 +13740,NY,Bovina Center,42.27094,-74.766112 +13743,NY,Candor,42.206274,-76.332196 +13744,NY,Castle Creek,42.256805,-75.908746 +13746,NY,Chenango Forks,42.263659,-75.824236 +13748,NY,Conklin,42.045429,-75.807624 +13750,NY,Davenport,42.471081,-74.835709 +13751,NY,Davenport Center,42.452303,-74.906975 +13752,NY,De Lancey,42.188984,-74.922899 +13753,NY,Meredith,42.287851,-74.922823 +13754,NY,Deposit,42.066581,-75.428745 +13755,NY,Downsville,42.071634,-75.015216 +13756,NY,East Branch,41.984366,-75.125189 +13757,NY,East Meredith,42.410098,-74.898699 +13760,NY,Endwell,42.114089,-76.056927 +13775,NY,Franklin,42.342117,-75.148475 +13776,NY,Gilbertsville,42.432951,-75.360929 +13777,NY,Glen Aubrey,42.257289,-75.980544 +13778,NY,Greene,42.337301,-75.75954 +13780,NY,Guilford,42.426901,-75.482318 +13782,NY,Hamden,42.17873,-74.998391 +13783,NY,Cadosia,41.959667,-75.265306 +13786,NY,Harpersfield,42.449901,-74.687059 +13787,NY,Harpursville,42.18232,-75.654538 +13788,NY,Hobart,42.359409,-74.675889 +13790,NY,Johnson City,42.126683,-75.968492 +13795,NY,Kirkwood,42.069463,-75.796711 +13796,NY,Laurens,42.538261,-75.127947 +13797,NY,Lisle,42.340923,-76.030237 +13801,NY,Mc Donough,42.506807,-75.762305 +13802,NY,Maine,42.196204,-76.059526 +13803,NY,Marathon,42.452725,-76.039526 +13804,NY,Masonville,42.262346,-75.215485 +13806,NY,Meridale,42.377987,-74.980258 +13807,NY,Milford,42.614801,-74.968498 +13808,NY,Morris,42.547807,-75.244764 +13809,NY,Mount Upton,42.408064,-75.400268 +13810,NY,Mount Vision,42.606763,-75.126366 +13811,NY,Newark Valley,42.228136,-76.16248 +13812,NY,Nichols,42.031961,-76.361039 +13813,NY,Nineveh,42.162481,-75.548409 +13815,NY,Norwich,42.54145,-75.527431 +13820,NY,Oneonta,42.462453,-75.049072 +13825,NY,Otego,42.41333,-75.207883 +13826,NY,Ouaquaga,42.119293,-75.647351 +13827,NY,Owego,42.113809,-76.252797 +13830,NY,Brisben,42.443375,-75.606256 +13832,NY,Plymouth,42.633592,-75.617163 +13833,NY,Sanitaria Spring,42.195735,-75.790978 +13834,NY,Portlandville,42.510303,-74.976059 +13835,NY,Richford,42.394521,-76.186501 +13838,NY,Sidney,42.307368,-75.3908 +13839,NY,Sidney Center,42.244085,-75.287057 +13841,NY,Smithville Flats,42.398894,-75.823719 +13842,NY,South Kortright,42.376994,-74.725901 +13843,NY,South New Berlin,42.530569,-75.35249 +13844,NY,South Plymouth,42.605254,-75.633 +13846,NY,Treadwell,42.362963,-75.058754 +13849,NY,Unadilla,42.325199,-75.336589 +13850,NY,Vestal,42.077106,-76.011757 +13856,NY,Walton,42.175647,-75.153177 +13859,NY,Wells Bridge,42.357973,-75.256565 +13861,NY,West Oneonta,42.453854,-75.095689 +13862,NY,Whitney Point,42.338449,-75.952231 +13863,NY,Willet,42.452044,-75.901434 +13864,NY,Willseyville,42.302915,-76.389721 +13865,NY,Windsor,42.074482,-75.672828 +13901,NY,Binghamton,42.146307,-75.886517 +13903,NY,Binghamton,42.081102,-75.897676 +13904,NY,Binghamton,42.11714,-75.865269 +13905,NY,Binghamton,42.115051,-75.930865 +14001,NY,Akron,43.024944,-78.508365 +14003,NY,Alabama,43.071888,-78.385231 +14004,NY,Alden,42.89839,-78.525707 +14005,NY,Alexander,42.915851,-78.25889 +14006,NY,Angola,42.636581,-79.049651 +14008,NY,Appleton,43.310535,-78.637217 +14009,NY,Arcade,42.562995,-78.413418 +14011,NY,Attica,42.849918,-78.279826 +14012,NY,Barker,43.336779,-78.542004 +14013,NY,Basom,43.080724,-78.395143 +14020,NY,Batavia,43.000316,-78.192869 +14024,NY,Bliss,42.579936,-78.258084 +14025,NY,Boston,42.631384,-78.73909 +14026,NY,Bowmansville,42.947826,-78.682961 +14028,NY,Burt,43.322089,-78.714097 +14030,NY,Chaffee,42.560492,-78.502543 +14031,NY,Clarence,42.980965,-78.616228 +14032,NY,Clarence Center,43.0362,-78.63903 +14033,NY,Colden,42.655052,-78.692078 +14034,NY,Collins,42.500082,-78.892974 +14036,NY,Corfu,42.977734,-78.392906 +14037,NY,Cowlesville,42.811245,-78.448136 +14039,NY,Dale,42.826284,-78.174865 +14040,NY,Darien Center,42.894806,-78.387782 +14041,NY,Dayton,42.423075,-78.981842 +14042,NY,Delevan,42.492598,-78.479326 +14043,NY,Depew,42.904973,-78.704052 +14047,NY,Derby,42.697445,-78.983365 +14048,NY,Van Buren Bay,42.475907,-79.329366 +14051,NY,Swormville,43.029168,-78.705035 +14052,NY,East Aurora,42.770138,-78.601992 +14054,NY,East Bethany,42.916619,-78.134206 +14055,NY,East Concord,42.546585,-78.610972 +14057,NY,Eden,42.650552,-78.878077 +14058,NY,Elba,43.089739,-78.170383 +14059,NY,Elma,42.834002,-78.634257 +14060,NY,Farmersville Sta,42.44827,-78.291533 +14062,NY,Forestville,42.448229,-79.160743 +14063,NY,Fredonia,42.433345,-79.333914 +14065,NY,Freedom,42.489693,-78.35013 +14066,NY,Gainesville,42.61897,-78.179516 +14067,NY,Gasport,43.210587,-78.574536 +14068,NY,Getzville,43.023989,-78.753184 +14069,NY,Glenwood,42.600094,-78.638634 +14070,NY,Gowanda,42.471202,-78.933902 +14072,NY,Grand Island,43.018266,-78.959059 +14075,NY,Hamburg,42.733404,-78.838853 +14080,NY,Holland,42.639582,-78.543889 +14081,NY,Irving,42.573866,-79.059634 +14082,NY,Java Center,42.66342,-78.392527 +14083,NY,Java Village,42.676852,-78.44101 +14085,NY,Lake View,42.721535,-78.932693 +14086,NY,Lancaster,42.901681,-78.663085 +14091,NY,Lawtons,42.540364,-78.921222 +14092,NY,Lewiston,43.172165,-79.021547 +14094,NY,Lockport,43.159987,-78.692344 +14098,NY,Lyndonville,43.323312,-78.381057 +14101,NY,Machias,42.408271,-78.50586 +14102,NY,Marilla,42.833216,-78.558656 +14103,NY,Medina,43.218428,-78.387422 +14105,NY,Middleport,43.218257,-78.484055 +14108,NY,Newfane,43.272443,-78.706972 +14111,NY,North Collins,42.589648,-78.91073 +14113,NY,North Java,42.677631,-78.337958 +14120,NY,North Tonawanda,43.049828,-78.850997 +14125,NY,Oakfield,43.071726,-78.270179 +14127,NY,Orchard Park,42.763891,-78.751834 +14129,NY,Perrysburg,42.472289,-78.998108 +14131,NY,Ransomville,43.228602,-78.898159 +14132,NY,Sanborn,43.141879,-78.878522 +14134,NY,Sardinia,42.532976,-78.506415 +14136,NY,Silver Creek,42.535675,-79.162805 +14138,NY,South Dayton,42.371803,-79.050132 +14139,NY,South Wales,42.706271,-78.545219 +14141,NY,Springville,42.519982,-78.684717 +14143,NY,Stafford,42.982894,-78.089783 +14145,NY,Strykersville,42.724892,-78.434714 +14150,NY,Tonawanda,43.002837,-78.85472 +14167,NY,Varysburg,42.745935,-78.316749 +14170,NY,West Falls,42.70532,-78.677937 +14171,NY,West Valley,42.43153,-78.627978 +14172,NY,Wilson,43.29681,-78.824396 +14174,NY,Youngstown,43.246075,-79.024545 +14201,NY,Buffalo,42.896659,-78.884575 +14202,NY,Buffalo,42.887038,-78.877948 +14203,NY,Buffalo,42.893938,-78.868143 +14204,NY,Buffalo,42.883978,-78.859736 +14206,NY,Buffalo,42.881132,-78.810375 +14207,NY,Buffalo,42.949062,-78.897815 +14208,NY,Buffalo,42.915416,-78.850487 +14209,NY,Buffalo,42.913,-78.865629 +14210,NY,Buffalo,42.861432,-78.82055 +14211,NY,Buffalo,42.908153,-78.822477 +14212,NY,Buffalo,42.894553,-78.824458 +14213,NY,Buffalo,42.916675,-78.889461 +14214,NY,Buffalo,42.941429,-78.837403 +14215,NY,Buffalo,42.933536,-78.811504 +14216,NY,Buffalo,42.949914,-78.859865 +14217,NY,Kenmore,42.968618,-78.872948 +14218,NY,Lackawanna,42.818301,-78.817263 +14219,NY,Blasdell,42.790039,-78.822228 +14220,NY,Buffalo,42.844138,-78.818205 +14221,NY,Williamsville,42.985621,-78.738044 +14222,NY,Buffalo,42.916401,-78.876333 +14223,NY,Buffalo,42.973088,-78.845 +14224,NY,West Seneca,42.836162,-78.75109 +14225,NY,Cheektowaga,42.928642,-78.760855 +14226,NY,Amherst,42.967232,-78.799849 +14227,NY,Cheektowaga,42.877467,-78.741936 +14228,NY,Amherst,43.018414,-78.774604 +14301,NY,Niagara Falls,43.095467,-79.041443 +14303,NY,Niagara Falls,43.087777,-79.036958 +14304,NY,Niagara Falls,43.090844,-78.964375 +14305,NY,Niagara Falls,43.114648,-79.037804 +14410,NY,Adams Basin,43.190644,-77.853905 +14411,NY,Albion,43.239827,-78.206846 +14414,NY,Avon,42.903034,-77.727398 +14415,NY,Bellona,42.755442,-77.021737 +14416,NY,Bergen,43.086937,-77.96033 +14418,NY,Branchport,42.606537,-77.205165 +14420,NY,Brockport,43.21284,-77.936797 +14422,NY,Byron,43.073794,-78.062912 +14423,NY,Caledonia,42.956661,-77.849295 +14424,NY,Canandaigua,42.868866,-77.284561 +14425,NY,Canandaigua,42.959591,-77.341139 +14427,NY,Castile,42.635883,-78.054728 +14428,NY,Clifton,43.089617,-77.860339 +14432,NY,Clifton Springs,42.963175,-77.143975 +14433,NY,Clyde,43.085549,-76.872464 +14435,NY,Conesus,42.721643,-77.67469 +14437,NY,Dansville,42.569975,-77.710907 +14441,NY,Dresden,42.684565,-76.956389 +14445,NY,East Rochester,43.112808,-77.490596 +14450,NY,Fairport,43.089198,-77.435956 +14454,NY,Geneseo,42.793783,-77.799552 +14456,NY,Geneva,42.86372,-76.991349 +14462,NY,Groveland,42.676046,-77.757334 +14464,NY,Hamlin,43.307577,-77.926996 +14466,NY,Hemlock,42.779957,-77.58199 +14467,NY,Henrietta,43.048264,-77.612224 +14468,NY,Hilton,43.292344,-77.790511 +14469,NY,Bloomfield,42.885101,-77.459983 +14470,NY,Hulberton,43.225494,-78.040392 +14471,NY,Honeoye,42.768637,-77.505434 +14472,NY,Honeoye Falls,42.969499,-77.57812 +14475,NY,Ionia,42.938002,-77.50086 +14476,NY,Kendall,43.328415,-78.030359 +14477,NY,Kent,43.334064,-78.135533 +14478,NY,Bluff Point,42.601032,-77.105197 +14480,NY,Lakeville,42.82957,-77.714865 +14481,NY,Leicester,42.773903,-77.898976 +14482,NY,Le Roy,42.977377,-77.985097 +14485,NY,Lima,42.901234,-77.608305 +14486,NY,Linwood,42.884721,-77.910422 +14487,NY,Livonia,42.813514,-77.663472 +14489,NY,Lyons,43.07768,-76.989575 +14502,NY,Macedon,43.078366,-77.337199 +14504,NY,Manchester,42.969874,-77.229733 +14505,NY,Marion,43.154612,-77.186277 +14506,NY,Mendon,42.995307,-77.50013 +14507,NY,Middlesex,42.697624,-77.280509 +14510,NY,Tuscarora,42.705431,-77.861083 +14512,NY,Naples,42.640425,-77.390106 +14513,NY,Newark,43.051909,-77.094602 +14514,NY,North Chili,43.118601,-77.800518 +14516,NY,North Rose,43.196439,-76.915152 +14517,NY,Nunda,42.586708,-77.918006 +14519,NY,Ontario,43.229092,-77.308781 +14521,NY,Hayt Corners,42.676979,-76.821575 +14522,NY,Palmyra,43.062192,-77.221798 +14525,NY,Linwood,42.880088,-78.014698 +14526,NY,Penfield,43.139638,-77.456043 +14527,NY,Penn Yan,42.664548,-77.05687 +14530,NY,Perry,42.722852,-78.005882 +14532,NY,Phelps,42.958178,-77.047264 +14533,NY,Wadsworth,42.84269,-77.882545 +14534,NY,Pittsford,43.069511,-77.514067 +14536,NY,Portageville,42.556957,-78.085635 +14541,NY,Mac Dougall,42.761378,-76.853582 +14543,NY,West Rush,42.998934,-77.665381 +14544,NY,Rushville,42.75973,-77.239538 +14545,NY,Scottsburg,42.658907,-77.682633 +14546,NY,Scottsville,43.02462,-77.774256 +14548,NY,Shortsville,42.969034,-77.227312 +14550,NY,Rock Glen,42.669446,-78.092994 +14551,NY,Sodus,43.221681,-77.05141 +14555,NY,Sodus Point,43.265058,-76.98833 +14559,NY,Spencerport,43.189502,-77.804333 +14560,NY,Springwater,42.677598,-77.577503 +14561,NY,Stanley,42.830277,-77.120702 +14564,NY,Victor,42.986597,-77.417982 +14568,NY,Walworth,43.140161,-77.28582 +14569,NY,Warsaw,42.741035,-78.142899 +14571,NY,Waterport,43.332563,-78.242958 +14572,NY,Wayland,42.559274,-77.590613 +14580,NY,Webster,43.219563,-77.461587 +14586,NY,West Henrietta,43.039667,-77.687131 +14589,NY,Williamson,43.242071,-77.170011 +14590,NY,Wolcott,43.234129,-76.821748 +14591,NY,Wyoming,42.83175,-78.083292 +14604,NY,Rochester,43.157729,-77.607978 +14605,NY,Rochester,43.169758,-77.600711 +14606,NY,Rochester,43.168455,-77.684488 +14607,NY,Rochester,43.150086,-77.588976 +14608,NY,Rochester,43.152144,-77.625803 +14609,NY,Rochester,43.174001,-77.563701 +14610,NY,Rochester,43.14524,-77.549501 +14611,NY,Rochester,43.148375,-77.639353 +14612,NY,Rochester,43.256576,-77.665228 +14613,NY,Rochester,43.18308,-77.639276 +14614,NY,Rochester,43.155823,-77.61419 +14615,NY,Rochester,43.20575,-77.652118 +14616,NY,Greece,43.232359,-77.651238 +14617,NY,Rochester,43.220258,-77.599442 +14618,NY,Twelve Corners,43.115416,-77.558801 +14619,NY,Rochester,43.136685,-77.6481 +14620,NY,Rochester,43.131711,-77.606239 +14621,NY,Rochester,43.183362,-77.604284 +14622,NY,Rochester,43.213959,-77.55549 +14623,NY,Rochester,43.083371,-77.634412 +14624,NY,Westgate,43.12589,-77.733552 +14625,NY,Panorama,43.14949,-77.503188 +14626,NY,Rochester,43.21257,-77.703996 +14701,NY,Jamestown,42.092845,-79.243989 +14706,NY,Allegany,42.091827,-78.499883 +14708,NY,Alma,42.016859,-78.040012 +14709,NY,Angelica,42.326339,-77.994671 +14710,NY,Ashville,42.108376,-79.405624 +14711,NY,Belfast,42.320013,-78.094281 +14712,NY,Bemus Point,42.151346,-79.35808 +14714,NY,Black Creek,42.285528,-78.231249 +14715,NY,Bolivar,42.070442,-78.144834 +14716,NY,Brocton,42.393973,-79.43443 +14717,NY,Caneadea,42.370304,-78.197321 +14718,NY,Cassadaga,42.350356,-79.299282 +14719,NY,Cattaraugus,42.333291,-78.888528 +14721,NY,Ceres,41.99939,-78.272686 +14723,NY,Cherry Creek,42.312725,-79.120275 +14724,NY,Clymer,42.055699,-79.668532 +14726,NY,Conewango Valley,42.262467,-79.021956 +14727,NY,Cuba,42.18819,-78.275074 +14728,NY,Dewittville,42.239413,-79.419303 +14729,NY,East Otto,42.3971,-78.743167 +14731,NY,Ellicottville,42.295873,-78.66064 +14733,NY,Falconer,42.123915,-79.189499 +14735,NY,Fillmore,42.463605,-78.106232 +14736,NY,Findley Lake,42.120401,-79.734908 +14737,NY,Franklinville,42.338823,-78.440043 +14738,NY,Frewsburg,42.052753,-79.131797 +14739,NY,Friendship,42.190666,-78.13588 +14740,NY,Gerry,42.214728,-79.164865 +14741,NY,Great Valley,42.208292,-78.620811 +14743,NY,Ischua,42.179747,-78.400611 +14744,NY,Houghton,42.411567,-78.109506 +14747,NY,Kennedy,42.150776,-79.096416 +14748,NY,Kill Buck,42.141005,-78.642604 +14750,NY,Lakewood,42.097256,-79.329124 +14753,NY,Limestone,42.063945,-78.631979 +14754,NY,Little Genesee,42.023964,-78.235056 +14755,NY,Little Valley,42.254121,-78.809286 +14757,NY,Mayville,42.240906,-79.496325 +14760,NY,Olean,42.0787,-78.423265 +14767,NY,Panama,42.056965,-79.481536 +14769,NY,Portland,42.385792,-79.458894 +14770,NY,Portville,42.027253,-78.331353 +14772,NY,Randolph,42.163143,-78.960034 +14775,NY,Ripley,42.248175,-79.712103 +14777,NY,Rushford,42.417216,-78.186704 +14779,NY,Salamanca,42.16035,-78.73042 +14781,NY,Sherman,42.163124,-79.585742 +14782,NY,Sinclairville,42.24548,-79.267297 +14784,NY,Stockton,42.318195,-79.375792 +14787,NY,Westfield,42.321977,-79.572646 +14801,NY,Addison,42.09825,-77.266027 +14802,NY,Alfred,42.255165,-77.79295 +14803,NY,Alfred Station,42.255799,-77.778084 +14804,NY,Almond,42.316036,-77.777965 +14805,NY,Alpine,42.351014,-76.734775 +14806,NY,Andover,42.157454,-77.792008 +14807,NY,Arkport,42.422466,-77.691778 +14808,NY,Atlanta,42.556269,-77.480091 +14809,NY,Wallace,42.41513,-77.434254 +14810,NY,Veterans Adminis,42.345451,-77.323255 +14812,NY,Beaver Dams,42.279763,-76.971953 +14813,NY,Belmont,42.233409,-78.01103 +14814,NY,Big Flats,42.145509,-76.952721 +14815,NY,Bradford,42.382517,-77.09134 +14816,NY,Breesport,42.19392,-76.73612 +14817,NY,Brooktondale,42.37653,-76.366844 +14818,NY,Burdett,42.439442,-76.829219 +14819,NY,Cameron,42.21284,-77.440341 +14820,NY,Cameron Mills,42.192547,-77.364976 +14821,NY,Campbell,42.238569,-77.206619 +14822,NY,Canaseraga,42.458504,-77.795374 +14823,NY,Canisteo,42.263503,-77.589706 +14824,NY,Cayuta,42.277445,-76.697367 +14825,NY,Chemung,42.039243,-76.620224 +14826,NY,Cohocton,42.500315,-77.499763 +14830,NY,Corning,42.138331,-77.047546 +14836,NY,Dalton,42.544895,-77.928889 +14837,NY,Dundee,42.505261,-77.002773 +14838,NY,Erin,42.185898,-76.681942 +14839,NY,Greenwood,42.139809,-77.636041 +14840,NY,Hammondsport,42.431217,-77.197702 +14841,NY,Hector,42.49658,-76.878597 +14842,NY,Himrod,42.594455,-76.950774 +14843,NY,Hornell,42.327393,-77.656907 +14845,NY,Horseheads,42.180493,-76.834539 +14846,NY,Hunt,42.538821,-77.981839 +14847,NY,Interlaken,42.616524,-76.726798 +14850,NY,Ithaca College,42.448497,-76.492911 +14853,NY,Ithaca,42.443087,-76.488707 +14855,NY,Jasper,42.128962,-77.499909 +14858,NY,Lindley,42.042483,-77.154132 +14859,NY,Lockwood,42.114943,-76.536618 +14860,NY,Lodi,42.596555,-76.833904 +14861,NY,Lowman,42.06938,-76.693005 +14864,NY,Millport,42.258084,-76.839233 +14865,NY,Montour Falls,42.343678,-76.839581 +14867,NY,Newfield,42.362137,-76.591978 +14869,NY,Odessa,42.360947,-76.771698 +14870,NY,Painted Post,42.170967,-77.119375 +14871,NY,Pine City,42.041938,-76.881519 +14872,NY,Pine Valley,42.234795,-76.865206 +14873,NY,Prattsburg,42.526918,-77.282455 +14874,NY,Pulteney,42.523275,-77.169108 +14877,NY,Rexville,42.072645,-77.676663 +14878,NY,Rock Stream,42.448511,-76.936436 +14879,NY,Savona,42.30407,-77.208345 +14880,NY,Scio,42.169703,-77.990026 +14881,NY,Slaterville Spri,42.401119,-76.315677 +14882,NY,Lansing,42.564494,-76.537455 +14883,NY,Spencer,42.246736,-76.489853 +14884,NY,Swain,42.477314,-77.88899 +14885,NY,Troupsburg,42.050083,-77.550208 +14886,NY,Trumansburg,42.520987,-76.668145 +14888,NY,Valois,42.524304,-76.860879 +14889,NY,Van Etten,42.208455,-76.571663 +14891,NY,Watkins Glen,42.377121,-76.90215 +14892,NY,Waverly,42.017228,-76.533308 +14894,NY,Wellsburg,42.027317,-76.772315 +14895,NY,Wellsville,42.110757,-77.94191 +14897,NY,Whitesville,42.045586,-77.810615 +14898,NY,Woodhull,42.073638,-77.420333 +14901,NY,Elmira,42.100769,-76.811977 +14903,NY,Elmira Heights,42.130203,-76.843572 +14904,NY,Elmira,42.072866,-76.803735 +14905,NY,Elmira,42.086919,-76.839686 +27006,NC,Advance,36.006496,-80.446301 +27007,NC,Ararat,36.386932,-80.608887 +27009,NC,Belews Creek,36.226874,-80.092988 +27011,NC,Boonville,36.234012,-80.63569 +27012,NC,Clemmons,36.034112,-80.39623 +27013,NC,Cleveland,35.737397,-80.711254 +27016,NC,Danbury,36.455857,-80.219354 +27017,NC,Dobson,36.369826,-80.710065 +27018,NC,East Bend,36.203152,-80.528405 +27019,NC,Germanton,36.272513,-80.225432 +27020,NC,Hamptonville,36.124248,-80.813687 +27021,NC,King,36.295033,-80.355957 +27022,NC,Lawsonville,36.513228,-80.210291 +27023,NC,Lewisville,36.0967,-80.420638 +27024,NC,Lowgap,36.503041,-80.788862 +27025,NC,Madison,36.369507,-79.965438 +27027,NC,Mayodan,36.427677,-79.956742 +27028,NC,Mocksville,35.922007,-80.536965 +27030,NC,Mount Airy,36.500739,-80.611871 +27040,NC,Pfafftown,36.166914,-80.379826 +27041,NC,Pilot Mountain,36.41094,-80.492065 +27042,NC,Pine Hall,36.348178,-80.049533 +27043,NC,Pinnacle,36.333905,-80.439111 +27045,NC,Rural Hall,36.229251,-80.293643 +27046,NC,Sandy Ridge,36.489973,-80.085857 +27047,NC,Siloam,36.300208,-80.577162 +27048,NC,Stoneville,36.470483,-79.901297 +27050,NC,Tobaccoville,36.233627,-80.391549 +27051,NC,Walkertown,36.179999,-80.162865 +27052,NC,Walnut Cove,36.318872,-80.148414 +27053,NC,Westfield,36.467405,-80.367739 +27054,NC,Woodleaf,35.787564,-80.603941 +27055,NC,Yadkinville,36.127694,-80.65302 +27101,NC,Winston Salem,36.10237,-80.222798 +27103,NC,Winston Salem,36.067127,-80.302509 +27104,NC,Winston Salem,36.091985,-80.322423 +27105,NC,Winston Salem,36.144039,-80.237646 +27106,NC,Winston Salem,36.142762,-80.306866 +27107,NC,Winston Salem,36.040324,-80.193265 +27127,NC,Winston Salem,36.042534,-80.260946 +27203,NC,Farmer,35.693496,-79.819678 +27207,NC,Bear Creek,35.612882,-79.372606 +27208,NC,Bennett,35.567269,-79.522524 +27209,NC,Biscoe,35.325654,-79.759555 +27212,NC,Blanch,36.533839,-79.304185 +27214,NC,Browns Summit,36.201868,-79.71008 +27215,NC,Glen Raven,36.072011,-79.462152 +27217,NC,Burlington,36.1288,-79.411447 +27229,NC,Candor,35.22335,-79.787623 +27231,NC,Cedar Grove,36.201986,-79.166588 +27233,NC,Climax,35.934512,-79.701858 +27235,NC,Colfax,36.100272,-80.010276 +27239,NC,Denton,35.619567,-80.095926 +27242,NC,Eagle Springs,35.335957,-79.630983 +27243,NC,Efland,36.091166,-79.188415 +27244,NC,Elon College,36.146638,-79.502334 +27248,NC,Franklinville,35.791739,-79.713178 +27249,NC,Gibsonville,36.118304,-79.568454 +27252,NC,Goldston,35.56428,-79.33852 +27253,NC,Graham,36.030967,-79.381384 +27258,NC,Haw River,36.055085,-79.334557 +27260,NC,High Point,35.959313,-80.011673 +27262,NC,High Point,35.973406,-80.010677 +27263,NC,Archdale,35.910757,-79.961764 +27265,NC,High Point,36.003584,-80.003571 +27278,NC,Hillsborough,36.07558,-79.091416 +27281,NC,Jackson Springs,35.225941,-79.668535 +27282,NC,Jamestown,35.998993,-79.929286 +27283,NC,Julian,35.95429,-79.638629 +27284,NC,Kernersville,36.116534,-80.083115 +27288,NC,Eden,36.500003,-79.758998 +27291,NC,Leasburg,36.415113,-79.194188 +27292,NC,Lexington,35.82306,-80.262049 +27298,NC,Liberty,35.872878,-79.582144 +27299,NC,Linwood,35.75623,-80.374895 +27301,NC,Mc Leansville,36.116291,-79.668388 +27302,NC,Mebane,36.097862,-79.271895 +27305,NC,Milton,36.515784,-79.208699 +27306,NC,Mount Gilead,35.227447,-79.98709 +27310,NC,Oak Ridge,36.167315,-79.980366 +27311,NC,Pelham,36.489912,-79.473605 +27312,NC,Pittsboro,35.769436,-79.175509 +27313,NC,Pleasant Garden,35.952243,-79.754943 +27314,NC,Prospect Hill,36.293195,-79.215644 +27315,NC,Providence,36.48314,-79.36306 +27316,NC,Coleridge,35.708349,-79.635101 +27317,NC,Randleman,35.848805,-79.801794 +27320,NC,Reidsville,36.343209,-79.664212 +27325,NC,Robbins,35.452839,-79.582034 +27326,NC,Ruffin,36.442763,-79.560551 +27330,NC,Colon,35.464148,-79.176446 +27341,NC,Seagrove,35.528309,-79.69787 +27343,NC,Semora,36.511414,-79.094168 +27344,NC,Siler City,35.735392,-79.456624 +27349,NC,Snow Camp,35.906583,-79.427893 +27350,NC,Sophia,35.829845,-79.898634 +27355,NC,Staley,35.801485,-79.584391 +27356,NC,Star,35.421113,-79.782607 +27357,NC,Stokesdale,36.255217,-79.970528 +27358,NC,Summerfield,36.224454,-79.890136 +27360,NC,Thomasville,35.87128,-80.09128 +27370,NC,Trinity,35.842949,-79.990206 +27371,NC,Troy,35.377702,-79.909252 +27376,NC,West End,35.251239,-79.53598 +27377,NC,Whitsett,36.032981,-79.597151 +27379,NC,Yanceyville,36.390695,-79.346485 +27401,NC,Greensboro,36.069741,-79.768151 +27403,NC,Greensboro,36.064147,-79.820181 +27405,NC,Greensboro,36.121408,-79.7733 +27406,NC,Greensboro,36.021969,-79.782058 +27407,NC,Greensboro,36.033442,-79.862647 +27408,NC,Greensboro,36.1064,-79.816531 +27409,NC,Greensboro,36.077683,-79.908602 +27410,NC,Greensboro,36.103164,-79.879365 +27501,NC,Angier,35.489725,-78.724931 +27502,NC,Apex,35.722504,-78.840816 +27503,NC,Bahama,36.156581,-78.890284 +27504,NC,Benson,35.403661,-78.54213 +27505,NC,Broadway,35.418088,-79.043547 +27507,NC,Bullock,36.507642,-78.56458 +27509,NC,Butner,36.135939,-78.7636 +27510,NC,Carrboro,35.912409,-79.081832 +27511,NC,Cary,35.764119,-78.778568 +27513,NC,Cary,35.795642,-78.794061 +27514,NC,Chapel Hill,35.920322,-79.037189 +27516,NC,Chapel Hill,35.916175,-79.099867 +27520,NC,Clayton,35.63484,-78.451013 +27521,NC,Coats,35.40822,-78.662704 +27522,NC,Creedmoor,36.112433,-78.647587 +27524,NC,Four Oaks,35.404017,-78.415282 +27525,NC,Franklinton,36.095505,-78.448618 +27526,NC,Fuquay Varina,35.579952,-78.790807 +27529,NC,Garner,35.681254,-78.597527 +27530,NC,Grantham,35.382585,-78.015813 +27531,NC,Seymour Johnson,35.352611,-77.964312 +27534,NC,Goldsboro,35.36643,-77.922069 +27536,NC,Henderson,36.330068,-78.398086 +27540,NC,Holly Springs,35.626263,-78.845816 +27541,NC,Hurdle Mills,36.251788,-79.08266 +27542,NC,Kenly,35.607742,-78.138227 +27544,NC,Kittrell,36.204175,-78.424073 +27545,NC,Knightdale,35.778926,-78.489814 +27546,NC,Lillington,35.331954,-78.921223 +27549,NC,Louisburg,36.05781,-78.258625 +27551,NC,Macon,36.444697,-77.998709 +27553,NC,Manson,36.460264,-78.29525 +27557,NC,Middlesex,35.766499,-78.206162 +27559,NC,Moncure,35.630615,-79.083915 +27560,NC,Morrisville,35.834371,-78.846594 +27562,NC,New Hill,35.680877,-78.936534 +27563,NC,Norlina,36.475364,-78.189455 +27565,NC,Oxford,36.331269,-78.613433 +27569,NC,Princeton,35.455833,-78.167368 +27571,NC,Rolesville,35.915575,-78.465843 +27572,NC,Rougemont,36.239251,-78.901867 +27573,NC,Roxboro,36.405902,-78.973698 +27576,NC,Selma,35.556531,-78.264025 +27577,NC,Smithfield,35.50684,-78.347866 +27581,NC,Stem,36.21004,-78.70012 +27583,NC,Timberlake,36.291763,-78.935287 +27587,NC,Wake Forest,35.981544,-78.539213 +27589,NC,Warrenton,36.353944,-78.159389 +27591,NC,Wendell,35.797964,-78.392601 +27592,NC,Willow Spring,35.547031,-78.671738 +27596,NC,Youngsville,36.007782,-78.441198 +27597,NC,Zebulon,35.832078,-78.317368 +27601,NC,Raleigh,35.772701,-78.632439 +27603,NC,Raleigh,35.707569,-78.656265 +27604,NC,Raleigh,35.833407,-78.579949 +27605,NC,Raleigh,35.790795,-78.653025 +27606,NC,Raleigh,35.764499,-78.711189 +27607,NC,Raleigh,35.801385,-78.687747 +27608,NC,Raleigh,35.807746,-78.646277 +27609,NC,Raleigh,35.847989,-78.631654 +27610,NC,Raleigh,35.766674,-78.60076 +27612,NC,Raleigh,35.851997,-78.684119 +27613,NC,Raleigh,35.894932,-78.705059 +27614,NC,Raleigh,35.945711,-78.643339 +27615,NC,Raleigh,35.888744,-78.639277 +27701,NC,Durham,35.996725,-78.896613 +27703,NC,Durham,35.978122,-78.843874 +27704,NC,Durham,36.038297,-78.876437 +27705,NC,Durham,36.021846,-78.947776 +27706,NC,Durham,36.002427,-78.937524 +27707,NC,Durham,35.963076,-78.931484 +27712,NC,Durham,36.091779,-78.929919 +27713,NC,Research Triangl,35.916105,-78.916641 +27801,NC,Rocky Mount,35.94265,-77.760816 +27803,NC,Rocky Mount,35.923784,-77.835022 +27804,NC,Wesleyan College,35.979634,-77.827543 +27805,NC,Aulander,36.147452,-77.114086 +27806,NC,Aurora,35.302282,-76.799448 +27807,NC,Bailey,35.807167,-78.089226 +27808,NC,Bath,35.470161,-76.771531 +27809,NC,Battleboro,35.84387,-77.431107 +27810,NC,Belhaven,35.520493,-76.623574 +27812,NC,Bethel,35.790885,-77.374765 +27814,NC,Blounts Creek,35.382029,-76.925004 +27816,NC,Castalia,36.090124,-78.070452 +27817,NC,Chocowinity,35.481409,-77.086801 +27818,NC,Como,36.497818,-77.051526 +27820,NC,Conway,36.416382,-77.250243 +27821,NC,Edward,35.323588,-76.879388 +27822,NC,Elm City,35.810954,-77.856032 +27823,NC,Enfield,36.197331,-77.712907 +27824,NC,Middletown,35.49806,-76.037434 +27826,NC,Fairfield,35.565873,-76.231768 +27828,NC,Farmville,35.580606,-77.579303 +27829,NC,Fountain,35.669436,-77.621448 +27830,NC,Eureka,35.518558,-77.996302 +27831,NC,Garysburg,36.476147,-77.571905 +27832,NC,Gaston,36.51153,-77.682379 +27834,NC,Greenville,35.619221,-77.397542 +27837,NC,Grimesland,35.558005,-77.256612 +27839,NC,Halifax,36.30492,-77.560725 +27840,NC,Hamilton,35.944119,-77.21762 +27842,NC,Henrico,36.527409,-77.854625 +27843,NC,Hobgood,36.004281,-77.436959 +27844,NC,Hollister,36.25898,-77.931916 +27845,NC,Jackson,36.386984,-77.468144 +27846,NC,Jamesville,35.78385,-76.898332 +27847,NC,Kelford,36.199173,-77.259214 +27848,NC,Lasker,36.376664,-77.348266 +27849,NC,Lewiston Woodvil,36.134416,-77.206631 +27850,NC,Littleton,36.416877,-77.852815 +27851,NC,Lucama,35.641504,-78.019687 +27852,NC,Crisp,35.773741,-77.596442 +27853,NC,Margarettsville,36.524494,-77.325997 +27855,NC,Murfreesboro,36.43192,-77.102696 +27856,NC,Nashville,35.98428,-77.959485 +27857,NC,Oak City,35.959736,-77.300362 +27858,NC,Greenville,35.586567,-77.348505 +27859,NC,Palmyra,36.106268,-77.364288 +27860,NC,Pantego,35.620058,-76.698848 +27862,NC,Pendleton,36.493676,-77.191112 +27863,NC,Pikeville,35.49289,-77.957787 +27864,NC,Pinetops,35.819611,-77.691952 +27865,NC,Pinetown,35.57576,-76.807565 +27866,NC,Pleasant Hill,36.521246,-77.519217 +27869,NC,Rich Square,36.277256,-77.296947 +27870,NC,Roanoke Rapids,36.446146,-77.67306 +27871,NC,Robersonville,35.821797,-77.26004 +27872,NC,Roxobel,36.194464,-77.227061 +27873,NC,Saratoga,35.662778,-77.767613 +27874,NC,Scotland Neck,36.130141,-77.427274 +27875,NC,Scranton,35.525039,-76.491706 +27876,NC,Seaboard,36.488552,-77.411306 +27880,NC,Sims,35.74351,-78.085854 +27882,NC,Spring Hope,35.930193,-78.1085 +27883,NC,Stantonsburg,35.593998,-77.837773 +27884,NC,Stokes,35.710402,-77.272178 +27885,NC,Swanquarter,35.422207,-76.287521 +27886,NC,Tarboro,35.898257,-77.542067 +27888,NC,Walstonburg,35.588204,-77.698336 +27889,NC,Washington,35.588392,-77.140356 +27890,NC,Weldon,36.420643,-77.60346 +27891,NC,Whitakers,36.075797,-77.716743 +27892,NC,Williamston,35.660154,-77.048344 +27893,NC,Wilson,35.727022,-77.922733 +27897,NC,George,36.320465,-77.197782 +27909,NC,Elizabeth City,36.295051,-76.244548 +27910,NC,Ahoskie,36.295737,-76.996632 +27916,NC,Aydlett,36.304469,-75.902914 +27917,NC,Barco,36.358778,-75.979284 +27919,NC,Belvidere,36.309644,-76.543586 +27921,NC,Camden,36.324985,-76.150002 +27922,NC,Cofield,36.333316,-76.874568 +27923,NC,Coinjock,36.375064,-75.934012 +27924,NC,Colerain,36.190083,-76.854799 +27925,NC,Columbia,35.905664,-76.234481 +27926,NC,Corapeake,36.517946,-76.597852 +27927,NC,Corolla,36.320646,-75.813217 +27928,NC,Creswell,35.865303,-76.419555 +27929,NC,Currituck,36.429691,-75.988399 +27932,NC,Edenton,36.090777,-76.622384 +27935,NC,Eure,36.434117,-76.846341 +27937,NC,Gates,36.503618,-76.764563 +27938,NC,Gatesville,36.407171,-76.732462 +27939,NC,Grandy,36.233889,-75.876808 +27941,NC,Harbinger,36.086392,-75.812143 +27942,NC,Harrellsville,36.286586,-76.776677 +27944,NC,Durants Neck,36.177058,-76.424299 +27946,NC,Hobbsville,36.354303,-76.617813 +27947,NC,Jarvisburg,36.173963,-75.859469 +27948,NC,Kill Devil Hills,36.008793,-75.675654 +27949,NC,Southern Shores,36.100694,-75.725373 +27950,NC,Knotts Island,36.523167,-75.970247 +27953,NC,East Lake,35.887191,-75.944404 +27954,NC,Manteo,35.894774,-75.671418 +27956,NC,Maple,36.398686,-76.003874 +27957,NC,Merry Hill,36.087121,-76.77756 +27958,NC,Moyock,36.487094,-76.114575 +27959,NC,Nags Head,35.347209,-75.567592 +27962,NC,Plymouth,35.850826,-76.743148 +27964,NC,Point Harbor,36.078114,-75.798285 +27965,NC,Poplar Branch,36.257028,-75.883018 +27966,NC,Powells Point,36.120674,-75.827314 +27970,NC,Roper,35.899413,-76.580918 +27973,NC,Shawboro,36.377875,-76.094451 +27974,NC,Shiloh,36.258449,-76.043168 +27976,NC,South Mills,36.453576,-76.303284 +27978,NC,Stumpy Point,35.863007,-75.77909 +27979,NC,Sunbury,36.431605,-76.609568 +27980,NC,Tyner,36.250239,-76.642796 +27983,NC,Windsor,36.015881,-76.933612 +27986,NC,Winton,36.382616,-76.936007 +28001,NC,Albemarle,35.357276,-80.204363 +28006,NC,Alexis,35.383613,-81.102204 +28012,NC,Belmont,35.244029,-81.044016 +28016,NC,Bessemer City,35.284904,-81.28635 +28018,NC,Bostic,35.453259,-81.81183 +28020,NC,Casar,35.514496,-81.635742 +28021,NC,Cherryville,35.374742,-81.350893 +28023,NC,China Grove,35.5669,-80.59004 +28025,NC,Concord,35.371614,-80.530027 +28027,NC,Concord,35.414115,-80.616227 +28032,NC,Cramerton,35.23965,-81.083061 +28033,NC,Crouse,35.483722,-81.341851 +28034,NC,Dallas,35.334853,-81.1862 +28036,NC,Cornelius,35.495692,-80.857229 +28037,NC,Denver,35.483677,-80.989785 +28040,NC,Ellenboro,35.334426,-81.770652 +28043,NC,Alexander Mills,35.301753,-81.864247 +28052,NC,Gastonia,35.244917,-81.219449 +28054,NC,Gastonia,35.200537,-81.145409 +28056,NC,Gastonia,35.258331,-81.149622 +28071,NC,Gold Hill,35.549784,-80.334558 +28073,NC,Grover,35.183639,-81.455182 +28075,NC,Harrisburg,35.324731,-80.659401 +28078,NC,Cornelius,35.421992,-80.864664 +28079,NC,Indian Trail,35.08307,-80.659743 +28080,NC,Iron Station,35.465654,-81.107009 +28081,NC,Kannapolis,35.502016,-80.635875 +28083,NC,Kannapolis,35.484807,-80.601536 +28086,NC,Kings Mountain,35.251578,-81.380567 +28088,NC,Landis,35.5435,-80.612926 +28090,NC,Lawndale,35.444932,-81.533625 +28091,NC,Lilesville,34.968914,-79.97208 +28092,NC,Boger City,35.482138,-81.228039 +28097,NC,Locust,35.270416,-80.421061 +28098,NC,Lowell,35.265481,-81.096037 +28103,NC,Marshville,35.016684,-80.378113 +28105,NC,Stallings,35.121879,-80.713568 +28107,NC,Midland,35.247724,-80.531853 +28110,NC,Monroe,35.017775,-80.53723 +28112,NC,Monroe,34.894621,-80.553952 +28114,NC,Mooresboro,35.248389,-81.672171 +28115,NC,Mooresville,35.577358,-80.822629 +28119,NC,Morven,34.85106,-80.002529 +28120,NC,Mount Holly,35.311872,-81.030567 +28124,NC,Mount Pleasant,35.414576,-80.417081 +28125,NC,Mount Ulla,35.638934,-80.72386 +28127,NC,New London,35.428518,-80.205737 +28128,NC,Norwood,35.227493,-80.14326 +28129,NC,Oakboro,35.245997,-80.341272 +28133,NC,Peachland,35.005434,-80.282943 +28134,NC,Pineville,35.070942,-80.885852 +28135,NC,Polkton,34.982288,-80.153812 +28137,NC,Richfield,35.511035,-80.267135 +28138,NC,Rockwell,35.549437,-80.422568 +28139,NC,Rutherfordton,35.37058,-81.978107 +28144,NC,Salisbury,35.651498,-80.488945 +28146,NC,Salisbury,35.667564,-80.46569 +28150,NC,Kingstown,35.347075,-81.581573 +28152,NC,Shelby,35.268889,-81.533673 +28159,NC,Spencer,35.695312,-80.431049 +28160,NC,Spindale,35.360131,-81.925142 +28163,NC,Stanfield,35.21061,-80.440672 +28164,NC,Stanley,35.351565,-81.095921 +28166,NC,Troutman,35.686271,-80.882229 +28167,NC,Union Mills,35.47324,-81.96846 +28168,NC,Vale,35.518796,-81.458887 +28170,NC,Wadesboro,34.980938,-80.069586 +28173,NC,Weddington,34.955334,-80.727901 +28174,NC,Wingate,34.984666,-80.447595 +28202,NC,Charlotte,35.229002,-80.841864 +28203,NC,Charlotte,35.208139,-80.858279 +28204,NC,Charlotte,35.213178,-80.823149 +28205,NC,Charlotte,35.219951,-80.788129 +28206,NC,Charlotte,35.252173,-80.826505 +28207,NC,Charlotte,35.193474,-80.827248 +28208,NC,Charlotte,35.235795,-80.896352 +28209,NC,Charlotte,35.179629,-80.855926 +28210,NC,Charlotte,35.131586,-80.857749 +28211,NC,Charlotte,35.167653,-80.793244 +28212,NC,Charlotte,35.190797,-80.744777 +28213,NC,Charlotte,35.317868,-80.750079 +28214,NC,Charlotte,35.273095,-80.95709 +28215,NC,Charlotte,35.243962,-80.738669 +28216,NC,Charlotte,35.283377,-80.870216 +28217,NC,Charlotte,35.0972,-81.007848 +28226,NC,Charlotte,35.086856,-80.816675 +28227,NC,Charlotte,35.193612,-80.684634 +28262,NC,Charlotte,35.272506,-80.775958 +28269,NC,Charlotte,35.288635,-80.820941 +28270,NC,Charlotte,35.135473,-80.766872 +28273,NC,Charlotte,35.159646,-80.896673 +28277,NC,Charlotte,35.134486,-80.800174 +28278,NC,Charlotte,35.146685,-80.960421 +28301,NC,East Fayettevill,35.05099,-78.842255 +28303,NC,Bonnie Doone,35.084046,-78.960135 +28304,NC,Fayetteville,35.025683,-78.970494 +28305,NC,Fayetteville,35.056022,-78.904658 +28306,NC,Fayetteville,35.001874,-78.936408 +28307,NC,Fort Bragg,35.141649,-79.002457 +28311,NC,Fayetteville,35.129416,-78.898217 +28314,NC,Fayetteville,35.058322,-79.007985 +28315,NC,Aberdeen,35.121641,-79.445039 +28318,NC,Autryville,35.099673,-78.602111 +28320,NC,Bladenboro,34.565832,-78.779295 +28323,NC,Bunnlevel,35.281057,-78.855189 +28326,NC,Johnsonville,35.313581,-79.268826 +28327,NC,Carthage,35.306066,-79.396939 +28328,NC,Clinton,35.015143,-78.326007 +28333,NC,Dudley,35.292564,-78.027274 +28334,NC,Dunn,35.316511,-78.615079 +28337,NC,Elizabethtown,34.64714,-78.574693 +28338,NC,Ellerbe,35.091422,-79.752361 +28339,NC,Erwin,35.328651,-78.685935 +28340,NC,Mcdonald,34.481402,-79.128596 +28341,NC,Faison,35.119884,-78.117983 +28343,NC,Gibson,34.754857,-79.583854 +28344,NC,Godwin,35.196919,-78.662472 +28345,NC,Hamlet,34.889375,-79.702217 +28347,NC,Hoffman,35.032607,-79.560027 +28348,NC,Hope Mills,34.953564,-78.935364 +28349,NC,Kenansville,35.039621,-77.967743 +28351,NC,Laurel Hill,34.823831,-79.549135 +28352,NC,Laurinburg,34.759869,-79.467316 +28356,NC,Linden,35.227645,-78.800361 +28357,NC,Lumber Bridge,34.876192,-79.066417 +28358,NC,Lumberton,34.629301,-79.008309 +28363,NC,Marston,34.989628,-79.659554 +28364,NC,Maxton,34.733435,-79.309725 +28365,NC,Mount Olive,35.210923,-78.09834 +28366,NC,Newton Grove,35.221258,-78.426037 +28369,NC,Orrum,34.447347,-79.031037 +28371,NC,Parkton,34.900569,-78.996943 +28372,NC,Pembroke,34.690198,-79.18337 +28374,NC,Pinehurst,35.188408,-79.473194 +28376,NC,Raeford,34.989009,-79.22276 +28377,NC,Red Springs,34.808315,-79.163619 +28379,NC,Rockingham,34.933613,-79.766566 +28382,NC,Roseboro,34.994081,-78.504109 +28383,NC,Rowland,34.588664,-79.261843 +28384,NC,Saint Pauls,34.800962,-78.973077 +28385,NC,Salemburg,35.051459,-78.471385 +28386,NC,Shannon,34.898762,-79.180617 +28387,NC,Southern Pines,35.169747,-79.395682 +28390,NC,Spring Lake,35.182981,-78.978555 +28391,NC,Stedman,35.034749,-78.694932 +28392,NC,Tar Heel,34.746541,-78.81341 +28393,NC,Turkey,34.985673,-78.212086 +28394,NC,Vass,35.217133,-79.256189 +28395,NC,Wade,35.160559,-78.724929 +28396,NC,Wagram,34.904432,-79.39594 +28398,NC,Bowdens,34.99818,-78.086739 +28399,NC,White Oak,34.766206,-78.73014 +28401,NC,Cape Fear,34.225304,-77.937856 +28403,NC,Wilmington,34.223653,-77.886213 +28405,NC,Ogden,34.264065,-77.852937 +28409,NC,Wilmington,34.166256,-77.87227 +28412,NC,Wilmington,34.157173,-77.914137 +28420,NC,Ash,34.065871,-78.505637 +28421,NC,Atkinson,34.530445,-78.167108 +28422,NC,Bolivia,34.025962,-78.16814 +28423,NC,Bolton,34.309085,-78.337177 +28425,NC,Burgaw,34.548679,-77.940317 +28428,NC,Carolina Beach,34.036599,-77.896289 +28429,NC,Castle Hayne,34.323596,-77.91085 +28430,NC,Cerro Gordo,34.302483,-78.921571 +28431,NC,Chadbourn,34.322303,-78.826683 +28432,NC,Clarendon,34.199517,-78.788844 +28433,NC,Clarkton,34.503011,-78.631271 +28434,NC,Council,34.429042,-78.411511 +28435,NC,Currie,34.449668,-78.092516 +28436,NC,Delco,34.327419,-78.19169 +28438,NC,Evergreen,34.375234,-78.884638 +28439,NC,Fair Bluff,34.302275,-79.017502 +28441,NC,Garland,34.822906,-78.34142 +28442,NC,Hallsboro,34.318087,-78.604272 +28443,NC,Hampstead,34.3879,-77.662808 +28444,NC,Harrells,34.676918,-78.242973 +28445,NC,Surf City,34.4644,-77.51005 +28447,NC,Ivanhoe,34.697169,-78.162333 +28448,NC,Kelly,34.459064,-78.294161 +28449,NC,Kure Beach,33.992707,-77.909875 +28450,NC,Lake Waccamaw,34.339359,-78.510208 +28451,NC,Leland,34.267952,-78.057815 +28452,NC,Longwood,33.950059,-78.531531 +28453,NC,Magnolia,34.895702,-78.043213 +28454,NC,Maple Hill,34.617753,-77.736588 +28455,NC,Nakina,34.115293,-78.657005 +28456,NC,Riegelwood,34.34706,-78.257473 +28457,NC,Rocky Point,34.434418,-77.923448 +28458,NC,Rose Hill,34.823462,-78.016624 +28459,NC,Shallotte,33.943011,-78.41068 +28460,NC,Sneads Ferry,34.542589,-77.403801 +28461,NC,Boiling Spring L,34.012137,-78.045551 +28462,NC,Holden Beach,33.962504,-78.296089 +28463,NC,Tabor City,34.123314,-78.823178 +28464,NC,Teachey,34.770036,-78.022091 +28465,NC,Oak Island,33.916122,-78.125455 +28466,NC,Wallace,34.754166,-77.942922 +28467,NC,Calabash,33.904668,-78.574406 +28468,NC,Sunset Beach,33.883569,-78.519955 +28469,NC,Ocean Isle Beach,33.891271,-78.429849 +28471,NC,Watha,34.620725,-78.007351 +28472,NC,Whiteville,34.324142,-78.716048 +28478,NC,Willard,34.684451,-78.023445 +28479,NC,Winnabow,34.214511,-78.056211 +28480,NC,Wrightsville Bea,34.212228,-77.798166 +28501,NC,Kinston,35.278333,-77.585969 +28508,NC,Albertson,35.117647,-77.851517 +28510,NC,Arapahoe,35.0055,-76.814909 +28511,NC,Atlantic,34.888827,-76.352097 +28512,NC,Pine Knoll Shore,34.697295,-76.815163 +28513,NC,Ayden,35.456471,-77.405127 +28515,NC,Bayboro,35.152598,-76.751793 +28516,NC,Beaufort,34.758037,-76.622834 +28518,NC,Beulaville,34.933962,-77.769655 +28520,NC,Cedar Island,35.074881,-76.08049 +28521,NC,Chinquapin,34.827609,-77.763573 +28523,NC,Cove City,35.202274,-77.296306 +28525,NC,Deep Run,35.162991,-77.69275 +28526,NC,Dover,35.262652,-77.372688 +28527,NC,Ernul,35.254693,-77.050164 +28528,NC,Gloucester,34.685645,-76.527627 +28529,NC,Grantsboro,35.122186,-76.884387 +28530,NC,Grifton,35.375681,-77.4193 +28531,NC,Harkers Island,34.69663,-76.558301 +28532,NC,Havelock,34.896753,-76.890042 +28537,NC,Hobucken,35.251838,-76.569602 +28538,NC,Hookerton,35.437976,-77.565555 +28539,NC,Hubert,34.69929,-77.207928 +28540,NC,Jacksonville,34.737456,-77.462815 +28542,NC,Camp Lejeune,34.665806,-77.3373 +28543,NC,Tarawa Terrace,34.73542,-77.383114 +28544,NC,Midway Park,34.726994,-77.320001 +28546,NC,Jacksonville,34.77401,-77.378097 +28551,NC,La Grange,35.305381,-77.76862 +28552,NC,Lowland,35.305955,-76.5777 +28553,NC,Marshallberg,34.726472,-76.517323 +28555,NC,Maysville,34.869077,-77.231456 +28556,NC,Merritt,35.1228,-76.699401 +28557,NC,Morehead City,34.72532,-76.753069 +28560,NC,New Bern,35.101941,-77.031945 +28562,NC,New Bern,35.100434,-77.102874 +28570,NC,Newport,34.755076,-76.906945 +28571,NC,Oriental,35.036406,-76.701521 +28572,NC,Pink Hill,35.066351,-77.712148 +28573,NC,Pollocksville,35.015105,-77.228727 +28574,NC,Richlands,34.862426,-77.586305 +28577,NC,Sealevel,34.876949,-76.389778 +28578,NC,Seven Springs,35.210466,-77.914621 +28579,NC,Smyrna,34.773384,-76.515313 +28580,NC,Snow Hill,35.443848,-77.695565 +28581,NC,Stacy,34.84124,-76.428877 +28582,NC,Stella,34.777672,-77.130807 +28584,NC,Swansboro,34.699066,-77.135013 +28585,NC,Trenton,35.074481,-77.459473 +28586,NC,Vanceboro,35.306255,-77.171618 +28587,NC,Vandemere,35.195298,-76.657088 +28590,NC,Winterville,35.533582,-77.39097 +28594,NC,Emerald Isle,34.666195,-77.025961 +28601,NC,Hickory,35.75757,-81.328858 +28602,NC,Hickory,35.68837,-81.361229 +28604,NC,Banner Elk,36.170461,-81.841194 +28605,NC,Blowing Rock,36.094594,-81.750968 +28606,NC,Boomer,36.055192,-81.313704 +28607,NC,Boone,36.214237,-81.666025 +28609,NC,Catawba,35.675708,-81.050307 +28610,NC,Claremont,35.721053,-81.129672 +28611,NC,Collettsville,35.951946,-81.674188 +28612,NC,Connellys Spring,35.706972,-81.492958 +28613,NC,Conover,35.731343,-81.216455 +28615,NC,Creston,36.449959,-81.650624 +28617,NC,Crumpler,36.464057,-81.403886 +28618,NC,Deep Gap,36.213573,-81.516265 +28621,NC,Elkin,36.28723,-80.855365 +28622,NC,Elk Park,36.164623,-81.963882 +28623,NC,Ennice,36.525278,-80.977141 +28624,NC,Ferguson,36.128316,-81.386407 +28626,NC,Fleetwood,36.281382,-81.514008 +28627,NC,Glade Valley,36.442889,-81.016782 +28630,NC,Granite Falls,35.819663,-81.457145 +28631,NC,Grassy Creek,36.541524,-81.446751 +28634,NC,Harmony,35.957975,-80.758462 +28635,NC,Hays,36.310015,-81.116116 +28636,NC,Hiddenite,35.95045,-81.048663 +28638,NC,Hudson,35.840295,-81.489747 +28640,NC,Jefferson,36.408987,-81.439626 +28642,NC,Jonesville,36.228571,-80.787029 +28643,NC,Lansing,36.517641,-81.526925 +28644,NC,Laurel Springs,36.444897,-81.26061 +28645,NC,Lenoir,35.914935,-81.539793 +28648,NC,Longisland,35.665814,-80.990403 +28649,NC,Mc Grady,36.310345,-81.191207 +28650,NC,Maiden,35.575884,-81.174492 +28651,NC,Millers Creek,36.211949,-81.248533 +28654,NC,Moravian Falls,36.078762,-81.178073 +28655,NC,Morganton,35.73458,-81.704216 +28657,NC,Frank,36.040203,-81.952276 +28658,NC,Newton,35.649766,-81.242546 +28659,NC,North Wilkesboro,36.20174,-81.128603 +28660,NC,Olin,35.959333,-80.851084 +28665,NC,Purlear,36.196391,-81.352773 +28668,NC,Roaring Gap,36.383553,-81.018781 +28669,NC,Roaring River,36.191561,-81.000373 +28670,NC,Ronda,36.20594,-80.926964 +28673,NC,Sherrills Ford,35.596244,-81.033859 +28675,NC,Sparta,36.508851,-81.138442 +28676,NC,State Road,36.34218,-80.865294 +28677,NC,Statesville,35.799022,-80.894009 +28678,NC,Stony Point,35.866109,-81.064135 +28679,NC,Sugar Grove,36.262672,-81.844094 +28681,NC,Taylorsville,35.901046,-81.212429 +28682,NC,Terrell,35.583587,-80.963064 +28683,NC,Thurmond,36.356188,-80.931674 +28684,NC,Todd,36.324527,-81.587403 +28685,NC,Traphill,36.330097,-81.015126 +28686,NC,Triplett,36.181685,-81.489649 +28689,NC,Union Grove,36.036947,-80.896695 +28690,NC,Valdese,35.744739,-81.56696 +28691,NC,Valle Crucis,36.207041,-81.880563 +28692,NC,Vilas,36.257375,-81.765203 +28693,NC,Warrensville,36.45723,-81.546522 +28694,NC,West Jefferson,36.377648,-81.487218 +28697,NC,Wilkesboro,36.135857,-81.157292 +28698,NC,Zionville,36.319437,-81.747567 +28701,NC,Alexander,35.706394,-82.631134 +28702,NC,Almond,35.3295,-83.578406 +28703,NC,Aquone,35.240254,-83.566218 +28704,NC,Arden,35.463666,-82.535372 +28705,NC,Bakersville,36.028588,-82.171133 +28708,NC,Balsam Grove,35.229751,-82.87795 +28709,NC,Barnardsville,35.77483,-82.456682 +28711,NC,Black Mountain S,35.612494,-82.325087 +28712,NC,Brevard,35.22076,-82.740444 +28713,NC,Bryson City,35.424128,-83.439246 +28714,NC,Burnsville,35.902974,-82.287623 +28715,NC,Candler,35.537626,-82.700081 +28716,NC,Canton,35.512651,-82.841291 +28717,NC,Cashiers,35.097117,-83.087074 +28719,NC,Cherokee,35.50937,-83.31444 +28721,NC,Clyde,35.559654,-82.921582 +28722,NC,Columbus,35.241031,-82.120631 +28723,NC,Cullowhee,35.240876,-83.147522 +28726,NC,East Flat Rock,35.279868,-82.420423 +28729,NC,Etowah,35.317192,-82.597705 +28730,NC,Fairview,35.525759,-82.398534 +28731,NC,Flat Rock,35.288993,-82.391568 +28732,NC,Fletcher,35.44989,-82.496559 +28733,NC,Fontana Dam,35.428187,-83.817631 +28734,NC,Franklin,35.180984,-83.388479 +28735,NC,Gerton,35.468723,-82.306204 +28736,NC,Glenville,35.188164,-83.090033 +28738,NC,Hazelwood,35.476877,-83.004284 +28739,NC,Hendersonville,35.319213,-82.499995 +28740,NC,Greenmountain,35.995619,-82.287867 +28741,NC,Highlands,35.070546,-83.216044 +28742,NC,Horse Shoe,35.370267,-82.598128 +28743,NC,Hot Springs,35.816175,-82.812011 +28745,NC,Lake Junaluska,35.525916,-82.970235 +28746,NC,Lake Lure,35.446447,-82.175203 +28747,NC,Lake Toxaway,35.145052,-82.919081 +28748,NC,Leicester,35.649781,-82.710622 +28751,NC,Maggie Valley,35.52006,-83.092928 +28752,NC,Marion,35.681916,-82.017993 +28753,NC,Walnut,35.856074,-82.656577 +28754,NC,Mars Hill,35.852825,-82.525352 +28756,NC,Mill Spring,35.333792,-82.155733 +28761,NC,Nebo,35.673158,-81.905581 +28762,NC,Old Fort,35.616948,-82.168621 +28763,NC,Otto,35.062668,-83.384755 +28766,NC,Penrose,35.252407,-82.622239 +28768,NC,Pisgah Forest,35.259931,-82.669516 +28771,NC,Robbinsville,35.325932,-83.788775 +28772,NC,Rosman,35.119695,-82.818916 +28773,NC,Saluda,35.238341,-82.330595 +28774,NC,Sapphire,35.066578,-83.001924 +28775,NC,Scaly Mountain,35.024036,-83.311338 +28777,NC,Spruce Pine,35.905971,-82.070492 +28778,NC,Warren Wilson Co,35.604843,-82.40649 +28779,NC,Sylva,35.348055,-83.203054 +28780,NC,Tapoco,35.442023,-83.905415 +28781,NC,Topton,35.230604,-83.745117 +28782,NC,Tryon,35.215703,-82.23942 +28783,NC,Tuckasegee,35.259934,-83.074864 +28786,NC,Waynesville,35.501767,-82.991346 +28787,NC,Weaverville,35.712642,-82.549109 +28789,NC,Whittier,35.446934,-83.287239 +28790,NC,Zirconia,35.215291,-82.457368 +28792,NC,Hendersonville,35.361342,-82.426443 +28801,NC,Asheville,35.597075,-82.556533 +28803,NC,Asheville,35.539291,-82.518021 +28804,NC,Asheville,35.63743,-82.564625 +28805,NC,Asheville,35.600363,-82.491781 +28806,NC,Asheville,35.580814,-82.607787 +28901,NC,Andrews,35.195948,-83.822836 +28902,NC,Brasstown,35.031392,-83.966773 +28904,NC,Hayesville,35.04172,-83.78668 +28905,NC,Marble,35.14748,-83.938065 +28906,NC,Unaka,35.079228,-84.101454 +28909,NC,Warne,35.002437,-83.904541 +58002,ND,Absaraka,47.014359,-97.388769 +58003,ND,Alice,46.768892,-97.531819 +58004,ND,Amenia,47.019395,-97.204808 +58005,ND,Argusville,47.10664,-96.905764 +58006,ND,Arthur,47.104774,-97.209737 +58007,ND,Ayr,47.019576,-97.572841 +58008,ND,Barney,46.249621,-96.970772 +58009,ND,Blanchard,47.353664,-97.262079 +58011,ND,Buffalo,46.926351,-97.535159 +58012,ND,Casselton,46.899195,-97.213821 +58013,ND,Cayuga,46.132589,-97.405941 +58014,ND,Chaffee,46.766477,-97.357753 +58015,ND,Christine,46.552157,-96.790882 +58016,ND,Clifford,47.356946,-97.409961 +58017,ND,Brampton,46.089106,-97.809543 +58018,ND,Colfax,46.497153,-96.979001 +58021,ND,Davenport,46.696811,-97.087073 +58027,ND,Enderlin,46.607898,-97.610554 +58029,ND,Erie,47.112803,-97.384851 +58030,ND,Fairmount,46.042658,-96.630811 +58031,ND,Fingal,46.772754,-97.781198 +58032,ND,Forman,46.072075,-97.698643 +58033,ND,Englevale,46.478188,-97.905482 +58035,ND,Galesburg,47.27779,-97.374599 +58036,ND,Gardner,47.1252,-96.990116 +58038,ND,Grandin,47.215769,-97.020676 +58039,ND,Great Bend,46.154369,-96.817143 +58040,ND,Crete,46.230455,-97.866853 +58041,ND,Hankinson,46.055797,-96.899069 +58042,ND,Prosper,46.996497,-96.900973 +58043,ND,Havana,45.964413,-97.60945 +58045,ND,Kelso,47.394168,-97.056024 +58046,ND,Colgate,47.19995,-97.784865 +58047,ND,Hickson,46.739267,-96.860941 +58048,ND,Hunter,47.19132,-97.251648 +58049,ND,Hastings,46.705548,-97.999791 +58051,ND,Kindred,46.654296,-97.004919 +58052,ND,Leonard,46.659324,-97.272488 +58053,ND,Geneseo,46.073885,-97.144429 +58054,ND,Elliott,46.420133,-97.658895 +58056,ND,Luverne,47.315052,-97.729622 +58057,ND,Mcleod,46.41027,-97.313892 +58058,ND,Mantador,46.159935,-96.957004 +58059,ND,Durbin,46.867546,-97.051366 +58060,ND,Delamere,46.255074,-97.433724 +58061,ND,Mooreton,46.261537,-96.850726 +58062,ND,Nome,46.674834,-97.791099 +58063,ND,Oriska,46.943251,-97.785331 +58064,ND,Page,47.151512,-97.596665 +58067,ND,Rutland,46.073813,-97.548284 +58068,ND,Sheldon,46.554784,-97.454261 +58069,ND,Stirum,46.229891,-97.654233 +58071,ND,Tower City,46.911873,-97.659392 +58072,ND,Valley City,46.92681,-98.003316 +58075,ND,Dwight,46.279842,-96.633934 +58077,ND,Walcott,46.583529,-97.001442 +58078,ND,Riverside,46.869523,-96.895002 +58079,ND,Embden,46.875015,-97.391694 +58081,ND,Wyndmere,46.289137,-97.128912 +58102,ND,North River,46.900878,-96.793577 +58103,ND,Fargo,46.856406,-96.812252 +58104,ND,Briarwood,46.81492,-96.823846 +58201,ND,Grand Forks,47.901041,-97.04463 +58203,ND,Grand Forks,47.927217,-97.067156 +58205,ND,Grand Forks,47.959499,-97.370802 +58210,ND,Adams,48.422299,-98.086741 +58212,ND,Aneta,47.699262,-97.981406 +58213,ND,Ardoch,48.226911,-97.253534 +58214,ND,Arvilla,47.909292,-97.487124 +58216,ND,Bathgate,48.868632,-97.483215 +58218,ND,Buxton,47.616314,-97.089259 +58219,ND,Caledonia,47.457645,-96.908476 +58220,ND,Concrete,48.794341,-97.657191 +58222,ND,Crystal,48.592387,-97.673846 +58223,ND,Cummings,47.537023,-96.991287 +58224,ND,Dahlen,48.159896,-97.957269 +58225,ND,Bowesmont,48.578569,-97.199222 +58227,ND,Gardar,48.490164,-97.890188 +58228,ND,Emerado,47.921376,-97.263012 +58229,ND,Fairdale,48.481924,-98.206587 +58230,ND,Finley,47.530611,-97.744242 +58231,ND,Fordville,48.22119,-97.802238 +58233,ND,Forest River,48.225094,-97.460476 +58235,ND,Honeyford,48.077082,-97.463299 +58237,ND,Nash,48.410783,-97.415895 +58238,ND,Hamilton,48.794249,-97.469302 +58239,ND,Hannah,48.959446,-98.723693 +58240,ND,Hatton,47.638012,-97.432548 +58241,ND,Hensel,48.673836,-97.596223 +58243,ND,Hoople,48.51981,-97.618333 +58244,ND,Orr,48.118654,-97.681302 +58245,ND,58245,48.143406,-97.454697 +58246,ND,58246,48.793789,-97.215983 +58249,ND,Langdon,48.786562,-98.35662 +58250,ND,Lankin,48.295233,-98.006997 +58251,ND,Mccanna,47.904048,-97.651792 +58254,ND,Kloten,47.778981,-98.162999 +58255,ND,Maida,48.949043,-98.394826 +58256,ND,Manvel,48.085314,-97.194332 +58257,ND,Mayville,47.50138,-97.317645 +58258,ND,Mekinock,47.980909,-97.489593 +58259,ND,Whitman,48.04144,-98.124243 +58260,ND,Milton,48.616963,-98.018285 +58261,ND,Voss,48.298874,-97.333727 +58262,ND,Mountain,48.677341,-97.807569 +58264,ND,58264,48.497773,-97.471905 +58265,ND,Neche,48.979567,-97.542687 +58266,ND,Niagara,47.984817,-97.833431 +58267,ND,Kempton,47.741756,-97.563054 +58269,ND,Osnabrock,48.641908,-98.23271 +58270,ND,Park River,48.403881,-97.743897 +58271,ND,Joliette,48.936124,-97.275611 +58272,ND,Petersburg,47.997973,-97.984033 +58273,ND,Pisek,48.297096,-97.702894 +58274,ND,Portland,47.501542,-97.384303 +58275,ND,Reynolds,47.706776,-97.209153 +58276,ND,Saint Thomas,48.625223,-97.454508 +58277,ND,Sharon,47.606188,-97.905091 +58278,ND,Thompson,47.77658,-97.096201 +58281,ND,Wales,48.921647,-98.559649 +58282,ND,Backoo,48.91103,-97.881927 +58301,ND,Devils Lake,48.113162,-98.861588 +58311,ND,Loma,48.636847,-98.622545 +58315,ND,Barton,48.461084,-100.204429 +58316,ND,Belcourt,48.837862,-99.768754 +58317,ND,Bisbee,48.555196,-99.363592 +58318,ND,Bottineau,48.845137,-100.432894 +58319,ND,Bremen,47.727212,-99.371564 +58320,ND,Brinsmade,48.156805,-99.312384 +58321,ND,Brocket,48.225527,-98.355854 +58323,ND,Calvin,48.80843,-98.924236 +58324,ND,Maza,48.485479,-99.194553 +58325,ND,Churchs Ferry,48.286206,-99.141187 +58327,ND,Southam,48.053028,-98.621236 +58328,ND,Doyon,48.081067,-98.506757 +58329,ND,San Haven,48.84801,-100.031105 +58330,ND,Edmore,48.43084,-98.445756 +58331,ND,Egeland,48.635537,-99.111475 +58332,ND,Fillmore,48.072022,-99.703388 +58337,ND,Hamberg,47.779372,-99.468297 +58338,ND,Hampden,48.522892,-98.654316 +58339,ND,Hansboro,48.86648,-99.383259 +58341,ND,Manfred,47.768121,-99.932941 +58342,ND,Heimdal,47.799918,-99.689147 +58343,ND,Knox,48.338812,-99.671274 +58344,ND,Mapes,48.035714,-98.341548 +58345,ND,Lawton,48.30326,-98.414199 +58346,ND,Harlow,48.26681,-99.440123 +58348,ND,Flora,47.95074,-99.543061 +58351,ND,Minnewaukan,48.069777,-99.274323 +58352,ND,Calio,48.654605,-98.842646 +58353,ND,Mylo,48.635981,-99.632878 +58356,ND,Brantford,47.679385,-99.078007 +58357,ND,Oberon,47.948744,-99.140129 +58360,ND,Overly,48.679029,-100.175958 +58361,ND,Pekin,47.769558,-98.326035 +58362,ND,Penn,48.227106,-99.065509 +58363,ND,Perth,48.681601,-99.383076 +58365,ND,Rocklake,48.821569,-99.179628 +58366,ND,Nanson,48.655224,-99.874375 +58367,ND,Rolla,48.859423,-99.613386 +58368,ND,Pleasant Lake,48.317264,-99.998954 +58369,ND,Saint John,48.936588,-99.76476 +58370,ND,Saint Michael,47.977363,-98.918058 +58372,ND,Sarles,48.945921,-98.960562 +58373,ND,58373,47.868454,-99.882826 +58374,ND,Sheyenne,47.818386,-99.058326 +58377,ND,Starkweather,48.448802,-98.853903 +58380,ND,Hamar,47.802014,-98.475218 +58381,ND,Warwick,47.891285,-98.680956 +58382,ND,Webster,48.322852,-98.873944 +58384,ND,Willow City,48.606205,-100.296802 +58385,ND,Wolford,48.480937,-99.662756 +58386,ND,Baker,48.321709,-99.550489 +58401,ND,Eldridge,46.905899,-98.706127 +58411,ND,Alfred,46.58588,-98.914671 +58412,ND,Arena,47.134934,-100.17651 +58413,ND,Ashley,46.053677,-99.3164 +58415,ND,Berlin,46.400834,-98.523342 +58416,ND,Binford,47.573899,-98.354625 +58418,ND,Bowdon,47.434318,-99.701532 +58420,ND,Buchanan,47.040917,-98.811158 +58421,ND,Bordulac,47.453918,-99.108226 +58422,ND,Emrick,47.549857,-99.429677 +58423,ND,Chaseley,47.449018,-99.824082 +58424,ND,Windsor,46.883242,-99.086596 +58425,ND,Cooperstown,47.452732,-98.153332 +58426,ND,Courtenay,47.227195,-98.54885 +58428,ND,Dawson,46.829612,-99.763544 +58429,ND,Sibley,47.195503,-98.143863 +58430,ND,Denhoff,47.570905,-100.263037 +58431,ND,Dickey,46.542565,-98.468212 +58432,ND,Eckelson,46.916737,-98.366939 +58433,ND,Merricourt,46.324969,-98.708346 +58436,ND,Ellendale,46.007317,-98.51383 +58438,ND,Fessenden,47.628644,-99.643361 +58439,ND,Forbes,46.010926,-98.812414 +58440,ND,Fredonia,46.353456,-99.262818 +58441,ND,Fullerton,46.195138,-98.388219 +58442,ND,Gackle,46.591263,-99.219056 +58443,ND,Juanita,47.443185,-98.663951 +58444,ND,Goodrich,47.471048,-100.118979 +58445,ND,Grace City,47.55358,-98.809465 +58448,ND,Walum,47.299693,-98.15718 +58450,ND,Heaton,47.462249,-99.578482 +58451,ND,Hurdsfield,47.438733,-99.94165 +58454,ND,Nortonville,46.500996,-98.807661 +58455,ND,Kensal,47.272609,-98.720579 +58456,ND,Kulm,46.307274,-98.942724 +58458,ND,Grand Rapids,46.361961,-98.30022 +58460,ND,Lehr,46.258638,-99.349136 +58461,ND,Litchville,46.688788,-98.20327 +58463,ND,Mcclusky,47.489639,-100.451966 +58464,ND,Mchenry,47.560416,-98.572594 +58465,ND,Manfred,47.711663,-99.764369 +58466,ND,Marion,46.571587,-98.253327 +58467,ND,Medina,46.891951,-99.310556 +58471,ND,Monango,46.193641,-98.57962 +58472,ND,Adrian,46.654218,-98.597647 +58474,ND,Guelph,46.128796,-98.099339 +58475,ND,Pettibone,47.119973,-99.527892 +58476,ND,Edmunds,47.165715,-99.002041 +58477,ND,Regan,47.152703,-100.522448 +58478,ND,Lake Williams,47.150765,-99.700302 +58479,ND,Leal,47.071086,-98.220885 +58480,ND,Sanborn,46.927065,-98.233622 +58481,ND,Spiritwood,47.101601,-98.648468 +58482,ND,Steele,46.852357,-99.933559 +58483,ND,Streeter,46.694999,-99.297108 +58484,ND,Sutton,47.385355,-98.432044 +58486,ND,Sykeston,47.436938,-99.39751 +58487,ND,Tappen,46.83362,-99.601892 +58488,ND,Tuttle,47.162583,-99.987287 +58489,ND,Venturia,46.037075,-99.494253 +58490,ND,Verona,46.371229,-98.089536 +58492,ND,Wimbledon,47.143837,-98.432916 +58494,ND,Wing,47.151939,-100.307159 +58495,ND,Burnstad,46.251617,-99.586005 +58496,ND,Woodworth,47.163639,-99.3406 +58497,ND,Ypsilanti,46.771949,-98.487636 +58501,ND,Bismarck,46.823448,-100.774755 +58504,ND,Lincoln,46.782463,-100.774411 +58520,ND,Almont,46.704605,-101.522126 +58521,ND,Baldwin,46.954338,-100.761464 +58523,ND,Beulah,47.270664,-101.807468 +58524,ND,Braddock,46.549885,-100.241577 +58528,ND,Cannon Ball,46.387446,-100.59749 +58529,ND,Carson,46.462389,-101.538725 +58530,ND,Fort Clark,47.121912,-101.328643 +58531,ND,Coleharbor,47.519559,-101.233198 +58532,ND,Driscoll,46.851139,-100.144063 +58533,ND,Heil,46.411346,-101.835145 +58535,ND,Lark,46.465133,-101.151681 +58537,ND,Huff,46.563172,-100.693909 +58538,ND,Fort Yates,46.09054,-100.651611 +58540,ND,Emmet,47.655219,-101.398325 +58541,ND,Golden Valley,47.293754,-102.061229 +58542,ND,Hague,46.058896,-99.974507 +58544,ND,Hazelton,46.487477,-100.273325 +58545,ND,Hazen,47.327138,-101.610695 +58549,ND,Kintyre,46.573573,-99.970462 +58551,ND,Leith,46.234873,-101.455531 +58552,ND,Temvik,46.286924,-100.215832 +58553,ND,Mckenzie,46.831062,-100.3995 +58554,ND,Mandan,46.830649,-100.909175 +58558,ND,Menoken,46.861032,-100.527488 +58559,ND,Mercer,47.485792,-100.717079 +58560,ND,Moffit,46.675725,-100.297538 +58561,ND,Napoleon,46.486724,-99.77253 +58562,ND,Bentley,46.374448,-101.89369 +58563,ND,Hannover,46.851248,-101.424453 +58564,ND,Raleigh,46.335236,-101.282651 +58565,ND,Riverdale,47.640333,-101.115061 +58566,ND,Saint Anthony,46.588831,-100.897237 +58568,ND,Selfridge,46.035147,-101.150204 +58569,ND,Shields,46.183772,-101.258894 +58570,ND,Breien,46.294106,-100.81363 +58571,ND,Stanton,47.312786,-101.38987 +58572,ND,Sterling,46.843583,-100.274392 +58573,ND,Strasburg,46.097938,-100.211869 +58575,ND,Turtle Lake,47.541416,-100.881364 +58576,ND,Underwood,47.460163,-101.189807 +58577,ND,Washburn,47.311388,-101.011568 +58579,ND,Wilton,47.170853,-100.794385 +58580,ND,Zap,47.289711,-101.925649 +58581,ND,Zeeland,46.005476,-99.772543 +58601,ND,New Hradec,46.887289,-102.787595 +58620,ND,Amidon,46.455951,-103.264741 +58621,ND,Beach,46.932381,-103.98429 +58622,ND,Fryburg,46.887728,-103.179515 +58623,ND,Bowman,46.173316,-103.401965 +58625,ND,Dodge,47.304893,-102.198505 +58626,ND,Dunn Center,47.345265,-102.589198 +58627,ND,Gorham,47.118004,-103.222328 +58630,ND,Gladstone,46.815162,-102.527379 +58631,ND,Glen Ullin,46.823301,-101.822293 +58632,ND,Golva,46.7075,-103.957545 +58634,ND,Grassy Butte,47.443072,-103.294433 +58636,ND,Werner,47.367752,-102.319286 +58638,ND,Hebron,46.893613,-102.036678 +58639,ND,Bucyrus,46.027869,-102.584516 +58640,ND,Killdeer,47.410898,-102.776242 +58641,ND,Lefor,46.725264,-102.764292 +58642,ND,Manning,47.125837,-102.680638 +58643,ND,Marmarth,46.325396,-103.88 +58645,ND,Medora,46.845771,-103.421011 +58646,ND,Burt,46.401095,-102.312935 +58647,ND,New England,46.512841,-102.835816 +58649,ND,Reeder,46.111577,-102.940519 +58650,ND,Regent,46.423452,-102.568443 +58651,ND,Rhame,46.166449,-103.70791 +58652,ND,Richardton,46.842614,-102.292004 +58653,ND,Gascoyne,46.139924,-103.144688 +58654,ND,Sentinel Butte,46.830475,-103.800113 +58655,ND,South Heart,46.812701,-103.016241 +58656,ND,Taylor,46.928372,-102.375626 +58657,ND,Trotters,47.233008,-103.854704 +58701,ND,Minot,48.22914,-101.298476 +58704,ND,Minot Afb,48.423217,-101.31678 +58710,ND,Anamoose,47.870307,-100.252941 +58711,ND,Antler,48.958525,-101.333758 +58712,ND,Balfour,47.968451,-100.520929 +58713,ND,Bantry,48.511875,-100.789445 +58716,ND,Benedict,47.786493,-101.057884 +58718,ND,Blaisdell,48.323399,-101.800562 +58721,ND,Coteau,48.796803,-102.247271 +58722,ND,Burlington,48.273534,-101.428205 +58723,ND,Butte,47.811884,-100.660446 +58725,ND,Carpio,48.432299,-101.711943 +58727,ND,Larson,48.878875,-102.794848 +58730,ND,Crosby,48.883551,-103.274023 +58731,ND,Deering,48.405693,-101.033685 +58733,ND,Des Lacs,48.25569,-101.567167 +58734,ND,Donnybrook,48.490015,-101.896039 +58735,ND,Douglas,47.865914,-101.511218 +58736,ND,Drake,47.902431,-100.378955 +58737,ND,Northgate,48.917672,-102.341502 +58738,ND,Foxholm,48.339193,-101.59072 +58739,ND,Gardena,48.683566,-100.48429 +58740,ND,Wolseth,48.507978,-101.31955 +58741,ND,Granville,48.256575,-100.808193 +58744,ND,Karlsruhe,48.10085,-100.574158 +58746,ND,Coulee,48.673149,-102.071745 +58747,ND,Kief,47.818615,-100.52146 +58748,ND,Kramer,48.686666,-100.671638 +58750,ND,Lansford,48.625419,-101.385825 +58752,ND,Lignite,48.848113,-102.554177 +58755,ND,Mcgregor,48.594983,-102.928795 +58756,ND,Makoti,47.985283,-101.814942 +58757,ND,Mandaree,47.856744,-102.653473 +58758,ND,Martin,47.778144,-100.122517 +58759,ND,Max,47.815577,-101.293166 +58760,ND,Maxbass,48.772163,-101.256328 +58761,ND,Loraine,48.765814,-101.554512 +58762,ND,Newburg,48.698192,-100.968056 +58763,ND,Charlson,47.977154,-102.485793 +58765,ND,Noonan,48.885635,-103.009793 +58768,ND,Norwich,48.249115,-100.971165 +58769,ND,Palermo,48.3396,-102.239954 +58770,ND,Parshall,47.95597,-102.142732 +58771,ND,Plaza,48.02421,-101.964276 +58772,ND,Portal,48.975818,-102.548023 +58773,ND,Battleview,48.589815,-102.644646 +58775,ND,Roseglen,47.695967,-101.822041 +58776,ND,Ross,48.316159,-102.530721 +58778,ND,Ruso,47.762224,-100.875432 +58779,ND,Raub,47.868017,-101.765095 +58781,ND,Sawyer,48.085837,-101.067396 +58782,ND,Sherwood,48.957551,-101.697024 +58783,ND,Carbury,48.937378,-100.741324 +58784,ND,Belden,48.319189,-102.392802 +58785,ND,Surrey,48.236472,-101.121617 +58787,ND,Tolley,48.796903,-101.855891 +58788,ND,Berwick,48.377657,-100.412322 +58789,ND,Upham,48.581632,-100.732314 +58790,ND,Velva,48.06748,-100.934623 +58792,ND,Bergen,47.951793,-100.803824 +58793,ND,Westhope,48.905074,-101.033809 +58794,ND,White Earth,48.430748,-102.806672 +58795,ND,Hamlet,48.621929,-103.184878 +58801,ND,Bonetraill,48.167924,-103.631699 +58830,ND,Appam,48.585803,-103.422154 +58831,ND,Rawson,47.843517,-103.63961 +58833,ND,Ambrose,48.817195,-103.700676 +58835,ND,Arnegard,47.808832,-103.453837 +58838,ND,Cartwright,47.79922,-103.948718 +58843,ND,Springbrook,48.260088,-103.372462 +58844,ND,Colgan,48.924646,-103.828955 +58845,ND,Alkabo,48.613946,-103.929128 +58847,ND,Keene,47.940516,-102.890567 +58849,ND,Wheelock,48.3323,-103.18365 +58852,ND,Temple,48.392009,-102.961281 +58853,ND,Trenton,48.056303,-103.861276 +58854,ND,Watford City,47.804258,-103.258205 +58856,ND,Zahl,48.578747,-103.659926 +43001,OH,Alexandria,40.105965,-82.607683 +43002,OH,Amlin,40.07203,-83.179157 +43003,OH,Ashley,40.416264,-82.954201 +43004,OH,Blacklick,40.020952,-82.807857 +43006,OH,Brinkhaven,40.458346,-82.155289 +43009,OH,Cable,40.178411,-83.64696 +43011,OH,Centerburg,40.286513,-82.680039 +43013,OH,Croton,40.237603,-82.698948 +43014,OH,Danville,40.455693,-82.263855 +43015,OH,Delaware,40.293186,-83.072312 +43017,OH,Dublin,40.109297,-83.114633 +43019,OH,Fredericktown,40.497613,-82.585711 +43021,OH,Galena,40.191546,-82.895937 +43022,OH,Gambier,40.378241,-82.382752 +43023,OH,Granville,40.078791,-82.519399 +43025,OH,Hebron,39.953464,-82.491868 +43026,OH,Hilliard,40.032187,-83.138333 +43028,OH,Howard,40.415818,-82.333351 +43029,OH,Irwin,40.128352,-83.458699 +43031,OH,Johnstown,40.14452,-82.697284 +43036,OH,Magnetic Springs,40.358023,-83.267142 +43037,OH,Martinsburg,40.267954,-82.356691 +43040,OH,Marysville,40.247723,-83.362213 +43044,OH,Mechanicsburg,40.064659,-83.572352 +43045,OH,Milford Center,40.181666,-83.437333 +43046,OH,Millersport,39.899307,-82.528348 +43050,OH,Mount Vernon,40.384937,-82.487286 +43054,OH,New Albany,40.084686,-82.798793 +43055,OH,Newark,40.072429,-82.404565 +43056,OH,Heath,40.019659,-82.387527 +43060,OH,North Lewisburg,40.222871,-83.561476 +43061,OH,Ostrander,40.273971,-83.197813 +43062,OH,Pataskala,40.000925,-82.668656 +43064,OH,Plain City,40.097356,-83.269049 +43065,OH,Shawnee Hills,40.152652,-83.074921 +43066,OH,Radnor,40.391779,-83.178074 +43067,OH,Raymond,40.247321,-83.364927 +43068,OH,Reynoldsburg,39.955145,-82.803454 +43071,OH,Saint Louisville,40.181776,-82.356015 +43072,OH,Saint Paris,40.105755,-83.963062 +43074,OH,Sunbury,40.265499,-82.851051 +43076,OH,Thornville,39.897364,-82.407059 +43078,OH,Urbana,40.106639,-83.767142 +43080,OH,Utica,40.244137,-82.413459 +43081,OH,Westerville,40.114569,-82.910504 +43084,OH,Woodstock,40.181644,-83.546149 +43085,OH,Worthington,40.105155,-83.010069 +43102,OH,Amanda,39.625104,-82.755236 +43103,OH,Ashville,39.731576,-82.944567 +43105,OH,Baltimore,39.864452,-82.624023 +43106,OH,Bloomingburg,39.628617,-83.409521 +43107,OH,Hide A Way Hills,39.698807,-82.42548 +43110,OH,Canal Winchester,39.83486,-82.804369 +43112,OH,Carroll,39.795743,-82.708358 +43113,OH,Circleville,39.598836,-82.929966 +43115,OH,Clarksburg,39.490432,-83.156282 +43119,OH,Galloway,39.936604,-83.183848 +43123,OH,Grove City,39.881382,-83.083944 +43125,OH,Groveport,39.858137,-82.887219 +43128,OH,Jeffersonville,39.65896,-83.56873 +43130,OH,Lancaster,39.718697,-82.603074 +43135,OH,Laurelville,39.4757,-82.721219 +43137,OH,Lockbourne,39.814236,-82.976369 +43138,OH,Logan,39.537175,-82.412594 +43140,OH,London,39.900074,-83.443899 +43143,OH,Mount Sterling,39.717506,-83.280618 +43145,OH,New Holland,39.558897,-83.250429 +43146,OH,Orient,39.795386,-83.154317 +43147,OH,Pickerington,39.906062,-82.756267 +43148,OH,Pleasantville,39.822684,-82.504268 +43149,OH,Rockbridge,39.550907,-82.562572 +43150,OH,Rushville,39.767375,-82.427981 +43152,OH,South Bloomingvi,39.374145,-82.639404 +43153,OH,South Solon,39.742295,-83.596984 +43154,OH,Stoutsville,39.60672,-82.819279 +43155,OH,Sugar Grove,39.627699,-82.532113 +43160,OH,Washington Court,39.534346,-83.438817 +43162,OH,West Jefferson,39.942409,-83.285306 +43164,OH,Williamsport,39.611739,-83.125053 +43201,OH,Columbus,39.995157,-83.004732 +43202,OH,Columbus,40.020084,-83.011842 +43203,OH,Columbus,39.971925,-82.969131 +43204,OH,Columbus,39.952333,-83.077999 +43205,OH,Columbus,39.956905,-82.964352 +43206,OH,Columbus,39.942639,-82.974845 +43207,OH,Columbus,39.904565,-82.970334 +43209,OH,Bexley,39.958999,-82.926595 +43210,OH,Columbus,40.002804,-83.016404 +43211,OH,Columbus,40.011792,-82.973196 +43212,OH,Columbus,39.987381,-83.045579 +43213,OH,Whitehall,39.967146,-82.878275 +43214,OH,Columbus,40.053482,-83.01875 +43215,OH,Columbus,39.967106,-83.004383 +43217,OH,Columbus,39.806209,-82.947483 +43219,OH,Shepard,40.004394,-82.936459 +43220,OH,Columbus,40.049484,-83.066911 +43221,OH,Upper Arlington,40.015431,-83.064592 +43222,OH,Columbus,39.957628,-83.031109 +43223,OH,Columbus,39.938753,-83.046344 +43224,OH,Columbus,40.042493,-82.968947 +43227,OH,Columbus,39.944394,-82.890298 +43228,OH,Lincoln Village,39.947876,-83.123858 +43229,OH,Columbus,40.083886,-82.972568 +43230,OH,Gahanna,40.038458,-82.882429 +43231,OH,Columbus,40.080984,-82.938275 +43232,OH,Columbus,39.923024,-82.866432 +43235,OH,West Worthington,40.101271,-83.059287 +43302,OH,Marion,40.587648,-83.127056 +43310,OH,Belle Center,40.502371,-83.768773 +43311,OH,Bellefontaine,40.360472,-83.757076 +43314,OH,Caledonia,40.627239,-82.992465 +43315,OH,Cardington,40.506583,-82.933728 +43316,OH,Carey,40.948599,-83.383578 +43318,OH,De Graff,40.305773,-83.9153 +43319,OH,East Liberty,40.307682,-83.586221 +43320,OH,Edison,40.590475,-82.902301 +43321,OH,Fulton,40.465013,-82.836244 +43323,OH,Harpster,40.747541,-83.23428 +43324,OH,Huntsville,40.441295,-83.792748 +43326,OH,Kenton,40.640433,-83.611087 +43331,OH,Lakeview,40.503033,-83.908139 +43332,OH,La Rue,40.578879,-83.373397 +43333,OH,Lewistown,40.42768,-83.920893 +43334,OH,Marengo,40.389512,-82.812136 +43335,OH,Martel,40.670775,-82.90586 +43337,OH,Morral,40.695366,-83.204606 +43338,OH,Mount Gilead,40.538371,-82.806235 +43340,OH,Mount Victory,40.52321,-83.494165 +43341,OH,New Bloomington,40.607301,-83.322351 +43342,OH,Prospect,40.472659,-83.176295 +43343,OH,Quincy,40.287606,-83.974411 +43344,OH,Richwood,40.43698,-83.313639 +43345,OH,Ridgeway,40.520923,-83.570161 +43346,OH,Roundhead,40.580337,-83.848502 +43347,OH,Rushsylvania,40.465808,-83.659789 +43348,OH,Russells Point,40.474956,-83.879825 +43350,OH,Sparta,40.373492,-82.697034 +43351,OH,Upper Sandusky,40.824876,-83.297711 +43356,OH,Waldo,40.460544,-83.070609 +43357,OH,West Liberty,40.262541,-83.752763 +43358,OH,West Mansfield,40.404284,-83.524274 +43359,OH,Wharton,40.861216,-83.463016 +43360,OH,Zanesfield,40.302396,-83.664832 +43402,OH,Bowling Green,41.381513,-83.650749 +43406,OH,Bradner,41.329789,-83.4456 +43407,OH,Burgoon,41.267986,-83.247455 +43410,OH,Clyde,41.302397,-82.991849 +43412,OH,Curtice,41.647736,-83.285825 +43413,OH,Cygnet,41.247024,-83.614151 +43416,OH,Elmore,41.468144,-83.27673 +43420,OH,Fremont,41.349792,-83.118095 +43430,OH,Genoa,41.530005,-83.358984 +43431,OH,Gibsonburg,41.380474,-83.335762 +43432,OH,Elliston,41.527136,-83.261135 +43435,OH,Millersville,41.318005,-83.323184 +43436,OH,Isle Saint Georg,41.713668,-82.819275 +43438,OH,Kelleys Island,41.600755,-82.706811 +43439,OH,Lacarne,41.527846,-83.024004 +43440,OH,Lakeside,41.52913,-82.771392 +43442,OH,Lindsey,41.414747,-83.213474 +43443,OH,Luckey,41.451669,-83.467396 +43445,OH,Bono,41.596249,-83.345536 +43447,OH,Millbury,41.56106,-83.438083 +43449,OH,Oak Harbor,41.523556,-83.127764 +43450,OH,Pemberville,41.402258,-83.473642 +43451,OH,Portage,41.312702,-83.614299 +43452,OH,Port Clinton,41.521535,-82.909368 +43456,OH,Put In Bay,41.651356,-82.822593 +43457,OH,Risingsun,41.270639,-83.43259 +43460,OH,Rossford,41.604908,-83.563793 +43462,OH,Rudolph,41.296734,-83.683212 +43464,OH,Vickery,41.39099,-82.898953 +43465,OH,Walbridge,41.586067,-83.493008 +43466,OH,Wayne,41.299312,-83.470065 +43469,OH,Woodville,41.451206,-83.364643 +43501,OH,Alvordton,41.662489,-84.435533 +43502,OH,Archbold,41.533255,-84.304833 +43504,OH,Berkey,41.698892,-83.830972 +43506,OH,Bryan,41.474839,-84.56287 +43511,OH,Custar,41.295318,-83.834919 +43512,OH,Defiance,41.279858,-84.362583 +43515,OH,Delta,41.557695,-83.9866 +43516,OH,Deshler,41.223945,-83.896434 +43517,OH,Edgerton,41.442496,-84.734937 +43518,OH,Edon,41.584219,-84.757002 +43521,OH,Fayette,41.671716,-84.325004 +43522,OH,Grand Rapids,41.437855,-83.855246 +43524,OH,Hamler,41.212874,-84.071989 +43525,OH,Haskins,41.465159,-83.705858 +43526,OH,Hicksville,41.303378,-84.758852 +43527,OH,Holgate,41.254859,-84.144735 +43528,OH,Holland,41.622629,-83.725712 +43532,OH,Liberty Center,41.451371,-83.985889 +43533,OH,Lyons,41.690546,-84.062351 +43534,OH,Mc Clure,41.377309,-83.942482 +43535,OH,Malinta,41.308425,-84.045731 +43536,OH,Mark Center,41.291669,-84.62778 +43537,OH,Maumee,41.581682,-83.66283 +43540,OH,Metamora,41.695233,-83.925972 +43542,OH,Monclova,41.568416,-83.775718 +43543,OH,Montpelier,41.59821,-84.614703 +43545,OH,Napoleon,41.390969,-84.143271 +43548,OH,New Bavaria,41.208649,-84.191336 +43549,OH,Ney,41.378083,-84.526921 +43551,OH,Perrysburg,41.542926,-83.592727 +43554,OH,Pioneer,41.665619,-84.536324 +43556,OH,Sherwood,41.294593,-84.541674 +43557,OH,Stryker,41.486123,-84.408914 +43558,OH,Swanton,41.594497,-83.871821 +43560,OH,Sylvania,41.707985,-83.706825 +43566,OH,Waterville,41.502248,-83.733142 +43567,OH,Wauseon,41.566796,-84.153745 +43569,OH,Weston,41.351593,-83.797336 +43570,OH,West Unity,41.575645,-84.442066 +43571,OH,Whitehouse,41.519432,-83.81151 +43602,OH,Toledo,41.647984,-83.554747 +43604,OH,Toledo,41.661415,-83.524949 +43605,OH,Oregon,41.640701,-83.512341 +43606,OH,Toledo,41.671213,-83.605992 +43607,OH,Toledo,41.650417,-83.597419 +43608,OH,Toledo,41.677908,-83.534359 +43609,OH,Toledo,41.629761,-83.577282 +43610,OH,Toledo,41.676693,-83.557303 +43611,OH,Toledo,41.704507,-83.489203 +43612,OH,Toledo,41.704567,-83.565622 +43613,OH,Toledo,41.703913,-83.603397 +43614,OH,Toledo,41.60279,-83.62917 +43615,OH,Toledo,41.649197,-83.670583 +43616,OH,Oregon,41.641842,-83.471366 +43617,OH,Toledo,41.666765,-83.716967 +43618,OH,Oregon,41.665636,-83.392302 +43619,OH,Northwood,41.607986,-83.48056 +43620,OH,Toledo,41.66536,-83.553602 +43623,OH,Toledo,41.707968,-83.643408 +43624,OH,Toledo,41.65627,-83.545005 +43701,OH,Sonora,39.944265,-82.008898 +43713,OH,Somerton,39.9812,-81.171295 +43716,OH,Beallsville,39.872601,-81.014358 +43718,OH,Belmont,40.03202,-81.006564 +43719,OH,Bethesda,40.019221,-81.076742 +43720,OH,Blue Rock,39.799996,-81.891023 +43723,OH,Byesville,39.962336,-81.548485 +43724,OH,Caldwell,39.746651,-81.51528 +43725,OH,Claysville,40.030501,-81.591277 +43727,OH,Chandlersville,39.889659,-81.830084 +43728,OH,Chesterhill,39.495277,-81.877286 +43730,OH,Hemlock,39.634902,-82.097737 +43731,OH,Crooksville,39.762321,-82.084018 +43732,OH,Cumberland,39.874092,-81.625925 +43734,OH,Duncan Falls,39.877777,-81.911665 +43739,OH,Glenford,39.869935,-82.302592 +43746,OH,Hopewell,39.96008,-82.175619 +43747,OH,Jerusalem,39.848831,-81.092088 +43748,OH,Junction City,39.696531,-82.315525 +43749,OH,Guernsey,40.166544,-81.53036 +43754,OH,Lewisville,39.768379,-81.231583 +43755,OH,Lore City,40.045854,-81.447853 +43756,OH,Mc Connelsville,39.670014,-81.837625 +43758,OH,Malta,39.648212,-81.912746 +43760,OH,Mount Perry,39.878798,-82.188039 +43762,OH,New Concord,40.008798,-81.738727 +43764,OH,New Lexington,39.717438,-82.201884 +43766,OH,New Straitsville,39.586872,-82.248804 +43767,OH,Norwich,39.993438,-81.802425 +43771,OH,Philo,39.845773,-81.917479 +43772,OH,Pleasant City,39.909514,-81.55797 +43773,OH,Quaker City,39.986576,-81.289883 +43777,OH,Roseville,39.818656,-82.079212 +43778,OH,Salesville,40.008146,-81.372793 +43779,OH,Sarahsville,39.793846,-81.467825 +43780,OH,Senecaville,39.933719,-81.458043 +43782,OH,Shawnee,39.610984,-82.208459 +43783,OH,Somerset,39.793615,-82.29911 +43787,OH,Pennsville,39.561434,-81.825251 +43788,OH,Summerfield,39.803597,-81.331993 +43793,OH,Antioch,39.753063,-81.10336 +43802,OH,Adamsville,40.07929,-81.871847 +43804,OH,Baltic,40.447568,-81.679171 +43811,OH,Conesville,40.180441,-81.895074 +43812,OH,Coshocton,40.275412,-81.866033 +43821,OH,Adams Mills,40.112941,-82.018807 +43822,OH,Frazeysburg,40.131616,-82.129279 +43824,OH,Fresno,40.371126,-81.762297 +43830,OH,Nashport,40.038588,-82.09976 +43832,OH,Newcomerstown,40.273895,-81.593969 +43837,OH,Port Washington,40.340359,-81.521518 +43840,OH,Stone Creek,40.405188,-81.589018 +43843,OH,Walhonding,40.362037,-82.209359 +43844,OH,Warsaw,40.317243,-82.055989 +43845,OH,West Lafayette,40.271829,-81.736102 +43901,OH,Adena,40.212581,-80.881538 +43902,OH,Alledonia,39.905271,-80.957753 +43903,OH,Amsterdam,40.473131,-80.959554 +43906,OH,Bellaire,40.020399,-80.763813 +43907,OH,Moorefield,40.264537,-80.996244 +43908,OH,Bergholz,40.47771,-80.886153 +43910,OH,Bloomingdale,40.3742,-80.807214 +43912,OH,Bridgeport,40.075184,-80.774682 +43913,OH,Brilliant,40.268283,-80.631949 +43915,OH,Clarington,39.781908,-80.911311 +43917,OH,Dillonvale,40.212132,-80.802843 +43920,OH,Calcutta,40.645918,-80.578669 +43930,OH,Hammondsville,40.579909,-80.729918 +43932,OH,Irondale,40.511052,-80.791546 +43933,OH,Armstrong Mills,39.956304,-80.882181 +43935,OH,Martins Ferry,40.103597,-80.736125 +43938,OH,Mingo Junction,40.320256,-80.625021 +43942,OH,Powhatan Point,39.867935,-80.8168 +43943,OH,Rayland,40.208274,-80.712534 +43944,OH,Richmond,40.426061,-80.76128 +43945,OH,Salineville,40.619525,-80.834977 +43946,OH,Sardis,39.652639,-80.924308 +43947,OH,Shadyside,39.967497,-80.764309 +43950,OH,Saint Clairsvill,40.083439,-80.902285 +43952,OH,Wintersville,40.370638,-80.66115 +43963,OH,Tiltonsville,40.168075,-80.699647 +43964,OH,Toronto,40.473298,-80.632504 +43968,OH,Wellsville,40.617099,-80.662095 +43971,OH,Yorkville,40.158051,-80.707737 +43973,OH,Freeport,40.192502,-81.276955 +43976,OH,Hopedale,40.349647,-80.902136 +43977,OH,Flushing,40.145144,-81.07573 +43983,OH,Piedmont,40.150716,-81.214494 +43986,OH,Jewett,40.37446,-81.000379 +43988,OH,Scio,40.40116,-81.101577 +44001,OH,South Amherst,41.390506,-82.228165 +44003,OH,Andover,41.622488,-80.575374 +44004,OH,Ashtabula,41.867877,-80.794681 +44010,OH,Austinburg,41.75536,-80.858422 +44011,OH,Avon,41.446713,-82.020359 +44012,OH,Avon Lake,41.501904,-82.011094 +44017,OH,Berea,41.367557,-81.861756 +44021,OH,Burton,41.452702,-81.15262 +44022,OH,Chagrin Falls,41.418577,-81.361437 +44024,OH,Chardon,41.571862,-81.205629 +44026,OH,Chesterland,41.534378,-81.342102 +44028,OH,Columbia Station,41.318708,-81.934398 +44030,OH,Conneaut,41.934479,-80.580257 +44032,OH,Dorset,41.658972,-80.668334 +44035,OH,Elyria,41.372353,-82.105088 +44039,OH,North Ridgeville,41.396432,-82.003323 +44040,OH,Gates Mills,41.532368,-81.415021 +44041,OH,Geneva,41.802864,-80.947363 +44044,OH,Grafton,41.28537,-82.043098 +44046,OH,Huntsburg,41.530559,-81.057183 +44047,OH,Jefferson,41.733513,-80.756166 +44048,OH,Kingsville,41.872311,-80.660092 +44050,OH,Lagrange,41.242278,-82.127918 +44052,OH,Lorain,41.457796,-82.171039 +44053,OH,Lorain,41.432002,-82.203833 +44054,OH,Sheffield Lake,41.482276,-82.096497 +44055,OH,Lorain,41.436131,-82.134992 +44056,OH,Macedonia,41.322236,-81.499578 +44057,OH,Madison,41.805367,-81.058819 +44060,OH,Mentor,41.689468,-81.342133 +44062,OH,Middlefield,41.445547,-81.037338 +44064,OH,Montville,41.603446,-81.057036 +44065,OH,Newbury,41.475022,-81.23452 +44067,OH,Northfield,41.320821,-81.542943 +44070,OH,North Olmsted,41.420129,-81.913056 +44072,OH,Novelty,41.476288,-81.334228 +44074,OH,Oberlin,41.28987,-82.222863 +44076,OH,East Orwell,41.533456,-80.839671 +44077,OH,Fairport Harbor,41.714014,-81.243665 +44081,OH,Perry,41.767916,-81.143312 +44082,OH,Pierpont,41.767661,-80.574114 +44084,OH,Roaming Shores,41.6651,-80.885134 +44085,OH,Roaming Shores,41.602629,-80.832075 +44086,OH,Thompson,41.676189,-81.057318 +44087,OH,Twinsburg,41.328851,-81.455912 +44089,OH,Vermilion,41.409989,-82.355417 +44090,OH,Wellington,41.171178,-82.226915 +44092,OH,Wickliffe,41.604565,-81.469175 +44093,OH,Williamsfield,41.538296,-80.596378 +44094,OH,Willoughby,41.630229,-81.407619 +44095,OH,Willowick,41.649822,-81.447887 +44099,OH,Windsor,41.56233,-80.966745 +44102,OH,Cleveland,41.473508,-81.739791 +44103,OH,Cleveland,41.515726,-81.640475 +44104,OH,Cleveland,41.480924,-81.624502 +44105,OH,Cleveland,41.450912,-81.619002 +44106,OH,Cleveland,41.508359,-81.60757 +44107,OH,Edgewater,41.482654,-81.797143 +44108,OH,Cleveland,41.53492,-81.608974 +44109,OH,Cleveland,41.445768,-81.703315 +44110,OH,Cleveland,41.563557,-81.573276 +44111,OH,Cleveland,41.457066,-81.78435 +44112,OH,East Cleveland,41.535517,-81.576262 +44113,OH,Cleveland,41.481648,-81.701848 +44114,OH,Cleveland,41.506351,-81.67425 +44115,OH,Cleveland,41.494574,-81.667009 +44116,OH,Rocky River,41.469401,-81.851246 +44117,OH,Euclid,41.569615,-81.525686 +44118,OH,Cleveland Height,41.501213,-81.553945 +44119,OH,Cleveland,41.588238,-81.546759 +44120,OH,Cleveland,41.471433,-81.583911 +44121,OH,South Euclid,41.526019,-81.533758 +44122,OH,Beachwood,41.470109,-81.523172 +44123,OH,Shore,41.604416,-81.524325 +44124,OH,Lyndhurst Mayfie,41.514349,-81.46801 +44125,OH,Garfield Heights,41.415792,-81.605385 +44126,OH,Fairview Park,41.4433,-81.856381 +44127,OH,Cleveland,41.470125,-81.648999 +44128,OH,Cleveland,41.441565,-81.548574 +44129,OH,Parma,41.396474,-81.734604 +44130,OH,Midpark,41.377178,-81.774858 +44131,OH,Independence,41.380905,-81.66421 +44132,OH,Noble,41.608516,-81.499056 +44133,OH,North Royalton,41.323164,-81.745657 +44134,OH,Parma,41.390764,-81.705726 +44135,OH,Cleveland,41.434177,-81.804433 +44136,OH,Strongsville,41.313218,-81.828457 +44137,OH,Maple Heights,41.410513,-81.560339 +44138,OH,Olmsted Falls,41.373351,-81.915769 +44139,OH,Solon,41.386597,-81.442082 +44140,OH,Bay Village,41.484137,-81.928868 +44141,OH,Brecksville,41.316554,-81.626083 +44142,OH,Brookpark,41.397944,-81.811811 +44143,OH,Richmond Heights,41.552195,-81.484715 +44144,OH,Brooklyn,41.434419,-81.735222 +44145,OH,Westlake,41.453459,-81.921771 +44146,OH,Bedford,41.392067,-81.52315 +44147,OH,Broadview Height,41.32907,-81.680879 +44201,OH,Atwater,41.033487,-81.198456 +44202,OH,Reminderville,41.320935,-81.360424 +44203,OH,Norton,41.018589,-81.615314 +44212,OH,Brunswick,41.247053,-81.827968 +44214,OH,Burbank,40.963725,-81.995753 +44215,OH,Chippewa Lake,41.06719,-81.909173 +44216,OH,Clinton,40.939062,-81.587079 +44217,OH,Creston,40.978846,-81.921083 +44221,OH,Cuyahoga Falls,41.140082,-81.478961 +44223,OH,Cuyahoga Falls,41.146448,-81.510719 +44224,OH,Stow,41.174808,-81.438017 +44230,OH,Doylestown,40.965042,-81.684845 +44231,OH,Garrettsville,41.298803,-81.070365 +44233,OH,Hinckley,41.241872,-81.74527 +44234,OH,Hiram,41.332253,-81.14644 +44235,OH,Homerville,41.02669,-82.124957 +44236,OH,Hudson,41.245836,-81.436659 +44240,OH,Kent,41.14492,-81.34976 +44241,OH,Streetsboro,41.249099,-81.338298 +44253,OH,Litchfield,41.166847,-82.015674 +44254,OH,Lodi,41.032713,-82.014661 +44255,OH,Mantua,41.294141,-81.228259 +44256,OH,Medina,41.140415,-81.858351 +44260,OH,Mogadore,41.038196,-81.358963 +44262,OH,Munroe Falls,41.14202,-81.437565 +44264,OH,Peninsula,41.225579,-81.540013 +44266,OH,Ravenna,41.164886,-81.233656 +44270,OH,Rittman,40.968381,-81.782599 +44272,OH,Rootstown,41.099534,-81.202642 +44273,OH,Seville,41.022731,-81.856199 +44275,OH,Spencer,41.098287,-82.099907 +44276,OH,Sterling,40.953263,-81.851914 +44278,OH,Tallmadge,41.097492,-81.425966 +44280,OH,Valley City,41.236806,-81.924467 +44281,OH,Wadsworth,41.038375,-81.737373 +44286,OH,Richfield,41.23712,-81.646668 +44287,OH,West Salem,40.948514,-82.106638 +44288,OH,Windham,41.239244,-81.053451 +44301,OH,Akron,41.044852,-81.520048 +44302,OH,Akron,41.091988,-81.542015 +44303,OH,Akron,41.102508,-81.538609 +44304,OH,Akron,41.080808,-81.508526 +44305,OH,Akron,41.076029,-81.464409 +44306,OH,Akron,41.04791,-81.491554 +44307,OH,Akron,41.069465,-81.548786 +44308,OH,Akron,41.079576,-81.519363 +44310,OH,Akron,41.107547,-81.500586 +44311,OH,Akron,41.063784,-81.520005 +44312,OH,Akron,41.033442,-81.438528 +44313,OH,Akron,41.121995,-81.568487 +44314,OH,Akron,41.040774,-81.559825 +44319,OH,Akron,40.97912,-81.53468 +44320,OH,Akron,41.083496,-81.56744 +44321,OH,Copley,41.103139,-81.648045 +44333,OH,Fairlawn,41.146734,-81.62385 +44401,OH,Berlin Center,41.024319,-80.934104 +44402,OH,Bristolville,41.379749,-80.856839 +44403,OH,Brookfield,41.247957,-80.578767 +44404,OH,Burghill,41.334688,-80.54406 +44405,OH,Campbell,41.077829,-80.589721 +44406,OH,Canfield,41.029328,-80.756436 +44408,OH,Columbiana,40.885279,-80.697473 +44410,OH,Cortland,41.325125,-80.732745 +44411,OH,Deerfield,41.03586,-81.052827 +44412,OH,Diamond,41.093473,-81.0425 +44413,OH,East Palestine,40.840554,-80.546513 +44417,OH,Farmdale,41.392301,-80.662818 +44418,OH,Fowler,41.334851,-80.605894 +44420,OH,Girard,41.161136,-80.693305 +44423,OH,Hanoverton,40.773116,-80.914445 +44425,OH,Hubbard,41.162401,-80.576192 +44427,OH,Kensington,40.71418,-80.938079 +44428,OH,Kinsman,41.435442,-80.576506 +44429,OH,Lake Milton,41.101354,-80.97235 +44430,OH,Leavittsburg,41.244498,-80.886922 +44431,OH,Leetonia,40.863077,-80.758453 +44432,OH,Lisbon,40.759154,-80.758674 +44436,OH,Lowellville,41.050256,-80.541551 +44437,OH,Mc Donald,41.158026,-80.731169 +44438,OH,Masury,41.22552,-80.532565 +44440,OH,Mineral Ridge,41.131843,-80.755293 +44441,OH,Negley,40.774601,-80.564497 +44442,OH,New Middletown,40.964607,-80.553415 +44443,OH,New Springfield,40.926517,-80.585585 +44444,OH,Newton Falls,41.191047,-80.970135 +44445,OH,New Waterford,40.848941,-80.620855 +44446,OH,Niles,41.182414,-80.755775 +44449,OH,North Benton,40.987579,-81.016168 +44450,OH,North Bloomfield,41.456887,-80.806835 +44451,OH,North Jackson,41.088044,-80.86225 +44452,OH,North Lima,40.964866,-80.654911 +44454,OH,Petersburg,40.904861,-80.540031 +44455,OH,Rogers,40.778943,-80.620237 +44460,OH,Salem,40.900024,-80.861883 +44470,OH,Southington,41.298312,-80.948474 +44471,OH,Struthers,41.050847,-80.598487 +44473,OH,Vienna,41.217478,-80.654998 +44481,OH,Warren,41.172426,-80.871806 +44483,OH,Warren,41.263878,-80.816448 +44484,OH,Warren,41.231819,-80.764243 +44485,OH,Warren,41.240511,-80.844136 +44490,OH,Washingtonville,40.897331,-80.763137 +44491,OH,West Farmington,41.350849,-80.967245 +44502,OH,Youngstown,41.077366,-80.640905 +44503,OH,Youngstown,41.102016,-80.650007 +44504,OH,Youngstown,41.123686,-80.653887 +44505,OH,Youngstown,41.125748,-80.627748 +44506,OH,Youngstown,41.096045,-80.625916 +44507,OH,Youngstown,41.073236,-80.655336 +44509,OH,Youngstown,41.10498,-80.694463 +44510,OH,Youngstown,41.119714,-80.667204 +44511,OH,Youngstown,41.070402,-80.693098 +44512,OH,Boardman,41.031985,-80.666629 +44514,OH,Poland,41.023258,-80.610254 +44515,OH,Austintown,41.093903,-80.743966 +44601,OH,Alliance,40.915842,-81.118193 +44606,OH,Apple Creek,40.755118,-81.809256 +44608,OH,Beach City,40.656199,-81.585129 +44609,OH,Beloit,40.895678,-80.989669 +44611,OH,Big Prairie,40.618777,-82.072048 +44612,OH,Bolivar,40.634692,-81.446356 +44613,OH,Brewster,40.714387,-81.598752 +44614,OH,Canal Fulton,40.88871,-81.577269 +44615,OH,Carrollton,40.578663,-81.081789 +44618,OH,Dalton,40.779326,-81.70078 +44620,OH,Dellroy,40.586143,-81.19856 +44621,OH,Dennison,40.408885,-81.320301 +44622,OH,Dover,40.534338,-81.476321 +44624,OH,Dundee,40.639441,-81.676519 +44625,OH,East Rochester,40.756288,-81.01749 +44626,OH,East Sparta,40.697065,-81.368728 +44627,OH,Fredericksburg,40.685953,-81.851812 +44628,OH,Glenmont,40.521682,-82.150538 +44629,OH,Gnadenhutten,40.372123,-81.405858 +44632,OH,Hartville,40.961798,-81.323873 +44633,OH,Holmesville,40.633042,-81.927476 +44634,OH,Homeworth,40.859192,-81.065473 +44637,OH,Killbuck,40.4933,-81.983721 +44638,OH,Lakeville,40.651965,-82.145477 +44641,OH,Louisville,40.847729,-81.259464 +44643,OH,Magnolia,40.651414,-81.307607 +44644,OH,Malvern,40.684532,-81.18378 +44645,OH,Marshallville,40.906677,-81.722527 +44646,OH,Massillon,40.811605,-81.497263 +44647,OH,Massillon,40.795918,-81.553252 +44651,OH,Mechanicstown,40.626279,-80.956025 +44654,OH,Millersburg,40.556683,-81.832383 +44656,OH,Zoarville,40.625686,-81.354561 +44657,OH,Minerva,40.742049,-81.103076 +44662,OH,Navarre,40.720405,-81.533824 +44663,OH,New Philadelphia,40.484539,-81.435827 +44666,OH,North Lawrence,40.838652,-81.629946 +44667,OH,Orrville,40.845836,-81.774109 +44669,OH,Paris,40.801413,-81.15399 +44672,OH,Sebring,40.922694,-81.023191 +44675,OH,Sherrodsville,40.518418,-81.233945 +44676,OH,Shreve,40.692584,-82.032451 +44677,OH,Smithville,40.859228,-81.863328 +44680,OH,Strasburg,40.60028,-81.536646 +44681,OH,Sugarcreek,40.514785,-81.660356 +44683,OH,Uhrichsville,40.390502,-81.337365 +44685,OH,Uniontown,40.963694,-81.421108 +44688,OH,Waynesburg,40.682881,-81.265891 +44689,OH,Wilmot,40.656723,-81.635247 +44691,OH,Wooster,40.809354,-81.948272 +44695,OH,Bowerston,40.437056,-81.18624 +44699,OH,Tippecanoe,40.279748,-81.291937 +44702,OH,Canton,40.80267,-81.373946 +44703,OH,Canton,40.809791,-81.381439 +44704,OH,Canton,40.799076,-81.353701 +44705,OH,Canton,40.825866,-81.339903 +44706,OH,Canton,40.767959,-81.411903 +44707,OH,North Industry,40.776885,-81.360407 +44708,OH,Canton,40.81196,-81.424116 +44709,OH,North Canton,40.837227,-81.385947 +44710,OH,Canton,40.791107,-81.416946 +44714,OH,Canton,40.827174,-81.360963 +44718,OH,Jackson Belden,40.85479,-81.448514 +44720,OH,North Canton,40.889919,-81.413464 +44721,OH,Canton,40.883446,-81.33279 +44730,OH,East Canton,40.784983,-81.278295 +44802,OH,Alvada,41.046284,-83.376982 +44804,OH,Arcadia,41.111562,-83.50195 +44805,OH,Ashland,40.855892,-82.318931 +44807,OH,Carrothers,41.077755,-82.889721 +44811,OH,Bellevue,41.268432,-82.85765 +44813,OH,Bellville,40.613604,-82.517516 +44814,OH,Berlin Heights,41.320519,-82.477713 +44817,OH,Bloomdale,41.181489,-83.572356 +44818,OH,Bloomville,41.018206,-82.989874 +44820,OH,Bucyrus,40.810306,-82.969829 +44822,OH,Butler,40.543754,-82.398984 +44824,OH,Castalia,41.387229,-82.799426 +44825,OH,Chatfield,40.956637,-83.021432 +44826,OH,Collins,41.245023,-82.490402 +44827,OH,Crestline,40.792714,-82.736723 +44830,OH,Fostoria,41.162346,-83.413938 +44833,OH,Galion,40.730316,-82.793943 +44836,OH,Green Springs,41.228111,-83.088549 +44837,OH,Greenwich,41.04068,-82.51334 +44839,OH,Shinrock,41.390662,-82.555491 +44840,OH,Jeromesville,40.813366,-82.186134 +44841,OH,Kansas,41.212543,-83.329829 +44842,OH,Loudonville,40.636059,-82.23559 +44843,OH,Lucas,40.70389,-82.408671 +44844,OH,Mc Cutchenville,40.975225,-83.263669 +44845,OH,Melmore,41.038954,-83.143238 +44846,OH,Milan,41.311065,-82.612565 +44847,OH,Monroeville,41.218074,-82.70233 +44849,OH,Nevada,40.825946,-83.126567 +44851,OH,New London,41.090575,-82.396588 +44853,OH,New Riegel,41.036058,-83.241807 +44854,OH,New Washington,40.957076,-82.850359 +44855,OH,North Fairfield,41.102987,-82.599801 +44857,OH,Norwalk,41.240314,-82.60785 +44859,OH,Nova,41.028215,-82.338439 +44864,OH,Perrysville,40.660626,-82.321307 +44865,OH,Plymouth,41.00031,-82.663492 +44866,OH,Polk,40.934293,-82.212587 +44867,OH,Republic,41.125876,-83.019407 +44870,OH,Sandusky,41.434878,-82.70633 +44874,OH,Savannah,40.945382,-82.344272 +44875,OH,Shelby,40.878432,-82.654949 +44878,OH,Shiloh,40.934015,-82.522155 +44880,OH,Sullivan,41.036818,-82.217217 +44882,OH,Sycamore,40.941299,-83.149176 +44883,OH,Tiffin,41.123822,-83.184356 +44887,OH,Tiro,40.880992,-82.797032 +44889,OH,Wakeman,41.263748,-82.378168 +44890,OH,Willard,41.062787,-82.728805 +44902,OH,Mansfield,40.755937,-82.512269 +44903,OH,Mansfield,40.762258,-82.52538 +44904,OH,Lexington,40.682568,-82.590605 +44905,OH,Lincoln,40.777173,-82.474609 +44906,OH,Mansfield,40.762679,-82.559295 +44907,OH,Mansfield,40.734483,-82.519833 +45001,OH,Addyston,39.137364,-84.709602 +45002,OH,Cleves,39.193707,-84.733969 +45003,OH,College Corner,39.575453,-84.804951 +45005,OH,Carlisle,39.547839,-84.305881 +45011,OH,Hamilton,39.405906,-84.522117 +45013,OH,Rossville,39.40619,-84.606655 +45014,OH,Fairfield,39.326602,-84.547881 +45015,OH,Lindenwald,39.367152,-84.551187 +45030,OH,Harrison,39.259208,-84.78368 +45036,OH,Otterbien Home,39.442047,-84.218754 +45039,OH,Maineville,39.313878,-84.252567 +45040,OH,Mason,39.335741,-84.314935 +45042,OH,Middletown,39.532121,-84.389601 +45044,OH,Excello,39.485259,-84.383461 +45050,OH,Monroe,39.441285,-84.365196 +45052,OH,North Bend,39.153605,-84.727261 +45053,OH,Okeana,39.353732,-84.776149 +45054,OH,Oregonia,39.414479,-84.051136 +45056,OH,Miami University,39.503838,-84.738518 +45064,OH,Somerville,39.555366,-84.621911 +45065,OH,South Lebanon,39.371451,-84.210783 +45066,OH,Springboro,39.562975,-84.228774 +45067,OH,Trenton,39.479937,-84.459769 +45068,OH,Waynesville,39.528489,-84.081518 +45069,OH,West Chester,39.340243,-84.399786 +45101,OH,Aberdeen,38.670864,-83.763723 +45102,OH,Amelia,39.021138,-84.211174 +45103,OH,Batavia,39.095661,-84.145125 +45106,OH,Bethel,38.94236,-84.09195 +45107,OH,Blanchester,39.303442,-83.973977 +45111,OH,Camp Dennison,39.196212,-84.289659 +45113,OH,Clarksville,39.404233,-83.959407 +45118,OH,Fayetteville,39.186214,-83.950087 +45120,OH,Felicity,38.826248,-84.098581 +45121,OH,Georgetown,38.871708,-83.909153 +45122,OH,Goshen,39.220931,-84.118764 +45123,OH,Greenfield,39.347763,-83.389805 +45130,OH,Hamersville,38.919962,-83.993062 +45133,OH,Hillsboro,39.167877,-83.606406 +45135,OH,Leesburg,39.345767,-83.548146 +45140,OH,Loveland,39.244484,-84.258802 +45142,OH,Lynchburg,39.211931,-83.802124 +45144,OH,Manchester,38.698167,-83.618064 +45146,OH,Martinsville,39.312705,-83.800545 +45148,OH,Midland,39.29169,-83.893131 +45150,OH,Day Heights,39.179987,-84.243814 +45152,OH,Morrow,39.347619,-84.118085 +45153,OH,Moscow,38.858255,-84.195824 +45154,OH,Mount Orab,39.045368,-83.948027 +45157,OH,New Richmond,38.953663,-84.237903 +45159,OH,New Vienna,39.332058,-83.688171 +45162,OH,Pleasant Plain,39.288382,-84.096736 +45167,OH,Ripley,38.755095,-83.822677 +45168,OH,Russellville,38.851128,-83.762459 +45169,OH,Sabina,39.490022,-83.650252 +45171,OH,Sardinia,38.983232,-83.796649 +45174,OH,Terrace Park,39.160155,-84.309762 +45176,OH,Williamsburg,39.075345,-84.043167 +45177,OH,Wilmington,39.448788,-83.841653 +45202,OH,Cincinnati,39.107225,-84.501956 +45203,OH,Cincinnati,39.10754,-84.525684 +45204,OH,Cincinnati,39.102498,-84.566794 +45205,OH,Cincinnati,39.110439,-84.575672 +45206,OH,Cincinnati,39.126916,-84.485258 +45207,OH,Cincinnati,39.139747,-84.470621 +45208,OH,Cincinnati,39.136082,-84.435474 +45209,OH,Cincinnati,39.151578,-84.427833 +45210,OH,Cincinnati,39.112579,-84.513535 +45211,OH,Cincinnati,39.152401,-84.596714 +45212,OH,Norwood,39.162505,-84.452765 +45213,OH,Taft,39.182905,-84.418701 +45214,OH,Cincinnati,39.120642,-84.541442 +45215,OH,Lockland,39.230063,-84.457168 +45216,OH,Elmwood Place,39.199183,-84.479232 +45217,OH,Saint Bernard,39.161715,-84.497424 +45218,OH,Greenhills,39.266573,-84.519608 +45219,OH,Cincinnati,39.127027,-84.513127 +45220,OH,Cincinnati,39.143183,-84.521738 +45223,OH,Cincinnati,39.169619,-84.547807 +45224,OH,College Hill,39.203079,-84.53883 +45225,OH,Cincinnati,39.144654,-84.553267 +45226,OH,Cincinnati,39.117356,-84.431194 +45227,OH,Madisonville,39.15431,-84.387211 +45228,OH,Cincinnati,39.066448,-84.423539 +45229,OH,Cincinnati,39.149016,-84.489184 +45230,OH,Anderson,39.080861,-84.378727 +45231,OH,Cincinnati,39.241827,-84.543702 +45232,OH,Cincinnati,39.185926,-84.514101 +45233,OH,Saylor Park,39.11928,-84.669411 +45236,OH,Taft,39.207302,-84.394746 +45237,OH,Cincinnati,39.18797,-84.457997 +45238,OH,Western Hills,39.111667,-84.608805 +45239,OH,Groesbeck,39.207995,-84.579225 +45240,OH,Parkdale,39.286424,-84.526299 +45241,OH,Sharonville,39.276745,-84.391161 +45242,OH,Sycamore,39.239881,-84.359919 +45243,OH,Madeira,39.187847,-84.359349 +45244,OH,Newtown,39.107091,-84.347765 +45245,OH,Newtown,39.091293,-84.277383 +45246,OH,Glendale,39.28751,-84.472353 +45247,OH,Groesbeck,39.207604,-84.631608 +45248,OH,Westwood,39.159056,-84.651535 +45249,OH,Sycamore,39.275946,-84.326673 +45251,OH,Groesbeck,39.253005,-84.587987 +45252,OH,Cincinnati,39.266803,-84.62832 +45255,OH,Anderson,39.070642,-84.330774 +45302,OH,Anna,40.405105,-84.210344 +45303,OH,Ansonia,40.215064,-84.640642 +45304,OH,Castine,39.988367,-84.53702 +45305,OH,Bellbrook,39.640187,-84.08245 +45306,OH,Botkins,40.465897,-84.177994 +45308,OH,Bradford,40.128558,-84.429288 +45309,OH,Brookville,39.841393,-84.416464 +45311,OH,Camden,39.613391,-84.610008 +45312,OH,Casstown,40.071578,-84.108799 +45314,OH,Cedarville,39.748424,-83.801253 +45315,OH,Clayton,39.855124,-84.33989 +45317,OH,Conover,40.145694,-84.028297 +45318,OH,Covington,40.11756,-84.349646 +45320,OH,Eaton,39.742572,-84.650849 +45321,OH,Eldorado,39.888209,-84.678592 +45322,OH,Union,39.873976,-84.309515 +45323,OH,Enon,39.866282,-83.938464 +45324,OH,Fairborn,39.805311,-84.019789 +45325,OH,Farmersville,39.686684,-84.420507 +45326,OH,Fletcher,40.152622,-84.13304 +45327,OH,Germantown,39.6244,-84.376384 +45331,OH,Greenville,40.098726,-84.634189 +45332,OH,Hollansburg,39.989862,-84.79008 +45333,OH,Houston,40.253478,-84.352109 +45334,OH,Jackson Center,40.435802,-84.045677 +45335,OH,Jamestown,39.642848,-83.750417 +45337,OH,Laura,39.978492,-84.3994 +45338,OH,Lewisburg,39.853404,-84.53685 +45339,OH,Ludlow Falls,39.987091,-84.333391 +45340,OH,Maplewood,40.343743,-84.076657 +45341,OH,Medway,39.879774,-84.026808 +45342,OH,Miamisburg,39.632095,-84.267477 +45344,OH,New Carlisle,39.930025,-84.021704 +45345,OH,New Lebanon,39.739798,-84.395591 +45346,OH,New Madison,39.968711,-84.722211 +45347,OH,New Paris,39.861718,-84.779337 +45348,OH,New Weston,40.334923,-84.630792 +45356,OH,Piqua,40.148621,-84.253053 +45359,OH,Pleasant Hill,40.053136,-84.343634 +45362,OH,Rossburg,40.29465,-84.626419 +45363,OH,Russia,40.234065,-84.412255 +45365,OH,Sidney,40.287357,-84.162223 +45368,OH,Selma,39.846939,-83.660787 +45369,OH,South Vienna,39.94732,-83.615704 +45370,OH,Spring Valley,39.602761,-84.101583 +45371,OH,Phoneton,39.943577,-84.171501 +45373,OH,Troy,40.037394,-84.203151 +45377,OH,Vandalia,39.888273,-84.202266 +45380,OH,Versailles,40.227284,-84.495697 +45381,OH,West Alexandria,39.725898,-84.535214 +45382,OH,West Manchester,39.902564,-84.619383 +45383,OH,West Milton,39.953077,-84.324237 +45385,OH,Xenia,39.684204,-83.936878 +45387,OH,Yellow Springs,39.799569,-83.889066 +45388,OH,Yorkshire,40.328328,-84.483587 +45390,OH,Union City,40.201773,-84.783209 +45402,OH,Dayton,39.756305,-84.189508 +45403,OH,Dayton,39.761728,-84.149802 +45404,OH,Dayton,39.78619,-84.162157 +45405,OH,Dayton,39.78993,-84.213546 +45406,OH,Dayton,39.782148,-84.237297 +45407,OH,Dayton,39.762699,-84.224232 +45408,OH,Dayton,39.739526,-84.228963 +45409,OH,Dayton,39.728496,-84.182495 +45410,OH,Dayton,39.74743,-84.16001 +45414,OH,Dayton,39.828528,-84.202444 +45415,OH,Dayton,39.835488,-84.261328 +45416,OH,Trotwood,39.805541,-84.259824 +45417,OH,Dayton,39.752812,-84.246961 +45418,OH,Dayton,39.716251,-84.267696 +45419,OH,Dayton,39.715486,-84.163656 +45420,OH,Kettering,39.721286,-84.133892 +45424,OH,Huber Heights,39.845339,-84.123287 +45426,OH,Trotwood,39.810548,-84.298283 +45427,OH,Dayton,39.754527,-84.281884 +45429,OH,Kettering,39.686392,-84.156077 +45430,OH,Beavercreek,39.709381,-84.083596 +45431,OH,Beavercreek,39.765396,-84.099802 +45432,OH,Beavercreek,39.740774,-84.094157 +45433,OH,Dayton,39.813758,-84.059048 +45434,OH,Beavercreek,39.716552,-84.040385 +45439,OH,West Carrollton,39.689617,-84.21626 +45440,OH,Dayton,39.674854,-84.113573 +45449,OH,West Carrollton,39.662098,-84.237887 +45458,OH,Centerville,39.615755,-84.162697 +45459,OH,Centerville,39.645957,-84.166422 +45502,OH,Springfield,39.930486,-83.841338 +45503,OH,Springfield,39.9528,-83.78043 +45504,OH,Springfield,39.940793,-83.834302 +45505,OH,Springfield,39.910588,-83.785593 +45506,OH,Springfield,39.910418,-83.827512 +45601,OH,Chillicothe,39.337997,-82.98949 +45612,OH,Bainbridge,39.213116,-83.276268 +45613,OH,Beaver,39.023847,-82.847469 +45614,OH,Bidwell,38.927647,-82.270092 +45616,OH,Blue Creek,38.756451,-83.35268 +45619,OH,Chesapeake,38.455089,-82.450448 +45620,OH,Cheshire,38.958678,-82.123537 +45622,OH,Creola,39.3497,-82.493835 +45623,OH,Crown City,38.613548,-82.265717 +45628,OH,Frankfort,39.391015,-83.203356 +45629,OH,Franklin Furnace,38.628216,-82.814477 +45631,OH,Gallipolis,38.814781,-82.22902 +45634,OH,Hamden,39.168497,-82.509976 +45638,OH,Ironton,38.529429,-82.665351 +45640,OH,Jackson,39.042821,-82.647209 +45644,OH,Kingston,39.441432,-82.848808 +45645,OH,Kitts Hill,38.564945,-82.548897 +45646,OH,Latham,39.080436,-83.328294 +45647,OH,Londonderry,39.272283,-82.783288 +45648,OH,Lucasville,38.893832,-82.994009 +45651,OH,Allensville,39.255326,-82.490699 +45652,OH,Mc Dermott,38.836203,-83.068892 +45653,OH,Minford,38.875087,-82.855538 +45654,OH,New Plymouth,39.388421,-82.389172 +45656,OH,Oak Hill,38.891559,-82.588343 +45657,OH,Otway,38.85203,-83.222172 +45658,OH,Patriot,38.77702,-82.427491 +45659,OH,Pedro,38.650323,-82.647722 +45660,OH,Peebles,38.986885,-83.368698 +45661,OH,Idaho,39.040196,-83.076742 +45662,OH,New Boston,38.757252,-82.94864 +45663,OH,Portsmouth,38.749222,-83.047657 +45669,OH,Proctorville,38.463461,-82.352294 +45670,OH,Radcliff,39.105205,-82.354243 +45671,OH,Rarden,38.943388,-83.237337 +45672,OH,Ray,39.207678,-82.690801 +45673,OH,Richmond Dale,39.203922,-82.814913 +45675,OH,Rock Camp,38.522145,-82.563832 +45678,OH,Scottown,38.594034,-82.396685 +45679,OH,Seaman,38.962072,-83.593625 +45680,OH,South Point,38.433856,-82.552883 +45681,OH,South Salem,39.302137,-83.271953 +45682,OH,South Webster,38.819967,-82.720151 +45684,OH,Stout,38.654588,-83.208984 +45685,OH,Thurman,38.898786,-82.404996 +45686,OH,Vinton,38.978338,-82.357014 +45688,OH,Waterloo,38.718152,-82.517399 +45690,OH,Waverly,39.126445,-83.004874 +45692,OH,Wellston,39.118897,-82.548474 +45693,OH,West Union,38.801702,-83.533349 +45694,OH,Wheelersburg,38.741793,-82.820434 +45696,OH,Willow Wood,38.593976,-82.453 +45697,OH,Winchester,38.935283,-83.666137 +45701,OH,Athens,39.317824,-82.102011 +45710,OH,Albany,39.209664,-82.217727 +45711,OH,Amesville,39.408641,-81.964976 +45714,OH,Belpre,39.286772,-81.596795 +45715,OH,Beverly,39.571435,-81.634588 +45723,OH,Coolville,39.214131,-81.832867 +45724,OH,Cutler,39.404172,-81.76573 +45727,OH,Dexter City,39.652585,-81.467151 +45729,OH,Fleming,39.392806,-81.656444 +45732,OH,Glouster,39.497837,-82.087128 +45734,OH,Rinard Mills,39.659384,-81.189152 +45735,OH,Guysville,39.294368,-81.926841 +45741,OH,Dexter,39.056325,-82.231186 +45742,OH,Little Hocking,39.280046,-81.707107 +45743,OH,Long Bottom,39.08015,-81.888748 +45744,OH,Lowell,39.53847,-81.519679 +45745,OH,Warner,39.593895,-81.35452 +45746,OH,Macksburg,39.620356,-81.447088 +45750,OH,Marietta,39.428141,-81.464438 +45760,OH,Middleport,38.999312,-82.060012 +45761,OH,Millfield,39.407711,-82.111328 +45764,OH,Nelsonville,39.455635,-82.230883 +45766,OH,New Marshfield,39.338295,-82.222513 +45767,OH,New Matamoras,39.528819,-81.093998 +45768,OH,Newport,39.39711,-81.240175 +45769,OH,Pomeroy,39.060729,-82.033145 +45770,OH,Portland,38.999919,-81.813548 +45771,OH,Racine,38.978551,-81.925759 +45772,OH,Reedsville,39.149002,-81.792433 +45773,OH,Reno,39.378408,-81.38043 +45774,OH,45774,39.559845,-81.182005 +45775,OH,Rutland,39.045653,-82.121914 +45776,OH,Shade,39.212862,-82.021755 +45778,OH,Stewart,39.32133,-81.892884 +45780,OH,The Plains,39.366177,-82.134148 +45784,OH,Vincent,39.337446,-81.674265 +45786,OH,Waterford,39.515904,-81.655917 +45788,OH,Whipple,39.480975,-81.363639 +45789,OH,Wingett Run,39.542813,-81.283999 +45801,OH,Lima,40.764066,-84.097296 +45804,OH,Lima,40.727476,-84.089023 +45805,OH,Lima,40.739911,-84.14591 +45806,OH,Cridersville,40.675926,-84.144049 +45807,OH,Elida,40.791599,-84.163966 +45810,OH,Ada,40.770931,-83.815402 +45812,OH,Alger,40.705967,-83.825011 +45813,OH,Antwerp,41.188736,-84.744796 +45814,OH,Arlington,40.876109,-83.668536 +45817,OH,Bluffton,40.878978,-83.891397 +45821,OH,Cecil,41.217355,-84.629646 +45822,OH,Carthagena,40.546074,-84.570067 +45827,OH,Cloverdale,41.037934,-84.29382 +45828,OH,Coldwater,40.484557,-84.651653 +45830,OH,Columbus Grove,40.91372,-84.070467 +45831,OH,Continental,41.114769,-84.235778 +45832,OH,Convoy,40.926998,-84.723772 +45833,OH,Delphos,40.833619,-84.324678 +45835,OH,Dola,40.787645,-83.689371 +45836,OH,Dunkirk,40.782375,-83.633912 +45840,OH,Findlay,41.044903,-83.645656 +45841,OH,Jenera,40.900388,-83.725628 +45843,OH,Patterson,40.79955,-83.509771 +45844,OH,Fort Jennings,40.948393,-84.237381 +45845,OH,Fort Loramie,40.330632,-84.374131 +45846,OH,Fort Recovery,40.401829,-84.76125 +45849,OH,Grover Hill,41.024497,-84.495601 +45850,OH,Harrod,40.717657,-83.943649 +45851,OH,Haviland,41.032911,-84.6139 +45856,OH,Leipsic,41.109197,-83.995723 +45858,OH,Mc Comb,41.112498,-83.801423 +45860,OH,Maria Stein,40.406225,-84.507579 +45862,OH,Mendon,40.677737,-84.51515 +45863,OH,Middle Point,40.873147,-84.417495 +45865,OH,Minster,40.390983,-84.372895 +45867,OH,Mount Blanchard,40.892929,-83.555286 +45868,OH,Mount Cory,40.943717,-83.809285 +45869,OH,New Bremen,40.438917,-84.3821 +45871,OH,New Knoxville,40.50386,-84.311797 +45872,OH,North Baltimore,41.186703,-83.680581 +45873,OH,Oakwood,41.090788,-84.396923 +45874,OH,Ohio City,40.785428,-84.673063 +45875,OH,Gilboa,41.029747,-84.047293 +45876,OH,Ottoville,40.937218,-84.347392 +45877,OH,Pandora,40.95087,-83.952073 +45879,OH,Paulding,41.141016,-84.572227 +45880,OH,Payne,41.08069,-84.734127 +45881,OH,Rawson,41.000135,-83.806951 +45882,OH,Rockford,40.677077,-84.664174 +45883,OH,Saint Henry,40.409138,-84.633338 +45885,OH,Saint Marys,40.543988,-84.394399 +45886,OH,Scott,40.989238,-84.584455 +45887,OH,Spencerville,40.703767,-84.34125 +45889,OH,Van Buren,41.132691,-83.647302 +45890,OH,Vanlue,40.958314,-83.497062 +45891,OH,Van Wert,40.868927,-84.590364 +45894,OH,Venedocia,40.768454,-84.46204 +45895,OH,Wapakoneta,40.568978,-84.177378 +45896,OH,Waynesfield,40.607185,-83.958475 +45898,OH,Willshire,40.734618,-84.77773 +73002,OK,Alex,34.961202,-97.75709 +73004,OK,Amber,35.137691,-97.764566 +73005,OK,Anadarko,35.072808,-98.24291 +73006,OK,Apache,34.903376,-98.369483 +73007,OK,Arcadia,35.6543,-97.324289 +73008,OK,Bethany,35.504315,-97.639856 +73009,OK,Binger,35.310593,-98.314797 +73010,OK,Blanchard,35.119215,-97.640131 +73011,OK,Bradley,34.874124,-97.711841 +73013,OK,Edmond,35.621534,-97.473268 +73014,OK,Calumet,35.594819,-98.189991 +73015,OK,Carnegie,35.123484,-98.575454 +73016,OK,Cashion,35.799996,-97.679523 +73017,OK,Cement,34.932092,-98.14656 +73018,OK,Chickasha,35.026751,-97.951847 +73020,OK,Choctaw,35.471758,-97.272564 +73021,OK,Colony,35.344844,-98.670674 +73024,OK,Corn,35.399842,-98.806226 +73027,OK,Coyle,35.898496,-97.260683 +73028,OK,Crescent,35.942,-97.596922 +73029,OK,Cyril,34.895854,-98.208269 +73030,OK,Davis,34.495301,-97.10843 +73034,OK,Edmond,35.666483,-97.479835 +73035,OK,Elmore City,34.608516,-97.39003 +73036,OK,El Reno,35.533468,-97.959091 +73038,OK,Fort Cobb,35.116097,-98.430296 +73039,OK,Foster,34.627789,-97.533395 +73040,OK,Geary,35.621709,-98.390529 +73041,OK,Gotebo,35.075891,-98.875977 +73042,OK,Gracemont,35.187498,-98.283513 +73043,OK,Greenfield,35.733269,-98.384073 +73044,OK,Guthrie,35.832955,-97.435995 +73045,OK,Harrah,35.483258,-97.17343 +73046,OK,Hennepin,34.485893,-97.421467 +73047,OK,Hinton,35.4675,-98.331348 +73048,OK,Hydro,35.45201,-98.560448 +73049,OK,Jones,35.575316,-97.28914 +73051,OK,Lexington,35.037661,-97.260945 +73052,OK,Lindsay,34.821116,-97.599788 +73053,OK,Lookeba,35.367946,-98.389833 +73054,OK,Luther,35.631491,-97.182292 +73055,OK,Marlow,34.638681,-97.940955 +73056,OK,Marshall,36.148455,-97.617052 +73057,OK,Maysville,34.811316,-97.413143 +73058,OK,Meridian,35.8451,-97.24623 +73059,OK,Minco,35.306723,-97.96638 +73061,OK,Morrison,36.290214,-97.022777 +73062,OK,Mountain View,35.06535,-98.730694 +73063,OK,Mulhall,36.053678,-97.409809 +73064,OK,Mustang,35.388498,-97.730888 +73065,OK,Newcastle,35.245269,-97.621573 +73067,OK,Ninnekah,34.91435,-97.933277 +73068,OK,Noble,35.141742,-97.340929 +73069,OK,Norman,35.220389,-97.457743 +73071,OK,Norman,35.224254,-97.379159 +73072,OK,Norman,35.210733,-97.472984 +73073,OK,Orlando,36.141973,-97.395992 +73074,OK,Paoli,34.828492,-97.260807 +73075,OK,Pauls Valley,34.738506,-97.219501 +73077,OK,Perry,36.287468,-97.284175 +73078,OK,Piedmont,35.66946,-97.743109 +73079,OK,Pocasset,35.154437,-97.97904 +73080,OK,Purcell,35.010293,-97.425493 +73081,OK,Ratliff City,34.420719,-97.514424 +73082,OK,Rush Springs,34.770804,-97.943101 +73084,OK,Spencer,35.518276,-97.348775 +73086,OK,Sulphur,34.511585,-96.979695 +73088,OK,Tussy,34.492159,-97.536379 +73089,OK,Tuttle,35.267406,-97.744621 +73090,OK,Union City,35.391333,-97.93979 +73092,OK,Verden,35.08356,-98.079206 +73093,OK,Washington,35.13235,-97.486969 +73095,OK,Wayne,34.915353,-97.329014 +73096,OK,Weatherford,35.535046,-98.699603 +73098,OK,Wynnewood,34.63847,-97.176952 +73099,OK,Yukon,35.49772,-97.732307 +73102,OK,Oklahoma City,35.472601,-97.519926 +73103,OK,Oklahoma City,35.490957,-97.519591 +73104,OK,Oklahoma City,35.479388,-97.501714 +73105,OK,Oklahoma City,35.510811,-97.500291 +73106,OK,Oklahoma City,35.485328,-97.537228 +73107,OK,Oklahoma City,35.48736,-97.573974 +73108,OK,Oklahoma City,35.444485,-97.561928 +73109,OK,Oklahoma City,35.425944,-97.526131 +73110,OK,Midwest City,35.461978,-97.397661 +73111,OK,Oklahoma City,35.504238,-97.480607 +73112,OK,Oklahoma City,35.518435,-97.574639 +73114,OK,Oklahoma City,35.570357,-97.525736 +73115,OK,Del City,35.440093,-97.441645 +73116,OK,Nichols Hills,35.542484,-97.56394 +73117,OK,Oklahoma City,35.479667,-97.472195 +73118,OK,Oklahoma City,35.513645,-97.531908 +73119,OK,Oklahoma City,35.421033,-97.561584 +73120,OK,Oklahoma City,35.583478,-97.563756 +73121,OK,Oklahoma City,35.506235,-97.445183 +73122,OK,Warr Acres,35.520239,-97.613305 +73127,OK,Oklahoma City,35.483371,-97.629927 +73128,OK,Oklahoma City,35.444358,-97.616362 +73129,OK,Oklahoma City,35.43119,-97.491309 +73130,OK,Midwest City,35.460863,-97.351489 +73131,OK,Oklahoma City,35.579693,-97.469127 +73132,OK,Warr Acres,35.552783,-97.636333 +73134,OK,Oklahoma City,35.617397,-97.558342 +73135,OK,Oklahoma City,35.411037,-97.438762 +73139,OK,Oklahoma City,35.379193,-97.536205 +73141,OK,Oklahoma City,35.491848,-97.366606 +73142,OK,Oklahoma City,35.598994,-97.625067 +73145,OK,Tinker Afb,35.415706,-97.403707 +73149,OK,Oklahoma City,35.394998,-97.497175 +73150,OK,Oklahoma City,35.41231,-97.33308 +73151,OK,Oklahoma City,35.568508,-97.39057 +73159,OK,Oklahoma City,35.39224,-97.55674 +73160,OK,Moore,35.342465,-97.487352 +73162,OK,Oklahoma City,35.580647,-97.641934 +73165,OK,Moore,35.337086,-97.349792 +73169,OK,Oklahoma City,35.388233,-97.658683 +73170,OK,Moore,35.341554,-97.536 +73173,OK,Oklahoma City,35.342455,-97.63171 +73179,OK,Oklahoma City,35.424157,-97.654729 +73401,OK,Milo,34.176681,-97.134157 +73430,OK,Burneyville,33.951516,-97.324929 +73432,OK,Coleman,34.262498,-96.458818 +73437,OK,Graham,34.337379,-97.495435 +73438,OK,Healdton,34.229017,-97.488904 +73439,OK,Kingston,33.951664,-96.711977 +73440,OK,Lebanon,33.961036,-96.864495 +73441,OK,Leon,33.924278,-97.447058 +73442,OK,Loco,34.321416,-97.665803 +73443,OK,Lone Grove,34.177373,-97.268523 +73446,OK,Mc Millan,34.07126,-96.787258 +73447,OK,Mannsville,34.189902,-96.877801 +73448,OK,Marietta,33.943099,-97.114801 +73449,OK,Mead,33.994442,-96.529886 +73450,OK,Milburn,34.195172,-96.54286 +73453,OK,Overbrook,34.053906,-97.132353 +73456,OK,Ringling,34.167865,-97.602867 +73458,OK,Springer,34.303832,-97.122266 +73459,OK,Thackerville,33.788167,-97.136349 +73460,OK,Tishomingo,34.264286,-96.667502 +73461,OK,Wapanucka,34.386634,-96.453223 +73463,OK,Rubottom,34.164206,-97.42487 +73501,OK,Lawton,34.591467,-98.369783 +73503,OK,Fort Sill,34.659525,-98.40041 +73505,OK,Lawton,34.617939,-98.455234 +73507,OK,Lawton,34.624595,-98.389453 +73521,OK,Altus,34.648406,-99.320483 +73526,OK,Blair,34.778813,-99.333404 +73527,OK,Cache,34.613072,-98.615351 +73528,OK,Chattanooga,34.426193,-98.651365 +73529,OK,Comanche,34.376523,-97.979286 +73530,OK,Davidson,34.251423,-99.064031 +73531,OK,Devol,34.195589,-98.576991 +73532,OK,Duke,34.666769,-99.548172 +73533,OK,Duncan,34.507277,-97.940322 +73537,OK,Eldorado,34.472744,-99.645956 +73538,OK,Elgin,34.772018,-98.407322 +73539,OK,Elmer,34.513668,-99.316744 +73540,OK,Faxon,34.464521,-98.55771 +73541,OK,Fletcher,34.784657,-98.200246 +73542,OK,Frederick,34.401199,-99.011877 +73543,OK,Geronimo,34.480499,-98.387525 +73544,OK,Gould,34.664964,-99.784337 +73546,OK,Grandfield,34.228247,-98.686654 +73547,OK,Granite,34.971184,-99.388139 +73548,OK,Hastings,34.225064,-98.107539 +73549,OK,Headrick,34.72189,-99.23904 +73550,OK,Hollis,34.695281,-99.917711 +73551,OK,Hollister,34.352473,-98.881404 +73552,OK,Indiahoma,34.624226,-98.734864 +73553,OK,Loveland,34.391018,-98.72353 +73554,OK,Reed,34.875473,-99.505769 +73559,OK,Mountain Park,34.703158,-98.959136 +73560,OK,Olustee,34.549634,-99.428684 +73561,OK,Oscar,33.973237,-97.761359 +73562,OK,Randlett,34.174045,-98.459974 +73564,OK,Roosevelt,34.846983,-98.983599 +73565,OK,Ryan,34.023787,-97.946141 +73566,OK,Snyder,34.654779,-98.950752 +73568,OK,Temple,34.260669,-98.237074 +73569,OK,Grady,33.897162,-97.935045 +73570,OK,Tipton,34.509793,-99.131482 +73571,OK,Vinson,34.906179,-99.833929 +73572,OK,Walters,34.360526,-98.313983 +73573,OK,Waurika,34.174466,-97.997346 +73601,OK,Clinton,35.511543,-98.979533 +73620,OK,Arapaho,35.578864,-98.959508 +73622,OK,Bessie,35.38545,-98.989638 +73625,OK,Butler,35.633638,-99.242749 +73626,OK,Canute,35.403678,-99.281575 +73627,OK,Carter,35.220779,-99.482239 +73628,OK,Strong City,35.623181,-99.676688 +73632,OK,Cordell,35.278803,-98.951056 +73638,OK,Crawford,35.836766,-99.806446 +73639,OK,Custer City,35.689371,-98.912013 +73641,OK,Dill City,35.278704,-99.153738 +73642,OK,Durham,35.836391,-99.908774 +73644,OK,Elk City,35.410359,-99.421086 +73645,OK,Erick,35.228586,-99.863463 +73646,OK,Fay,35.820417,-98.658678 +73647,OK,Foss,35.373645,-99.15259 +73650,OK,Hammon,35.646131,-99.402683 +73651,OK,Hobart,35.025521,-99.094433 +73654,OK,Leedey,35.869772,-99.349146 +73655,OK,Lone Wolf,34.980584,-99.250161 +73658,OK,Eagle City,35.921429,-98.708058 +73659,OK,Putnam,35.853851,-98.963765 +73660,OK,Reydon,35.657587,-99.916567 +73661,OK,Rocky,35.152636,-99.048037 +73662,OK,Sayre,35.304722,-99.642928 +73663,OK,Seiling,36.127823,-98.88746 +73664,OK,Sentinel,35.161741,-99.170611 +73666,OK,Sweetwater,35.448835,-99.900619 +73667,OK,Taloga,35.997242,-98.982473 +73668,OK,Texola,35.224977,-99.98218 +73669,OK,Thomas,35.738165,-98.738842 +73673,OK,Willow,35.070245,-99.542091 +73701,OK,Enid,36.402842,-97.862257 +73703,OK,Enid,36.397509,-97.915697 +73716,OK,Aline,36.505621,-98.457387 +73717,OK,Alva,36.801564,-98.672162 +73718,OK,Ames,36.242293,-98.181989 +73719,OK,Amorita,36.941221,-98.245821 +73720,OK,Bison,36.196222,-97.880484 +73722,OK,Burlington,36.903613,-98.421455 +73723,OK,Byron,36.879857,-98.244502 +73724,OK,Canton,36.037194,-98.577818 +73725,OK,Capron,36.896812,-98.629891 +73726,OK,Carmen,36.584206,-98.457793 +73727,OK,Carrier,36.518892,-97.999688 +73728,OK,Cherokee,36.756376,-98.359375 +73729,OK,Cleo Springs,36.408989,-98.442275 +73730,OK,Covington,36.309944,-97.575163 +73731,OK,Dacoma,36.660604,-98.594202 +73733,OK,Douglas,36.248138,-97.689626 +73734,OK,Dover,35.984761,-97.906677 +73735,OK,Drummond,36.284142,-98.035846 +73736,OK,Fairmont,36.391614,-97.711493 +73737,OK,Orienta,36.265981,-98.506271 +73738,OK,Garber,36.439184,-97.578899 +73739,OK,Goltry,36.531364,-98.153978 +73741,OK,Helena,36.54375,-98.277819 +73742,OK,Hennessey,36.086848,-97.892595 +73744,OK,Hitchcock,35.971209,-98.331535 +73747,OK,Isabella,36.23407,-98.337446 +73749,OK,Jet,36.692917,-98.172121 +73750,OK,Kingfisher,35.863613,-97.947293 +73753,OK,Kremlin,36.520735,-97.854186 +73754,OK,Lahoma,36.385005,-98.072738 +73755,OK,Longdale,36.121233,-98.549966 +73756,OK,Loyal,35.970529,-98.115516 +73757,OK,Lucien,36.275327,-97.452574 +73758,OK,Manchester,36.9744,-98.03826 +73759,OK,Medford,36.814195,-97.720215 +73760,OK,Meno,36.381497,-98.163501 +73761,OK,Nash,36.696146,-98.025764 +73762,OK,Okarche,35.750158,-97.92999 +73763,OK,Okeene,36.11646,-98.325422 +73764,OK,Omega,35.850653,-98.186344 +73766,OK,Pond Creek,36.664281,-97.801903 +73768,OK,Ringwood,36.375293,-98.270639 +73770,OK,Southard,36.074706,-98.446456 +73771,OK,Wakita,36.875333,-97.942687 +73772,OK,Watonga,35.853762,-98.417487 +73773,OK,Waukomis,36.278057,-97.899578 +73801,OK,Woodward,36.426784,-99.402016 +73832,OK,Harmon,36.120524,-99.73266 +73834,OK,Selman,36.835901,-99.604816 +73835,OK,Camargo,36.021235,-99.278101 +73838,OK,Chester,36.252841,-98.884078 +73840,OK,Fargo,36.40525,-99.650602 +73841,OK,Fort Supply,36.564556,-99.526797 +73842,OK,Freedom,36.809036,-99.131922 +73843,OK,Gage,36.317996,-99.760003 +73844,OK,Gate,36.875679,-100.073386 +73847,OK,Knowles,36.839316,-100.217867 +73848,OK,Laverne,36.70625,-99.891766 +73849,OK,Logan,36.635554,-100.167934 +73851,OK,May,36.62673,-99.72469 +73852,OK,Mooreland,36.442828,-99.18321 +73853,OK,Mutual,36.213954,-99.114492 +73855,OK,Rosston,36.878915,-99.900253 +73857,OK,Sharon,36.269872,-99.358736 +73858,OK,Shattuck,36.288922,-99.879303 +73859,OK,Vici,36.137168,-99.267004 +73860,OK,Waynoka,36.585788,-98.848746 +73931,OK,Balko,36.599607,-100.710329 +73932,OK,Elmwood,36.795562,-100.532938 +73933,OK,Boise City,36.728328,-102.535519 +73937,OK,Felt,36.566569,-102.797422 +73938,OK,Forgan,36.908588,-100.540875 +73939,OK,Goodwell,36.674382,-101.71369 +73942,OK,Guymon,36.696052,-101.47778 +73944,OK,Hardesty,36.601754,-101.153944 +73945,OK,Optima,36.847981,-101.190683 +73946,OK,Kenton,36.855639,-102.912421 +73947,OK,Keyes,36.800316,-102.236063 +73949,OK,Texhoma,36.52529,-101.839351 +73950,OK,Baker,36.909012,-100.869028 +73951,OK,Tyrone,36.95577,-101.059408 +74002,OK,Barnsdall,36.542866,-96.131789 +74003,OK,Bartlesville,36.743956,-95.992091 +74006,OK,Bartlesville,36.736646,-95.92513 +74008,OK,Bixby,35.917291,-95.872895 +74010,OK,Bristow,35.820904,-96.375838 +74011,OK,Broken Arrow,35.990812,-95.814332 +74012,OK,Broken Arrow,36.04466,-95.807863 +74014,OK,Broken Arrow,36.054435,-95.722269 +74015,OK,Catoosa,36.17208,-95.727321 +74016,OK,Chelsea,36.535586,-95.448871 +74017,OK,Claremore,36.324208,-95.598539 +74020,OK,Cleveland,36.255334,-96.423009 +74021,OK,Collinsville,36.370069,-95.84688 +74022,OK,Copan,36.906181,-95.912987 +74023,OK,Cushing,35.982174,-96.752628 +74027,OK,Delaware,36.780382,-95.618096 +74028,OK,Depew,35.756141,-96.489665 +74029,OK,Dewey,36.80125,-95.93454 +74030,OK,Drumright,35.993136,-96.519789 +74032,OK,Glencoe,36.215815,-96.913845 +74033,OK,Glenpool,35.959106,-95.999709 +74035,OK,Hominy,36.411068,-96.387848 +74036,OK,Inola,36.150315,-95.520456 +74037,OK,Jenks,36.014834,-95.979711 +74038,OK,Jennings,36.186302,-96.573227 +74039,OK,Kellyville,35.917075,-96.218009 +74042,OK,Lenapah,36.880055,-95.623316 +74044,OK,Mannford,36.092688,-96.357552 +74045,OK,Maramec,36.217465,-96.68441 +74047,OK,Mounds,35.912919,-96.068513 +74048,OK,Nowata,36.694565,-95.640421 +74051,OK,Ochelata,36.594655,-95.969143 +74053,OK,Oologah,36.443723,-95.72901 +74054,OK,Osage,36.283156,-96.377411 +74055,OK,Owasso,36.286258,-95.822151 +74056,OK,Pawhuska,36.690424,-96.31209 +74058,OK,Pawnee,36.336197,-96.79227 +74059,OK,Perkins,35.97684,-97.044059 +74060,OK,Prue,36.250125,-96.270074 +74061,OK,Ramona,36.575245,-95.89622 +74062,OK,Ripley,35.998491,-96.89667 +74063,OK,Sand Springs,36.13414,-96.142601 +74066,OK,Sapulpa,36.00297,-96.11061 +74070,OK,Skiatook,36.372495,-96.012325 +74072,OK,S Coffeyville,36.983684,-95.606509 +74073,OK,Sperry,36.29547,-95.980368 +74074,OK,Stillwater,36.104349,-97.060868 +74075,OK,Stillwater,36.139584,-97.063035 +74079,OK,Kendrick,35.782389,-96.684377 +74080,OK,Talala,36.542915,-95.714203 +74081,OK,Terlton,36.188856,-96.487569 +74083,OK,Wann,36.940211,-95.776752 +74084,OK,Wynona,36.50847,-96.368891 +74085,OK,Yale,36.110065,-96.702209 +74103,OK,Tulsa,36.153858,-95.995426 +74104,OK,Tulsa,36.146446,-95.952566 +74105,OK,Tulsa,36.094808,-95.965544 +74106,OK,Tulsa,36.188296,-95.985956 +74107,OK,Tulsa,36.104199,-96.024448 +74108,OK,Tulsa,36.149893,-95.792311 +74110,OK,Tulsa,36.180296,-95.952492 +74112,OK,Tulsa,36.147039,-95.907036 +74114,OK,Tulsa,36.126152,-95.940796 +74115,OK,Tulsa,36.175408,-95.911183 +74116,OK,Tulsa,36.174994,-95.847695 +74117,OK,Tulsa,36.27949,-95.910768 +74119,OK,Tulsa,36.140688,-95.990194 +74120,OK,Tulsa,36.144228,-95.973373 +74126,OK,Tulsa,36.238288,-95.993113 +74127,OK,Tulsa,36.157636,-96.03107 +74128,OK,Tulsa,36.145927,-95.851377 +74129,OK,Tulsa,36.125928,-95.865354 +74130,OK,Tulsa,36.239481,-95.959649 +74131,OK,Tulsa,36.05566,-96.060229 +74132,OK,Tulsa,36.063971,-96.025104 +74133,OK,Tulsa,36.046717,-95.884062 +74134,OK,Tulsa,36.116223,-95.822472 +74135,OK,Tulsa,36.097603,-95.922805 +74136,OK,Tulsa,36.060548,-95.945178 +74137,OK,Tulsa,36.028426,-95.930597 +74145,OK,Tulsa,36.093433,-95.885576 +74146,OK,Tulsa,36.109293,-95.85061 +74301,OK,Vinita,36.633353,-95.138164 +74330,OK,Adair,36.411453,-95.273199 +74331,OK,Bernice,36.630072,-94.907491 +74332,OK,Big Cabin,36.607931,-95.274736 +74333,OK,Bluejacket,36.797453,-95.101844 +74337,OK,Chouteau,36.166924,-95.341574 +74338,OK,Colcord,36.233349,-94.654675 +74339,OK,Commerce,36.933063,-94.872983 +74342,OK,Eucha,36.398709,-94.923003 +74343,OK,Fairland,36.74178,-94.827934 +74344,OK,Grove,36.592869,-94.756536 +74346,OK,Jay,36.436343,-94.776309 +74347,OK,Kansas,36.216114,-94.811416 +74352,OK,Locust Grove,36.181902,-95.168854 +74354,OK,Miami,36.876377,-94.87186 +74359,OK,Oaks,36.168663,-94.850206 +74360,OK,Picher,36.979961,-94.817301 +74361,OK,Pryor,36.292112,-95.312942 +74363,OK,Quapaw,36.928248,-94.742983 +74364,OK,Leach,36.211263,-94.993362 +74365,OK,Salina,36.311597,-95.115772 +74366,OK,Spavinaw,36.415548,-95.028465 +74367,OK,Strang,36.463861,-95.070768 +74368,OK,Twin Oaks,36.191616,-94.854444 +74369,OK,Welch,36.902022,-95.129455 +74370,OK,Wyandotte,36.779616,-94.700239 +74401,OK,Muskogee,35.730661,-95.375491 +74403,OK,Muskogee,35.741057,-95.344907 +74421,OK,Beggs,35.789595,-96.026398 +74422,OK,Boynton,35.657652,-95.660036 +74423,OK,Braggs,35.657395,-95.203326 +74425,OK,Canadian,35.159258,-95.653042 +74426,OK,Checotah,35.435786,-95.535038 +74427,OK,Cookson,35.711622,-94.913205 +74428,OK,Council Hill,35.532175,-95.711326 +74429,OK,Coweta,35.957835,-95.652597 +74432,OK,Eufaula,35.29114,-95.647227 +74434,OK,Fort Gibson,35.794285,-95.229734 +74435,OK,Gore,35.541772,-95.109474 +74436,OK,Haskell,35.810752,-95.683981 +74437,OK,Hoffman,35.454476,-95.976187 +74440,OK,Hoyt,35.268466,-95.299382 +74441,OK,Hulbert,35.925415,-95.165095 +74442,OK,Indianola,35.093724,-95.784479 +74445,OK,Morris,35.661877,-95.83186 +74447,OK,Okmulgee,35.628805,-95.96967 +74450,OK,Oktaha,35.625014,-95.485591 +74451,OK,Park Hill,35.797686,-94.982173 +74452,OK,Peggs,36.059061,-94.991928 +74454,OK,Porter,35.85674,-95.508193 +74455,OK,Porum,35.363059,-95.260661 +74457,OK,Proctor,35.967111,-94.744159 +74461,OK,Stidham,35.381389,-95.705575 +74462,OK,Stigler,35.268561,-95.10707 +74463,OK,Taft,35.758059,-95.54936 +74464,OK,Tahlequah,35.909385,-94.97873 +74467,OK,Wagoner,35.954864,-95.353956 +74469,OK,Warner,35.494546,-95.306434 +74470,OK,Webbers Falls,35.513787,-95.165881 +74471,OK,Welling,35.881917,-94.865326 +74472,OK,Whitefield,35.25114,-95.237493 +74501,OK,Mcalester,34.926233,-95.759168 +74523,OK,Antlers,34.234923,-95.625412 +74525,OK,Atoka,34.34451,-96.141827 +74528,OK,Blanco,34.762151,-95.792069 +74531,OK,Calvin,34.877987,-96.270972 +74533,OK,Caney,34.222112,-96.258364 +74534,OK,Centrahoma,34.606642,-96.338585 +74536,OK,Clayton,34.590591,-95.379981 +74538,OK,Coalgate,34.534408,-96.216726 +74540,OK,Daisy,34.538357,-95.708773 +74542,OK,Farris,34.255833,-95.841368 +74543,OK,Finley,34.340654,-95.538519 +74547,OK,Hartshorne,34.84517,-95.573972 +74548,OK,Haywood,34.951102,-95.967154 +74549,OK,Honobia,34.592604,-94.991557 +74552,OK,Kinta,35.197065,-95.317545 +74553,OK,Kiowa,34.727755,-95.932836 +74555,OK,Lane,34.269122,-95.968515 +74557,OK,Moyers,34.338648,-95.663881 +74558,OK,Nashoba,34.507204,-95.207467 +74560,OK,Pittsburg,34.69748,-95.843905 +74561,OK,Quinton,35.154666,-95.467085 +74562,OK,Rattan,34.245417,-95.344235 +74563,OK,Red Oak,34.942174,-95.090432 +74567,OK,Snow,34.377963,-95.427833 +74569,OK,Stringtown,34.467597,-96.000245 +74570,OK,Stuart,34.882581,-96.138105 +74571,OK,Talihina,34.73812,-94.997813 +74572,OK,Tupelo,34.559809,-96.427365 +74574,OK,Tuskahoma,34.734778,-95.220798 +74576,OK,Wardville,34.568791,-96.020958 +74577,OK,Whitesboro,34.684311,-94.869977 +74578,OK,Wilburton,34.912805,-95.338896 +74601,OK,Ponca City,36.703104,-97.078409 +74604,OK,Ponca City,36.729916,-97.045443 +74630,OK,Billings,36.524609,-97.418889 +74631,OK,Blackwell,36.800574,-97.286695 +74632,OK,Braman,36.933054,-97.308231 +74633,OK,Burbank,36.696583,-96.786873 +74636,OK,Deer Creek,36.80482,-97.513581 +74637,OK,Fairfax,36.557687,-96.699691 +74640,OK,Hunter,36.560342,-97.642507 +74641,OK,Kaw City,36.786663,-96.898862 +74643,OK,Lamont,36.693884,-97.560093 +74644,OK,Marland,36.559067,-97.097592 +74646,OK,Nardin,36.815517,-97.432458 +74647,OK,Peckham,36.887425,-97.05133 +74650,OK,Ralston,36.499228,-96.775481 +74651,OK,Red Rock,36.474754,-97.164021 +74652,OK,Foraker,36.814915,-96.674962 +74653,OK,Tonkawa,36.68062,-97.30634 +74701,OK,Durant,34.00609,-96.384705 +74723,OK,Bennington,33.977085,-96.018774 +74724,OK,Bethel,34.358443,-94.878126 +74726,OK,Bokchito,33.985913,-96.162097 +74727,OK,Boswell,34.024475,-95.840313 +74728,OK,Broken Bow,34.026991,-94.762296 +74729,OK,Caddo,34.115688,-96.260017 +74730,OK,Calera,33.928872,-96.410205 +74731,OK,Cartwright,33.884552,-96.551909 +74733,OK,Colbert,33.857516,-96.495345 +74734,OK,Eagletown,34.036358,-94.559557 +74735,OK,Fort Towson,34.051968,-95.253015 +74736,OK,Garvin,33.920512,-94.932308 +74738,OK,Grant,33.930239,-95.489324 +74740,OK,Tom,33.787507,-94.581775 +74741,OK,Hendrix,33.801582,-96.358134 +74743,OK,Hugo,34.011339,-95.513876 +74745,OK,Idabel,33.88512,-94.802012 +74748,OK,Kenefic,34.131377,-96.388663 +74754,OK,Ringold,34.179892,-95.070387 +74755,OK,Rufe,34.161684,-95.136011 +74756,OK,Sawyer,34.027726,-95.355833 +74759,OK,Soper,34.03659,-95.691566 +74760,OK,Spencerville,34.13263,-95.383468 +74764,OK,Valliant,34.009056,-95.068625 +74766,OK,Wright City,34.079922,-94.992889 +74801,OK,Shawnee,35.34907,-96.931321 +74820,OK,Ada,34.780044,-96.69236 +74824,OK,Agra,35.882548,-96.87794 +74825,OK,Allen,34.850176,-96.558462 +74826,OK,Asher,34.984862,-96.876326 +74827,OK,Atwood,34.919194,-96.357703 +74829,OK,Boley,35.491328,-96.470386 +74831,OK,Byars,34.890397,-97.099723 +74832,OK,Carney,35.805381,-97.015942 +74833,OK,Castle,35.473235,-96.379133 +74834,OK,Chandler,35.704253,-96.858266 +74835,OK,Clearview,35.392585,-96.171404 +74839,OK,Dustin,35.251937,-96.057271 +74840,OK,Earlsboro,35.262792,-96.804093 +74842,OK,Fittstown,34.630134,-96.649458 +74843,OK,Fitzhugh,34.661545,-96.774487 +74845,OK,Vernon,35.208526,-95.895795 +74848,OK,Holdenville,35.083935,-96.376968 +74849,OK,Konawa,34.970824,-96.734279 +74850,OK,Lamar,35.083557,-96.114226 +74851,OK,Mc Loud,35.41907,-97.105178 +74852,OK,Macomb,35.12052,-97.033964 +74854,OK,Maud,35.129224,-96.762686 +74855,OK,Meeker,35.521111,-96.998052 +74856,OK,Mill Creek,34.309754,-96.788419 +74857,OK,Newalla,35.373415,-97.197123 +74859,OK,Bearden,35.447516,-96.306788 +74860,OK,Paden,35.518171,-96.571921 +74864,OK,Prague,35.510482,-96.700879 +74865,OK,Roff,34.615294,-96.842313 +74867,OK,Sasakwa,34.950982,-96.538706 +74868,OK,Seminole,35.252095,-96.668307 +74869,OK,Sparks,35.61378,-96.816269 +74871,OK,Harden City,34.666194,-96.54289 +74872,OK,Stratford,34.771412,-96.976277 +74873,OK,Tecumseh,35.25023,-96.966713 +74875,OK,Tryon,35.863151,-96.9984 +74878,OK,Wanette,34.998313,-97.0419 +74880,OK,Weleetka,35.341582,-96.113609 +74881,OK,Wellston,35.675738,-97.059685 +74882,OK,Welty,35.610727,-96.42762 +74883,OK,Wetumka,35.239552,-96.242082 +74884,OK,New Lima,35.182893,-96.503793 +74901,OK,Arkoma,35.343352,-94.440311 +74902,OK,Pocola,35.243603,-94.476029 +74930,OK,Bokoshe,35.160925,-94.722158 +74931,OK,Bunch,35.735691,-94.734154 +74932,OK,Cameron,35.149355,-94.506015 +74937,OK,Heavener,34.835267,-94.61849 +74939,OK,Hodgen,34.753757,-94.63908 +74940,OK,Howe,34.929936,-94.657072 +74941,OK,Keota,35.264541,-94.902822 +74944,OK,Mccurtain,35.140403,-95.012737 +74948,OK,Muldrow,35.401985,-94.633216 +74949,OK,Muse,34.664124,-94.719007 +74953,OK,Poteau,35.060561,-94.609603 +74954,OK,Roland,35.453811,-94.529085 +74955,OK,Sallisaw,35.485191,-94.778998 +74956,OK,Shady Point,35.129333,-94.666534 +74957,OK,Octavia,34.479056,-94.619117 +74959,OK,Spiro,35.249219,-94.626546 +74960,OK,Stilwell,35.810703,-94.631322 +74962,OK,Vian,35.540383,-94.988756 +74963,OK,Watson,34.419252,-94.556217 +74964,OK,Watts,36.115216,-94.634472 +74965,OK,Westville,35.991226,-94.592627 +74966,OK,Wister,34.955593,-94.783205 +97001,OR,Antelope,44.889196,-120.791384 +97002,OR,Aurora,45.228432,-122.803881 +97004,OR,Beavercreek,45.259723,-122.475122 +97005,OR,Beaverton,45.475035,-122.805395 +97006,OR,Aloha,45.517675,-122.859209 +97007,OR,Aloha,45.472985,-122.859473 +97009,OR,Boring,45.429704,-122.380713 +97010,OR,Bridal Veil,45.557904,-122.176587 +97011,OR,Brightwood,45.365218,-122.003621 +97013,OR,Canby,45.251425,-122.68322 +97014,OR,Bonneville,45.671447,-121.882411 +97015,OR,Clackamas,45.414992,-122.52005 +97016,OR,Westport,46.09978,-123.2124 +97017,OR,Colton,45.157291,-122.424753 +97018,OR,Columbia City,45.892474,-122.812174 +97019,OR,Corbett,45.522116,-122.241746 +97021,OR,Friend,45.429099,-121.146797 +97022,OR,Eagle Creek,45.358205,-122.338053 +97023,OR,Estacada,45.287177,-122.325858 +97026,OR,Gervais,45.108645,-122.896185 +97027,OR,Gladstone,45.389882,-122.590197 +97028,OR,Timberline Lodge,45.318366,-121.785426 +97029,OR,Grass Valley,45.301333,-120.747795 +97030,OR,Gresham,45.515397,-122.420258 +97031,OR,Hood River,45.671058,-121.539104 +97032,OR,Hubbard,45.160422,-122.754115 +97033,OR,Kent,45.083789,-120.664895 +97034,OR,Lake Oswego,45.409263,-122.684721 +97035,OR,Lake Oswego,45.414666,-122.722709 +97037,OR,Maupin,45.074247,-121.228164 +97038,OR,Molalla,45.122256,-122.575574 +97039,OR,Moro,45.485332,-120.695666 +97040,OR,Mosier,45.66167,-121.324532 +97041,OR,Mount Hood Parkd,45.521584,-121.588485 +97042,OR,Mulino,45.212973,-122.535068 +97044,OR,Odell,45.623245,-121.440131 +97045,OR,Oregon City,45.337718,-122.569991 +97048,OR,Rainier,46.064552,-122.967067 +97049,OR,Zigzag,45.355201,-121.953691 +97050,OR,Rufus,45.68515,-120.726777 +97051,OR,Saint Helens,45.860825,-122.828177 +97053,OR,Warren,45.826043,-122.863445 +97054,OR,Deer Island,45.935553,-122.898458 +97055,OR,Sandy,45.378954,-122.223049 +97056,OR,Scappoose,45.765451,-122.892771 +97057,OR,Shaniko,45.047231,-120.806953 +97058,OR,The Dalles,45.599504,-121.190493 +97060,OR,Troutdale,45.525398,-122.373866 +97062,OR,Tualatin,45.372688,-122.763132 +97063,OR,Wamic,45.231789,-121.296517 +97064,OR,Vernonia,45.857298,-123.196662 +97065,OR,Wasco,45.597447,-120.730356 +97067,OR,Welches,45.339862,-121.959826 +97068,OR,West Linn,45.366874,-122.647952 +97070,OR,Wilsonville,45.298646,-122.769886 +97071,OR,Woodburn,45.144617,-122.858342 +97080,OR,Gresham,45.481699,-122.415645 +97101,OR,Amity,45.115704,-123.174402 +97103,OR,Astoria,46.155802,-123.79798 +97106,OR,Banks,45.653476,-123.120982 +97107,OR,Bay City,45.519658,-123.876075 +97108,OR,Beaver,45.276746,-123.823417 +97109,OR,Buxton,45.736983,-123.214555 +97111,OR,Carlton,45.28593,-123.152346 +97112,OR,Cloverdale,45.285821,-123.835628 +97113,OR,Cornelius,45.529034,-123.041536 +97114,OR,Dayton,45.197722,-123.075332 +97115,OR,Dundee,45.27761,-123.01523 +97116,OR,Glenwood,45.532835,-123.115152 +97117,OR,Gales Creek,45.595747,-123.233967 +97119,OR,Gaston,45.442738,-123.16657 +97121,OR,Hammond,46.198028,-123.952726 +97122,OR,Hebo,45.212016,-123.871433 +97123,OR,Hillsboro,45.498401,-122.956998 +97124,OR,Hillsboro,45.53868,-122.963608 +97125,OR,Manning,45.652468,-123.186113 +97127,OR,Lafayette,45.246638,-123.111362 +97128,OR,Mcminnville,45.209677,-123.204342 +97131,OR,Nehalem,45.72159,-123.904943 +97132,OR,Newberg,45.309901,-122.968503 +97136,OR,Rockaway,45.608511,-123.907834 +97137,OR,Saint Paul,45.195996,-122.96737 +97138,OR,Gearhart,45.969506,-123.878837 +97140,OR,Sherwood,45.351419,-122.856724 +97141,OR,Tillamook,45.449185,-123.818851 +97144,OR,Timber,45.727033,-123.311852 +97145,OR,Tolovana Park,45.886172,-123.95887 +97146,OR,Warrenton,46.145017,-123.925366 +97148,OR,Yamhill,45.335049,-123.203639 +97149,OR,Neskowin,45.178165,-123.926344 +97201,OR,Portland,45.498819,-122.690258 +97202,OR,Portland,45.484007,-122.636534 +97203,OR,Portland,45.588872,-122.734699 +97204,OR,Portland,45.51807,-122.674498 +97205,OR,Portland,45.52072,-122.688846 +97206,OR,Portland,45.483995,-122.59727 +97209,OR,Portland,45.526962,-122.685447 +97210,OR,Portland,45.530318,-122.703348 +97211,OR,Portland,45.565259,-122.644815 +97212,OR,Portland,45.544127,-122.642319 +97213,OR,Portland,45.537292,-122.59867 +97214,OR,Portland,45.514207,-122.636397 +97215,OR,Portland,45.514282,-122.599001 +97216,OR,Portland,45.513746,-122.55688 +97217,OR,Portland,45.57424,-122.684196 +97218,OR,Portland,45.560032,-122.600131 +97219,OR,Portland,45.457956,-122.70738 +97220,OR,Portland,45.541109,-122.556586 +97221,OR,Portland,45.491829,-122.726723 +97222,OR,Milwaukie,45.442919,-122.615092 +97223,OR,Garden Home,45.443343,-122.775974 +97224,OR,Tigard,45.407292,-122.788379 +97225,OR,Cedar Hills,45.500449,-122.768344 +97227,OR,Portland,45.549564,-122.674257 +97229,OR,Portland,45.541087,-122.829924 +97230,OR,Rockwood Corners,45.535753,-122.500343 +97231,OR,Portland,45.640124,-122.838032 +97232,OR,Portland,45.528712,-122.63631 +97233,OR,Portland,45.514206,-122.498493 +97236,OR,Portland,45.488748,-122.509091 +97266,OR,Portland,45.476207,-122.559607 +97267,OR,Oak Grove,45.407494,-122.610631 +97301,OR,Salem,44.926039,-122.979692 +97302,OR,Salem,44.903899,-123.044514 +97303,OR,Keizer,44.985794,-123.019015 +97304,OR,Salem,44.958846,-123.075323 +97305,OR,Brooks,44.982502,-122.966892 +97306,OR,Salem,44.8685,-123.043789 +97321,OR,Albany,44.627722,-123.094409 +97324,OR,Alsea,44.369068,-123.60892 +97325,OR,West Stayton,44.817817,-122.878575 +97326,OR,Blodgett,44.628141,-123.606715 +97327,OR,Brownsville,44.376974,-122.948491 +97329,OR,Cascadia,44.392239,-122.464214 +97330,OR,Corvallis,44.590411,-123.272171 +97331,OR,Corvallis,44.563783,-123.277889 +97333,OR,Corvallis,44.539281,-123.279908 +97338,OR,Dallas,44.922534,-123.319991 +97341,OR,Depoe Bay,44.851445,-124.03234 +97342,OR,Detroit,44.776619,-122.18447 +97343,OR,Eddyville,44.637139,-123.753096 +97344,OR,Falls City,44.870597,-123.446149 +97345,OR,Foster,44.383556,-122.544898 +97346,OR,Gates,44.752716,-122.399498 +97347,OR,Grand Ronde,45.074973,-123.633518 +97348,OR,Halsey,44.386151,-123.125103 +97350,OR,Idanha,44.701484,-122.047574 +97351,OR,Independence,44.848098,-123.187913 +97352,OR,Jefferson,44.749452,-123.00596 +97355,OR,Lebanon,44.531558,-122.882064 +97357,OR,Logsden,44.747514,-123.773645 +97358,OR,Lyons,44.776792,-122.820083 +97360,OR,Mill City,44.751566,-122.476825 +97361,OR,Monmouth,44.837706,-123.251233 +97362,OR,Mount Angel,45.073727,-122.785611 +97364,OR,Neotsu,44.998801,-123.984337 +97365,OR,Newport,44.648653,-124.050903 +97366,OR,South Beach,44.57122,-124.059968 +97367,OR,Lincoln City,44.968139,-123.99556 +97368,OR,Otis,45.013755,-123.933244 +97370,OR,Philomath,44.548817,-123.392271 +97371,OR,Rickreall,45.020032,-123.206424 +97374,OR,Scio,44.716792,-122.768356 +97375,OR,Scotts Mills,45.022,-122.665418 +97376,OR,Seal Rock,44.477749,-124.060708 +97377,OR,Shedd,44.452951,-123.106462 +97378,OR,Sheridan,45.089703,-123.400335 +97380,OR,Siletz,44.731333,-123.906239 +97381,OR,Silverton,44.991041,-122.762724 +97383,OR,Stayton,44.80211,-122.76241 +97385,OR,Sublimity,44.842523,-122.800718 +97386,OR,Sweet Home,44.398111,-122.728561 +97389,OR,Tangent,44.54973,-123.110815 +97390,OR,Tidewater,44.405538,-123.914861 +97391,OR,Toledo,44.627082,-123.930119 +97392,OR,Turner,44.847607,-122.950117 +97394,OR,Waldport,44.408497,-124.035053 +97396,OR,Willamina,45.082605,-123.504708 +97401,OR,Coburg,44.073677,-123.078757 +97402,OR,Eugene,44.061243,-123.155525 +97403,OR,Eugene,44.038534,-123.061422 +97404,OR,Eugene,44.100536,-123.13336 +97405,OR,Eugene,44.018497,-123.099769 +97406,OR,Agness,42.574788,-124.064769 +97410,OR,Azalea,42.844992,-123.155017 +97411,OR,Bandon,43.096806,-124.40367 +97412,OR,Blachly,44.196597,-123.534816 +97413,OR,Mc Kenzie Bridge,44.177809,-122.222951 +97414,OR,Broadbent,42.985048,-124.118924 +97415,OR,Harbor,42.064004,-124.267811 +97416,OR,Camas Valley,43.05566,-123.665465 +97417,OR,Canyonville,42.930683,-123.278015 +97419,OR,Cheshire,44.178206,-123.371516 +97420,OR,Charleston,43.362812,-124.233101 +97423,OR,Coquille,43.188413,-124.201386 +97424,OR,Cottage Grove,43.783934,-123.05291 +97426,OR,Creswell,43.90583,-123.02838 +97427,OR,Culp Creek,43.684534,-122.752417 +97429,OR,Days Creek,42.981946,-123.14387 +97430,OR,Greenleaf,44.145131,-123.688328 +97431,OR,Dexter,43.921691,-122.842351 +97434,OR,Dorena,43.758655,-122.885796 +97435,OR,Drain,43.687659,-123.292922 +97436,OR,Elkton,43.637761,-123.590014 +97437,OR,Elmira,44.08726,-123.367051 +97438,OR,Fall Creek,43.95616,-122.785904 +97439,OR,Florence,43.988099,-124.099303 +97441,OR,Gardiner,43.785736,-124.143695 +97442,OR,Glendale,42.751751,-123.394302 +97443,OR,Glide,43.277395,-122.963846 +97444,OR,Pistol River,42.434818,-124.396072 +97446,OR,Harrisburg,44.271656,-123.143165 +97447,OR,Idleyld Park,43.371571,-122.901789 +97448,OR,Junction City,44.198792,-123.230014 +97449,OR,Lakeside,43.583306,-124.162364 +97450,OR,Langlois,42.915386,-124.441322 +97451,OR,Lorane,43.829044,-123.247679 +97452,OR,Lowell,43.920993,-122.780627 +97453,OR,Mapleton,44.031189,-123.865735 +97454,OR,Marcola,44.206439,-122.82464 +97455,OR,Pleasant Hill,43.945816,-122.928487 +97456,OR,Monroe,44.32446,-123.32033 +97457,OR,Myrtle Creek,43.016161,-123.285054 +97458,OR,Myrtle Point,43.066694,-124.121327 +97459,OR,North Bend,43.432665,-124.213103 +97461,OR,Noti,44.119509,-123.456962 +97462,OR,Oakland,43.452968,-123.355774 +97463,OR,Oakridge,43.749767,-122.457711 +97465,OR,Port Orford,42.757194,-124.491283 +97466,OR,Powers,42.891006,-124.066441 +97467,OR,Winchester Bay,43.695701,-124.105476 +97468,OR,Remote,43.007909,-123.89149 +97469,OR,Riddle,42.938867,-123.361247 +97470,OR,Roseburg,43.222726,-123.366437 +97473,OR,Scottsburg,43.676481,-123.804065 +97476,OR,Sixes,42.824984,-124.44093 +97477,OR,Springfield,44.06106,-123.015259 +97478,OR,Springfield,44.056056,-122.917108 +97479,OR,Sutherlin,43.390404,-123.297425 +97480,OR,Swisshome,44.089903,-123.827899 +97481,OR,Tenmile,43.137116,-123.530104 +97484,OR,Tiller,42.985896,-122.908088 +97486,OR,Umpqua,43.374537,-123.535771 +97487,OR,Veneta,44.038235,-123.35159 +97488,OR,Vida,44.130041,-122.504429 +97489,OR,Leaburg,44.135163,-122.629064 +97490,OR,Walton,44.028194,-123.589304 +97492,OR,Westfir,43.756636,-122.514095 +97493,OR,Westlake,43.914017,-124.033364 +97496,OR,Winston,43.104855,-123.432481 +97497,OR,Sunny Valley,42.655128,-123.351538 +97498,OR,Yachats,44.325563,-124.086262 +97499,OR,Yoncalla,43.60434,-123.292562 +97501,OR,West Main,42.319293,-122.887011 +97502,OR,Central Point,42.389914,-122.922235 +97503,OR,White City,42.431919,-122.82962 +97504,OR,Medford,42.336251,-122.839801 +97520,OR,Ashland,42.188509,-122.693033 +97522,OR,Butte Falls,42.549243,-122.563801 +97523,OR,Cave Junction,42.134789,-123.627199 +97524,OR,Eagle Point,42.493467,-122.808802 +97525,OR,Gold Hill,42.424436,-123.08543 +97526,OR,Grants Pass,42.463758,-123.345727 +97527,OR,Grants Pass,42.398913,-123.353799 +97530,OR,Applegate,42.254894,-123.028098 +97531,OR,Kerby,42.209343,-123.657302 +97532,OR,Merlin,42.529654,-123.439256 +97534,OR,O Brien,42.068816,-123.720898 +97535,OR,Phoenix,42.276555,-122.822694 +97536,OR,Prospect,42.754394,-122.50898 +97537,OR,Rogue River,42.488889,-123.158726 +97538,OR,Selma,42.296358,-123.568394 +97539,OR,Shady Cove,42.607575,-122.812191 +97540,OR,Talent,42.236252,-122.78605 +97541,OR,Trail,42.686358,-122.816029 +97543,OR,Wilderville,42.392483,-123.513861 +97544,OR,Williams,42.223049,-123.282877 +97601,OR,Oretech,42.229601,-121.786969 +97603,OR,Klamath Falls,42.191915,-121.724124 +97620,OR,Adel,42.148697,-119.883291 +97621,OR,Beatty,42.436942,-121.219962 +97623,OR,Bonanza,42.246268,-121.333558 +97624,OR,Chiloquin,42.546293,-121.744959 +97625,OR,Dairy,42.258141,-121.642453 +97627,OR,Keno,42.175472,-121.972427 +97630,OR,Lakeview,42.185443,-120.377533 +97632,OR,Malin,42.019502,-121.422121 +97633,OR,Merrill,42.029516,-121.598545 +97635,OR,New Pine Creek,42.027759,-120.28939 +97636,OR,Paisley,42.703089,-120.553208 +97637,OR,Plush,42.503493,-119.894722 +97638,OR,Silver Lake,43.258164,-120.780109 +97640,OR,Summer Lake,42.831302,-121.063254 +97701,OR,Bend,44.092788,-121.293632 +97702,OR,Bend,44.022332,-121.298543 +97707,OR,Sunriver,43.850336,-121.457871 +97711,OR,Ashwood,44.719479,-120.719161 +97712,OR,Brothers,43.778877,-120.477035 +97720,OR,Burns,43.51451,-119.050398 +97730,OR,Camp Sherman,44.454997,-121.639363 +97731,OR,Diamond Lake,43.124669,-121.8447 +97732,OR,Crane,43.426219,-118.4642 +97733,OR,Crescent,43.497226,-121.664813 +97734,OR,Culver,44.481796,-121.234353 +97735,OR,Fort Rock,43.44615,-121.08243 +97737,OR,Gilchrist,43.30759,-121.886596 +97739,OR,La Pine,43.709125,-121.519445 +97740,OR,Lawen,43.561816,-118.8418 +97741,OR,Madras,44.637579,-121.134924 +97750,OR,Mitchell,44.565734,-120.145579 +97751,OR,Paulina,44.210243,-119.782768 +97752,OR,Post,44.079273,-120.299781 +97753,OR,Powell Butte,44.241512,-121.011326 +97754,OR,Prineville,44.30445,-120.833616 +97756,OR,Redmond,44.27669,-121.189604 +97758,OR,Riley,44.930529,-116.900621 +97759,OR,Black Butte Ranc,44.307329,-121.524133 +97760,OR,Crooked River Ra,44.355505,-121.167565 +97761,OR,Warm Springs,44.746826,-121.290941 +97801,OR,Pendleton,45.660535,-118.783104 +97810,OR,Adams,45.749678,-118.617582 +97812,OR,Arlington,45.666417,-120.197148 +97813,OR,Athena,45.828893,-118.497147 +97814,OR,Medical Springs,44.780102,-117.828631 +97818,OR,Boardman,45.827165,-119.72057 +97820,OR,Canyon City,44.410005,-118.950155 +97823,OR,Condon,45.230587,-120.189834 +97824,OR,Cove,45.319902,-117.814741 +97825,OR,Dayville,44.466307,-119.531178 +97826,OR,Echo,45.74109,-119.194904 +97827,OR,Elgin,45.594101,-117.91119 +97828,OR,Enterprise,45.437037,-117.288808 +97830,OR,Kinzua,44.985289,-120.206699 +97831,OR,Fox,44.660681,-119.291646 +97833,OR,Haines,44.877622,-117.97556 +97834,OR,Halfway,44.895272,-117.113152 +97835,OR,Helix,45.866541,-118.722219 +97836,OR,Heppner,45.348577,-119.536897 +97837,OR,Hereford,44.641048,-117.98896 +97838,OR,Hermiston,45.844992,-119.284876 +97839,OR,Lexington,45.426362,-119.74636 +97841,OR,Imbler,45.459908,-117.954377 +97842,OR,Imnaha,45.513733,-116.825741 +97843,OR,Ione,45.54033,-119.769034 +97844,OR,Irrigon,45.88768,-119.507016 +97845,OR,John Day,44.409977,-119.105157 +97846,OR,Joseph,45.349432,-117.212805 +97848,OR,Kimberly,44.72263,-119.596497 +97850,OR,La Grande,45.330435,-118.085228 +97856,OR,Long Creek,44.755416,-119.09702 +97857,OR,Lostine,45.493861,-117.435909 +97862,OR,Milton Freewater,45.948581,-118.391172 +97864,OR,Monument,44.818451,-119.430164 +97865,OR,Mount Vernon,44.417095,-119.112142 +97867,OR,North Powder,45.031667,-117.933666 +97868,OR,Pilot Rock,45.422724,-118.848331 +97869,OR,Prairie City,44.456977,-118.695199 +97870,OR,Richland,44.797013,-117.301825 +97872,OR,Ritter,44.95404,-118.941818 +97873,OR,Seneca,44.127704,-119.057797 +97874,OR,Spray,44.824186,-119.830318 +97875,OR,Stanfield,45.785988,-119.211602 +97876,OR,Summerville,45.507687,-118.026978 +97877,OR,Sumpter,44.73164,-118.190604 +97882,OR,Mcnary,45.915725,-119.313715 +97883,OR,Union,45.201939,-117.853554 +97884,OR,Unity,44.449063,-118.16273 +97885,OR,Wallowa,45.571722,-117.535727 +97886,OR,Weston,45.807365,-118.373279 +97901,OR,Adrian,43.653712,-117.060193 +97902,OR,Arock,43.970896,-117.034189 +97903,OR,Brogan,44.199396,-117.590371 +97904,OR,Drewsey,43.864277,-118.47066 +97906,OR,Harper,43.873363,-117.528433 +97907,OR,Huntington,44.381113,-117.309691 +97908,OR,Ironside,44.300913,-117.944435 +97909,OR,Jamieson,44.181873,-117.437269 +97910,OR,Jordan Valley,42.880139,-117.280984 +97911,OR,Juntura,43.825277,-118.092118 +97913,OR,Nyssa,43.860386,-117.025113 +97914,OR,Ontario,44.04156,-116.978268 +97917,OR,Riverside,43.467415,-118.095769 +97918,OR,Vale,44.003902,-117.267412 +97920,OR,Westfall,43.992246,-117.687673 +15001,PA,Macarthur,40.604424,-80.281567 +15003,PA,Fairoaks,40.595368,-80.219778 +15005,PA,Baden,40.641595,-80.198471 +15007,PA,Bakerstown,40.647826,-79.930956 +15009,PA,Beaver,40.697184,-80.336528 +15010,PA,Racine,40.766234,-80.33988 +15012,PA,Rostraver,40.14368,-79.83454 +15014,PA,Brackenridge,40.608223,-79.741375 +15015,PA,Bradfordwoods,40.634175,-80.082305 +15017,PA,Bridgeville,40.347195,-80.115293 +15018,PA,Buena Vista,40.278635,-79.791874 +15019,PA,Bulger,40.405119,-80.362192 +15021,PA,Paris,40.390114,-80.444485 +15022,PA,Charleroi,40.140402,-79.92002 +15024,PA,Cheswick,40.568117,-79.841002 +15025,PA,Large,40.298917,-79.910096 +15026,PA,Clinton,40.513148,-80.342282 +15027,PA,Conway,40.664917,-80.234899 +15030,PA,Creighton,40.582051,-79.78177 +15031,PA,Cuddy,40.360069,-80.164432 +15033,PA,Donora,40.176821,-79.861858 +15034,PA,Dravosburg,40.352676,-79.889461 +15035,PA,East Mc Keesport,40.383944,-79.807881 +15037,PA,Elizabeth,40.265575,-79.856842 +15042,PA,Freedom,40.683023,-80.214663 +15043,PA,Georgetown,40.574275,-80.490023 +15044,PA,Gibsonia,40.625233,-79.944307 +15045,PA,Glassport,40.325952,-79.888324 +15049,PA,Harwick,40.557433,-79.805115 +15050,PA,Hookstown,40.542929,-80.436268 +15051,PA,Indianola,40.576605,-79.881765 +15052,PA,Industry,40.667101,-80.415085 +15053,PA,Joffre,40.381027,-80.391542 +15055,PA,Lawrence,40.311615,-80.144029 +15056,PA,Leetsdale,40.566165,-80.209874 +15057,PA,Mc Donald,40.369664,-80.256204 +15059,PA,Midland,40.658962,-80.468952 +15060,PA,Midway,40.367974,-80.29209 +15061,PA,Monaca,40.671847,-80.291743 +15062,PA,Monessen,40.152379,-79.883526 +15063,PA,Monongahela,40.193728,-79.924127 +15064,PA,Morgan,40.360433,-80.154064 +15065,PA,Natrona,40.628862,-79.725621 +15066,PA,New Brighton,40.739333,-80.29722 +15067,PA,New Eagle,40.206573,-79.953408 +15068,PA,Arnold,40.571179,-79.741547 +15071,PA,Noblestown,40.428734,-80.202615 +15074,PA,Rochester,40.715745,-80.260315 +15076,PA,Russellton,40.614344,-79.837102 +15077,PA,Shippingport,40.626012,-80.419866 +15078,PA,Slovan,40.363086,-80.399239 +15083,PA,Sutersville,40.238207,-79.792223 +15084,PA,Tarentum,40.618651,-79.785204 +15085,PA,Level Green,40.385155,-79.755157 +15086,PA,Warrendale,40.664149,-80.080705 +15089,PA,West Newton,40.207549,-79.757976 +15090,PA,Wexford,40.612044,-80.064879 +15101,PA,Allison Park,40.569975,-79.966512 +15102,PA,Bethel Park,40.320984,-80.039793 +15104,PA,Rankin,40.406304,-79.864352 +15106,PA,Carnegie,40.402941,-80.091532 +15108,PA,Moon Twp,40.513245,-80.18969 +15110,PA,Duquesne,40.370449,-79.852244 +15112,PA,East Pittsburgh,40.403577,-79.83889 +15116,PA,Glenshaw,40.537492,-79.964351 +15120,PA,Munhall,40.394171,-79.904199 +15122,PA,W Mifflin Fin,40.366535,-79.89429 +15126,PA,Imperial,40.458384,-80.264861 +15129,PA,Library,40.292199,-80.001144 +15131,PA,White Oak,40.341147,-79.810519 +15132,PA,Mc Keesport,40.341713,-79.8452 +15133,PA,Mc Keesport,40.332835,-79.866759 +15135,PA,Boston,40.304412,-79.812844 +15136,PA,Mc Kees Rocks,40.471742,-80.087567 +15137,PA,North Versailles,40.376248,-79.812427 +15139,PA,Oakmont,40.519647,-79.836865 +15140,PA,Pitcairn,40.404787,-79.776951 +15142,PA,Presto,40.384664,-80.120922 +15143,PA,Sewickley,40.557031,-80.157848 +15144,PA,Springdale,40.543999,-79.784447 +15145,PA,Turtle Creek,40.41135,-79.822046 +15146,PA,Monroeville,40.429026,-79.762279 +15147,PA,Verona,40.492727,-79.834535 +15148,PA,Wall,40.393416,-79.803033 +15201,PA,Arsenal,40.474536,-79.952524 +15202,PA,Bellevue,40.501321,-80.066966 +15203,PA,Carson,40.425439,-79.977556 +15204,PA,Corliss,40.455569,-80.061056 +15205,PA,Crafton,40.438045,-80.073393 +15206,PA,East Liberty,40.468885,-79.919267 +15207,PA,Hazelwood,40.401206,-79.933935 +15208,PA,Homewood,40.454955,-79.898474 +15209,PA,Millvale,40.49718,-79.97401 +15210,PA,Mount Oliver,40.408541,-79.987405 +15211,PA,Mount Washington,40.42908,-80.012156 +15212,PA,Allegheny,40.468873,-80.013128 +15213,PA,Oakland,40.44372,-79.954428 +15214,PA,Observatory,40.481309,-80.01393 +15215,PA,Aspinwall,40.499225,-79.917513 +15216,PA,South Hills,40.399584,-80.035727 +15217,PA,Squirrel Hill,40.431852,-79.924973 +15218,PA,Swissvale,40.424468,-79.887591 +15219,PA,Uptown,40.44539,-79.977229 +15220,PA,Parkway Center,40.417405,-80.051202 +15221,PA,Wilkinsburg,40.438352,-79.870243 +15222,PA,Downtown,40.442111,-80.000556 +15223,PA,Etna,40.50428,-79.95145 +15224,PA,Bloomfield,40.464215,-79.945445 +15225,PA,Neville Island,40.513819,-80.137027 +15226,PA,Brookline,40.394628,-80.015759 +15227,PA,Brentwood,40.37619,-79.975816 +15228,PA,Mount Lebanon,40.371326,-80.043186 +15229,PA,West View,40.519321,-80.035685 +15232,PA,Shadyside,40.453598,-79.932557 +15233,PA,Kilbuck,40.460425,-80.029965 +15234,PA,Castle Shannon,40.369424,-80.017907 +15235,PA,Penn Hills,40.4605,-79.826892 +15236,PA,Caste Village,40.345244,-79.976894 +15237,PA,Mc Knight,40.552238,-80.034939 +15238,PA,Blawnox,40.515077,-79.877423 +15239,PA,Plum,40.477693,-79.734505 +15241,PA,Upper Saint Clai,40.332174,-80.07921 +15243,PA,Cedarhurst,40.373797,-80.072425 +15301,PA,Washington,40.171687,-80.255957 +15310,PA,Aleppo,39.824647,-80.457918 +15311,PA,Amity,40.061786,-80.194865 +15312,PA,Avella,40.273386,-80.456503 +15313,PA,Beallsville,40.064503,-80.025056 +15314,PA,Bentleyville,40.118702,-80.006987 +15317,PA,Mc Murray,40.270743,-80.153153 +15320,PA,Carmichaels,39.882548,-79.971007 +15321,PA,Cecil,40.322813,-80.20437 +15322,PA,Clarksville,39.994064,-80.012386 +15323,PA,Claysville,40.137557,-80.385904 +15324,PA,Cokeburg,40.100801,-80.065152 +15327,PA,Dilliner,39.755536,-79.977135 +15329,PA,Prosperity,40.0224,-80.261257 +15330,PA,Eighty Four,40.186821,-80.062695 +15331,PA,Ellsworth,40.107321,-80.020364 +15332,PA,Finleyville,40.259301,-79.97531 +15333,PA,Fredericktown,40.023749,-80.030937 +15337,PA,Graysville,39.909165,-80.395223 +15338,PA,Greensboro,39.804482,-79.93992 +15340,PA,Hickory,40.292511,-80.302508 +15341,PA,Holbrook,39.848878,-80.338455 +15342,PA,Houston,40.242492,-80.220937 +15344,PA,Jefferson,39.933391,-80.050286 +15345,PA,Marianna,40.033067,-80.114506 +15346,PA,Mather,39.945226,-80.085353 +15349,PA,Davistown,39.744289,-80.096763 +15352,PA,New Freeport,39.750728,-80.454228 +15353,PA,Nineveh,39.974328,-80.312809 +15357,PA,Rices Landing,39.943993,-79.985701 +15359,PA,Rogersville,39.900515,-80.283665 +15360,PA,Scenery Hill,40.099378,-80.091414 +15362,PA,Spraggs,39.761038,-80.262186 +15363,PA,Strabane,40.216914,-80.146156 +15364,PA,Sycamore,39.95273,-80.228199 +15367,PA,Venetia,40.275451,-80.059849 +15370,PA,Waynesburg,39.891691,-80.179524 +15376,PA,West Alexander,40.106514,-80.497769 +15377,PA,West Finley,39.991397,-80.440806 +15380,PA,Wind Ridge,39.897106,-80.464665 +15401,PA,Uniontown,39.889733,-79.728216 +15410,PA,Adah,39.883101,-79.890827 +15411,PA,Addison,39.761195,-79.319334 +15412,PA,Allenport,40.089845,-79.854194 +15413,PA,Allison,39.982566,-79.875675 +15417,PA,West Brownsville,40.02671,-79.920609 +15419,PA,California,40.062529,-79.895319 +15423,PA,Coal Center,40.097272,-79.8839 +15424,PA,Listonburg,39.821247,-79.351304 +15425,PA,South Connellsvi,40.025037,-79.587838 +15427,PA,Daisytown,40.074349,-79.967036 +15428,PA,Dawson,40.063767,-79.660224 +15431,PA,Dunbar,39.972171,-79.64305 +15432,PA,Dunlevy,40.115077,-79.862703 +15433,PA,East Millsboro,39.982214,-79.966442 +15434,PA,Elco,40.079671,-79.875836 +15436,PA,Fairchance,39.822876,-79.755051 +15437,PA,Farmington,39.806995,-79.583185 +15438,PA,Fayette City,40.098799,-79.836584 +15440,PA,Gibbon Glade,39.736357,-79.573603 +15442,PA,Grindstone,40.008415,-79.840447 +15444,PA,Hiller,40.004496,-79.899936 +15445,PA,Hopwood,39.868868,-79.705945 +15446,PA,Indian Head,40.020195,-79.393387 +15450,PA,La Belle,39.973829,-79.937024 +15451,PA,Lake Lynn,39.750065,-79.86184 +15456,PA,Lemont Furnace,39.931057,-79.647684 +15458,PA,Lamberton,39.890185,-79.859022 +15459,PA,Markleysburg,39.759723,-79.46003 +15461,PA,Grays Landing,39.83495,-79.893813 +15462,PA,Melcroft,40.064789,-79.3587 +15463,PA,Merrittstown,39.964854,-79.874447 +15464,PA,Mill Run,39.967985,-79.462219 +15468,PA,New Salem,39.940747,-79.80407 +15469,PA,Normalville,40.041793,-79.415061 +15470,PA,Ohiopyle,39.873202,-79.48846 +15472,PA,Oliver,39.911659,-79.715601 +15473,PA,Layton,40.085724,-79.754384 +15474,PA,Point Marion,39.735124,-79.898986 +15475,PA,Republic,39.961427,-79.902914 +15477,PA,Roscoe,40.078686,-79.865617 +15478,PA,Smithfield,39.792306,-79.81268 +15479,PA,Van Meter,40.144267,-79.731277 +15480,PA,Smock,39.996096,-79.767828 +15482,PA,Star Junction,40.083198,-79.755461 +15483,PA,Stockdale,40.082567,-79.850103 +15486,PA,Vanderbilt,40.024581,-79.695518 +15488,PA,Waltersburg,39.990465,-79.780336 +15490,PA,White,40.072596,-79.425117 +15501,PA,Somerset,40.024813,-79.080814 +15521,PA,Alum Bank,40.185833,-78.620591 +15522,PA,Bedford,39.990838,-78.526071 +15530,PA,Berlin,39.918847,-78.963692 +15531,PA,Boswell,40.191807,-79.036179 +15533,PA,Breezewood,39.990521,-78.245271 +15534,PA,Buffalo Mills,39.922025,-78.69962 +15535,PA,Clearville,39.853284,-78.43918 +15536,PA,Crystal Spring,39.919973,-78.225836 +15537,PA,Everett,40.009808,-78.371315 +15538,PA,Glencoe,39.909046,-78.827522 +15540,PA,Fort Hill,39.877282,-79.23535 +15541,PA,Friedens,40.010997,-78.903298 +15542,PA,Garrett,39.864581,-79.061561 +15545,PA,Hyndman,39.804857,-78.733512 +15546,PA,Jenners,40.147321,-79.054571 +15550,PA,Manns Choice,39.980787,-78.642259 +15551,PA,Markleton,39.869096,-79.287851 +15552,PA,Meyersdale,39.790489,-79.026141 +15554,PA,New Paris,40.118876,-78.588569 +15557,PA,Rockwood,39.937296,-79.186546 +15558,PA,Salisbury,39.753052,-79.083516 +15559,PA,Schellsburg,40.04869,-78.648194 +15562,PA,Springs,39.748895,-79.08895 +15563,PA,Stoystown,40.109886,-78.955978 +15601,PA,Greensburg,40.307359,-79.542439 +15610,PA,Acme,40.104891,-79.482747 +15611,PA,Adamsburg,40.312577,-79.656469 +15612,PA,Alverton,40.127866,-79.558608 +15613,PA,Apollo,40.556481,-79.577158 +15615,PA,Ardara,40.362993,-79.733533 +15616,PA,Armbrust,40.236097,-79.553884 +15617,PA,Arona,40.26799,-79.659104 +15618,PA,Avonmore,40.522125,-79.485264 +15620,PA,Bradenville,40.296094,-79.309679 +15622,PA,Champion,40.043976,-79.324719 +15625,PA,Darragh,40.260377,-79.678036 +15626,PA,Delmont,40.413901,-79.57638 +15627,PA,Derry,40.334931,-79.332585 +15628,PA,Donegal,40.099613,-79.381043 +15631,PA,Everson,40.091144,-79.587277 +15632,PA,Export,40.425185,-79.611021 +15634,PA,Grapeville,40.303804,-79.603189 +15636,PA,Harrison City,40.372455,-79.679754 +15637,PA,Herminie,40.245485,-79.717164 +15639,PA,Hunker,40.214947,-79.582364 +15641,PA,Hyde Park,40.631102,-79.589884 +15642,PA,North Huntingdon,40.319227,-79.723855 +15644,PA,Jeannette,40.32947,-79.614412 +15646,PA,Jones Mills,40.07977,-79.339933 +15647,PA,Larimer,40.351842,-79.736627 +15650,PA,Latrobe,40.292625,-79.410278 +15655,PA,Laughlintown,40.208025,-79.18058 +15656,PA,Leechburg,40.634398,-79.620101 +15658,PA,Wilpen,40.245133,-79.236666 +15661,PA,Loyalhanna,40.30199,-79.344157 +15663,PA,Madison,40.246669,-79.675978 +15665,PA,Manor,40.33822,-79.671221 +15666,PA,Mount Pleasant,40.174179,-79.513383 +15668,PA,Murrysville,40.446674,-79.684154 +15670,PA,New Alexandria,40.398112,-79.396594 +15671,PA,New Derry,40.333334,-79.300863 +15672,PA,New Stanton,40.223345,-79.618187 +15675,PA,Penn,40.330081,-79.641336 +15677,PA,Rector,40.186444,-79.247331 +15678,PA,Rillton,40.282454,-79.728211 +15679,PA,Ruffs Dale,40.158458,-79.627743 +15681,PA,Saltsburg,40.479239,-79.442844 +15683,PA,Scottdale,40.102948,-79.593017 +15684,PA,Slickville,40.465347,-79.506654 +15686,PA,Spring Church,40.615329,-79.454487 +15687,PA,Stahlstown,40.138593,-79.344473 +15688,PA,Tarrs,40.161915,-79.566101 +15690,PA,Park,40.605883,-79.565531 +15692,PA,Westmoreland Cit,40.276802,-79.547696 +15697,PA,Youngwood,40.239482,-79.582291 +15698,PA,Yukon,40.215529,-79.684941 +15701,PA,Indiana,40.619628,-79.159596 +15711,PA,Anita,41.001806,-78.966637 +15713,PA,Aultman,40.540083,-79.219791 +15714,PA,Barnesboro,40.673307,-78.777058 +15716,PA,Black Lick,40.466905,-79.193231 +15717,PA,Blairsville,40.441262,-79.253329 +15720,PA,Brush Valley,40.528565,-79.058765 +15721,PA,Burnside,40.813431,-78.786488 +15722,PA,Carrolltown,40.589054,-78.703676 +15724,PA,Cherry Tree,40.755387,-78.847357 +15725,PA,Clarksburg,40.503933,-79.367676 +15728,PA,Clymer,40.668811,-79.011863 +15729,PA,Commodore,40.701588,-78.913371 +15730,PA,Coolspring,40.951816,-78.922015 +15732,PA,Creekside,40.719892,-79.201396 +15739,PA,Ernest,40.704255,-79.096937 +15742,PA,Glen Campbell,40.850766,-78.855538 +15744,PA,Hamilton,40.921432,-79.093987 +15747,PA,Home,40.783441,-79.164082 +15748,PA,Graceton,40.538375,-79.183942 +15753,PA,La Jose,40.830118,-78.62337 +15754,PA,Lucernemines,40.545313,-79.157349 +15757,PA,Mc Gees Mills,40.889251,-78.72039 +15758,PA,Marchand,40.875411,-79.045151 +15759,PA,Marion Center,40.78135,-79.02524 +15760,PA,Marsteller,40.65004,-78.813356 +15762,PA,Nicktown,40.601623,-78.811394 +15763,PA,Northpoint,40.903703,-79.125657 +15764,PA,Oliveburg,40.996379,-79.038197 +15765,PA,Penn Run,40.626825,-78.971597 +15767,PA,Punxsutawney,40.947937,-78.968056 +15770,PA,Ringgold,40.999731,-79.176581 +15771,PA,Rochester Mills,40.819482,-78.997985 +15772,PA,Rossiter,40.884553,-78.941353 +15773,PA,Saint Benedict,40.611845,-78.738332 +15774,PA,Shelocta,40.638787,-79.31907 +15775,PA,Spangler,40.648082,-78.769061 +15776,PA,Sprankle Mills,41.01846,-79.077809 +15777,PA,Starford,40.700971,-78.980317 +15778,PA,Timblin,40.968387,-79.20135 +15780,PA,Valier,40.922851,-79.083263 +15784,PA,Worthville,41.023767,-79.138685 +15801,PA,Du Bois,41.126039,-78.752698 +15821,PA,Benezett,41.325318,-78.357621 +15823,PA,Brockport,41.28217,-78.712829 +15824,PA,Brockway,41.240564,-78.811568 +15825,PA,Hazen,41.159986,-79.064101 +15827,PA,Byrnedale,41.286459,-78.505126 +15828,PA,Clarington,41.323272,-79.146557 +15829,PA,Corsica,41.182983,-79.175567 +15832,PA,Driftwood,41.376396,-78.163194 +15834,PA,Emporium,41.517689,-78.25361 +15840,PA,Falls Creek,41.145505,-78.812791 +15845,PA,Johnsonburg,41.492823,-78.67826 +15846,PA,Kersey,41.356271,-78.60152 +15848,PA,Luthersburg,41.05321,-78.742758 +15849,PA,Penfield,41.208519,-78.579111 +15851,PA,Reynoldsville,41.062935,-78.896147 +15853,PA,Portland Mills,41.431566,-78.729715 +15856,PA,Rockton,41.080571,-78.657662 +15857,PA,Saint Marys,41.428949,-78.550533 +15860,PA,Sigel,41.309921,-79.053957 +15861,PA,Sinnamahoning,41.376197,-78.06607 +15864,PA,Summerville,41.105822,-79.172583 +15865,PA,Sykesville,41.05137,-78.819508 +15868,PA,Weedville,41.268502,-78.495165 +15870,PA,Wilcox,41.573471,-78.682295 +15901,PA,Johnstown,40.325957,-78.91408 +15902,PA,Johnstown,40.307787,-78.896905 +15904,PA,Johnstown,40.285026,-78.865383 +15905,PA,Johnstown,40.307188,-78.943006 +15906,PA,Johnstown,40.352193,-78.938317 +15909,PA,Johnstown,40.387965,-78.862284 +15920,PA,Armagh,40.442452,-79.013055 +15923,PA,Bolivar,40.367289,-79.160546 +15924,PA,Cairnbrook,40.114472,-78.810082 +15926,PA,Central City,40.091257,-78.844753 +15927,PA,Colver,40.541086,-78.778432 +15928,PA,Davidsville,40.224451,-78.936333 +15931,PA,Ebensburg,40.480105,-78.726294 +15935,PA,Hollsopple,40.234301,-78.951471 +15936,PA,Hooversville,40.148776,-78.914071 +15938,PA,Lilly,40.423844,-78.62306 +15940,PA,Loretto,40.510484,-78.629357 +15942,PA,Mineral Point,40.379253,-78.835201 +15943,PA,Nanty Glo,40.470435,-78.837504 +15944,PA,New Florence,40.382266,-79.096803 +15945,PA,Parkhill,40.359385,-78.869432 +15946,PA,Puritan,40.384201,-78.671753 +15949,PA,Robinson,40.407655,-79.137928 +15951,PA,Saint Michael,40.336248,-78.782999 +15952,PA,Salix,40.300627,-78.743704 +15953,PA,Seanor,40.231191,-78.890897 +15954,PA,Seward,40.409907,-79.023224 +15955,PA,Sidman,40.329873,-78.745966 +15956,PA,South Fork,40.362877,-78.788671 +15957,PA,Strongstown,40.56279,-78.912961 +15958,PA,Summerhill,40.388959,-78.755979 +15960,PA,Twin Rocks,40.518254,-78.860488 +15961,PA,Vintondale,40.493949,-78.94267 +15963,PA,Windber,40.228695,-78.830289 +16001,PA,Bon Aire,40.862096,-79.902717 +16020,PA,Boyers,41.109205,-79.904692 +16022,PA,Bruin,41.057078,-79.729051 +16023,PA,Marwood,40.779723,-79.770851 +16025,PA,Chicora,40.945768,-79.746237 +16028,PA,East Brady,40.974373,-79.630187 +16030,PA,Eau Claire,41.13478,-79.798093 +16033,PA,Evans City,40.780795,-80.059195 +16034,PA,Fenelton,40.855464,-79.737152 +16036,PA,Foxburg,41.160239,-79.653443 +16037,PA,Harmony,40.849646,-80.138117 +16038,PA,Harrisville,41.163087,-79.979639 +16040,PA,Hilliards,41.100894,-79.821456 +16041,PA,Karns City,41.002193,-79.716017 +16045,PA,Lyndora,40.855071,-79.921401 +16046,PA,Mars,40.700514,-80.035769 +16049,PA,Parker,41.100891,-79.688888 +16050,PA,Petrolia,41.044208,-79.771069 +16051,PA,Portersville,40.948651,-80.172965 +16052,PA,Prospect,40.904941,-80.067903 +16053,PA,Renfrew,40.810003,-79.977004 +16055,PA,Sarver,40.714285,-79.74243 +16056,PA,Saxonburg,40.736099,-79.835222 +16057,PA,Slippery Rock,41.045412,-80.046847 +16059,PA,Valencia,40.701831,-79.923527 +16061,PA,West Sunbury,41.002601,-79.875134 +16063,PA,Zelienople,40.73136,-80.128564 +16101,PA,New Castle,40.99222,-80.328449 +16102,PA,New Castle,40.967745,-80.390704 +16105,PA,Neshannock,41.033502,-80.342191 +16110,PA,Adamsville,41.506677,-80.376544 +16111,PA,Atlantic,41.533313,-80.286251 +16112,PA,Bessemer,40.975493,-80.493689 +16114,PA,Clarks Mills,41.385141,-80.175223 +16115,PA,Darlington,40.796839,-80.455611 +16116,PA,Edinburg,41.027614,-80.463178 +16117,PA,Ellport,40.859024,-80.274606 +16120,PA,Enon Valley,40.8721,-80.461182 +16121,PA,Farrell,41.210995,-80.494442 +16123,PA,Fombell,40.812527,-80.207312 +16124,PA,Fredonia,41.324141,-80.269871 +16125,PA,Shenango,41.399403,-80.380344 +16127,PA,Grove City,41.160704,-80.084138 +16130,PA,Hadley,41.43302,-80.153544 +16131,PA,Hartstown,41.550875,-80.381321 +16133,PA,Jackson Center,41.280134,-80.103726 +16134,PA,Westford,41.506031,-80.456459 +16137,PA,Mercer,41.23254,-80.234018 +16141,PA,New Galilee,40.856891,-80.393904 +16142,PA,New Wilmington,41.138155,-80.324541 +16143,PA,Pulaski,41.094215,-80.468515 +16145,PA,Sandy Lake,41.338337,-80.04974 +16146,PA,Sharon,41.231552,-80.499342 +16148,PA,Hermitage,41.232601,-80.45303 +16150,PA,Sharpsville,41.267648,-80.465642 +16153,PA,Stoneboro,41.34385,-80.097613 +16154,PA,Transfer,41.324401,-80.419742 +16156,PA,Volant,41.093767,-80.244129 +16157,PA,Wampum,40.881879,-80.339184 +16159,PA,West Middlesex,41.174054,-80.452759 +16201,PA,Kittanning,40.815516,-79.510675 +16210,PA,Adrian,40.904902,-79.507444 +16212,PA,Cadogan,40.75392,-79.579827 +16213,PA,Callensburg,41.132379,-79.55695 +16214,PA,Clarion,41.212272,-79.377268 +16217,PA,Cooksburg,41.338366,-79.19708 +16218,PA,Cowansville,40.922985,-79.594607 +16222,PA,Dayton,40.874101,-79.268551 +16224,PA,Fairmount City,41.042861,-79.278405 +16225,PA,Fisher,41.266737,-79.247033 +16226,PA,Ford City,40.738407,-79.51222 +16229,PA,Freeport,40.703277,-79.662991 +16232,PA,Knox,41.224518,-79.519404 +16233,PA,Leeper,41.367074,-79.302179 +16234,PA,Limestone,41.133396,-79.299292 +16235,PA,Lucinda,41.312377,-79.375372 +16236,PA,Mc Grann,40.76929,-79.53086 +16238,PA,Manorville,40.786256,-79.521333 +16239,PA,Marienville,41.462237,-79.130581 +16240,PA,Mayport,40.99059,-79.261701 +16242,PA,New Bethlehem,40.9999,-79.352654 +16248,PA,Huey,41.039434,-79.510677 +16249,PA,Rural Valley,40.788488,-79.299102 +16254,PA,Shippenville,41.247491,-79.433199 +16255,PA,Sligo,41.11394,-79.480485 +16256,PA,Smicksburg,40.837193,-79.161432 +16258,PA,Strattanville,41.195498,-79.308188 +16259,PA,Templeton,40.941884,-79.449884 +16260,PA,Vowinckel,41.378642,-79.274553 +16262,PA,Craigsville,40.834442,-79.638525 +16301,PA,Oil City,41.431936,-79.691648 +16311,PA,Carlton,41.481541,-80.020302 +16313,PA,Clarendon,41.730224,-79.171949 +16314,PA,Cochranton,41.520487,-80.057269 +16316,PA,Conneaut Lake,41.6189,-80.308567 +16317,PA,Cooperstown,41.497998,-79.875676 +16319,PA,Cranberry,41.337184,-79.719121 +16321,PA,East Hickory,41.5691,-79.385483 +16323,PA,Franklin,41.404775,-79.83089 +16326,PA,Fryburg,41.371736,-79.413401 +16327,PA,Guys Mills,41.633265,-79.971437 +16329,PA,Irvine,41.843283,-79.286303 +16331,PA,Kossuth,41.290215,-79.588249 +16332,PA,Lickingville,41.3789,-79.371516 +16333,PA,Ludlow,41.728409,-78.924345 +16334,PA,Marble,41.326077,-79.445929 +16335,PA,Meadville,41.633847,-80.148787 +16340,PA,Pittsfield,41.836629,-79.419619 +16341,PA,Pleasantville,41.586696,-79.5685 +16342,PA,Polk,41.358315,-79.93461 +16345,PA,Russell,41.946106,-79.127079 +16346,PA,Seneca,41.374436,-79.675902 +16347,PA,Sheffield,41.70053,-79.034814 +16350,PA,Sugar Grove,41.947542,-79.318609 +16351,PA,Tidioute,41.703008,-79.375224 +16353,PA,Tionesta,41.511616,-79.366332 +16354,PA,Titusville,41.638163,-79.685494 +16360,PA,Townville,41.685581,-79.876679 +16362,PA,Utica,41.479848,-79.940292 +16364,PA,Venus,41.376113,-79.504765 +16365,PA,North Warren,41.845265,-79.14286 +16371,PA,Youngsville,41.853654,-79.318708 +16372,PA,Clintonville,41.20022,-79.87338 +16373,PA,Emlenton,41.202769,-79.746996 +16374,PA,Kennerdell,41.284762,-79.739313 +16401,PA,Lundys Lane,41.885882,-80.375273 +16402,PA,Bear Lake,41.97006,-79.461365 +16403,PA,Cambridge Spring,41.794611,-80.028003 +16404,PA,Centerville,41.724316,-79.79004 +16405,PA,Columbus,41.938152,-79.573073 +16406,PA,Conneautville,41.745455,-80.344516 +16407,PA,Corry,41.922593,-79.656742 +16410,PA,Cranesville,41.916222,-80.308528 +16411,PA,East Springfield,41.979363,-80.430336 +16412,PA,Edinboro,41.875629,-80.135604 +16415,PA,Fairview,42.040741,-80.239508 +16417,PA,Girard,41.989573,-80.317756 +16420,PA,Grand Valley,41.77315,-79.546944 +16421,PA,Harborcreek,42.176719,-79.941648 +16423,PA,Lake City,42.020361,-80.338834 +16424,PA,Espyville,41.663535,-80.426911 +16426,PA,Mc Kean,41.999035,-80.147336 +16428,PA,North East,42.200793,-79.833179 +16433,PA,Saegertown,41.726753,-80.147857 +16434,PA,Spartansburg,41.793648,-79.684916 +16435,PA,Springboro,41.811348,-80.375276 +16436,PA,Spring Creek,41.846832,-79.56554 +16438,PA,Union City,41.893851,-79.845464 +16440,PA,Venango,41.791968,-80.125353 +16441,PA,Waterford,41.960266,-79.99963 +16442,PA,Wattsburg,42.039114,-79.836282 +16443,PA,West Springfield,41.94646,-80.46501 +16501,PA,Erie,42.125962,-80.08601 +16502,PA,Erie,42.113332,-80.097607 +16503,PA,Erie,42.126506,-80.063976 +16504,PA,Erie,42.1108,-80.05208 +16505,PA,Presque Isle,42.097526,-80.161902 +16506,PA,Erie,42.073801,-80.14844 +16507,PA,Erie,42.131579,-80.086424 +16508,PA,Erie,42.097577,-80.093544 +16509,PA,Erie,42.076326,-80.066827 +16510,PA,Wesleyville,42.123673,-80.003752 +16511,PA,Erie,42.15529,-80.017665 +16565,PA,Erie,42.0687,-80.10011 +16601,PA,Altoona,40.520945,-78.408901 +16602,PA,Altoona,40.50524,-78.390533 +16611,PA,Barree,40.549901,-78.107066 +16613,PA,Ashville,40.551266,-78.534639 +16616,PA,Beccaria,40.757938,-78.508036 +16617,PA,Bellwood,40.60394,-78.337234 +16620,PA,Brisbin,40.838711,-78.352634 +16621,PA,Broad Top,40.201891,-78.1406 +16622,PA,Calvin,40.298667,-78.023697 +16623,PA,Cassville,40.293977,-78.027178 +16625,PA,Claysburg,40.329243,-78.479658 +16627,PA,Coalport,40.750323,-78.535238 +16630,PA,Cresson,40.460779,-78.586068 +16634,PA,Dudley,40.219453,-78.183823 +16635,PA,Duncansville,40.426228,-78.43833 +16636,PA,Dysart,40.60885,-78.527072 +16637,PA,East Freedom,40.328197,-78.447519 +16639,PA,Fallentimber,40.671924,-78.465912 +16640,PA,Flinton,40.701615,-78.48149 +16641,PA,Gallitzin,40.48772,-78.555435 +16645,PA,Glen Hope,40.798405,-78.499869 +16646,PA,Hastings,40.665874,-78.702924 +16647,PA,Hesston,40.412139,-78.128109 +16648,PA,Hollidaysburg,40.438727,-78.368627 +16650,PA,Hopewell,40.119225,-78.312897 +16651,PA,Houtzdale,40.830538,-78.3618 +16652,PA,Huntingdon,40.502274,-78.005028 +16655,PA,Imler,40.23186,-78.516719 +16656,PA,Irvona,40.801744,-78.560243 +16657,PA,James Creek,40.356672,-78.188678 +16659,PA,Loysburg,40.174577,-78.386435 +16661,PA,Madera,40.827086,-78.427475 +16662,PA,Martinsburg,40.295082,-78.324367 +16664,PA,New Enterprise,40.200013,-78.425916 +16666,PA,Osceola Mills,40.872208,-78.275705 +16667,PA,St Clairsville,40.158583,-78.509928 +16668,PA,Patton,40.623045,-78.635028 +16669,PA,Petersburg,40.602968,-77.998402 +16671,PA,Ramey,40.801511,-78.399821 +16673,PA,Roaring Spring,40.327747,-78.39284 +16674,PA,Robertsdale,40.178674,-78.111696 +16678,PA,Saxton,40.223301,-78.247137 +16679,PA,Six Mile Run,40.157583,-78.210814 +16680,PA,Smithmill,40.767808,-78.399442 +16683,PA,Spruce Creek,40.621767,-78.136083 +16685,PA,Todd,40.25775,-78.100354 +16686,PA,Tyrone,40.661905,-78.241905 +16689,PA,Waterfall,40.073871,-78.047708 +16691,PA,Wells Tannery,40.100996,-78.140269 +16692,PA,Westover,40.76152,-78.735481 +16693,PA,Ganister,40.437356,-78.22555 +16695,PA,Woodbury,40.21847,-78.366573 +16701,PA,Bradford,41.954678,-78.653967 +16720,PA,Austin,41.629649,-78.090812 +16724,PA,Crosby,41.713356,-78.374637 +16726,PA,Ormsby,41.826327,-78.566743 +16727,PA,Derrick City,41.972577,-78.562564 +16729,PA,Duke Center,41.954017,-78.492269 +16731,PA,Eldred,41.948925,-78.388439 +16732,PA,Gifford,41.860715,-78.584604 +16734,PA,James City,41.593116,-78.85052 +16735,PA,Kane,41.661861,-78.797778 +16738,PA,Lewis Run,41.821123,-78.680498 +16740,PA,Mount Jewett,41.724737,-78.644613 +16743,PA,Port Allegany,41.816919,-78.279909 +16744,PA,Rew,41.912222,-78.535406 +16745,PA,Rixford,41.934606,-78.458647 +16746,PA,Roulette,41.773795,-78.153843 +16748,PA,Shinglehouse,41.957176,-78.19062 +16749,PA,Smethport,41.802063,-78.470229 +16750,PA,Turtlepoint,41.884665,-78.330793 +16801,PA,State College,40.792522,-77.852279 +16803,PA,State College,40.808162,-77.892578 +16820,PA,Aaronsburg,40.876944,-77.387977 +16821,PA,Allport,40.975039,-78.21038 +16822,PA,Beech Creek,41.084507,-77.585118 +16823,PA,Pleasant Gap,40.909377,-77.7642 +16827,PA,Boalsburg,40.779344,-77.782236 +16828,PA,Centre Hall,40.825429,-77.674225 +16829,PA,Clarence,41.058482,-77.931213 +16830,PA,Clearfield,41.02103,-78.443488 +16832,PA,Coburn,40.867818,-77.492173 +16833,PA,Curwensville,40.965972,-78.527247 +16836,PA,Frenchville,41.103794,-78.234465 +16837,PA,Glen Richey,40.938209,-78.475215 +16838,PA,Grampian,40.981768,-78.594913 +16839,PA,Grassflat,40.995881,-78.128354 +16840,PA,Hawk Run,40.941215,-78.213787 +16841,PA,Howard,41.020315,-77.670178 +16844,PA,Julian,40.891709,-77.933243 +16845,PA,Karthaus,41.113635,-78.087509 +16852,PA,Madisonburg,40.933407,-77.494959 +16854,PA,Millheim,40.896314,-77.450531 +16858,PA,Morrisdale,41.000128,-78.235717 +16859,PA,Moshannon,41.03419,-78.009469 +16860,PA,Munson,40.966704,-78.18621 +16861,PA,New Millport,40.885302,-78.494543 +16863,PA,Olanta,40.905621,-78.500079 +16864,PA,Orviston,41.075386,-77.620306 +16865,PA,Pennsylvania Fur,40.728194,-77.954068 +16866,PA,Philipsburg,40.886252,-78.219008 +16870,PA,Port Matilda,40.801819,-78.078795 +16871,PA,Pottersdale,41.186798,-78.034056 +16872,PA,Rebersburg,40.954906,-77.405322 +16874,PA,Snow Shoe,41.037581,-77.95228 +16875,PA,Spring Mills,40.857753,-77.574031 +16877,PA,Warriors Mark,40.741414,-78.077478 +16878,PA,West Decatur,40.949305,-78.312936 +16879,PA,Winburne,40.967779,-78.156235 +16881,PA,Woodland,41.009833,-78.321445 +16882,PA,Woodward,40.911574,-77.348269 +16901,PA,Wellsboro,41.737343,-77.30802 +16912,PA,Blossburg,41.669771,-77.079711 +16914,PA,Columbia Cross R,41.846282,-76.793242 +16915,PA,Oswayo,41.781529,-78.003861 +16917,PA,Covington,41.739297,-77.108795 +16920,PA,Elkland,41.988165,-77.313392 +16921,PA,Gaines,41.747134,-77.568001 +16922,PA,Galeton,41.723006,-77.654756 +16923,PA,North Bingham,41.935312,-77.873585 +16925,PA,Gillett,41.956826,-76.771329 +16926,PA,Granville Summit,41.697299,-76.721829 +16927,PA,Harrison Valley,41.949824,-77.687665 +16928,PA,Knoxville,41.959557,-77.435678 +16929,PA,Lawrenceville,41.978266,-77.11355 +16930,PA,Liberty,41.565571,-77.119505 +16932,PA,Mainesburg,41.790029,-76.968156 +16933,PA,Mansfield,41.812288,-77.07163 +16935,PA,Middlebury Cente,41.891706,-77.314764 +16936,PA,Millerton,41.962467,-76.974766 +16937,PA,Mills,41.902482,-77.762051 +16938,PA,Morris,41.54752,-77.291975 +16939,PA,Morris Run,41.672943,-77.027769 +16940,PA,Nelson,41.978719,-77.241909 +16941,PA,Genesee,41.981963,-77.773995 +16942,PA,Osceola,41.984765,-77.353983 +16943,PA,Sabinsville,41.856414,-77.537825 +16946,PA,Tioga,41.912454,-77.139294 +16947,PA,Troy,41.77815,-76.771143 +16948,PA,Ulysses,41.845903,-77.712557 +16950,PA,Little Marsh,41.919063,-77.530975 +17002,PA,Allensville,40.524921,-77.829396 +17003,PA,Annville,40.345608,-76.544676 +17004,PA,Belleville,40.601571,-77.735823 +17005,PA,Berrysburg,40.60199,-76.811207 +17006,PA,Blain,40.329314,-77.511736 +17007,PA,Boiling Springs,40.144873,-77.119489 +17009,PA,Burnham,40.636119,-77.562459 +17011,PA,Shiremanstown,40.238071,-76.929111 +17013,PA,Carlisle Barrack,40.203877,-77.199526 +17014,PA,Cocolamus,40.656706,-77.106749 +17017,PA,Dalmatia,40.648315,-76.879713 +17018,PA,Dauphin,40.384581,-76.928304 +17019,PA,Dillsburg,40.096373,-77.03387 +17020,PA,Duncannon,40.408678,-77.047254 +17021,PA,East Waterford,40.354191,-77.652789 +17022,PA,Elizabethtown,40.155331,-76.602545 +17023,PA,Elizabethville,40.55497,-76.835484 +17024,PA,Elliottsburg,40.362428,-77.270348 +17025,PA,Enola,40.292178,-76.943208 +17026,PA,Fredericksburg,40.452392,-76.42674 +17028,PA,Grantville,40.360629,-76.671331 +17029,PA,Granville,40.547868,-77.613358 +17030,PA,Gratz,40.610424,-76.718851 +17031,PA,Green Park,40.375143,-77.320096 +17032,PA,Halifax,40.47603,-76.89404 +17033,PA,Hershey,40.263767,-76.654518 +17034,PA,Highspire,40.208348,-76.785303 +17035,PA,Honey Grove,40.430903,-77.57607 +17036,PA,Hummelstown,40.278199,-76.709375 +17037,PA,Ickesburg,40.434154,-77.34291 +17038,PA,Jonestown,40.43607,-76.503842 +17040,PA,Landisburg,40.332644,-77.319146 +17042,PA,Cleona,40.335912,-76.425895 +17043,PA,Wormleysburg,40.247158,-76.89757 +17044,PA,Lewistown,40.599439,-77.57558 +17045,PA,Liverpool,40.575272,-77.008327 +17047,PA,Loysville,40.36576,-77.413823 +17048,PA,Lykens,40.590919,-76.70736 +17049,PA,Mc Alisterville,40.646916,-77.2602 +17051,PA,Mc Veytown,40.504593,-77.718625 +17052,PA,Mapleton Depot,40.386414,-77.960444 +17053,PA,Marysville,40.335062,-76.972204 +17055,PA,Hampden,40.212669,-76.99493 +17057,PA,Middletown,40.204086,-76.733127 +17058,PA,Mifflin,40.570842,-77.41314 +17059,PA,Mifflintown,40.572666,-77.376119 +17060,PA,Mill Creek,40.447102,-77.917689 +17061,PA,Millersburg,40.558743,-76.930483 +17062,PA,Millerstown,40.550548,-77.129776 +17063,PA,Milroy,40.72033,-77.556739 +17065,PA,Mount Holly Spri,40.118356,-77.190807 +17066,PA,Mount Union,40.390106,-77.863704 +17067,PA,Myerstown,40.378949,-76.314328 +17068,PA,New Bloomfield,40.419325,-77.193836 +17070,PA,New Cumberland,40.215105,-76.868909 +17071,PA,New Germantown,40.305749,-77.579701 +17073,PA,Newmanstown,40.317938,-76.2426 +17074,PA,Newport,40.482662,-77.165866 +17076,PA,Oakland Mills,40.614748,-77.319244 +17078,PA,Palmyra,40.301055,-76.58861 +17082,PA,Port Royal,40.51068,-77.430958 +17084,PA,Reedsville,40.672189,-77.611589 +17086,PA,Richfield,40.688424,-77.122296 +17087,PA,Richland,40.380595,-76.265447 +17090,PA,Shermans Dale,40.329898,-77.180856 +17094,PA,Thompsontown,40.590782,-77.207551 +17097,PA,Wiconisco,40.567511,-76.709084 +17098,PA,Williamstown,40.580761,-76.622259 +17099,PA,Yeagertown,40.643558,-77.568823 +17101,PA,Harrisburg,40.261767,-76.883079 +17102,PA,Harrisburg,40.27278,-76.891044 +17103,PA,Penbrook,40.273852,-76.863812 +17104,PA,Harrisburg,40.259683,-76.859397 +17109,PA,Colonial Park,40.29122,-76.822612 +17110,PA,Harrisburg,40.302957,-76.886246 +17111,PA,Swatara,40.266058,-76.793918 +17112,PA,Harrisburg,40.335208,-76.791438 +17113,PA,Steelton,40.234007,-76.827568 +17201,PA,Chambersburg,39.931318,-77.657928 +17211,PA,Artemas,39.757465,-78.40314 +17212,PA,Big Cove Tannery,39.889704,-78.012366 +17213,PA,Blairs Mills,40.254804,-77.769473 +17214,PA,Blue Ridge Summi,39.726951,-77.469836 +17215,PA,Burnt Cabins,40.075278,-77.901718 +17217,PA,Concord,40.245842,-77.703133 +17219,PA,Doylesburg,40.217195,-77.686203 +17220,PA,Dry Run,40.174744,-77.76457 +17221,PA,Fannettsburg,40.071692,-77.82101 +17222,PA,Fayetteville,39.906543,-77.53096 +17223,PA,Fort Littleton,40.054372,-77.975678 +17224,PA,Fort Loudon,39.954692,-77.898365 +17225,PA,Greencastle,39.781827,-77.746956 +17228,PA,Harrisonville,39.976137,-78.084077 +17229,PA,Hustontown,40.044111,-78.014835 +17232,PA,Lurgan,40.127422,-77.635063 +17233,PA,Mc Connellsburg,39.944251,-77.990117 +17236,PA,Mercersburg,39.819519,-77.907259 +17237,PA,Mont Alto,39.841689,-77.553676 +17238,PA,Needmore,39.871279,-78.143935 +17239,PA,Neelyton,40.137051,-77.858015 +17240,PA,Newburg,40.13333,-77.566915 +17241,PA,Newville,40.185468,-77.411401 +17243,PA,Orbisonia,40.238872,-77.906924 +17244,PA,Orrstown,40.07305,-77.639762 +17246,PA,Pleasant Hall,40.04135,-77.703148 +17252,PA,Saint Thomas,39.924052,-77.7908 +17255,PA,Shade Gap,40.172976,-77.868045 +17257,PA,Shippensburg,40.051359,-77.519477 +17260,PA,Shirleysburg,40.316768,-77.870062 +17262,PA,Spring Run,40.14663,-77.740525 +17264,PA,Three Springs,40.183437,-77.99412 +17265,PA,Upperstrasburg,40.05799,-77.736791 +17266,PA,Walnut Bottom,40.086042,-77.408984 +17267,PA,Warfordsburg,39.769765,-78.198627 +17268,PA,Waynesboro,39.763504,-77.567363 +17271,PA,Willow Hill,40.113694,-77.796947 +17301,PA,Abbottstown,39.888099,-76.993077 +17302,PA,Airville,39.821012,-76.401179 +17304,PA,Aspers,39.976533,-77.228657 +17307,PA,Biglerville,39.928119,-77.288549 +17309,PA,Brogue,39.883044,-76.488236 +17313,PA,Yoe,39.900127,-76.644794 +17314,PA,Delta,39.751754,-76.344101 +17315,PA,Dover,40.006158,-76.855485 +17316,PA,East Berlin,39.964546,-77.007252 +17319,PA,Etters,40.154506,-76.801861 +17320,PA,Greenstone,39.762694,-77.376824 +17321,PA,Fawn Grove,39.751024,-76.439237 +17322,PA,Felton,39.836006,-76.593721 +17324,PA,Gardners,40.042759,-77.187725 +17325,PA,Gettysburg,39.832044,-77.222313 +17327,PA,Glen Rock,39.781326,-76.747713 +17329,PA,Brodbecks,39.759907,-76.862046 +17331,PA,Hanover,39.794286,-76.981196 +17339,PA,Lewisberry,40.146295,-76.870004 +17340,PA,Littlestown,39.749549,-77.100326 +17344,PA,Mc Sherrystown,39.804832,-77.01496 +17345,PA,Manchester,40.069461,-76.733245 +17347,PA,Mount Wolf,40.071126,-76.696576 +17349,PA,New Freedom,39.742266,-76.684064 +17350,PA,New Oxford,39.877459,-77.06433 +17352,PA,New Park,39.760027,-76.504167 +17353,PA,Orrtanna,39.881032,-77.380592 +17356,PA,Red Lion,39.902572,-76.608075 +17360,PA,Seven Valleys,39.855613,-76.738336 +17361,PA,Shrewsbury,39.760133,-76.674827 +17362,PA,Spring Grove,39.857208,-76.877356 +17363,PA,Stewartstown,39.771962,-76.597037 +17364,PA,Thomasville,39.934619,-76.882159 +17365,PA,Wellsville,40.055721,-76.944315 +17366,PA,Windsor,39.923271,-76.559126 +17368,PA,Wrightsville,39.996559,-76.526971 +17370,PA,York Haven,40.122154,-76.773725 +17372,PA,York Springs,40.00839,-77.106136 +17401,PA,York,39.963539,-76.726887 +17402,PA,East York,39.971508,-76.674578 +17403,PA,York,39.94943,-76.712998 +17404,PA,West York,39.961988,-76.768987 +17406,PA,Hellam,39.998249,-76.592646 +17407,PA,Jacobus,39.880203,-76.714634 +17501,PA,Akron,40.157086,-76.205295 +17502,PA,Bainbridge,40.1086,-76.672589 +17505,PA,Bird In Hand,40.056109,-76.183036 +17509,PA,Ninepoints,39.935632,-76.025983 +17512,PA,Columbia,40.039079,-76.48622 +17516,PA,Conestoga,39.940303,-76.357475 +17517,PA,Denver,40.229671,-76.115688 +17518,PA,Drumore,39.838399,-76.245684 +17519,PA,East Earl,40.139475,-76.027634 +17520,PA,East Petersburg,40.100781,-76.351169 +17522,PA,Ephrata,40.175641,-76.182093 +17527,PA,Gap,40.002018,-75.997801 +17529,PA,Gordonville,40.035304,-76.11063 +17532,PA,Holtwood,39.863146,-76.300822 +17535,PA,Kinzers,40.005326,-76.049326 +17536,PA,Kirkwood,39.82571,-76.093315 +17538,PA,Salunga,40.08825,-76.414975 +17540,PA,Leola,40.096448,-76.192109 +17543,PA,Brunnerville,40.162573,-76.29926 +17545,PA,Manheim,40.170229,-76.416794 +17547,PA,Marietta,40.066442,-76.564527 +17551,PA,Millersville,39.998213,-76.356568 +17552,PA,Florin,40.106828,-76.507551 +17554,PA,Mountville,40.042742,-76.427694 +17555,PA,Narvon,40.125165,-75.975584 +17557,PA,New Holland,40.100511,-76.080136 +17560,PA,New Providence,39.909776,-76.224319 +17562,PA,Paradise,39.985249,-76.108074 +17563,PA,Peach Bottom,39.770511,-76.179083 +17565,PA,Pequea,39.905765,-76.320866 +17566,PA,Quarryville,39.894932,-76.146462 +17569,PA,Reinholds,40.268758,-76.101332 +17572,PA,Ronks,40.020754,-76.166132 +17576,PA,Smoketown,40.040651,-76.22007 +17578,PA,Stevens,40.219397,-76.162604 +17579,PA,Strasburg,39.970075,-76.184824 +17581,PA,Terre Hill,40.158539,-76.051083 +17582,PA,Washington Boro,39.988118,-76.4402 +17584,PA,Willow Street,39.967003,-76.27524 +17601,PA,Neffsville,40.075381,-76.319888 +17602,PA,Lancaster,40.033514,-76.284364 +17603,PA,Rohrerstown,40.030475,-76.331583 +17701,PA,South Williamspo,41.247217,-77.020571 +17723,PA,Cammal,41.380901,-77.462021 +17724,PA,Canton,41.653784,-76.858188 +17727,PA,Cedar Run,41.498972,-77.48891 +17728,PA,Cogan Station,41.31517,-77.068996 +17729,PA,Cross Fork,41.473672,-77.80953 +17737,PA,Hughesville,41.255952,-76.71411 +17740,PA,Salladasburg,41.200733,-77.242704 +17742,PA,Lairdsville,41.233549,-76.58893 +17744,PA,Linden,41.247216,-77.152652 +17745,PA,Lock Haven,41.142497,-77.443588 +17747,PA,Loganton,41.028317,-77.320397 +17751,PA,Mill Hall,41.086688,-77.483609 +17752,PA,Montgomery,41.178778,-76.883933 +17754,PA,Montoursville,41.266252,-76.903035 +17756,PA,Muncy,41.213715,-76.763258 +17758,PA,Muncy Valley,41.381206,-76.541518 +17763,PA,Ralston,41.503817,-76.95835 +17764,PA,Renovo,41.333376,-77.74479 +17765,PA,Roaring Branch,41.569234,-76.942053 +17768,PA,Shunk,41.553574,-76.745521 +17771,PA,Trout Run,41.412481,-77.009776 +17772,PA,Turbotville,41.111867,-76.742493 +17774,PA,Unityville,41.243552,-76.518318 +17776,PA,Waterville,41.31136,-77.360368 +17777,PA,Watsontown,41.102006,-76.853192 +17778,PA,Westport,41.27445,-77.931496 +17779,PA,Woolrich,41.188734,-77.331307 +17801,PA,Sunbury,40.855122,-76.777611 +17810,PA,Allenwood,41.126424,-76.972362 +17812,PA,Beaver Springs,40.752766,-77.231801 +17813,PA,Beavertown,40.777378,-77.169112 +17814,PA,Benton,41.223142,-76.340632 +17815,PA,Bloomsburg,41.011528,-76.438379 +17820,PA,Catawissa,40.918031,-76.441586 +17821,PA,Danville,40.979895,-76.622897 +17823,PA,Dornsife,40.757092,-76.7626 +17824,PA,Elysburg,40.863871,-76.556924 +17827,PA,Freeburg,40.767498,-76.942963 +17828,PA,Gowen City,40.751141,-76.528149 +17830,PA,Herndon,40.691789,-76.800761 +17832,PA,Marion Heights,40.804576,-76.465137 +17834,PA,Kulpmont,40.793278,-76.474384 +17835,PA,Laurelton,40.91268,-77.205211 +17836,PA,Leck Kill,40.710135,-76.627108 +17837,PA,Lewisburg,40.970205,-76.909878 +17841,PA,Mc Clure,40.699084,-77.375791 +17842,PA,Middleburg,40.797656,-77.046798 +17843,PA,Beaver Springs,40.810917,-76.970366 +17844,PA,Mifflinburg,40.921826,-77.050515 +17845,PA,Millmont,40.880324,-77.194142 +17846,PA,Millville,41.126051,-76.520767 +17847,PA,Milton,41.01681,-76.839817 +17850,PA,Montandon,40.975936,-76.851024 +17851,PA,Mount Carmel,40.795535,-76.419466 +17853,PA,Mount Pleasant M,40.700185,-77.005241 +17855,PA,New Berlin,40.880212,-76.986124 +17856,PA,New Columbia,41.054108,-76.901851 +17857,PA,Northumberland,40.904355,-76.790794 +17859,PA,Orangeville,41.10156,-76.38097 +17860,PA,Paxinos,40.844809,-76.635041 +17864,PA,Port Trevorton,40.699593,-76.908215 +17866,PA,Ranshaw,40.803039,-76.498242 +17867,PA,Rebuck,40.712544,-76.740605 +17868,PA,Riverside,40.951269,-76.637458 +17870,PA,Selinsgrove,40.822372,-76.86825 +17872,PA,Excelsior,40.790336,-76.561118 +17877,PA,Snydertown,40.874097,-76.674945 +17878,PA,Stillwater,41.151517,-76.369624 +17881,PA,Trevorton,40.781867,-76.670234 +17888,PA,Wilburton,40.812087,-76.392922 +17889,PA,Winfield,40.890805,-76.871833 +17901,PA,Pottsville,40.683978,-76.212318 +17921,PA,Ashland,40.773231,-76.342972 +17922,PA,Auburn,40.596157,-76.13439 +17923,PA,Branchdale,40.664328,-76.332788 +17925,PA,Brockton,40.763162,-76.049874 +17927,PA,Centralia,40.81375,-76.357325 +17929,PA,Cressona,40.628361,-76.195028 +17931,PA,Frackville,40.782537,-76.231137 +17935,PA,Girardville,40.792162,-76.28581 +17938,PA,Hegins,40.666898,-76.473168 +17941,PA,Klingerstown,40.667571,-76.650709 +17948,PA,Mahanoy City,40.812302,-76.139601 +17954,PA,Minersville,40.690637,-76.261533 +17957,PA,Muir,40.613614,-76.468205 +17959,PA,Kaska,40.722728,-76.11348 +17960,PA,New Ringgold,40.714851,-75.948409 +17961,PA,Orwigsburg,40.643071,-76.083999 +17963,PA,Pine Grove,40.567093,-76.326913 +17964,PA,Pitman,40.704868,-76.523297 +17965,PA,Port Carbon,40.697731,-76.166046 +17967,PA,Ringtown,40.855854,-76.23493 +17968,PA,Sacramento,40.635238,-76.612833 +17970,PA,Saint Clair,40.719273,-76.192381 +17972,PA,Schuylkill Haven,40.630571,-76.169973 +17976,PA,Shenandoah,40.816744,-76.203502 +17978,PA,Spring Glen,40.633447,-76.635018 +17980,PA,Tower City,40.584475,-76.550022 +17981,PA,Donaldson,40.626842,-76.398796 +17983,PA,Valley View,40.644467,-76.544843 +17985,PA,Zion Grove,40.937152,-76.231032 +18011,PA,Alburtis,40.486201,-75.62113 +18013,PA,Roseto,40.854907,-75.195644 +18014,PA,Bath,40.755144,-75.40856 +18015,PA,Bethlehem,40.600167,-75.380507 +18017,PA,Butztown,40.65168,-75.35823 +18018,PA,Bethlehem,40.627849,-75.392827 +18031,PA,Breinigsville,40.552621,-75.655269 +18032,PA,Catasauqua,40.655696,-75.46927 +18034,PA,Center Valley,40.539594,-75.424208 +18035,PA,Cherryville,40.738476,-75.552133 +18036,PA,Coopersburg,40.507553,-75.388778 +18037,PA,Coplay,40.684865,-75.518825 +18038,PA,Danielsville,40.786636,-75.518604 +18041,PA,East Greenville,40.411876,-75.505618 +18042,PA,Forks Township,40.6867,-75.23582 +18049,PA,Emmaus,40.529295,-75.500991 +18051,PA,Fogelsville,40.59304,-75.656794 +18052,PA,Hokendauqua,40.647479,-75.495383 +18053,PA,Germansville,40.711826,-75.714687 +18054,PA,Green Lane,40.353377,-75.435148 +18055,PA,Hellertown,40.581715,-75.325513 +18056,PA,Hereford,40.448659,-75.579983 +18058,PA,Kunkletown,40.899891,-75.475974 +18062,PA,Macungie,40.528543,-75.566618 +18064,PA,Nazareth,40.744962,-75.319932 +18066,PA,New Tripoli,40.654544,-75.741739 +18067,PA,Northampton,40.699765,-75.48742 +18069,PA,Orefield,40.624826,-75.597395 +18070,PA,Palm,40.43167,-75.533124 +18071,PA,Palmerton,40.816976,-75.601119 +18072,PA,Pen Argyl,40.85182,-75.270115 +18073,PA,Pennsburg,40.391138,-75.486608 +18074,PA,Perkiomenville,40.31566,-75.50218 +18076,PA,Red Hill,40.375807,-75.484613 +18077,PA,Riegelsville,40.57824,-75.219064 +18078,PA,Schnecksville,40.681949,-75.623924 +18080,PA,Emerald,40.740695,-75.621612 +18087,PA,Trexlertown,40.554418,-75.602293 +18088,PA,Walnutport,40.76147,-75.565749 +18091,PA,Wind Gap,40.816922,-75.326378 +18092,PA,Zionsville,40.473425,-75.526146 +18101,PA,Allentown,40.602729,-75.470955 +18102,PA,Allentown,40.606818,-75.478139 +18103,PA,Allentown,40.589145,-75.464521 +18104,PA,Allentown,40.601849,-75.522499 +18106,PA,Wescosville,40.561451,-75.566424 +18201,PA,West Hazleton,40.962107,-75.978193 +18210,PA,Albrightsville,40.974786,-75.584206 +18211,PA,Andreas,40.746457,-75.834247 +18214,PA,Barnesville,40.813811,-76.06109 +18216,PA,Beaver Meadows,40.922672,-75.940648 +18218,PA,Coaldale,40.821942,-75.910385 +18220,PA,Delano,40.841048,-76.069462 +18222,PA,Drums,41.025525,-75.97676 +18224,PA,Freeland,41.019557,-75.888001 +18229,PA,Jim Thorpe,40.870002,-75.739665 +18232,PA,Lansford,40.831444,-75.882834 +18235,PA,Weissport,40.830024,-75.706088 +18237,PA,Mcadoo,40.89791,-75.997117 +18240,PA,Nesquehoning,40.862608,-75.82389 +18245,PA,Quakake,40.849337,-75.982477 +18246,PA,Rock Glen,40.964628,-76.163761 +18248,PA,Sheppton,40.888073,-76.137952 +18249,PA,Sugarloaf,40.997126,-76.071655 +18250,PA,Summit Hill,40.825524,-75.869275 +18252,PA,Tamaqua,40.798319,-75.97353 +18255,PA,Weatherly,40.941085,-75.830635 +18301,PA,East Stroudsburg,41.036714,-75.173463 +18321,PA,Bartonsville,41.008007,-75.296726 +18322,PA,Brodheadsville,40.930862,-75.410415 +18324,PA,Bushkill,41.128476,-75.013207 +18325,PA,Canadensis,41.233791,-75.257288 +18326,PA,Cresco,41.160605,-75.268228 +18327,PA,Delaware Water G,40.982863,-75.149987 +18328,PA,Dingmans Ferry,41.239966,-74.938018 +18330,PA,Effort,40.966946,-75.452286 +18331,PA,Gilbert,40.908866,-75.431373 +18332,PA,Henryville,41.088912,-75.279753 +18333,PA,Kresgeville,40.898156,-75.507437 +18334,PA,Long Pond,41.067732,-75.448245 +18336,PA,Matamoras,41.367437,-74.715358 +18337,PA,Milford,41.322816,-74.88236 +18340,PA,Millrift,41.358265,-74.773876 +18343,PA,Mount Bethel,40.900839,-75.111545 +18344,PA,Mount Pocono,41.121558,-75.352868 +18346,PA,Pocono Summit,41.103989,-75.413554 +18347,PA,Pocono Lake,41.118661,-75.555863 +18350,PA,Pocono Pines,41.105387,-75.476038 +18352,PA,Reeders,40.989533,-75.278113 +18353,PA,Saylorsburg,40.917179,-75.374761 +18354,PA,Sciota,40.928282,-75.293779 +18355,PA,Scotrun,41.075147,-75.32646 +18360,PA,Stroudsburg,40.987697,-75.24852 +18370,PA,Swiftwater,41.087936,-75.348278 +18371,PA,Tamiment,41.168112,-74.952614 +18372,PA,Tannersville,41.048202,-75.309984 +18401,PA,Aldenville,41.642679,-75.36749 +18403,PA,Eynon,41.495633,-75.555232 +18405,PA,Beach Lake,41.603403,-75.11649 +18407,PA,Simpson,41.583481,-75.507363 +18411,PA,Clarks Summit,41.487795,-75.705713 +18414,PA,Dalton,41.539496,-75.703737 +18415,PA,Damascus,41.736623,-75.131151 +18417,PA,Equinunk,41.811712,-75.189081 +18419,PA,Factoryville,41.576168,-75.765182 +18421,PA,Browndale,41.654587,-75.48725 +18424,PA,Gouldsboro,41.2448,-75.503653 +18425,PA,Greeley,41.437238,-75.012491 +18426,PA,Greentown,41.332145,-75.281911 +18427,PA,Hamlin,41.401477,-75.354232 +18428,PA,Hawley,41.478685,-75.197822 +18430,PA,Herrick Center,41.76434,-75.504387 +18431,PA,Honesdale,41.579227,-75.25279 +18433,PA,Mayfield,41.532723,-75.542948 +18434,PA,Jessup,41.472443,-75.568891 +18435,PA,Lackawaxen,41.504272,-75.074859 +18436,PA,Lake Ariel,41.439476,-75.431257 +18437,PA,Lake Como,41.866553,-75.32308 +18438,PA,Lakeville,41.422278,-75.260717 +18439,PA,Lakewood,41.817138,-75.383824 +18441,PA,Lenoxville,41.667713,-75.631934 +18443,PA,Milanville,41.649208,-75.08818 +18444,PA,Moscow,41.343194,-75.530137 +18445,PA,Newfoundland,41.304125,-75.338405 +18446,PA,Nicholson,41.641198,-75.764073 +18447,PA,Olyphant,41.467709,-75.601502 +18451,PA,Paupack,41.381197,-75.23032 +18452,PA,Peckville,41.482124,-75.589884 +18453,PA,Pleasant Mount,41.732204,-75.398944 +18455,PA,Preston Park,41.867264,-75.383147 +18456,PA,Prompton,41.582031,-75.320749 +18458,PA,Shohola,41.418193,-74.917962 +18460,PA,South Sterling,41.271222,-75.381443 +18461,PA,Starlight,41.925087,-75.321238 +18462,PA,Starrucca,41.890739,-75.449001 +18463,PA,Sterling,41.341912,-75.394467 +18464,PA,Tafton,41.369445,-75.101598 +18465,PA,Thompson,41.83395,-75.534215 +18466,PA,Tobyhanna,41.183638,-75.391781 +18469,PA,Tyler Hill,41.670873,-75.154246 +18470,PA,Union Dale,41.707941,-75.546476 +18472,PA,Waymart,41.570276,-75.406478 +18503,PA,Scranton,41.409517,-75.664205 +18504,PA,Scranton,41.412777,-75.686081 +18505,PA,Scranton,41.39145,-75.665738 +18507,PA,Moosic,41.361492,-75.717093 +18508,PA,Scranton,41.438917,-75.662529 +18509,PA,Scranton,41.427353,-75.646454 +18510,PA,Scranton,41.408039,-75.648397 +18512,PA,Dunmore,41.426184,-75.62294 +18517,PA,Taylor,41.390442,-75.715848 +18518,PA,Old Forge,41.370076,-75.739075 +18519,PA,Dickson City,41.462306,-75.624343 +18603,PA,Berwick,41.066477,-76.244269 +18610,PA,Blakeslee,41.048502,-75.534309 +18612,PA,College Miserico,41.363762,-75.958911 +18614,PA,Dushore,41.523213,-76.402145 +18615,PA,Falls,41.466677,-75.856004 +18616,PA,Forksville,41.526925,-76.60079 +18617,PA,Glen Lyon,41.174635,-76.074578 +18618,PA,Harveys Lake,41.359181,-76.04506 +18619,PA,Hillsgrove,41.448159,-76.697914 +18621,PA,Hunlock Creek,41.245923,-76.087915 +18622,PA,Huntington Mills,41.200905,-76.197342 +18623,PA,Laceyville,41.66621,-76.142566 +18624,PA,Lake Harmony,41.05424,-75.633129 +18628,PA,Lopez,41.418002,-76.300206 +18629,PA,Mehoopany,41.558695,-76.103462 +18630,PA,Meshoppen,41.639163,-76.015464 +18631,PA,Mifflinville,41.023473,-76.292396 +18632,PA,Mildred,41.479236,-76.38313 +18634,PA,Nanticoke,41.19634,-76.004419 +18635,PA,Nescopeck,41.046887,-76.19809 +18636,PA,Noxen,41.418131,-76.045952 +18640,PA,Pittston,41.317501,-75.788492 +18641,PA,Avoca,41.330857,-75.744655 +18642,PA,Duryea,41.348557,-75.761104 +18643,PA,West Pittston,41.337964,-75.816651 +18644,PA,Wyoming,41.319713,-75.854071 +18651,PA,Plymouth,41.245798,-75.948064 +18655,PA,Mocanaqua,41.176674,-76.167096 +18656,PA,Sweet Valley,41.30663,-76.133907 +18657,PA,Center Moreland,41.550687,-75.941043 +18660,PA,Wapwallopen,41.06797,-76.085729 +18661,PA,White Haven,41.079049,-75.771492 +18701,PA,Wilkes Barre,41.244892,-75.884063 +18702,PA,Hanover Township,41.236512,-75.882557 +18704,PA,Kingston,41.274223,-75.890338 +18705,PA,Wilkes Barre,41.268921,-75.845309 +18706,PA,Ashley,41.206709,-75.918157 +18707,PA,Mountain Top,41.134975,-75.937642 +18708,PA,Shavertown,41.299802,-75.97108 +18709,PA,Luzerne,41.284257,-75.893475 +18801,PA,Montrose,41.839584,-75.882055 +18810,PA,Athens,41.949002,-76.488855 +18812,PA,Brackney,41.966614,-75.937527 +18817,PA,East Smithfield,41.863115,-76.617207 +18818,PA,Friendsville,41.916445,-76.02569 +18821,PA,Great Bend,41.977513,-75.732742 +18822,PA,Hallstead,41.959798,-75.782595 +18823,PA,Harford,41.779891,-75.678632 +18824,PA,Hop Bottom,41.693196,-75.789656 +18825,PA,Jackson,41.864881,-75.609136 +18826,PA,Kingsley,41.765856,-75.783101 +18828,PA,Lawton,41.757294,-76.091214 +18829,PA,Le Raysville,41.843415,-76.179604 +18830,PA,Little Meadows,41.976593,-76.118472 +18831,PA,Milan,41.896555,-76.532777 +18832,PA,Monroeton,41.699387,-76.500995 +18833,PA,New Albany,41.59867,-76.43983 +18834,PA,New Milford,41.866409,-75.717113 +18837,PA,Rome,41.863403,-76.301498 +18839,PA,Rushville,41.776893,-76.050955 +18840,PA,Sayre,41.984222,-76.521757 +18842,PA,South Gibson,41.754373,-75.606723 +18844,PA,Springville,41.714684,-75.902472 +18845,PA,Stevensville,41.771782,-76.171696 +18846,PA,Sugar Run,41.604057,-76.259785 +18847,PA,Susquehanna,41.948669,-75.586249 +18848,PA,Towanda,41.763758,-76.464527 +18850,PA,Ulster,41.840809,-76.487574 +18851,PA,Warren Center,41.939389,-76.196445 +18853,PA,Wyalusing,41.701499,-76.275433 +18854,PA,Wysox,41.782621,-76.383397 +18901,PA,New Britain,40.320391,-75.129987 +18913,PA,Carversville,40.39079,-75.063127 +18914,PA,Chalfont,40.289175,-75.214938 +18915,PA,Colmar,40.271814,-75.266861 +18917,PA,Dublin,40.371996,-75.204453 +18920,PA,Erwinna,40.508689,-75.080372 +18923,PA,Fountainville,40.336815,-75.153627 +18925,PA,Furlong,40.294518,-75.064946 +18927,PA,Hilltown,40.34762,-75.27118 +18929,PA,Jamison,40.256599,-75.096093 +18930,PA,Kintnersville,40.531009,-75.211708 +18932,PA,Line Lexington,40.288781,-75.255535 +18933,PA,Lumberville,40.407103,-75.055166 +18934,PA,Mechanicsville,40.343821,-75.062962 +18936,PA,Montgomeryville,40.251353,-75.234643 +18938,PA,New Hope,40.355613,-74.983889 +18940,PA,George School,40.245817,-74.94313 +18942,PA,Ottsville,40.459239,-75.157009 +18944,PA,Perkasie,40.376526,-75.264803 +18947,PA,Pipersville,40.4262,-75.107398 +18951,PA,Quakertown,40.4411,-75.350667 +18954,PA,Richboro,40.216672,-75.002936 +18955,PA,Richlandtown,40.472166,-75.32193 +18960,PA,Sellersville,40.362024,-75.318953 +18964,PA,Bethton,40.312796,-75.321339 +18966,PA,Holland,40.190212,-75.005994 +18969,PA,Telford,40.320478,-75.352001 +18972,PA,Upper Black Eddy,40.541093,-75.125858 +18974,PA,Warminster,40.206676,-75.090513 +18976,PA,Warrington,40.246438,-75.135392 +18977,PA,Washington Cross,40.291906,-74.882859 +19001,PA,Ogontz Campus,40.128141,-75.128918 +19002,PA,Maple Glen,40.166318,-75.207234 +19003,PA,Ardmore,40.001971,-75.29665 +19004,PA,Bala Cynwyd,40.01179,-75.23421 +19006,PA,Huntingdon Valle,40.129686,-75.058979 +19007,PA,Tullytown,40.109174,-74.860718 +19008,PA,Broomall,39.974666,-75.360214 +19010,PA,Bryn Mawr,40.023618,-75.329487 +19012,PA,Cheltenham,40.060327,-75.104774 +19013,PA,Chester,39.849817,-75.374687 +19014,PA,Aston,39.864282,-75.43321 +19015,PA,Brookhaven,39.865355,-75.388483 +19018,PA,Primos Secane,39.923579,-75.299592 +19020,PA,Bensalem,40.110881,-74.937753 +19021,PA,Croydon,40.093322,-74.899077 +19022,PA,Crum Lynne,39.868457,-75.337397 +19023,PA,Collingdale,39.916732,-75.266226 +19025,PA,Dresher,40.143141,-75.162379 +19026,PA,Pilgrim Gardens,39.949197,-75.303479 +19029,PA,Lester,39.866864,-75.293521 +19030,PA,Fairless Hills,40.174822,-74.851923 +19031,PA,Flourtown,40.106774,-75.21148 +19032,PA,Folcroft,39.890508,-75.282117 +19033,PA,Folsom,39.890129,-75.329567 +19034,PA,Fort Washington,40.138592,-75.202175 +19035,PA,Gladwyne,40.045118,-75.282082 +19036,PA,Glenolden,39.904848,-75.294559 +19038,PA,Glenside,40.10959,-75.154964 +19040,PA,Hatboro,40.178547,-75.107182 +19041,PA,Haverford,40.009739,-75.312116 +19043,PA,Holmes,39.900284,-75.308674 +19044,PA,Horsham,40.182057,-75.147932 +19046,PA,Meadowbrook,40.100477,-75.117273 +19047,PA,Penndel,40.175055,-74.915101 +19050,PA,Yeadon,39.93779,-75.264872 +19053,PA,Feasterville Tre,40.151188,-74.983758 +19054,PA,Levittown,40.168142,-74.823138 +19055,PA,Levittown,40.148329,-74.83714 +19056,PA,Levittown,40.151861,-74.882632 +19057,PA,Levittown,40.143359,-74.861366 +19061,PA,Boothwyn,39.833934,-75.448309 +19063,PA,Glen Riddle Lima,39.915562,-75.407226 +19064,PA,Springfield,39.929599,-75.333786 +19066,PA,Merion Station,40.003043,-75.250302 +19067,PA,Yardley,40.212064,-74.822153 +19070,PA,Morton,39.906292,-75.323785 +19072,PA,Narberth,40.01768,-75.2594 +19073,PA,Newtown Square,39.986292,-75.406997 +19074,PA,Norwood,39.887026,-75.297247 +19075,PA,Oreland,40.113197,-75.18685 +19076,PA,Prospect Park,39.885737,-75.308165 +19078,PA,Ridley Park,39.878411,-75.321517 +19079,PA,Sharon Hill,39.903511,-75.269524 +19081,PA,Swarthmore,39.896724,-75.347428 +19082,PA,Upper Darby,39.95785,-75.268128 +19083,PA,Havertown,39.97736,-75.310613 +19085,PA,Villanova,40.039875,-75.345866 +19086,PA,Wallingford,39.887054,-75.372131 +19087,PA,Radnor,40.059554,-75.40416 +19090,PA,Willow Grove Nas,40.146725,-75.121297 +19094,PA,Woodlyn,39.875993,-75.346309 +19095,PA,Wyncote,40.086673,-75.152417 +19096,PA,Wynnewood,40,-75.275984 +19102,PA,Philadelphia,39.948908,-75.166109 +19103,PA,Philadelphia,39.951285,-75.174136 +19104,PA,Philadelphia,39.959732,-75.202445 +19106,PA,Philadelphia,39.94742,-75.147271 +19107,PA,Philadelphia,39.94867,-75.159339 +19111,PA,Philadelphia,40.059635,-75.081792 +19112,PA,Philadelphia,39.889252,-75.178207 +19113,PA,Philadelphia,39.864998,-75.275196 +19114,PA,Philadelphia,40.063356,-74.999032 +19115,PA,Philadelphia,40.090286,-75.041036 +19116,PA,Philadelphia,40.116599,-75.019803 +19117,PA,Elkins Park,40.075798,-75.127669 +19118,PA,Philadelphia,40.081247,-75.2006 +19119,PA,Philadelphia,40.054681,-75.186564 +19120,PA,Philadelphia,40.034254,-75.121256 +19121,PA,Philadelphia,39.981085,-75.174005 +19122,PA,Philadelphia,39.978014,-75.145882 +19123,PA,Philadelphia,39.965975,-75.150968 +19124,PA,Philadelphia,40.017798,-75.089526 +19125,PA,Philadelphia,39.978751,-75.126156 +19126,PA,Philadelphia,40.056839,-75.137854 +19127,PA,Philadelphia,40.027512,-75.224167 +19128,PA,Philadelphia,40.040247,-75.223084 +19129,PA,Philadelphia,40.011816,-75.186149 +19130,PA,Philadelphia,39.967677,-75.173467 +19131,PA,Philadelphia,39.98447,-75.228226 +19132,PA,Philadelphia,39.995393,-75.16982 +19133,PA,Philadelphia,39.992467,-75.141505 +19134,PA,Philadelphia,39.99252,-75.113284 +19135,PA,Philadelphia,40.024694,-75.051827 +19136,PA,Philadelphia,40.042159,-75.024388 +19137,PA,Philadelphia,40.000849,-75.072654 +19138,PA,Philadelphia,40.05683,-75.156898 +19139,PA,Philadelphia,39.961166,-75.230301 +19140,PA,Philadelphia,40.011771,-75.145626 +19141,PA,Philadelphia,40.036473,-75.145109 +19142,PA,Philadelphia,39.922332,-75.233796 +19143,PA,Philadelphia,39.944815,-75.228819 +19144,PA,Philadelphia,40.033773,-75.173099 +19145,PA,Philadelphia,39.922724,-75.181194 +19146,PA,Philadelphia,39.937949,-75.179364 +19147,PA,Philadelphia,39.936175,-75.156324 +19148,PA,Philadelphia,39.92068,-75.159538 +19149,PA,Philadelphia,40.036915,-75.066374 +19150,PA,Philadelphia,40.07262,-75.170621 +19151,PA,Philadelphia,39.977199,-75.254492 +19152,PA,Philadelphia,40.060571,-75.047079 +19153,PA,Philadelphia,39.905512,-75.244431 +19154,PA,Philadelphia,40.089738,-74.978052 +19301,PA,Paoli,40.04259,-75.482702 +19310,PA,Atglen,39.945782,-75.970343 +19311,PA,Avondale,39.821904,-75.768694 +19312,PA,Berwyn,40.041184,-75.447457 +19317,PA,Chadds Ford,39.864769,-75.588515 +19319,PA,Cheyney,39.917496,-75.548738 +19320,PA,Coatesville,39.984313,-75.825299 +19330,PA,Cochranville,39.875686,-75.921381 +19333,PA,Devon,40.045181,-75.422691 +19335,PA,Downingtown,40.016078,-75.718261 +19341,PA,Exton,40.046817,-75.643196 +19342,PA,Glen Mills,39.901515,-75.504872 +19343,PA,Glenmoore,40.084602,-75.771103 +19344,PA,Honey Brook,40.083227,-75.88432 +19346,PA,Kelton,39.795501,-75.875827 +19348,PA,Kennett Square,39.855033,-75.70002 +19350,PA,Landenberg,39.769558,-75.780707 +19352,PA,Lincoln Universi,39.780905,-75.881784 +19355,PA,Frazer,40.037123,-75.533021 +19362,PA,Nottingham,39.74411,-76.035551 +19363,PA,Oxford,39.782704,-75.981522 +19365,PA,Parkesburg,39.965388,-75.926041 +19372,PA,Thorndale,40.000127,-75.762859 +19373,PA,Thornton,39.904127,-75.531344 +19374,PA,Toughkenamon,39.825117,-75.782533 +19380,PA,West Chester,39.984458,-75.596231 +19382,PA,West Chester,39.944081,-75.588197 +19390,PA,West Grove,39.825314,-75.837374 +19401,PA,Norristown,40.124464,-75.330446 +19403,PA,Eagleville,40.14335,-75.384672 +19405,PA,Bridgeport,40.103042,-75.340234 +19406,PA,King Of Prussia,40.095581,-75.373706 +19422,PA,Penllyn,40.15939,-75.279656 +19425,PA,Chester Springs,40.097781,-75.639769 +19426,PA,Collegeville,40.189277,-75.448762 +19428,PA,West Conshohocke,40.079848,-75.301332 +19435,PA,Frederick,40.299924,-75.531975 +19436,PA,Gwynedd,40.202089,-75.250746 +19438,PA,Harleysville,40.265922,-75.388335 +19440,PA,Hatfield,40.277826,-75.297507 +19444,PA,Lafayette Hill,40.089597,-75.260052 +19446,PA,Lansdale,40.237776,-75.295512 +19453,PA,Mont Clare,40.13642,-75.499931 +19454,PA,North Wales,40.216593,-75.256483 +19460,PA,Phoenixville,40.126704,-75.527192 +19462,PA,Plymouth Meeting,40.107735,-75.279559 +19464,PA,Sanatoga,40.242989,-75.639256 +19468,PA,Limerick,40.19286,-75.530548 +19473,PA,Schwenksville,40.247087,-75.460155 +19475,PA,Spring City,40.176477,-75.56969 +19477,PA,Spring House,40.186954,-75.237501 +19492,PA,Zieglersville,40.281673,-75.485462 +19501,PA,Adamstown,40.242992,-76.056542 +19503,PA,Bally,40.400557,-75.587483 +19504,PA,Barto,40.381501,-75.574889 +19505,PA,Bechtelsville,40.379454,-75.625701 +19506,PA,Bernville,40.455061,-76.124732 +19507,PA,Bethel,40.480834,-76.274209 +19508,PA,Birdsboro,40.256304,-75.834373 +19510,PA,Blandon,40.443492,-75.883681 +19512,PA,Boyertown,40.333905,-75.660368 +19518,PA,Douglassville,40.270876,-75.739673 +19520,PA,Elverson,40.156781,-75.786563 +19522,PA,Evansville,40.446766,-75.8144 +19525,PA,Gilbertsville,40.305941,-75.595296 +19526,PA,Hamburg,40.548799,-75.987361 +19529,PA,Kempton,40.632794,-75.85127 +19530,PA,Kutztown,40.521354,-75.777395 +19533,PA,Leesport,40.415216,-75.994421 +19534,PA,Lenhartsville,40.575284,-75.850002 +19539,PA,Mertztown,40.499183,-75.687202 +19540,PA,Mohnton,40.258442,-75.98332 +19541,PA,Mohrsville,40.478307,-76.012491 +19543,PA,Morgantown,40.155248,-75.899802 +19547,PA,Oley,40.383312,-75.770575 +19549,PA,Port Clinton,40.581787,-76.026652 +19551,PA,Robesonia,40.355281,-76.13659 +19555,PA,Shoemakersville,40.495495,-75.960313 +19560,PA,Temple,40.402504,-75.904582 +19562,PA,Topton,40.502941,-75.701528 +19565,PA,Wernersville,40.329289,-76.09014 +19567,PA,Womelsdorf,40.374333,-76.198511 +19601,PA,Reading,40.346621,-75.935132 +19602,PA,Reading,40.330604,-75.919229 +19604,PA,Reading,40.350721,-75.914262 +19605,PA,Reading,40.38859,-75.932769 +19606,PA,Mount Penn,40.325109,-75.868178 +19607,PA,Shillington,40.299696,-75.953103 +19608,PA,Sinking Spring,40.31449,-76.024086 +19609,PA,West Lawn,40.325778,-75.995347 +19610,PA,Wyomissing,40.333478,-75.976382 +19611,PA,Reading,40.324989,-75.944188 +2804,RI,Ashaway,41.423054,-71.783745 +2806,RI,Barrington,41.744334,-71.317497 +2807,RI,Block Island,41.171546,-71.574825 +2808,RI,Bradford,41.411448,-71.746453 +2809,RI,Bristol,41.68247,-71.267558 +2812,RI,Richmond,41.46941,-71.650279 +2813,RI,Charlestown,41.400749,-71.661455 +2814,RI,Chepachet,41.91549,-71.679483 +2815,RI,Clayville,41.777762,-71.670589 +2816,RI,Coventry,41.69143,-71.576794 +2817,RI,West Greenwich,41.639977,-71.643549 +2818,RI,East Greenwich,41.649777,-71.474009 +2821,RI,2821,41.626721,-71.780767 +2822,RI,Exeter,41.574031,-71.607626 +2825,RI,Foster,41.781455,-71.718748 +2827,RI,Greene,41.706151,-71.735607 +2828,RI,Greenville,41.873409,-71.556923 +2830,RI,Harrisville,41.976379,-71.653405 +2831,RI,Hope,41.751603,-71.561225 +2832,RI,Richmond,41.506974,-71.734862 +2835,RI,Jamestown,41.516405,-71.376108 +2836,RI,Richmond,41.477694,-71.683992 +2837,RI,Little Compton,41.52204,-71.161215 +2838,RI,Manville,41.96888,-71.474113 +2840,RI,Middletown,41.504502,-71.30348 +2852,RI,North Kingstown,41.589426,-71.462494 +2857,RI,North Scituate,41.8439,-71.624187 +2858,RI,Oakland,41.963637,-71.642925 +2859,RI,Pascoag,41.962728,-71.709866 +2860,RI,Pawtucket,41.872873,-71.390713 +2861,RI,Pawtucket,41.881384,-71.356001 +2863,RI,Central Falls,41.888263,-71.394527 +2864,RI,Cumberland,41.948352,-71.415419 +2865,RI,Lincoln,41.908906,-71.434777 +2871,RI,Portsmouth,41.594397,-71.252018 +2872,RI,Prudence Island,41.613606,-71.311827 +2874,RI,Saunderstown,41.510528,-71.442693 +2876,RI,Slatersville,42.001478,-71.5682 +2877,RI,Slocum,41.521237,-71.537169 +2878,RI,Tiverton,41.633839,-71.180823 +2879,RI,Narragansett,41.430195,-71.525138 +2881,RI,Kingston,41.480295,-71.529239 +2882,RI,Narragansett,41.435313,-71.46164 +2883,RI,Peace Dale,41.45157,-71.500057 +2885,RI,Warren,41.725618,-71.270165 +2886,RI,Warwick,41.702601,-71.447591 +2888,RI,Warwick,41.74936,-71.40836 +2889,RI,Warwick,41.714069,-71.390146 +2891,RI,Westerly,41.369128,-71.812643 +2892,RI,Richmond,41.506716,-71.599076 +2893,RI,West Warwick,41.700433,-71.518349 +2894,RI,Wood River Junct,41.453771,-71.709512 +2895,RI,North Smithfield,41.99948,-71.513683 +2898,RI,Richmond,41.523362,-71.683973 +2903,RI,Providence,41.820002,-71.415801 +2904,RI,Centredale,41.860461,-71.438102 +2905,RI,Cranston,41.786568,-71.403146 +2906,RI,Providence,41.835104,-71.397065 +2907,RI,Cranston,41.800842,-71.424039 +2908,RI,Providence,41.838294,-71.437684 +2909,RI,Cranston,41.816777,-71.448165 +2910,RI,Cranston,41.776572,-71.438331 +2911,RI,Centredale,41.853412,-71.474058 +2914,RI,East Providence,41.813777,-71.368785 +2915,RI,Riverside,41.772313,-71.354244 +2916,RI,Rumford,41.842472,-71.355938 +2917,RI,Smithfield,41.896382,-71.520666 +2919,RI,Cranston,41.826431,-71.497646 +2920,RI,Cranston,41.77157,-71.465889 +2921,RI,Cranston,41.761357,-71.506102 +29001,SC,Alcolu,33.768402,-80.178782 +29003,SC,Bamberg,33.277915,-81.017744 +29006,SC,Batesburg,33.938595,-81.548988 +29009,SC,Bethune,34.42012,-80.366206 +29010,SC,Bishopville,34.224101,-80.274988 +29014,SC,Blackstock,34.577876,-81.124857 +29015,SC,Blair,34.496668,-81.345945 +29016,SC,Blythewood,34.191112,-80.975756 +29018,SC,Bowman,33.347466,-80.670868 +29020,SC,Camden,34.269636,-80.590997 +29030,SC,Cameron,33.557789,-80.646605 +29031,SC,Carlisle,34.614332,-81.509105 +29032,SC,Cassatt,34.342414,-80.499993 +29033,SC,Cayce,33.962567,-81.067084 +29036,SC,Chapin,34.131158,-81.33182 +29037,SC,Chappells,34.235834,-81.835253 +29038,SC,Cope,33.372555,-80.963111 +29039,SC,Cordova,33.42753,-80.885719 +29040,SC,Dalzell,34.014412,-80.466533 +29042,SC,Denmark,33.320925,-81.14072 +29044,SC,Eastover,33.915274,-80.699647 +29045,SC,Elgin,34.161963,-80.811292 +29046,SC,Elliott,34.117149,-80.175441 +29047,SC,Elloree,33.490608,-80.56784 +29048,SC,Eutawville,33.392189,-80.319983 +29051,SC,Gable,33.840989,-80.081377 +29052,SC,Gadsden,33.845461,-80.753199 +29053,SC,Gaston,33.833712,-81.117395 +29054,SC,Gilbert,33.95805,-81.39136 +29055,SC,Great Falls,34.57053,-80.913263 +29056,SC,Greeleyville,33.59664,-79.98022 +29058,SC,Heath Springs,34.602422,-80.71031 +29059,SC,Holly Hill,33.327586,-80.402393 +29061,SC,Hopkins,33.934868,-80.844906 +29063,SC,Irmo,34.110254,-81.196553 +29065,SC,Jenkinsville,34.271693,-81.271153 +29067,SC,Kershaw,34.557809,-80.554633 +29069,SC,Lamar,34.189044,-80.030134 +29070,SC,Leesville,33.913169,-81.459753 +29072,SC,Lexington,33.972383,-81.23586 +29073,SC,Lexington,33.863206,-81.235102 +29075,SC,Little Mountain,34.167569,-81.418375 +29077,SC,Lone Star,33.673574,-80.645025 +29078,SC,Lugoff,34.22961,-80.714712 +29080,SC,Lynchburg,34.052603,-80.098821 +29081,SC,Ehrhardt,33.104436,-81.022137 +29082,SC,Lodge,32.982263,-80.934641 +29101,SC,Mc Bee,34.46056,-80.254434 +29102,SC,Paxville,33.667716,-80.222078 +29104,SC,Saint Charles,34.046463,-80.234927 +29105,SC,Monetta,33.774729,-81.536299 +29107,SC,Neeses,33.534282,-81.083433 +29108,SC,Newberry,34.284661,-81.615741 +29111,SC,New Zion,33.795736,-80.014753 +29112,SC,North,33.621121,-81.060096 +29113,SC,Norway,33.453402,-81.109744 +29114,SC,Olanta,33.928545,-79.915349 +29115,SC,Orangeburg,33.502545,-80.859282 +29123,SC,Pelion,33.776628,-81.250161 +29125,SC,Pinewood,33.764216,-80.497761 +29126,SC,Pomaria,34.306281,-81.449973 +29127,SC,Prosperity,34.183243,-81.532353 +29128,SC,Rembert,34.108467,-80.494544 +29129,SC,Ridge Spring,33.871403,-81.655949 +29130,SC,Ridgeway,34.316651,-80.928813 +29131,SC,Rimini,33.672155,-80.472671 +29133,SC,Rowesville,33.370257,-80.833115 +29135,SC,Fort Motte,33.694212,-80.856286 +29137,SC,Salley,33.597233,-81.318418 +29138,SC,Saluda,34.017451,-81.775398 +29142,SC,Santee,33.483533,-80.480498 +29145,SC,Silverstreet,34.235553,-81.703684 +29146,SC,Springfield,33.534265,-81.249858 +29148,SC,Summerton,33.594578,-80.360566 +29150,SC,Oswego,33.928199,-80.321008 +29152,SC,Shaw A F B,33.980262,-80.481093 +29154,SC,Sumter,33.882067,-80.402761 +29160,SC,Swansea,33.733917,-81.093309 +29161,SC,Timmonsville,34.101241,-79.937845 +29162,SC,Turbeville,33.87857,-79.985174 +29163,SC,Vance,33.413882,-80.461716 +29164,SC,Wagener,33.649417,-81.39952 +29166,SC,Ward,33.884856,-81.728341 +29168,SC,Wedgefield,33.943002,-80.498719 +29169,SC,West Columbia,33.995024,-81.088836 +29170,SC,West Columbia,33.956751,-81.140474 +29172,SC,West Columbia,33.900022,-81.091008 +29175,SC,Westville,34.449177,-80.579554 +29178,SC,Whitmire,34.495485,-81.605981 +29180,SC,Winnsboro,34.381008,-81.10899 +29201,SC,Columbia,34.0004,-81.033418 +29203,SC,Columbia,34.063452,-81.026462 +29204,SC,Columbia,34.026037,-81.004647 +29205,SC,Columbia,33.990309,-80.999731 +29206,SC,Columbia,34.024655,-80.953152 +29209,SC,Columbia,33.965863,-80.935525 +29210,SC,Columbia,34.047863,-81.11006 +29212,SC,Columbia,34.072613,-81.179617 +29223,SC,Columbia,34.085267,-80.91667 +29301,SC,Spartanburg,34.935211,-81.965377 +29302,SC,Spartanburg,34.956283,-81.873625 +29303,SC,Valley Falls,34.993728,-81.957566 +29321,SC,Buffalo,34.724703,-81.682576 +29322,SC,Campobello,35.108003,-82.140343 +29323,SC,Chesnee,35.115398,-81.867827 +29325,SC,Clinton,34.470692,-81.87717 +29330,SC,Cowpens,35.038979,-81.822019 +29332,SC,Cross Hill,34.269274,-81.984278 +29334,SC,Duncan,34.917645,-82.125821 +29335,SC,Enoree,34.670952,-81.92373 +29340,SC,Gaffney,35.061508,-81.649061 +29349,SC,Inman,35.052795,-82.054013 +29351,SC,Joanna,34.406795,-81.81907 +29353,SC,Kelton,34.837368,-81.684218 +29355,SC,Kinards,34.355219,-81.71975 +29356,SC,Landrum,35.156486,-82.211473 +29360,SC,Ora,34.500714,-82.026774 +29365,SC,Lyman,34.968443,-82.143479 +29369,SC,Moore,34.883453,-82.017893 +29370,SC,Mountville,34.340791,-81.958429 +29372,SC,Pacolet,34.901708,-81.758703 +29374,SC,Glenn Springs,34.774808,-81.857853 +29376,SC,Roebuck,34.8688,-81.95255 +29379,SC,Union,34.726855,-81.620235 +29384,SC,Waterloo,34.33673,-82.087968 +29385,SC,Wellford,34.951394,-82.092706 +29388,SC,Woodruff,34.757864,-82.044658 +29401,SC,Charleston,32.779506,-79.937069 +29403,SC,Charleston,32.797575,-79.949283 +29404,SC,Charleston,32.895816,-80.067687 +29405,SC,Charleston,32.851206,-79.976442 +29406,SC,North Charleston,32.903035,-80.001053 +29407,SC,Charleston,32.799322,-80.005953 +29412,SC,Charleston,32.732319,-79.954727 +29414,SC,Charleston,32.821538,-80.056756 +29418,SC,Charleston,32.907135,-80.055126 +29420,SC,Charleston,32.933096,-80.086463 +29426,SC,Jericho,32.749318,-80.368197 +29429,SC,Awendaw,32.951475,-79.686075 +29431,SC,Bonneau,33.297332,-79.92164 +29432,SC,Branchville,33.262802,-80.805931 +29434,SC,Cordesville,33.162127,-79.920492 +29435,SC,Cottageville,32.961171,-80.479414 +29436,SC,Cross,33.336373,-80.185901 +29437,SC,Dorchester,33.124688,-80.403398 +29438,SC,Edisto Island,32.548572,-80.30701 +29440,SC,Georgetown,33.430776,-79.323459 +29445,SC,Mount Holly,32.988699,-80.019948 +29446,SC,Green Pond,32.662827,-80.528035 +29448,SC,Harleyville,33.220511,-80.450094 +29449,SC,Meggett,32.722306,-80.259566 +29450,SC,Huger,33.018436,-79.807254 +29451,SC,Isle Of Palms,32.794252,-79.772949 +29453,SC,Shulerville,33.228797,-79.715551 +29455,SC,Johns Island,32.709697,-80.094294 +29456,SC,Ladson,32.993019,-80.125701 +29458,SC,Mc Clellanville,33.10472,-79.479982 +29461,SC,Oakley,33.163071,-80.036576 +29464,SC,Mount Pleasant,32.816211,-79.852031 +29468,SC,Pineville,33.419926,-80.093181 +29469,SC,Pinopolis,33.224125,-80.039761 +29470,SC,Ravenel,32.788088,-80.222346 +29471,SC,Reevesville,33.187213,-80.66725 +29472,SC,Ridgeville,33.108017,-80.308611 +29474,SC,Round O,32.940516,-80.573882 +29475,SC,Ruffin,33.010319,-80.813653 +29477,SC,Saint George,33.184532,-80.573246 +29479,SC,Alvin,33.405953,-79.937635 +29481,SC,Smoaks,33.096319,-80.813021 +29482,SC,Sullivans Island,32.763652,-79.839905 +29483,SC,Summerville,33.028045,-80.173852 +29485,SC,Summerville,32.975556,-80.183082 +29487,SC,Wadmalaw Island,32.652854,-80.182867 +29488,SC,Ritter,32.897367,-80.679225 +29492,SC,Wando,32.962223,-79.86533 +29501,SC,Florence,34.18375,-79.772786 +29505,SC,Florence,34.256368,-79.775983 +29506,SC,Quinby,34.245178,-79.794547 +29510,SC,Andrews,33.452525,-79.560438 +29511,SC,Aynor,33.982271,-79.17773 +29512,SC,Bennettsville,34.625501,-79.689826 +29516,SC,Blenheim,34.502033,-79.659422 +29518,SC,Cades,33.812017,-79.817567 +29520,SC,Cheraw,34.686275,-79.917414 +29525,SC,Clio,34.58052,-79.545255 +29526,SC,Conway,33.873066,-79.055712 +29527,SC,Bucksport,33.77922,-79.050836 +29530,SC,Coward,33.990514,-79.751523 +29532,SC,Darlington,34.300294,-79.873221 +29536,SC,Dillon,34.414553,-79.377015 +29541,SC,Effingham,34.094571,-79.791822 +29543,SC,Fork,34.28733,-79.250063 +29544,SC,Galivants Ferry,34.123801,-79.105915 +29545,SC,Green Sea,34.205105,-79.051613 +29546,SC,Gresham,33.906941,-79.356426 +29547,SC,South Of The Bor,34.484556,-79.377871 +29550,SC,Hartsville,34.375616,-80.084237 +29554,SC,Hemingway,33.741887,-79.448895 +29555,SC,Johnsonville,33.829873,-79.478256 +29556,SC,Kingstree,33.687841,-79.783221 +29560,SC,Lake City,33.865473,-79.741794 +29563,SC,Lake View,34.34449,-79.192869 +29564,SC,Lane,33.50827,-79.871545 +29565,SC,Latta,34.339829,-79.441704 +29566,SC,Little River,33.876806,-78.650829 +29567,SC,Little Rock,34.404803,-79.326948 +29568,SC,Longs,33.906408,-78.793359 +29569,SC,Loris,34.055756,-78.916096 +29570,SC,Mc Coll,34.670406,-79.559741 +29571,SC,Marion,34.156195,-79.389822 +29572,SC,Myrtle Beach,33.758701,-78.804448 +29574,SC,Mullins,34.204441,-79.254155 +29575,SC,Surfside Beach,33.625245,-78.995228 +29576,SC,Murrells Inlet,33.550717,-79.05275 +29577,SC,Myrtle Beach,33.699363,-78.913697 +29580,SC,Nesmith,33.591652,-79.551301 +29581,SC,Nichols,34.242629,-79.162493 +29582,SC,Cherry Grove Bea,33.822801,-78.67792 +29583,SC,Pamplico,33.992166,-79.592917 +29584,SC,Patrick,34.559823,-80.064984 +29585,SC,Pawleys Island,33.450825,-79.134128 +29590,SC,Salters,33.561138,-79.830024 +29591,SC,Scranton,33.92813,-79.773101 +29592,SC,Sellers,34.269522,-79.436948 +29593,SC,Society Hill,34.451161,-79.886494 +29596,SC,Wallace,34.730704,-79.801142 +29601,SC,Greenville,34.847165,-82.406049 +29605,SC,Greenville,34.800117,-82.393218 +29607,SC,Greenville,34.828507,-82.35155 +29609,SC,Greenville,34.892101,-82.400195 +29611,SC,Greenville,34.85331,-82.449296 +29615,SC,Greenville,34.866095,-82.319815 +29620,SC,Abbeville,34.18186,-82.378452 +29621,SC,Anderson,34.526051,-82.630436 +29624,SC,Anderson,34.474807,-82.677052 +29625,SC,Anderson,34.527134,-82.70868 +29627,SC,Belton,34.508715,-82.510106 +29628,SC,Calhoun Falls,34.099912,-82.580544 +29630,SC,Central,34.74007,-82.794727 +29631,SC,Clemson,34.683061,-82.825003 +29635,SC,Cleveland,35.06537,-82.609256 +29638,SC,Shoals Junction,34.399772,-82.366616 +29639,SC,Due West,34.334425,-82.400164 +29640,SC,Easley,34.829031,-82.579552 +29642,SC,Easley,34.960694,-82.561716 +29643,SC,Fair Play,34.577548,-82.999874 +29644,SC,Fountain Inn,34.653334,-82.264593 +29645,SC,Ora,34.580984,-82.157035 +29646,SC,Greenwood,34.175802,-82.156211 +29649,SC,Greenwood,34.222988,-82.158189 +29650,SC,Greer,34.8968,-82.267442 +29651,SC,Greer,34.94532,-82.220857 +29653,SC,Hodges,34.288167,-82.214225 +29654,SC,Honea Path,34.441723,-82.425471 +29655,SC,Iva,34.319847,-82.657437 +29657,SC,Liberty,34.787189,-82.697429 +29658,SC,Long Creek,34.754954,-83.184728 +29659,SC,Lowndesville,34.26624,-82.571021 +29661,SC,Marietta,35.029644,-82.513622 +29662,SC,Mauldin,34.780675,-82.303507 +29664,SC,Mountain Rest,34.854119,-83.113402 +29666,SC,Ninety Six,34.165198,-82.029185 +29667,SC,Cateechee,34.765472,-82.755492 +29669,SC,Pelzer,34.646063,-82.467334 +29670,SC,Pendleton,34.63694,-82.740623 +29671,SC,Pickens,34.902403,-82.705784 +29673,SC,Piedmont,34.724433,-82.470216 +29676,SC,Salem,34.872836,-82.960687 +29678,SC,Seneca,34.682797,-82.936162 +29681,SC,Simpsonville,34.751228,-82.255009 +29682,SC,Six Mile,34.828287,-82.827795 +29684,SC,Starr,34.396196,-82.68971 +29685,SC,Sunset,34.970617,-82.807639 +29686,SC,Tamassee,34.898229,-82.986138 +29687,SC,Taylors,34.924517,-82.31968 +29688,SC,Tigerville,35.094443,-82.358236 +29689,SC,Townville,34.522638,-82.89633 +29690,SC,Travelers Rest,35.003929,-82.427179 +29691,SC,Walhalla,34.768902,-83.038778 +29692,SC,Ware Shoals,34.402491,-82.26779 +29693,SC,Madison,34.658857,-83.110782 +29696,SC,West Union,34.751572,-83.039887 +29697,SC,Williamston,34.620572,-82.511006 +29702,SC,Cherokee Falls,35.115047,-81.508004 +29704,SC,Catawba,34.850712,-80.934154 +29706,SC,Chester,34.714897,-81.21856 +29709,SC,Chesterfield,34.727834,-80.09577 +29710,SC,Lake Wylie,35.110728,-81.186358 +29712,SC,Edgemoor,34.797006,-80.989095 +29714,SC,Fort Lawn,34.70064,-80.909175 +29715,SC,Tega Cay,35.026001,-80.958559 +29717,SC,Hickory Grove,34.970833,-81.430599 +29718,SC,Jefferson,34.654581,-80.363934 +29720,SC,Lancaster,34.749006,-80.761576 +29726,SC,Mc Connells,34.867667,-81.236803 +29727,SC,Mount Croghan,34.743895,-80.242791 +29728,SC,Pageland,34.772193,-80.396615 +29729,SC,Richburg,34.682185,-80.989061 +29730,SC,Rock Hill,34.915068,-81.012904 +29732,SC,Rock Hill,34.968066,-81.048881 +29741,SC,Ruby,34.737928,-80.190966 +29742,SC,Sharon,34.908396,-81.372907 +29743,SC,Smyrna,35.030784,-81.389606 +29745,SC,York,34.994669,-81.224462 +29801,SC,Aiken,33.553024,-81.719429 +29803,SC,Aiken,33.531868,-81.594702 +29809,SC,New Ellenton,33.417242,-81.687376 +29810,SC,Allendale,33.007676,-81.320254 +29812,SC,Barnwell,33.233492,-81.35231 +29817,SC,Blackville,33.364476,-81.271844 +29819,SC,Bradley,34.032587,-82.202723 +29821,SC,Clarks Hill,33.65052,-82.14875 +29824,SC,Edgefield,33.805553,-81.96602 +29827,SC,Fairfax,32.951455,-81.25864 +29829,SC,Graniteville,33.563016,-81.814686 +29831,SC,Jackson,33.338886,-81.797628 +29832,SC,Johnston,33.823075,-81.797242 +29835,SC,Mc Cormick,33.914646,-82.271862 +29836,SC,Martin,33.109286,-81.500304 +29838,SC,Modoc,33.724894,-82.203469 +29840,SC,Mount Carmel,33.970323,-82.43607 +29841,SC,Beech Island,33.517766,-81.934794 +29843,SC,Olar,33.18364,-81.164042 +29845,SC,Plum Branch,33.832893,-82.248041 +29847,SC,Trenton,33.693757,-81.853392 +29848,SC,Troy,33.955654,-82.294077 +29849,SC,Ulmer,33.057597,-81.221292 +29851,SC,Warrenville,33.519917,-81.829397 +29853,SC,Williston,33.392608,-81.416146 +29856,SC,Windsor,33.467446,-81.513626 +29902,SC,Burton,32.418035,-80.709026 +29910,SC,Bluffton,32.251275,-80.872079 +29911,SC,Brunson,32.941297,-81.180719 +29916,SC,Early Branch,32.628893,-81.030011 +29918,SC,Estill,32.737514,-81.217768 +29920,SC,St Helena Island,32.380213,-80.533863 +29922,SC,Garnett,32.600666,-81.239629 +29924,SC,Hampton,32.87288,-81.097333 +29926,SC,Hilton Head Isla,32.229426,-80.728088 +29927,SC,Hardeeville,32.263512,-81.066865 +29928,SC,Hilton Head Isla,32.158718,-80.756577 +29929,SC,Islandton,32.950324,-80.891589 +29932,SC,Luray,32.86177,-81.223506 +29934,SC,Pineland,32.602065,-81.176116 +29935,SC,Port Royal,32.384205,-80.69278 +29936,SC,Coosawatchie,32.491938,-80.949435 +29940,SC,Seabrook,32.526884,-80.740793 +29943,SC,Tillman,32.492719,-81.077567 +29944,SC,Varnville,32.834893,-81.028839 +29945,SC,Yemassee,32.642983,-80.812932 +57001,SD,Alcester,43.004726,-96.633243 +57002,SD,Aurora,44.283786,-96.704268 +57003,SD,Baltic,43.730908,-96.756272 +57004,SD,Beresford,43.087409,-96.781256 +57005,SD,Corson,43.596413,-96.578201 +57006,SD,Brookings,44.305619,-96.791408 +57010,SD,Burbank,42.763798,-96.846569 +57012,SD,Canistota,43.585639,-97.288901 +57013,SD,Canton,43.303819,-96.593796 +57014,SD,Centerville,43.117635,-96.963637 +57015,SD,Chancellor,43.407962,-96.982695 +57016,SD,Chester,43.898077,-96.975883 +57017,SD,Colman,43.955761,-96.818882 +57018,SD,Colton,43.795102,-96.957202 +57020,SD,Crooks,43.64509,-96.818259 +57021,SD,Davis,43.286365,-96.979206 +57022,SD,Dell Rapids,43.822759,-96.722315 +57024,SD,Egan,43.986592,-96.649252 +57025,SD,Elk Point,42.738219,-96.686954 +57026,SD,Elkton,44.234984,-96.501095 +57027,SD,Fairview,43.208965,-96.574261 +57028,SD,Flandreau,44.06578,-96.622184 +57029,SD,Freeman,43.360501,-97.460073 +57030,SD,Garretson,43.71617,-96.519626 +57031,SD,Gayville,42.883516,-97.18295 +57032,SD,Harrisburg,43.446021,-96.686389 +57033,SD,Hartford,43.615472,-96.950052 +57034,SD,Hudson,43.128357,-96.53063 +57035,SD,Humboldt,43.612026,-97.06971 +57036,SD,Hurley,43.289256,-97.190364 +57037,SD,Irene,43.102683,-97.255797 +57038,SD,Jefferson,42.601341,-96.578392 +57039,SD,Lennox,43.345066,-96.882061 +57040,SD,Lesterville,43.054976,-97.548282 +57042,SD,Madison,44.005434,-97.11486 +57043,SD,Marion,43.41878,-97.277066 +57044,SD,Meckling,42.848994,-97.092249 +57045,SD,Menno,43.233968,-97.564986 +57046,SD,Mission Hill,42.983611,-97.334877 +57047,SD,Monroe,43.477883,-97.218167 +57048,SD,Montrose,43.706262,-97.188493 +57049,SD,Dakota Dunes,42.532706,-96.50761 +57050,SD,Nunda,44.152459,-96.994209 +57051,SD,Oldham,44.245722,-97.269575 +57052,SD,Olivet,43.292811,-97.718355 +57053,SD,Parker,43.40204,-97.133298 +57054,SD,Ramona,44.122887,-97.234889 +57055,SD,Renner,43.636625,-96.711925 +57057,SD,Rutland,44.068282,-96.951856 +57058,SD,Salem,43.735583,-97.379695 +57059,SD,Scotland,43.121208,-97.729596 +57060,SD,Sherman,43.798677,-96.544396 +57061,SD,Sinai,44.239745,-97.054332 +57062,SD,Springfield,42.868694,-97.928825 +57063,SD,Tabor,42.938262,-97.692282 +57064,SD,Tea,43.471114,-96.817734 +57065,SD,Trent,43.894159,-96.632574 +57066,SD,Tyndall,42.990043,-97.863285 +57067,SD,Utica,42.936629,-97.455095 +57068,SD,Valley Springs,43.577306,-96.495637 +57069,SD,Vermillion,42.795109,-96.925784 +57070,SD,Viborg,43.181497,-97.114048 +57071,SD,Volga,44.322354,-96.925148 +57072,SD,Volin,42.969617,-97.228231 +57073,SD,Wakonda,42.996001,-97.069374 +57074,SD,Ward,44.155883,-96.481325 +57075,SD,Wentworth,43.985242,-96.961456 +57076,SD,Winfred,43.959511,-97.309266 +57077,SD,Worthing,43.292531,-96.752935 +57078,SD,Yankton,42.882086,-97.398624 +57102,SD,Sioux Falls,43.546131,-96.726927 +57103,SD,Sioux Falls,43.537386,-96.686415 +57104,SD,Sioux Falls,43.551355,-96.737535 +57105,SD,Sioux Falls,43.523972,-96.734141 +57106,SD,Sioux Falls,43.517912,-96.792376 +57107,SD,Sioux Falls,43.556628,-96.802811 +57115,SD,Buffalo Ridge,43.516936,-96.834165 +57116,SD,Sioux Falls,43.508535,-96.766199 +57201,SD,Watertown,44.904295,-97.123977 +57202,SD,Waverly,45.003209,-96.946744 +57212,SD,Arlington,44.366769,-97.068734 +57213,SD,Astoria,44.573515,-96.541634 +57214,SD,Badger,44.491802,-97.218368 +57216,SD,Big Stone City,45.28504,-96.561434 +57217,SD,Bradley,45.075099,-97.638712 +57218,SD,Brandt,44.67383,-96.643545 +57219,SD,Butler,45.308982,-97.746573 +57220,SD,Bruce,44.467453,-96.910984 +57221,SD,Bryant,44.598671,-97.453659 +57223,SD,Castlewood,44.731339,-97.020432 +57224,SD,Claire City,45.875522,-97.107274 +57225,SD,Clark,44.878,-97.726536 +57226,SD,Altamont,44.763703,-96.700541 +57227,SD,Corona,45.359483,-96.664897 +57230,SD,57230,44.669557,-96.93657 +57231,SD,De Smet,44.385169,-97.563432 +57232,SD,Eden,45.621074,-97.374091 +57233,SD,Erwin,44.491484,-97.410291 +57234,SD,Dempster,44.576998,-96.923678 +57235,SD,Florence,45.055388,-97.286643 +57236,SD,Garden City,44.947413,-97.568025 +57237,SD,Gary,44.827022,-96.504362 +57238,SD,Bemis,44.886232,-96.811368 +57239,SD,Grenville,45.489673,-97.415457 +57241,SD,Hayti,44.664737,-97.230509 +57242,SD,Hazel,44.75717,-97.30829 +57243,SD,Henry,44.88576,-97.444216 +57244,SD,Hetland,44.367519,-97.141024 +57245,SD,Kranzburg,44.879264,-96.947013 +57246,SD,Labolt,45.041458,-96.689209 +57247,SD,Lake City,45.68991,-97.348131 +57248,SD,Lake Norden,44.584351,-97.200867 +57249,SD,Lake Preston,44.367298,-97.356283 +57251,SD,Marvin,45.272651,-96.90996 +57252,SD,Milbank,45.206127,-96.62548 +57255,SD,New Effington,45.865868,-96.914989 +57256,SD,Ortley,45.340633,-97.176985 +57257,SD,Peever,45.520647,-97.001205 +57258,SD,Raymond,44.863651,-97.916781 +57259,SD,Albee,45.022142,-96.562366 +57260,SD,Rosholt,45.875315,-96.71741 +57261,SD,Roslyn,45.500564,-97.540105 +57262,SD,Agency Village,45.664413,-97.02322 +57263,SD,South Shore,45.104919,-96.985885 +57264,SD,Stockholm,45.10309,-96.81059 +57265,SD,Strandburg,45.038872,-96.790129 +57266,SD,Summit,45.352128,-97.042654 +57268,SD,Toronto,44.578622,-96.70774 +57269,SD,Twin Brooks,45.211519,-96.995601 +57270,SD,Veblen,45.853508,-97.312193 +57271,SD,Vienna,44.690019,-97.545559 +57272,SD,Wallace,45.081542,-97.445751 +57273,SD,Waubay,45.37837,-97.294987 +57274,SD,Lily,45.322573,-97.515316 +57276,SD,White,44.413237,-96.614963 +57278,SD,Willow Lake,44.627225,-97.674747 +57279,SD,Wilmot,45.412487,-96.856006 +57301,SD,Loomis,43.710921,-98.027026 +57311,SD,Farmer,43.623847,-97.782087 +57312,SD,Alpena,44.170907,-98.396191 +57313,SD,Armour,43.316045,-98.341372 +57314,SD,Forestburg,44.035362,-97.953958 +57315,SD,Avon,43.039725,-98.028261 +57316,SD,Bancroft,44.494419,-97.776733 +57317,SD,Bonesteel,43.069536,-98.987959 +57319,SD,Dolton,43.554306,-97.49591 +57321,SD,Canova,43.885517,-97.534163 +57322,SD,Carpenter,44.664768,-97.916825 +57323,SD,Carthage,44.1496,-97.711632 +57324,SD,Cavour,44.364951,-98.020797 +57325,SD,Chamberlain,43.795295,-99.311819 +57328,SD,Corsica,43.421319,-98.356358 +57329,SD,Dante,42.996661,-98.174637 +57330,SD,Delmont,43.257261,-98.159612 +57331,SD,Dimock,43.470476,-97.9988 +57332,SD,Emery,43.565647,-97.647489 +57334,SD,Ethan,43.542653,-98.059074 +57335,SD,Fairfax,43.035103,-98.830757 +57336,SD,57336,43.715415,-97.71435 +57337,SD,Fedora,43.984125,-97.789003 +57339,SD,Fort Thompson,44.051695,-99.397305 +57340,SD,Fulton,43.758767,-97.871218 +57341,SD,Gann Valley,44.069303,-99.054334 +57342,SD,Geddes,43.259677,-98.69256 +57344,SD,Harrison,43.454923,-98.523338 +57345,SD,Highmore,44.532604,-99.454349 +57348,SD,Hitchcock,44.583444,-98.450914 +57349,SD,Roswell,44.029296,-97.516012 +57350,SD,Huron,44.359022,-98.216293 +57353,SD,Iroquois,44.345517,-97.854172 +57354,SD,Kaylor,43.202393,-97.820094 +57355,SD,Kimball,43.712881,-98.934305 +57356,SD,Lake Andes,43.130288,-98.496355 +57357,SD,Ravinia,43.136123,-98.426413 +57358,SD,Lane,44.067383,-98.406496 +57359,SD,Letcher,43.892324,-98.174279 +57361,SD,Marty,42.97639,-98.422429 +57362,SD,Miller,44.496644,-98.989395 +57363,SD,Mount Vernon,43.7204,-98.263288 +57364,SD,New Holland,43.431042,-98.628697 +57366,SD,Parkston,43.397796,-97.967824 +57368,SD,Plankinton,43.737287,-98.469395 +57369,SD,Academy,43.40242,-98.889656 +57370,SD,Pukwana,43.778326,-99.177884 +57371,SD,Ree Heights,44.560275,-99.22864 +57373,SD,Saint Lawrence,44.521523,-98.875427 +57374,SD,Spencer,43.755684,-97.59361 +57375,SD,Stickney,43.58422,-98.508843 +57376,SD,Tripp,43.240377,-97.971285 +57379,SD,Virgil,44.325582,-98.392146 +57380,SD,Wagner,43.081931,-98.281876 +57381,SD,Wessington,44.41285,-98.691982 +57382,SD,Wessington Sprin,44.069935,-98.611625 +57383,SD,White Lake,43.756441,-98.707613 +57384,SD,Wolsey,44.399072,-98.474251 +57385,SD,Woonsocket,44.057186,-98.243017 +57386,SD,Yale,44.495591,-97.993249 +57401,SD,Aberdeen,45.466109,-98.485642 +57420,SD,Akaska,45.332447,-100.118614 +57421,SD,Amherst,45.707426,-97.930078 +57422,SD,Andover,45.422171,-97.917497 +57424,SD,Athol,45.012833,-98.442549 +57425,SD,57425,45.022779,-98.630074 +57426,SD,Barnard,45.720469,-98.553379 +57427,SD,Bath,45.456352,-98.355209 +57428,SD,Bowdle,45.432881,-99.635978 +57429,SD,Brentford,45.153063,-98.319281 +57430,SD,Britton,45.802304,-97.741835 +57432,SD,Claremont,45.666149,-98.040367 +57433,SD,Columbia,45.671721,-98.295152 +57434,SD,Verdon,45.155125,-98.034323 +57435,SD,Cresbard,45.169125,-98.941124 +57436,SD,Doland,44.81587,-98.094709 +57437,SD,Artas,45.769768,-99.615926 +57438,SD,Miranda,45.06845,-99.134054 +57440,SD,Frankfort,44.808416,-98.293496 +57441,SD,Frederick,45.849332,-98.517564 +57442,SD,Gettysburg,45.02588,-99.976626 +57445,SD,Groton,45.450345,-98.105814 +57446,SD,Hecla,45.872515,-98.191774 +57448,SD,Hosmer,45.568988,-99.485745 +57449,SD,Houghton,45.796746,-98.095186 +57450,SD,Hoven,45.227799,-99.776286 +57451,SD,Ipswich,45.448905,-99.014807 +57452,SD,Java,45.413541,-99.835153 +57454,SD,Langford,45.617381,-97.792547 +57455,SD,Lebanon,45.012318,-99.736579 +57456,SD,Leola,45.732265,-98.901544 +57457,SD,Longlake,45.796812,-99.250677 +57460,SD,Mansfield,45.226727,-98.606568 +57461,SD,Mellette,45.16312,-98.48237 +57462,SD,Mina,45.439116,-98.756581 +57465,SD,Northville,45.161112,-98.658853 +57466,SD,Onaka,45.196527,-99.455052 +57467,SD,Orient,44.834347,-99.105787 +57468,SD,Pierpont,45.495983,-97.812844 +57469,SD,Redfield,44.871853,-98.511234 +57470,SD,Rockham,44.971579,-98.768683 +57471,SD,Roscoe,45.427119,-99.332631 +57472,SD,Selby,45.478587,-100.054067 +57473,SD,Seneca,45.026191,-99.460986 +57474,SD,Stratford,45.286595,-98.279153 +57475,SD,Tolstoy,45.170199,-99.617553 +57476,SD,Tulare,44.730489,-98.553926 +57477,SD,Turton,45.037938,-98.099641 +57479,SD,Warner,45.348627,-98.475697 +57481,SD,Wetonka,45.625025,-98.585623 +57483,SD,Zell,44.854624,-98.831746 +57501,SD,Pierre,44.369514,-100.321057 +57520,SD,Agar,44.839345,-100.071238 +57521,SD,Belvidere,43.886031,-101.238691 +57522,SD,Blunt,44.502572,-99.946278 +57523,SD,Lucas,43.210602,-99.268963 +57526,SD,Carter,43.368487,-100.172958 +57527,SD,Cedarbutte,43.64731,-101.131585 +57528,SD,Colome,43.227334,-99.693273 +57529,SD,Dallas,43.235075,-99.513994 +57531,SD,Draper,43.926035,-100.508514 +57532,SD,Fort Pierre,44.342587,-100.404323 +57533,SD,Dixon,43.226908,-99.430214 +57534,SD,Hamill,43.643942,-99.691752 +57536,SD,Harrold,44.521476,-99.738166 +57537,SD,Hayes,44.421898,-100.735938 +57538,SD,Herrick,43.101186,-99.217267 +57540,SD,Holabird,44.517327,-99.594299 +57541,SD,Ideal,43.559612,-99.927949 +57542,SD,Iona,43.575756,-99.488073 +57543,SD,Kadoka,43.84457,-101.552272 +57544,SD,Kennebec,43.892139,-99.850191 +57545,SD,Keyapaha,43.073497,-100.163958 +57547,SD,Long Valley,43.569784,-101.382145 +57548,SD,Lower Brule,44.093692,-99.613896 +57551,SD,Vetal,43.178543,-101.740814 +57552,SD,Ottumwa,44.237443,-101.292442 +57553,SD,Milesville,44.428259,-101.752276 +57555,SD,Mission,43.285017,-100.595364 +57557,SD,Mission Ridge,44.623851,-100.894553 +57559,SD,Murdo,43.896115,-100.712107 +57560,SD,Norris,43.466176,-101.151664 +57562,SD,Okaton,43.934157,-100.935054 +57564,SD,Onida,44.712543,-100.095667 +57566,SD,Parmelee,43.311716,-101.008089 +57567,SD,Philip,44.055006,-101.687611 +57568,SD,Presho,43.899538,-100.074645 +57569,SD,Reliance,43.830241,-99.485668 +57571,SD,Saint Charles,43.108893,-99.090969 +57572,SD,Saint Francis,43.191017,-100.88502 +57574,SD,Tuthill,43.119623,-101.470116 +57576,SD,Vivian,43.95352,-100.285989 +57577,SD,Wanblee,43.55893,-101.721856 +57578,SD,Wewela,43.079352,-99.747317 +57579,SD,White River,43.56662,-100.74487 +57580,SD,Clearfield,43.355504,-99.861907 +57584,SD,Witten,43.44982,-100.078291 +57585,SD,Wood,43.536599,-100.437929 +57601,SD,Mobridge,45.540723,-100.431488 +57620,SD,Bison,45.516126,-102.482707 +57622,SD,Cherry Creek,44.621018,-101.65178 +57623,SD,Dupree,45.007851,-101.63368 +57626,SD,Faith,44.992609,-102.054142 +57628,SD,Firesteel,45.430736,-101.223461 +57629,SD,Glad Valley,45.43696,-101.795168 +57630,SD,Glencross,45.450549,-100.894417 +57631,SD,Glenham,45.53351,-100.27156 +57632,SD,Herreid,45.845164,-100.048983 +57633,SD,Isabel,45.064016,-101.273637 +57634,SD,Keldron,45.902221,-101.939465 +57638,SD,Lemmon,45.915892,-102.192772 +57640,SD,Lodgepole,45.823193,-102.759917 +57641,SD,Mc Intosh,45.81244,-101.500393 +57642,SD,Mc Laughlin,45.748884,-100.877596 +57643,SD,Mahto,45.767644,-100.658897 +57644,SD,Meadow,45.353769,-102.284425 +57645,SD,Morristown,45.900642,-101.699838 +57646,SD,Mound City,45.678645,-100.047856 +57647,SD,Parade,45.108068,-100.743399 +57648,SD,Pollock,45.889043,-100.287518 +57649,SD,Prairie City,45.581342,-102.80847 +57650,SD,Ralph,45.855365,-103.035552 +57651,SD,Reva,45.527653,-103.069163 +57653,SD,Shadehill,45.669855,-102.189131 +57656,SD,Timber Lake,45.392737,-101.035077 +57657,SD,Trail City,45.440082,-100.682902 +57658,SD,Wakpala,45.700617,-100.533176 +57660,SD,Watauga,45.927593,-101.512936 +57701,SD,Rockerville,44.077041,-103.200259 +57702,SD,Silver City,44.069796,-103.283406 +57706,SD,Ellsworth Afb,44.144655,-103.07591 +57708,SD,Bethlehem,44.288967,-103.461246 +57714,SD,Allen,43.290818,-101.932858 +57716,SD,Denby,43.078962,-102.173776 +57717,SD,Belle Fourche,44.672281,-103.839601 +57718,SD,Black Hawk,44.151173,-103.348634 +57719,SD,Box Elder,44.119858,-103.068237 +57720,SD,Buffalo,45.574001,-103.582605 +57722,SD,Buffalo Gap,43.495762,-103.315749 +57724,SD,Sky Ranch,45.595289,-103.963232 +57725,SD,Caputa,43.980116,-103.023406 +57729,SD,Creighton,44.283087,-102.177043 +57730,SD,Crazy Horse,43.740886,-103.618465 +57732,SD,Deadwood,44.356628,-103.699939 +57735,SD,Edgemont,43.287361,-103.811018 +57736,SD,Elm Springs,44.239743,-102.631208 +57737,SD,Enning,44.538884,-102.6208 +57738,SD,Fairburn,43.66228,-103.213335 +57741,SD,Fort Meade,44.409097,-103.47233 +57742,SD,Fruitdale,44.660039,-103.689568 +57744,SD,Hermosa,43.818845,-103.20596 +57745,SD,Hill City,43.93768,-103.578158 +57747,SD,Hot Springs,43.422308,-103.476555 +57748,SD,Plainview,44.534952,-102.215763 +57750,SD,Interior,43.731892,-101.964238 +57751,SD,Keystone,43.969604,-103.335235 +57752,SD,Kyle,43.439437,-102.212419 +57754,SD,Spearfish Canyon,44.349012,-103.769841 +57755,SD,Ludlow,45.874655,-103.31115 +57756,SD,Manderson,43.309844,-102.374493 +57757,SD,Marcus,44.674678,-102.330697 +57758,SD,Mud Butte,45.031046,-102.803129 +57759,SD,Nemo,44.209718,-103.544863 +57760,SD,Newell,44.740979,-103.391359 +57761,SD,New Underwood,44.087354,-102.813635 +57762,SD,Nisland,44.666539,-103.540176 +57763,SD,Oelrichs,43.155063,-103.216181 +57765,SD,Opal,44.867111,-102.477752 +57766,SD,Oral,43.387587,-103.183215 +57767,SD,Owanka,44.063078,-102.562776 +57769,SD,Piedmont,44.228744,-103.368818 +57770,SD,Pine Ridge,43.112401,-102.598352 +57772,SD,Porcupine,43.293979,-102.223448 +57774,SD,Provo,43.173599,-103.866588 +57775,SD,Cottonwood,44.07721,-102.069706 +57777,SD,Redowl,44.720224,-102.65923 +57778,SD,Rochford,44.072318,-103.657621 +57779,SD,Saint Onge,44.552225,-103.734426 +57780,SD,Scenic,43.799368,-102.535309 +57782,SD,Smithwick,43.26837,-103.198826 +57783,SD,Spearfish,44.494625,-103.864962 +57785,SD,Hereford,44.413077,-103.477158 +57787,SD,Stoneville,44.638004,-102.79796 +57788,SD,Vale,44.622235,-103.379499 +57790,SD,Wall,43.981232,-102.224546 +57791,SD,Wasta,44.093707,-102.347077 +57792,SD,White Owl,44.618247,-102.445195 +57793,SD,Whitewood,44.458855,-103.637039 +57794,SD,Wounded Knee,43.185194,-102.402157 +57795,SD,Zeona,45.251481,-102.7793 +37010,TN,Adams,36.558174,-87.122626 +37012,TN,Alexandria,36.071147,-86.037171 +37013,TN,Antioch,36.059517,-86.659151 +37014,TN,Arrington,35.904876,-86.564515 +37015,TN,Ashland City,36.273132,-87.044719 +37016,TN,Auburntown,35.974392,-86.107532 +37018,TN,Beechgrove,35.644733,-86.204644 +37019,TN,Belfast,35.406905,-86.709482 +37020,TN,Bell Buckle,35.638105,-86.394908 +37022,TN,Bethpage,36.518575,-86.314572 +37023,TN,Big Rock,36.571606,-87.737838 +37025,TN,Bon Aqua,35.947073,-87.299564 +37026,TN,Bradyville,35.705278,-86.09119 +37027,TN,Brentwood,36.006272,-86.790947 +37028,TN,Bumpus Mills,36.622618,-87.861434 +37029,TN,Burns,36.047066,-87.306061 +37030,TN,Defeated,36.255617,-85.96969 +37031,TN,Castalian Spring,36.382108,-86.315545 +37032,TN,Cedar Hill,36.506163,-87.027523 +37033,TN,Centerville,35.779685,-87.477473 +37034,TN,Chapel Hill,35.63542,-86.683584 +37035,TN,Chapmansboro,36.378078,-87.111288 +37036,TN,Charlotte,36.232612,-87.281554 +37037,TN,Christiana,35.740877,-86.407932 +37040,TN,Clarksville,36.522014,-87.348997 +37042,TN,Clarksville,36.585315,-87.418621 +37043,TN,Clarksville,36.5107,-87.275653 +37046,TN,College Grove,35.783166,-86.749516 +37047,TN,Cornersville,35.34088,-86.82862 +37048,TN,Cottontown,36.491231,-86.603338 +37049,TN,Cross Plains,36.553068,-86.676088 +37050,TN,Cumberland City,36.366924,-87.63494 +37051,TN,Cumberland Furna,36.316146,-87.406585 +37052,TN,Cunningham,36.378926,-87.424546 +37055,TN,Dickson,36.076014,-87.399532 +37057,TN,Dixon Springs,36.445538,-86.05335 +37058,TN,Dover,36.507521,-87.838333 +37059,TN,Dowelltown,35.972485,-85.905533 +37060,TN,Eagleville,35.749243,-86.632652 +37061,TN,Erin,36.306684,-87.678964 +37062,TN,Fairview,35.975528,-87.132065 +37064,TN,Franklin,35.932782,-86.878833 +37066,TN,Gallatin,36.383438,-86.45116 +37072,TN,Goodlettsville,36.341677,-86.721215 +37073,TN,Greenbrier,36.422914,-86.791356 +37074,TN,Hartsville,36.394728,-86.170408 +37075,TN,Hendersonville,36.305425,-86.607157 +37076,TN,Hermitage,36.184814,-86.600162 +37078,TN,Hurricane Mills,35.974859,-87.767129 +37079,TN,Indian Mound,36.494593,-87.680368 +37080,TN,Joelton,36.328974,-86.916306 +37082,TN,Kingston Springs,36.095324,-87.115646 +37083,TN,Lafayette,36.538955,-86.024217 +37085,TN,Lascassas,35.949535,-86.311192 +37086,TN,La Vergne,36.012714,-86.559969 +37087,TN,Lebanon,36.209792,-86.302367 +37091,TN,Lewisburg,35.459615,-86.781204 +37095,TN,Gassaway,35.974593,-85.985448 +37096,TN,Flatwoods,35.599784,-87.865582 +37097,TN,Lobelville,35.746659,-87.825106 +37098,TN,Wrigley,35.892216,-87.317199 +37101,TN,Mc Ewen,36.118477,-87.64221 +37110,TN,Plaza,35.697358,-85.791609 +37115,TN,Madison,36.260386,-86.704557 +37118,TN,Milton,35.922085,-86.182377 +37122,TN,Mount Juliet,36.189684,-86.502344 +37129,TN,Murfreesboro,35.871019,-86.41809 +37130,TN,Murfreesboro,35.847792,-86.364675 +37134,TN,New Johnsonville,36.008775,-87.954693 +37135,TN,Nolensville,35.930723,-86.682868 +37137,TN,Nunnelly,35.87627,-87.506661 +37138,TN,Old Hickory,36.241564,-86.611704 +37140,TN,Only,35.867888,-87.665451 +37141,TN,Orlinda,36.611045,-86.699002 +37142,TN,Palmyra,36.417568,-87.491359 +37143,TN,Pegram,36.11291,-87.031613 +37144,TN,Petersburg,35.292416,-86.644728 +37145,TN,Pleasant Shade,36.348924,-85.908057 +37146,TN,Pleasant View,36.378281,-87.03948 +37147,TN,Pleasantville,35.668373,-87.653664 +37148,TN,Portland,36.567306,-86.505923 +37149,TN,Readyville,35.798878,-86.241483 +37150,TN,Red Boiling Spri,36.531283,-85.846333 +37151,TN,Riddleton,36.350581,-86.033482 +37153,TN,Rockvale,35.74503,-86.535196 +37160,TN,Royal,35.488313,-86.463425 +37166,TN,Smithville,35.929907,-85.804562 +37167,TN,Smyrna,35.965611,-86.504818 +37171,TN,Southside,36.362588,-87.306087 +37172,TN,Springfield,36.50182,-86.876901 +37174,TN,Spring Hill,35.717294,-86.904807 +37175,TN,Stewart,36.324055,-87.872495 +37178,TN,Tennessee Ridge,36.329712,-87.780761 +37179,TN,Thompsons Statio,35.831006,-87.004875 +37180,TN,Unionville,35.622416,-86.563852 +37181,TN,Vanleer,36.223738,-87.45653 +37183,TN,Wartrace,35.512299,-86.327736 +37184,TN,Watertown,36.095268,-86.143411 +37185,TN,Waverly,36.099664,-87.799108 +37186,TN,Westmoreland,36.575554,-86.235296 +37187,TN,White Bluff,36.12531,-87.21901 +37188,TN,White House,36.460048,-86.670524 +37189,TN,Whites Creek,36.274377,-86.82922 +37190,TN,Woodbury,35.814254,-86.050044 +37191,TN,Woodlawn,36.514695,-87.539331 +37201,TN,Nashville,36.167028,-86.778441 +37203,TN,Nashville,36.146802,-86.793922 +37204,TN,Melrose,36.114628,-86.781808 +37205,TN,Nashville,36.111432,-86.868954 +37206,TN,Nashville,36.179813,-86.741106 +37207,TN,Nashville,36.2195,-86.774008 +37208,TN,Nashville,36.176196,-86.807563 +37209,TN,Nashville,36.154592,-86.860212 +37210,TN,Nashville,36.137904,-86.741042 +37211,TN,Nashville,36.072486,-86.724038 +37212,TN,Nashville,36.133681,-86.800555 +37213,TN,Nashville,36.165512,-86.760556 +37214,TN,Nashville,36.163339,-86.660854 +37215,TN,Nashville,36.098584,-86.821917 +37216,TN,Nashville,36.212491,-86.725687 +37217,TN,Nashville,36.10585,-86.666585 +37218,TN,Nashville,36.207062,-86.845583 +37219,TN,Nashville,36.167768,-86.783676 +37220,TN,Nashville,36.064139,-86.769654 +37221,TN,Bellevue,36.071512,-86.943674 +37228,TN,Nashville,36.190145,-86.805264 +37301,TN,Altamont,35.425776,-85.763508 +37302,TN,Apison,35.014926,-85.016404 +37303,TN,Athens,35.457389,-84.604261 +37305,TN,Beersheba Spring,35.470371,-85.682128 +37306,TN,Belvidere,35.141499,-86.172827 +37307,TN,Benton,35.172953,-84.654433 +37308,TN,Birchwood,35.351968,-84.961835 +37309,TN,Calhoun,35.374614,-84.738105 +37310,TN,Charleston,35.255644,-84.766639 +37311,TN,Cleveland,35.131257,-84.875006 +37312,TN,Cleveland,35.202309,-84.847557 +37313,TN,Coalmont,35.386197,-85.655097 +37317,TN,Postelle,35.024987,-84.383964 +37318,TN,Cowan,35.170121,-86.019007 +37321,TN,Dayton,35.500186,-85.013455 +37322,TN,Decatur,35.507166,-84.808051 +37324,TN,Decherd,35.232598,-86.058859 +37325,TN,Delano,35.261234,-84.602366 +37327,TN,Dunlap,35.384175,-85.392513 +37328,TN,Elora,35.029496,-86.34811 +37329,TN,Englewood,35.427245,-84.483265 +37330,TN,Estill Springs,35.270508,-86.139561 +37331,TN,Etowah,35.331443,-84.528305 +37332,TN,Evensville,35.615346,-85.022773 +37333,TN,Farner,35.144894,-84.320904 +37334,TN,Fayetteville,35.152678,-86.566448 +37335,TN,Flintville,35.042782,-86.497974 +37336,TN,Georgetown,35.293241,-84.912684 +37337,TN,Grandview,35.760843,-84.861464 +37338,TN,Graysville,35.44842,-85.17904 +37339,TN,Gruetli Laager,35.363464,-85.669773 +37340,TN,Guild,35.017834,-85.511568 +37341,TN,Harrison,35.167898,-85.094532 +37342,TN,Hillsboro,35.369933,-85.972422 +37343,TN,Hixson,35.159112,-85.218215 +37345,TN,Huntland,35.051198,-86.269435 +37347,TN,Kimball,35.066603,-85.614737 +37348,TN,Kelso,35.102356,-86.468343 +37350,TN,Lookout Mountain,34.994825,-85.350564 +37352,TN,Lynchburg,35.270642,-86.372019 +37353,TN,Mc Donald,35.086902,-84.989198 +37354,TN,Hiwassee College,35.500917,-84.351899 +37355,TN,Manchester,35.495846,-86.081568 +37356,TN,Monteagle,35.240172,-85.822795 +37357,TN,Morrison,35.60002,-85.889895 +37359,TN,Mulberry,35.19413,-86.421685 +37360,TN,Normandy,35.429628,-86.255712 +37361,TN,Ocoee,35.102473,-84.713565 +37362,TN,Oldfort,35.03654,-84.721877 +37363,TN,Ooltewah,35.078104,-85.063495 +37365,TN,Palmer,35.374062,-85.564272 +37366,TN,Pelham,35.314045,-85.84408 +37367,TN,Pikeville,35.640769,-85.207653 +37369,TN,Reliance,35.180664,-84.54103 +37370,TN,Riceville,35.344615,-84.646247 +37373,TN,Sale Creek,35.385806,-85.102323 +37374,TN,Sequatchie,35.163396,-85.637084 +37375,TN,Sewanee,35.201101,-85.91259 +37376,TN,Sherwood,35.099164,-85.923841 +37377,TN,Signal Mountain,35.149424,-85.336243 +37379,TN,Soddy Daisy,35.252686,-85.163009 +37380,TN,South Pittsburg,35.028046,-85.722498 +37381,TN,Spring City,35.682072,-84.841968 +37385,TN,Tellico Plains,35.356237,-84.306785 +37387,TN,Tracy City,35.272081,-85.736187 +37388,TN,Dickel,35.35841,-86.22069 +37391,TN,Turtletown,35.108089,-84.354381 +37396,TN,Whiteside,35.066289,-85.398499 +37397,TN,Whitwell,35.197228,-85.501112 +37398,TN,Winchester,35.186398,-86.113038 +37402,TN,Chattanooga,35.046288,-85.316126 +37403,TN,Chattanooga,35.045045,-85.296516 +37404,TN,Chattanooga,35.030634,-85.272229 +37405,TN,Chattanooga,35.076801,-85.308224 +37406,TN,Chattanooga,35.061446,-85.247839 +37407,TN,Chattanooga,35.002361,-85.284913 +37408,TN,Chattanooga,35.029236,-85.306809 +37409,TN,Chattanooga,34.99809,-85.331016 +37410,TN,Chattanooga,35.001787,-85.313762 +37411,TN,Chattanooga,35.02706,-85.235583 +37412,TN,East Ridge,34.996726,-85.237957 +37415,TN,Red Bank,35.117668,-85.28633 +37416,TN,Chattanooga,35.094246,-85.175656 +37419,TN,Chattanooga,35.033092,-85.368698 +37421,TN,Chattanooga,35.024986,-85.14594 +37601,TN,Johnson City,36.333872,-82.340775 +37604,TN,Johnson City,36.310744,-82.381042 +37615,TN,Gray,36.41006,-82.447128 +37616,TN,Afton,36.204166,-82.746667 +37617,TN,Blountville,36.53562,-82.365558 +37618,TN,Bluff City,36.477391,-82.236181 +37620,TN,Bristol,36.568643,-82.181864 +37640,TN,Butler,36.328158,-81.985614 +37641,TN,Chuckey,36.221142,-82.667448 +37642,TN,Church Hill,36.539926,-82.725184 +37643,TN,Elizabethton,36.344548,-82.201481 +37645,TN,Mount Carmel,36.562913,-82.653217 +37650,TN,Erwin,36.134193,-82.41631 +37656,TN,Fall Branch,36.415839,-82.625605 +37657,TN,Flag Pond,36.008507,-82.562301 +37658,TN,Hampton,36.257743,-82.189144 +37659,TN,Jonesborough,36.295426,-82.490225 +37660,TN,Bloomingdale,36.552766,-82.554034 +37663,TN,Colonial Heights,36.4693,-82.4948 +37664,TN,Kingsport,36.520834,-82.516835 +37665,TN,Lynn Garden,36.578305,-82.569906 +37680,TN,Laurel Bloomery,36.574946,-81.725537 +37681,TN,Washington Colle,36.236968,-82.61709 +37683,TN,Mountain City,36.465724,-81.813999 +37686,TN,Piney Flats,36.446122,-82.333957 +37687,TN,Roan Mountain,36.177333,-82.081041 +37688,TN,Shady Valley,36.527218,-81.906797 +37690,TN,Telford,36.245053,-82.536935 +37691,TN,Trade,36.368328,-81.757234 +37692,TN,Unicoi,36.206585,-82.321957 +37694,TN,Watauga,36.370157,-82.268262 +37701,TN,Alcoa,35.78522,-83.980895 +37705,TN,Andersonville,36.191514,-84.054399 +37708,TN,Bean Station,36.32493,-83.314248 +37709,TN,Blaine,36.15832,-83.678272 +37710,TN,Devonia,36.185426,-84.215968 +37711,TN,Bulls Gap,36.325707,-83.03149 +37713,TN,Bybee,36.073957,-83.163071 +37714,TN,Caryville,36.285422,-84.189794 +37715,TN,Clairfield,36.565026,-83.939693 +37716,TN,Clinton,36.08688,-84.189735 +37721,TN,Corryton,36.120011,-83.813 +37722,TN,Cosby,35.834693,-83.218743 +37723,TN,Crab Orchard,35.889763,-84.858577 +37724,TN,Cumberland Gap,36.550381,-83.681049 +37725,TN,Dandridge,36.001798,-83.404435 +37726,TN,Deer Lodge,36.217584,-84.819074 +37727,TN,Del Rio,35.882967,-83.015008 +37729,TN,Duff,36.411035,-84.01247 +37731,TN,Eidson,36.499522,-83.08272 +37737,TN,Friendsville,35.752302,-84.106069 +37738,TN,Gatlinburg,35.728976,-83.487406 +37742,TN,Greenback,35.656738,-84.170959 +37743,TN,Baileyton,36.160807,-82.833136 +37748,TN,Harriman,35.934785,-84.515526 +37752,TN,Harrogate,36.576718,-83.607262 +37753,TN,Hartford,35.825597,-83.099642 +37754,TN,Heiskell,36.115027,-84.043826 +37755,TN,Helenwood,36.43294,-84.538088 +37756,TN,Huntsville,36.398329,-84.428832 +37757,TN,Jacksboro,36.326615,-84.192835 +37760,TN,Jefferson City,36.11633,-83.480982 +37762,TN,Jellico,36.554407,-84.118067 +37763,TN,Kingston,35.852807,-84.497054 +37764,TN,Kodak,35.972215,-83.617111 +37765,TN,Kyles Ford,36.572072,-83.050712 +37766,TN,Morley,36.368967,-84.111568 +37769,TN,Lake City,36.203223,-84.138567 +37770,TN,Lancing,36.145644,-84.713519 +37771,TN,Lenoir City,35.810391,-84.266501 +37774,TN,Loudon,35.729211,-84.34362 +37777,TN,Louisville,35.837465,-84.008895 +37778,TN,Lowland,36.164016,-83.244592 +37779,TN,Luttrell,36.200136,-83.759976 +37801,TN,Maryville,35.782449,-83.914541 +37804,TN,Maryville,35.715659,-84.004491 +37806,TN,Mascot,36.084421,-83.741101 +37807,TN,Maynardville,36.234274,-83.840261 +37809,TN,Midway,36.150995,-83.028141 +37810,TN,Mohawk,36.186919,-83.090185 +37811,TN,Mooresburg,36.362082,-83.209499 +37813,TN,Morristown,36.195672,-83.275519 +37814,TN,Morristown,36.224782,-83.31185 +37818,TN,Mosheim,36.183883,-82.967399 +37819,TN,Newcomb,36.542768,-84.179848 +37820,TN,New Market,36.081037,-83.567253 +37821,TN,Newport,35.954431,-83.202749 +37825,TN,New Tazewell,36.424475,-83.646949 +37826,TN,Niota,35.581924,-84.57215 +37829,TN,Oakdale,36.009962,-84.575295 +37830,TN,Oak Ridge,36.01588,-84.262297 +37840,TN,Oliver Springs,36.036616,-84.348632 +37841,TN,Oneida,36.505259,-84.529319 +37843,TN,Parrottsville,35.998297,-83.073627 +37845,TN,Petros,36.055903,-84.439914 +37846,TN,Philadelphia,35.664214,-84.450221 +37847,TN,Pioneer,36.469465,-84.290672 +37848,TN,Powder Springs,36.254899,-83.672921 +37849,TN,Powell,36.043454,-84.039987 +37852,TN,Robbins,36.352693,-84.590417 +37853,TN,Rockford,35.830519,-83.941202 +37854,TN,Rockwood,35.858677,-84.684188 +37857,TN,Rogersville,36.416196,-83.010786 +37860,TN,Russellville,36.256684,-83.19138 +37861,TN,Rutledge,36.250078,-83.512468 +37862,TN,Sevierville,35.845192,-83.538621 +37863,TN,Pigeon Forge,35.792222,-83.563821 +37865,TN,Seymour,35.869984,-83.749511 +37866,TN,Sharps Chapel,36.368498,-83.81268 +37869,TN,Sneedville,36.527515,-83.252892 +37870,TN,Speedwell,36.479723,-83.813495 +37871,TN,Strawberry Plain,36.041462,-83.677724 +37872,TN,Sunbright,36.262234,-84.69842 +37873,TN,Surgoinsville,36.474066,-82.830597 +37874,TN,Sweetwater,35.595703,-84.430424 +37877,TN,Talbott,36.159958,-83.412864 +37878,TN,Tallassee,35.583663,-84.003338 +37879,TN,Tazewell,36.471012,-83.555219 +37880,TN,Ten Mile,35.686175,-84.654848 +37881,TN,Thorn Hill,36.391687,-83.365973 +37882,TN,Townsend,35.678385,-83.757157 +37883,TN,Treadway,36.428202,-83.219138 +37885,TN,Vonore,35.535364,-84.177829 +37886,TN,Walland,35.753311,-83.824307 +37887,TN,Wartburg,36.101609,-84.565188 +37888,TN,Washburn,36.310649,-83.593685 +37890,TN,Baneberry,36.090299,-83.287921 +37891,TN,Whitesburg,36.262125,-83.145844 +37892,TN,Winfield,36.559825,-84.434026 +37902,TN,Knoxville,35.962516,-83.920915 +37909,TN,Knoxville,35.945978,-84.023501 +37912,TN,Knoxville,36.005492,-83.977317 +37914,TN,Knoxville,35.991755,-83.849624 +37915,TN,Knoxville,35.972074,-83.901005 +37916,TN,Knoxville,35.955584,-83.933576 +37917,TN,Knoxville,35.99803,-83.915216 +37918,TN,Knoxville,36.050054,-83.922558 +37919,TN,Knoxville,35.924385,-84.001468 +37920,TN,Kimberlin Height,35.922976,-83.879793 +37921,TN,Karns,35.976297,-83.982894 +37922,TN,Concord,35.877697,-84.127332 +37923,TN,Knoxville,35.933127,-84.076116 +37924,TN,Knoxville,36.032044,-83.80207 +37931,TN,Knoxville,35.992363,-84.120072 +37932,TN,Concord Farragut,35.923619,-84.169591 +37938,TN,Knoxville,36.105473,-83.945968 +38001,TN,Alamo,35.801697,-89.176465 +38002,TN,Arlington,35.275171,-89.729502 +38004,TN,Atoka,35.421337,-89.8216 +38006,TN,Bells,35.71976,-89.072857 +38008,TN,Bolivar,35.246082,-89.000723 +38011,TN,Brighton,35.470328,-89.752477 +38012,TN,Brownsville,35.609957,-89.262352 +38015,TN,Burlison,35.53995,-89.817729 +38017,TN,Collierville,35.055077,-89.676724 +38018,TN,Cordova,35.156349,-89.778934 +38019,TN,Covington,35.559838,-89.650144 +38023,TN,Drummonds,35.445203,-89.923649 +38024,TN,Dyersburg,36.044447,-89.383644 +38028,TN,Eads,35.15512,-89.676004 +38030,TN,Finley,36.016938,-89.513403 +38034,TN,Friendship,35.897642,-89.204136 +38037,TN,Gates,35.843942,-89.459182 +38039,TN,Grand Junction,35.065885,-89.153415 +38040,TN,Halls,35.886232,-89.414671 +38041,TN,Fort Pillow,35.682868,-89.637542 +38042,TN,Hickory Valley,35.157959,-89.130905 +38044,TN,Hornsby,35.219706,-88.826315 +38049,TN,Mason,35.438012,-89.551805 +38052,TN,Middleton,35.0818,-88.904625 +38053,TN,Millington,35.318463,-89.905422 +38057,TN,Moscow,35.058796,-89.359508 +38059,TN,Newbern,36.100875,-89.251364 +38060,TN,Oakland,35.222929,-89.551764 +38061,TN,Pocahontas,35.031476,-88.811559 +38063,TN,Ripley,35.752651,-89.534975 +38066,TN,Rossville,35.076758,-89.567848 +38067,TN,Saulsbury,35.049786,-89.076868 +38068,TN,Somerville,35.277218,-89.391813 +38069,TN,Stanton,35.448171,-89.33263 +38075,TN,Whiteville,35.319104,-89.133692 +38076,TN,Williston,35.166595,-89.390584 +38079,TN,Tiptonville,36.384583,-89.464922 +38080,TN,Ridgely,36.263849,-89.485765 +38103,TN,Memphis,35.144001,-90.047995 +38104,TN,Memphis,35.133393,-90.004625 +38105,TN,Memphis,35.149748,-90.033042 +38106,TN,Memphis,35.102124,-90.032997 +38107,TN,Memphis,35.183136,-90.020077 +38108,TN,Memphis,35.178655,-89.968238 +38109,TN,Memphis,35.042538,-90.073238 +38111,TN,Memphis,35.107573,-89.945745 +38112,TN,Memphis,35.148277,-89.972895 +38113,TN,Memphis,35.111201,-90.079426 +38114,TN,Memphis,35.098094,-89.98254 +38115,TN,Hickory Hill,35.054405,-89.86082 +38116,TN,Memphis,35.030298,-90.012314 +38117,TN,Memphis,35.112357,-89.903367 +38118,TN,Memphis,35.051421,-89.926538 +38119,TN,Memphis,35.082101,-89.850142 +38120,TN,Memphis,35.120654,-89.865119 +38122,TN,Memphis,35.157166,-89.926844 +38125,TN,Memphis,35.031249,-89.812357 +38126,TN,Memphis,35.125518,-90.042444 +38127,TN,Memphis,35.250982,-90.029623 +38128,TN,Memphis,35.221273,-89.941314 +38131,TN,Memphis,35.0655,-90.003699 +38132,TN,Memphis,35.071967,-89.988627 +38133,TN,Memphis,35.205362,-89.803564 +38134,TN,Bartlett,35.188639,-89.86409 +38135,TN,Memphis,35.232301,-89.850878 +38138,TN,Germantown,35.088344,-89.80526 +38139,TN,Germantown,35.087414,-89.770281 +38141,TN,Memphis,35.023091,-89.84916 +38201,TN,Mc Kenzie,36.127195,-88.513416 +38220,TN,Atwood,35.966345,-88.624656 +38221,TN,Big Sandy,36.228515,-88.062732 +38222,TN,Buchanan,36.414624,-88.151464 +38224,TN,Cottage Grove,36.34789,-88.461421 +38225,TN,Dresden,36.295042,-88.696291 +38226,TN,Dukedom,36.479645,-88.692553 +38229,TN,Gleason,36.211737,-88.618441 +38230,TN,Greenfield,36.148502,-88.74532 +38231,TN,Henry,36.201343,-88.453609 +38232,TN,Hornbeak,36.359594,-89.305617 +38233,TN,Kenton,36.190583,-89.022879 +38236,TN,Mansfield,36.184744,-88.285934 +38237,TN,Martin,36.342467,-88.855395 +38240,TN,Obion,36.265679,-89.28052 +38241,TN,Palmersville,36.394772,-88.614178 +38242,TN,Paris,36.300519,-88.309328 +38251,TN,Puryear,36.445632,-88.347193 +38253,TN,Rives,36.263665,-89.037632 +38255,TN,Sharon,36.239454,-88.847661 +38256,TN,Springville,36.265033,-88.145941 +38257,TN,South Fulton,36.481386,-88.880781 +38258,TN,Trezevant,36.017213,-88.610036 +38259,TN,Trimble,36.201113,-89.186265 +38260,TN,Troy,36.341644,-89.161058 +38261,TN,Union City,36.426311,-89.066662 +38301,TN,Jackson,35.610222,-88.814011 +38305,TN,Jackson,35.682875,-88.828127 +38310,TN,Adamsville,35.25561,-88.413367 +38311,TN,Bath Springs,35.452111,-88.12863 +38313,TN,Beech Bluff,35.592156,-88.639634 +38315,TN,Bethel Springs,35.228893,-88.643972 +38316,TN,Bradford,36.064474,-88.804593 +38317,TN,Bruceton,36.026792,-88.251804 +38318,TN,Buena Vista,35.943119,-88.292576 +38320,TN,Camden,36.055578,-88.111853 +38321,TN,Cedar Grove,35.861261,-88.551702 +38326,TN,Counce,35.039415,-88.293567 +38327,TN,Crump,35.221641,-88.335641 +38328,TN,Darden,35.662962,-88.217688 +38329,TN,Decaturville,35.558455,-88.133413 +38330,TN,Dyer,36.071578,-89.019226 +38332,TN,Enville,35.439321,-88.420613 +38333,TN,Eva,36.078814,-88.028036 +38334,TN,Finger,35.325208,-88.606709 +38337,TN,Gadsden,35.779867,-88.992947 +38339,TN,Guys,35.014211,-88.520761 +38340,TN,Henderson,35.426929,-88.639774 +38341,TN,Holladay,35.895143,-88.091183 +38342,TN,Hollow Rock,36.056524,-88.290135 +38343,TN,Humboldt,35.836993,-88.905652 +38344,TN,Huntingdon,36.006228,-88.420211 +38345,TN,Huron,35.614377,-88.519549 +38347,TN,Jacks Creek,35.478206,-88.501865 +38348,TN,Lavinia,35.85834,-88.632442 +38351,TN,Lexington,35.651195,-88.392743 +38352,TN,Luray,35.598846,-88.578422 +38355,TN,Medina,35.808088,-88.762655 +38356,TN,Medon,35.471804,-88.871656 +38357,TN,Michie,35.060306,-88.440463 +38358,TN,Milan,35.925089,-88.768844 +38359,TN,Milledgeville,35.345175,-88.399125 +38361,TN,Morris Chapel,35.302562,-88.317599 +38362,TN,Oakfield,35.754756,-88.802145 +38363,TN,Parsons,35.66635,-88.119532 +38366,TN,Pinson,35.478059,-88.730396 +38367,TN,Ramer,35.064181,-88.601733 +38368,TN,Reagan,35.50957,-88.350778 +38369,TN,Rutherford,36.130027,-88.984863 +38370,TN,Saltillo,35.381467,-88.247225 +38371,TN,Sardis,35.438598,-88.3058 +38372,TN,Savannah,35.202272,-88.200541 +38374,TN,Scotts Hill,35.504992,-88.240476 +38375,TN,Selmer,35.169124,-88.595832 +38376,TN,Shiloh,35.119545,-88.350717 +38379,TN,Stantonville,35.180946,-88.436432 +38380,TN,Sugar Tree,35.791993,-88.032249 +38381,TN,Toone,35.357421,-88.935286 +38382,TN,Trenton,35.971246,-88.950655 +38387,TN,Westport,35.916918,-88.336364 +38388,TN,Wildersville,35.769772,-88.438794 +38390,TN,Yuma,35.867964,-88.381878 +38391,TN,Denmark,35.557059,-88.975892 +38392,TN,Mercer,35.481828,-89.03728 +38401,TN,Columbia,35.615577,-87.038032 +38425,TN,Clifton,35.381948,-87.94997 +38449,TN,Ardmore,35.057445,-86.879555 +38450,TN,Collinwood,35.163525,-87.718488 +38451,TN,Culleoka,35.474914,-87.000503 +38452,TN,Cypress Inn,35.057945,-87.78833 +38453,TN,Ardmore,35.003654,-86.910024 +38454,TN,Duck River,35.738599,-87.342336 +38456,TN,Ethridge,35.332648,-87.303912 +38457,TN,Five Points,35.031046,-87.296128 +38459,TN,Frankewing,35.177854,-86.781818 +38460,TN,Goodspring,35.116709,-87.127788 +38461,TN,Hampshire,35.591482,-87.325135 +38462,TN,Kimmins,35.540837,-87.55461 +38463,TN,Iron City,35.056283,-87.647321 +38464,TN,Lawrenceburg,35.250668,-87.352582 +38468,TN,Leoma,35.138177,-87.316773 +38469,TN,Loretto,35.072797,-87.426978 +38471,TN,Lutts,35.113842,-87.892291 +38472,TN,Lynnville,35.379235,-87.062877 +38473,TN,Minor Hill,35.050034,-87.152194 +38474,TN,Mount Pleasant,35.530084,-87.203678 +38475,TN,Olivehill,35.266711,-88.039038 +38476,TN,Primm Springs,35.810364,-87.253043 +38477,TN,Prospect,35.066626,-87.017384 +38478,TN,Pulaski,35.209274,-87.039263 +38481,TN,Saint Joseph,35.037556,-87.501807 +38482,TN,Santa Fe,35.75877,-87.151543 +38483,TN,Summertown,35.430673,-87.31983 +38485,TN,Waynesboro,35.322019,-87.739498 +38486,TN,Westpoint,35.139302,-87.538025 +38487,TN,Williamsport,35.64937,-87.225692 +38488,TN,Taft,35.051731,-86.644672 +38501,TN,Algood,36.174261,-85.49531 +38504,TN,Allardt,36.374889,-84.850784 +38541,TN,Allons,36.497002,-85.319744 +38542,TN,Allred,36.366838,-85.176084 +38543,TN,Alpine,36.380324,-85.152153 +38544,TN,Baxter,36.124917,-85.637766 +38545,TN,Bloomington Spri,36.219454,-85.64786 +38547,TN,Brush Creek,36.110673,-86.020344 +38548,TN,Buffalo Valley,36.183311,-85.758879 +38549,TN,Byrdstown,36.570869,-85.145647 +38551,TN,Celina,36.547491,-85.496551 +38552,TN,Chestnut Mound,36.192877,-85.837402 +38553,TN,Clarkrange,36.211188,-84.977737 +38554,TN,Crawford,36.23611,-85.168765 +38555,TN,Fairfield Glade,35.944041,-85.017171 +38556,TN,Jamestown,36.424471,-84.935721 +38559,TN,Doyle,35.872206,-85.498997 +38560,TN,Elmwood,36.235468,-85.880843 +38562,TN,Gainesboro,36.343767,-85.635509 +38563,TN,Gordonsville,36.184317,-86.000818 +38564,TN,Granville,36.276847,-85.747533 +38565,TN,Grimsley,36.243353,-85.01549 +38567,TN,Hickman,36.119653,-85.902297 +38568,TN,Hilham,36.391492,-85.436918 +38569,TN,Lancaster,36.09542,-85.855095 +38570,TN,Livingston,36.389012,-85.320523 +38573,TN,Monroe,36.464201,-85.216385 +38574,TN,Monterey,36.150862,-85.254198 +38575,TN,Moss,36.596623,-85.677235 +38577,TN,Pall Mall,36.578066,-85.038385 +38578,TN,Pleasant Hill,36.01121,-85.16694 +38579,TN,Quebeck,35.825379,-85.538189 +38580,TN,Rickman,36.301933,-85.380572 +38581,TN,Bone Cave,35.743813,-85.635156 +38582,TN,Silver Point,36.100562,-85.733801 +38583,TN,Ravenscroft,35.954664,-85.478582 +38585,TN,Spencer,35.727871,-85.428661 +38587,TN,Walling,35.869543,-85.618509 +38588,TN,Whitleyville,36.515839,-85.689873 +38589,TN,Wilder,36.230526,-85.074717 +42223,TN,Fort Campbell,36.599497,-87.558507 +75002,TX,Allen,33.093383,-96.645433 +75006,TX,Carrollton,32.965736,-96.882464 +75007,TX,Carrollton,33.003294,-96.881988 +75008,TX,Carrollton,33.03524,-96.923197 +75009,TX,Celina,33.310316,-96.767325 +75010,TX,Carrollton,33.030414,-96.877746 +75019,TX,Coppell,32.96727,-96.980516 +75020,TX,Denison,33.745009,-96.549574 +75023,TX,Plano,33.054972,-96.736454 +75024,TX,Plano,33.075211,-96.784307 +75025,TX,Plano,33.078377,-96.729142 +75028,TX,Flower Mound,33.038268,-97.074501 +75034,TX,Frisco,33.149901,-96.824105 +75038,TX,Irving,32.865309,-96.990503 +75039,TX,Irving,32.869669,-96.938876 +75040,TX,Garland,32.922744,-96.624804 +75041,TX,Garland,32.87937,-96.641115 +75042,TX,Garland,32.918486,-96.677545 +75043,TX,Garland,32.856502,-96.599882 +75044,TX,Garland,32.952228,-96.665383 +75048,TX,Sachse,32.973576,-96.591472 +75050,TX,Grand Prairie,32.76488,-97.01121 +75051,TX,Grand Prairie,32.711471,-97.006916 +75052,TX,Grand Prairie,32.660475,-97.031142 +75056,TX,The Colony,33.094023,-96.883574 +75057,TX,Lewisville,33.053162,-96.999882 +75058,TX,Gunter,33.449513,-96.734103 +75060,TX,Irving,32.80231,-96.959665 +75061,TX,Irving,32.826658,-96.963256 +75062,TX,Irving,32.847854,-96.974027 +75063,TX,Irving,32.924686,-96.959817 +75065,TX,Lake Dallas,33.121903,-97.023709 +75067,TX,Highland Village,33.04503,-97.026815 +75068,TX,Lakewood Village,33.178319,-96.967811 +75069,TX,Mc Kinney,33.196558,-96.608488 +75070,TX,Mc Kinney,33.195148,-96.664223 +75074,TX,Plano,33.027722,-96.67771 +75075,TX,Plano,33.024985,-96.739743 +75076,TX,Pottsboro,33.809526,-96.690562 +75078,TX,Prosper,33.236169,-96.795401 +75080,TX,Richardson,32.965986,-96.745249 +75081,TX,Richardson,32.946217,-96.705841 +75082,TX,Richardson,32.986461,-96.685957 +75087,TX,Heath,32.90456,-96.454497 +75088,TX,Rowlett,32.90315,-96.547161 +75090,TX,Sherman,33.643525,-96.607521 +75093,TX,Plano,33.029866,-96.788903 +75094,TX,Murphy,33.004873,-96.609101 +75098,TX,Wylie,33.004102,-96.539383 +75102,TX,Barry,32.101356,-96.625141 +75103,TX,Canton,32.514301,-95.904657 +75104,TX,Cedar Hill,32.58847,-96.943802 +75105,TX,Chatfield,32.295416,-96.388668 +75110,TX,Corsicana,32.086776,-96.476151 +75114,TX,Crandall,32.597465,-96.46369 +75115,TX,De Soto,32.593167,-96.854721 +75116,TX,Duncanville,32.65873,-96.911392 +75117,TX,Edgewood,32.700326,-95.878011 +75119,TX,Ennis,32.332102,-96.622363 +75124,TX,Eustace,32.296485,-96.013693 +75125,TX,Ferris,32.52232,-96.664321 +75126,TX,Forney,32.749055,-96.459759 +75127,TX,Fruitvale,32.676981,-95.789903 +75134,TX,Lancaster,32.616056,-96.782997 +75135,TX,Caddo Mills,33.068267,-96.239093 +75137,TX,Duncanville,32.634665,-96.911325 +75140,TX,Grand Saline,32.663528,-95.706411 +75141,TX,Hutchins,32.639586,-96.707021 +75142,TX,Kaufman,32.54599,-96.285239 +75143,TX,Seven Points,32.369146,-96.257768 +75144,TX,Kerens,32.127463,-96.229828 +75146,TX,Lancaster,32.591395,-96.772805 +75147,TX,Gun Barrel City,32.307513,-96.129524 +75148,TX,Malakoff,32.170511,-96.005952 +75149,TX,Mesquite,32.767821,-96.608219 +75150,TX,Mesquite,32.815416,-96.630681 +75152,TX,Palmer,32.438714,-96.679429 +75153,TX,Powell,32.119557,-96.332713 +75154,TX,Ovilla,32.516096,-96.820337 +75155,TX,Rice,32.225788,-96.460613 +75158,TX,Scurry,32.48184,-96.392451 +75159,TX,Seagoville,32.652522,-96.557967 +75160,TX,Terrell,32.714292,-96.251342 +75163,TX,Trinidad,32.138341,-96.08307 +75165,TX,Waxahachie,32.380796,-96.837398 +75169,TX,Wills Point,32.72834,-96.00788 +75172,TX,Wilmer,32.598133,-96.68376 +75173,TX,Nevada,33.05934,-96.387657 +75180,TX,Balch Springs,32.720216,-96.615278 +75181,TX,Mesquite,32.727166,-96.566889 +75182,TX,Mesquite,32.801922,-96.567004 +75189,TX,Royse City,32.962778,-96.36484 +75201,TX,Dallas,32.790439,-96.80439 +75202,TX,Dallas,32.778056,-96.805352 +75203,TX,Dallas,32.745985,-96.806976 +75204,TX,Dallas,32.803814,-96.785144 +75205,TX,Village,32.836878,-96.793828 +75206,TX,Dallas,32.831029,-96.769219 +75207,TX,Dallas,32.793897,-96.831871 +75208,TX,Dallas,32.749208,-96.838898 +75209,TX,Dallas,32.84564,-96.825984 +75210,TX,Dallas,32.769919,-96.742974 +75211,TX,Cockrell Hill,32.736928,-96.881797 +75212,TX,Dallas,32.782884,-96.871396 +75214,TX,Dallas,32.824789,-96.749774 +75215,TX,Dallas,32.758206,-96.76226 +75216,TX,Dallas,32.708611,-96.795488 +75217,TX,Dallas,32.724429,-96.675481 +75218,TX,Dallas,32.846335,-96.697212 +75219,TX,Dallas,32.813245,-96.814166 +75220,TX,Dallas,32.868131,-96.862202 +75223,TX,Dallas,32.794173,-96.747475 +75224,TX,Dallas,32.711415,-96.838711 +75225,TX,Dallas,32.862808,-96.791753 +75226,TX,Dallas,32.78871,-96.767552 +75227,TX,Dallas,32.767226,-96.683586 +75228,TX,Dallas,32.824997,-96.678378 +75229,TX,Dallas,32.8958,-96.8588 +75230,TX,Dallas,32.89994,-96.789679 +75231,TX,Dallas,32.875621,-96.74953 +75232,TX,Dallas,32.664708,-96.838392 +75233,TX,Dallas,32.704638,-96.872547 +75234,TX,Farmers Branch,32.929803,-96.876848 +75235,TX,Dallas,32.825213,-96.838843 +75236,TX,Dallas,32.690002,-96.917737 +75237,TX,Dallas,32.658972,-96.876453 +75238,TX,Dallas,32.876976,-96.707982 +75239,TX,Dallas,32.659974,-96.732769 +75240,TX,Dallas,32.937431,-96.787214 +75241,TX,Dallas,32.672216,-96.777421 +75243,TX,Dallas,32.910347,-96.728472 +75244,TX,Farmers Branch,32.925817,-96.842533 +75246,TX,Dallas,32.79484,-96.769696 +75247,TX,Dallas,32.801323,-96.887123 +75248,TX,Dallas,32.968199,-96.794242 +75249,TX,Dallas,32.636024,-96.949266 +75251,TX,Dallas,32.912203,-96.771831 +75252,TX,Dallas,32.996848,-96.792113 +75253,TX,Dallas,32.683311,-96.59643 +75287,TX,Dallas,33.000458,-96.83143 +75401,TX,Greenville,33.117476,-96.102416 +75407,TX,Princeton,33.155542,-96.498073 +75409,TX,Anna,33.344516,-96.563862 +75410,TX,Alba,32.765235,-95.597102 +75411,TX,Arthur City,33.840031,-95.494037 +75412,TX,Bagwell,33.836089,-95.14869 +75414,TX,Bells,33.617817,-96.423668 +75415,TX,Ben Franklin,33.474146,-95.759107 +75416,TX,Blossom,33.694547,-95.382341 +75417,TX,Bogata,33.469862,-95.193725 +75418,TX,Bonham,33.580559,-96.183566 +75420,TX,Brashear,33.115521,-95.73451 +75421,TX,Brookston,33.624555,-95.688812 +75422,TX,Campbell,33.151049,-95.943919 +75423,TX,Celeste,33.264913,-96.207635 +75424,TX,Blue Ridge,33.306135,-96.390056 +75426,TX,Clarksville,33.623563,-95.046094 +75428,TX,Commerce,33.2493,-95.90968 +75431,TX,Como,33.064231,-95.362655 +75432,TX,Cooper,33.381166,-95.662311 +75433,TX,Cumby,33.111761,-95.794536 +75435,TX,Deport,33.522077,-95.365351 +75436,TX,Detroit,33.662691,-95.23848 +75437,TX,Dike,33.196485,-95.471125 +75438,TX,Dodd City,33.564704,-96.06194 +75439,TX,Ector,33.581913,-96.273533 +75440,TX,Emory,32.875041,-95.741786 +75442,TX,Farmersville,33.165862,-96.368619 +75446,TX,Honey Grove,33.598505,-95.9109 +75447,TX,Ivanhoe,33.67364,-96.169811 +75448,TX,Klondike,33.303375,-95.801762 +75449,TX,Ladonia,33.424527,-95.945489 +75450,TX,Lake Creek,33.467493,-95.622131 +75451,TX,Leesburg,32.976275,-95.107924 +75452,TX,Leonard,33.404363,-96.223772 +75453,TX,Lone Oak,32.991571,-95.943412 +75454,TX,Melissa,33.284114,-96.574009 +75455,TX,Mount Pleasant,33.173309,-94.969461 +75457,TX,Mount Vernon,33.170204,-95.218106 +75459,TX,Howe,33.534867,-96.640723 +75460,TX,Paris,33.658077,-95.537881 +75468,TX,Pattonville,33.570234,-95.3908 +75469,TX,Pecan Gap,33.419641,-95.826196 +75470,TX,Petty,33.609765,-95.789057 +75471,TX,Pickton,33.042401,-95.462979 +75472,TX,Point,32.900743,-95.890285 +75473,TX,Powderly,33.777877,-95.530692 +75474,TX,Quinlan,32.898347,-96.126083 +75476,TX,Ravenna,33.709757,-96.145157 +75477,TX,Roxton,33.542934,-95.741605 +75478,TX,Saltillo,33.176678,-95.343324 +75479,TX,Savoy,33.606571,-96.350156 +75480,TX,Scroggins,32.991177,-95.239683 +75481,TX,Sulphur Bluff,33.333379,-95.37396 +75482,TX,Sulphur Springs,33.134541,-95.592161 +75486,TX,Sumner,33.758941,-95.680671 +75487,TX,Talco,33.33436,-95.049718 +75488,TX,Telephone,33.797854,-96.044945 +75490,TX,Trenton,33.423491,-96.339754 +75491,TX,Whitewright,33.519041,-96.451025 +75492,TX,Windom,33.563295,-96.002002 +75493,TX,Winfield,33.161498,-95.078984 +75494,TX,Winnsboro,32.91462,-95.27265 +75495,TX,Van Alstyne,33.429169,-96.548632 +75496,TX,Wolfe City,33.360479,-96.06907 +75497,TX,Yantis,32.925694,-95.531113 +75501,TX,Wake Village,33.407371,-94.118245 +75503,TX,Texarkana,33.466906,-94.077374 +75550,TX,Annona,33.553519,-94.899226 +75551,TX,Atlanta,33.10898,-94.164617 +75554,TX,Avery,33.533935,-94.786708 +75555,TX,Bivins,32.96602,-94.140406 +75556,TX,Bloomburg,33.133859,-94.064688 +75558,TX,Cookville,33.181908,-94.873291 +75559,TX,De Kalb,33.472741,-94.621092 +75560,TX,Douglassville,33.175806,-94.346699 +75561,TX,Leary,33.477542,-94.269188 +75563,TX,Linden,33.004821,-94.360509 +75566,TX,Marietta,33.179618,-94.542098 +75567,TX,Maud,33.35504,-94.482267 +75568,TX,Naples,33.191186,-94.689061 +75569,TX,Nash,33.439786,-94.142237 +75570,TX,Boston,33.462119,-94.433882 +75571,TX,Omaha,33.180794,-94.763944 +75572,TX,Queen City,33.18736,-94.154825 +75574,TX,Simms,33.498727,-94.603862 +75601,TX,Longview,32.526854,-94.72328 +75602,TX,Longview,32.472373,-94.710078 +75603,TX,Longview,32.426368,-94.711691 +75604,TX,Longview,32.525139,-94.798957 +75605,TX,Longview,32.554711,-94.776748 +75630,TX,Avinger,32.848514,-94.579534 +75631,TX,Beckville,32.245165,-94.455451 +75633,TX,Carthage,32.154379,-94.352721 +75638,TX,Daingerfield,33.031263,-94.735899 +75639,TX,De Berry,32.254327,-94.13557 +75640,TX,New Diana,32.704585,-94.698122 +75643,TX,Gary,32.019848,-94.281501 +75644,TX,Gilmer,32.724565,-94.971434 +75647,TX,Gladewater,32.555858,-94.932001 +75650,TX,Hallsville,32.507283,-94.533308 +75651,TX,Harleton,32.657858,-94.465165 +75652,TX,Henderson,32.152375,-94.791962 +75656,TX,Hughes Springs,33.016763,-94.622758 +75657,TX,Smithland,32.779863,-94.371217 +75661,TX,Karnack,32.620508,-94.20005 +75662,TX,Kilgore,32.383557,-94.865271 +75667,TX,Laneville,31.950821,-94.866027 +75668,TX,Lone Star,32.946982,-94.718303 +75669,TX,Long Branch,32.050224,-94.472028 +75670,TX,Marshall,32.53378,-94.36191 +75681,TX,Mount Enterprise,31.9125,-94.623505 +75683,TX,Ore City,32.785588,-94.751401 +75684,TX,Overton,32.269041,-94.952914 +75686,TX,Pittsburg,32.96231,-94.960337 +75687,TX,Price,32.100842,-94.941494 +75689,TX,Turnertown,32.18734,-94.950805 +75691,TX,Tatum,32.326569,-94.596027 +75692,TX,Waskom,32.467183,-94.137884 +75693,TX,Clarksville City,32.537232,-94.862115 +75701,TX,Tyler,32.325366,-95.292179 +75702,TX,Tyler,32.361969,-95.311652 +75703,TX,Tyler,32.276827,-95.303147 +75704,TX,Tyler,32.373781,-95.406977 +75705,TX,Tyler,32.376599,-95.125225 +75706,TX,Tyler,32.444148,-95.330993 +75707,TX,Tyler,32.303782,-95.192692 +75708,TX,East Texas Cente,32.389193,-95.244354 +75709,TX,Tyler,32.307817,-95.395563 +75750,TX,Arp,32.241758,-95.063908 +75751,TX,Athens,32.193499,-95.84318 +75754,TX,Ben Wheeler,32.412588,-95.637085 +75755,TX,Big Sandy,32.61682,-95.088034 +75756,TX,Edom,32.290514,-95.62289 +75757,TX,Mount Selman,32.135745,-95.375045 +75758,TX,Chandler,32.270638,-95.502531 +75760,TX,Cushing,31.797767,-94.853887 +75762,TX,Flint,32.207927,-95.394848 +75763,TX,Frankston,32.053488,-95.516284 +75765,TX,Hawkins,32.643901,-95.222015 +75766,TX,Jacksonville,31.96177,-95.270328 +75770,TX,Larue,32.160758,-95.592661 +75771,TX,Mt Sylvan,32.517152,-95.429932 +75773,TX,Mineola,32.666059,-95.487032 +75778,TX,Murchison,32.325732,-95.77372 +75783,TX,Quitman,32.804862,-95.430161 +75784,TX,Reklaw,31.885858,-95.011834 +75785,TX,Dialville,31.80976,-95.173156 +75789,TX,Troup,32.104003,-95.122656 +75790,TX,Van,32.528265,-95.654538 +75791,TX,Whitehouse,32.221958,-95.226552 +75792,TX,Winona,32.466163,-95.124624 +75801,TX,Palestine,31.758752,-95.634158 +75831,TX,Freestone,31.457151,-96.058516 +75833,TX,Centerville,31.272025,-95.921287 +75835,TX,Austonio,31.315067,-95.46833 +75838,TX,Donie,31.487285,-96.238687 +75839,TX,Slocum,31.635087,-95.553232 +75840,TX,Fairfield,31.736136,-96.157176 +75844,TX,Grapeland,31.49721,-95.444713 +75845,TX,Groveton,31.065142,-95.096894 +75846,TX,Jewett,31.373925,-96.191841 +75847,TX,Kennard,31.338449,-95.154118 +75850,TX,Leona,31.14207,-95.928428 +75851,TX,Lovelady,31.0564,-95.550057 +75852,TX,Midway,30.980579,-95.70894 +75853,TX,Montalba,31.922165,-95.75926 +75855,TX,Oakwood,31.602312,-95.902151 +75856,TX,Pennington,31.161843,-95.158678 +75859,TX,Streetman,31.888532,-96.298763 +75860,TX,Teague,31.632772,-96.27778 +75861,TX,Tennessee Colony,31.792882,-95.899798 +75862,TX,Trinity,30.941951,-95.340295 +75901,TX,Keltys,31.336004,-94.734185 +75925,TX,Forest,31.647815,-95.079786 +75926,TX,Apple Springs,31.226923,-94.981152 +75928,TX,Bon Wier,30.687557,-93.766465 +75929,TX,Broaddus,31.295241,-94.215552 +75930,TX,Bronson,31.339056,-93.999256 +75931,TX,Brookeland,31.106273,-94.003566 +75932,TX,Burkeville,31.009934,-93.658517 +75933,TX,Call,30.574132,-93.833355 +75935,TX,Center,31.786468,-94.186947 +75936,TX,Chester,30.928532,-94.458099 +75937,TX,Chireno,31.511935,-94.430244 +75938,TX,Rockland,30.909226,-94.421811 +75939,TX,Barnum,31.000657,-94.7959 +75941,TX,Diboll,31.195028,-94.772911 +75943,TX,Douglass,31.657846,-94.869649 +75946,TX,Garrison,31.811111,-94.526604 +75948,TX,Hemphill,31.316123,-93.79045 +75949,TX,Huntington,31.283714,-94.566237 +75951,TX,Sam Rayburn,30.925348,-94.021481 +75954,TX,Joaquin,31.943989,-94.060833 +75956,TX,Bon Ami,30.688217,-93.927934 +75957,TX,Magnolia Springs,30.762882,-94.070896 +75959,TX,Milam,31.47001,-93.831816 +75960,TX,Moscow,30.917902,-94.85437 +75961,TX,Appleby,31.618534,-94.651093 +75966,TX,Newton,30.835074,-93.7497 +75968,TX,Pineland,31.241782,-93.97542 +75969,TX,Pollok,31.429107,-94.825403 +75972,TX,San Augustine,31.515173,-94.132581 +75973,TX,Shelbyville,31.713074,-93.969841 +75974,TX,Tenaha,31.940812,-94.248773 +75975,TX,Timpson,31.884089,-94.396733 +75976,TX,Wells,31.499755,-94.969351 +75977,TX,Wiergate,31.041417,-93.803854 +75979,TX,Dogwood,30.775133,-94.425494 +75980,TX,Zavalla,31.156863,-94.387115 +76006,TX,Arlington,32.778494,-97.083425 +76008,TX,Aledo,32.700351,-97.603885 +76009,TX,Alvarado,32.439499,-97.212971 +76010,TX,Arlington,32.720368,-97.082576 +76011,TX,Arlington,32.758236,-97.100302 +76012,TX,Arlington,32.753962,-97.134808 +76013,TX,Arlington,32.719905,-97.14416 +76014,TX,Arlington,32.695425,-97.087556 +76015,TX,Arlington,32.693125,-97.134685 +76016,TX,Arlington,32.688898,-97.190466 +76017,TX,Arlington,32.65545,-97.159899 +76018,TX,Arlington,32.654752,-97.091987 +76020,TX,Azle,32.903453,-97.541153 +76021,TX,Bedford,32.853579,-97.135797 +76022,TX,Bedford,32.829749,-97.145351 +76023,TX,Boyd,33.059367,-97.586797 +76028,TX,Burleson,32.531624,-97.308959 +76031,TX,Cleburne,32.342891,-97.397957 +76034,TX,Colleyville,32.88721,-97.146026 +76035,TX,Cresson,32.530714,-97.651931 +76036,TX,Crowley,32.581398,-97.370306 +76039,TX,Euless,32.858172,-97.083212 +76040,TX,Euless,32.826358,-97.097203 +76041,TX,Forreston,32.281131,-96.887522 +76043,TX,Glen Rose,32.229762,-97.762911 +76044,TX,Godley,32.428174,-97.534865 +76048,TX,Granbury,32.42505,-97.774173 +76049,TX,Granbury,32.448811,-97.728484 +76050,TX,Grandview,32.277856,-97.235069 +76051,TX,Grapevine,32.93143,-97.096203 +76052,TX,Haslet,32.955734,-97.337185 +76053,TX,Hurst,32.821107,-97.175613 +76054,TX,Hurst,32.855832,-97.175521 +76055,TX,Itasca,32.163589,-97.146034 +76058,TX,Joshua,32.466252,-97.401123 +76059,TX,Keene,32.393659,-97.32868 +76060,TX,Kennedale,32.64316,-97.213853 +76063,TX,Mansfield,32.577258,-97.141551 +76064,TX,Maypearl,32.327878,-96.98803 +76065,TX,Midlothian,32.475743,-96.993551 +76066,TX,Millsap,32.670019,-97.878386 +76067,TX,Mineral Wells,32.810283,-98.063051 +76070,TX,Nemo,32.271312,-97.656668 +76071,TX,Newark,33.007099,-97.510696 +76073,TX,Paradise,33.082607,-97.697423 +76077,TX,Rainbow,32.281216,-97.70652 +76078,TX,Rhome,33.054045,-97.481688 +76082,TX,Springtown,32.966021,-97.634951 +76084,TX,Venus,32.432975,-97.108734 +76086,TX,Weatherford,32.784074,-97.738591 +76087,TX,Weatherford,32.749473,-97.689439 +76092,TX,Grapevine,32.956456,-97.148066 +76093,TX,Rio Vista,32.253168,-97.367825 +76102,TX,Fort Worth,32.758897,-97.328023 +76103,TX,Fort Worth,32.747005,-97.260394 +76104,TX,Fort Worth,32.725551,-97.318409 +76105,TX,Fort Worth,32.723325,-97.26899 +76106,TX,Fort Worth,32.796849,-97.356008 +76107,TX,Fort Worth,32.739175,-97.385248 +76108,TX,White Settlement,32.759271,-97.474063 +76109,TX,Fort Worth,32.700246,-97.378876 +76110,TX,Fort Worth,32.706505,-97.337505 +76111,TX,Fort Worth,32.782382,-97.300327 +76112,TX,Fort Worth,32.749297,-97.218122 +76114,TX,River Oaks,32.775379,-97.401526 +76115,TX,Fort Worth,32.679618,-97.333634 +76116,TX,Fort Worth,32.723032,-97.448279 +76117,TX,Haltom City,32.808742,-97.270891 +76118,TX,North Richland H,32.808944,-97.222781 +76119,TX,Fort Worth,32.691379,-97.267492 +76120,TX,Fort Worth,32.763912,-97.178112 +76123,TX,Fort Worth,32.625361,-97.365838 +76126,TX,Benbrook,32.670023,-97.464141 +76127,TX,Carswell Afb,32.771846,-97.435453 +76131,TX,Fort Worth,32.863156,-97.337656 +76132,TX,Fort Worth,32.671092,-97.405626 +76133,TX,Fort Worth,32.652561,-97.375849 +76134,TX,Fort Worth,32.646886,-97.332467 +76135,TX,Fort Worth,32.824844,-97.45191 +76137,TX,Fort Worth,32.866421,-97.289114 +76140,TX,Everman,32.631332,-97.270406 +76148,TX,Watauga,32.8681,-97.249029 +76155,TX,Fort Worth,32.824742,-97.050285 +76177,TX,Fort Worth,32.901017,-97.332671 +76179,TX,Saginaw,32.872961,-97.403149 +76180,TX,North Richland H,32.853966,-97.220714 +76201,TX,Denton,33.22893,-97.131436 +76205,TX,Denton,33.180106,-97.101833 +76225,TX,Alvord,33.36982,-97.688488 +76226,TX,Argyle,33.106244,-97.159977 +76227,TX,Aubrey,33.291997,-96.987866 +76228,TX,Bellevue,33.58789,-98.157373 +76230,TX,Bowie,33.556796,-97.837337 +76233,TX,Collinsville,33.558012,-96.901365 +76234,TX,Decatur,33.235077,-97.573995 +76238,TX,Era,33.50101,-97.292358 +76239,TX,Forestburg,33.539778,-97.584774 +76240,TX,Lake Kiowa,33.625943,-97.103208 +76245,TX,Gordonville,33.834283,-96.84027 +76247,TX,Justin,33.073375,-97.309254 +76248,TX,Keller,32.927556,-97.248883 +76249,TX,Krum,33.27337,-97.267452 +76250,TX,Lindsay,33.63601,-97.221436 +76251,TX,Montague,33.663899,-97.728226 +76252,TX,Muenster,33.659549,-97.362409 +76255,TX,Nocona,33.798163,-97.726982 +76258,TX,Pilot Point,33.370983,-96.944554 +76259,TX,Ponder,33.177383,-97.284815 +76261,TX,Ringgold,33.816392,-97.943982 +76262,TX,Trophy Club,32.98639,-97.205346 +76263,TX,Rosston,33.483795,-97.454172 +76264,TX,Sadler,33.730989,-96.840017 +76265,TX,Saint Jo,33.744024,-97.556756 +76266,TX,Sanger,33.356266,-97.181432 +76270,TX,Sunset,33.453909,-97.770891 +76271,TX,Tioga,33.467493,-96.909712 +76272,TX,Valley View,33.502166,-97.231053 +76273,TX,Whitesboro,33.659021,-96.878984 +76301,TX,Wichita Falls,33.905284,-98.497645 +76302,TX,Wichita Falls,33.864278,-98.493987 +76303,TX,Wichita Falls,33.899837,-98.460812 +76304,TX,Wichita Falls,33.930806,-98.500491 +76305,TX,Wichita Falls,33.937345,-98.540679 +76306,TX,Wichita Falls,33.974595,-98.524835 +76308,TX,Wichita Falls,33.863258,-98.533965 +76309,TX,Wichita Falls,33.893084,-98.534288 +76310,TX,Wichita Falls,33.858122,-98.575548 +76311,TX,Sheppard Afb,33.982353,-98.508771 +76350,TX,76350,33.431472,-98.371578 +76354,TX,Burkburnett,34.085989,-98.570842 +76357,TX,Byers,34.072812,-98.183929 +76359,TX,Elbert,33.015687,-99.055214 +76360,TX,Electra,34.036234,-98.91545 +76363,TX,Goree,33.474832,-99.525806 +76364,TX,Harrold,34.097097,-99.035052 +76365,TX,Henrietta,33.819609,-98.259976 +76366,TX,Holliday,33.675141,-98.657634 +76367,TX,Iowa Park,33.94235,-98.674497 +76371,TX,Munday,33.456088,-99.632624 +76372,TX,Newcastle,33.190103,-98.744644 +76373,TX,Oklaunion,34.120372,-99.160234 +76374,TX,Olney,33.360135,-98.742695 +76377,TX,Petrolia,34.027331,-98.269223 +76378,TX,76378,33.611763,-99.40547 +76379,TX,Scotland,33.653486,-98.464983 +76380,TX,Seymour,33.591445,-99.258727 +76383,TX,Vera,33.615469,-99.759098 +76384,TX,Vernon,34.149135,-99.30301 +76388,TX,Weinert,33.324872,-99.666431 +76389,TX,Windthorst,33.57957,-98.437589 +76401,TX,Stephenville,32.221372,-98.222407 +76424,TX,Breckenridge,32.753166,-98.909882 +76426,TX,Bridgeport,33.187027,-97.78098 +76427,TX,Bryson,33.15947,-98.370256 +76429,TX,Caddo,32.688617,-98.658983 +76430,TX,Albany,32.719005,-99.319581 +76431,TX,Chico,33.319315,-97.803133 +76432,TX,Blanket,31.78819,-98.831089 +76433,TX,Bluff Dale,32.401791,-98.163775 +76435,TX,Carbon,32.270125,-98.83479 +76436,TX,Carlton,31.911438,-98.152519 +76437,TX,Cisco,32.380043,-98.986507 +76442,TX,Comanche,31.911637,-98.608227 +76443,TX,Cross Plains,32.148159,-99.18718 +76444,TX,De Leon,32.108742,-98.54894 +76445,TX,Desdemona,32.281877,-98.567327 +76446,TX,Dublin,32.090873,-98.345469 +76447,TX,76447,32.081163,-98.067535 +76448,TX,Eastland,32.399418,-98.807101 +76449,TX,Graford,32.924192,-98.337002 +76450,TX,Graham,33.099283,-98.583212 +76453,TX,Gordon,32.547828,-98.363211 +76454,TX,Gorman,32.223441,-98.683408 +76455,TX,Gustine,31.872448,-98.383488 +76457,TX,Hico,31.959718,-98.024933 +76458,TX,Jacksboro,33.234655,-98.168138 +76459,TX,Jermyn,33.263554,-98.393149 +76460,TX,Loving,33.26886,-98.50237 +76462,TX,Lipan,32.507218,-97.953614 +76463,TX,Mingus,32.562665,-98.426262 +76464,TX,Moran,32.554909,-99.165567 +76470,TX,Ranger,32.46809,-98.674659 +76471,TX,Rising Star,32.127986,-98.985852 +76472,TX,Santo,32.597935,-98.179675 +76474,TX,Sidney,31.932031,-98.767995 +76475,TX,Strawn,32.5945,-98.499467 +76476,TX,Tolar,32.377246,-97.880208 +76483,TX,Throckmorton,33.179446,-99.183812 +76484,TX,Palo Pinto,32.725315,-98.270262 +76486,TX,Perrin,33.058453,-98.044006 +76487,TX,Poolville,32.968023,-97.847229 +76490,TX,Whitt,32.955459,-98.021008 +76491,TX,Woodson,33.301972,-99.015953 +76501,TX,Temple,31.089518,-97.334264 +76502,TX,Temple,31.071004,-97.389781 +76504,TX,Temple,31.091742,-97.364764 +76511,TX,Bartlett,30.799056,-97.426302 +76513,TX,Belton,31.072298,-97.472025 +76518,TX,Buckholts,30.885756,-97.124135 +76519,TX,Burlington,30.945691,-96.885308 +76520,TX,Cameron,30.852713,-96.976562 +76522,TX,Izoro,31.125799,-97.912132 +76523,TX,Davilla,30.767471,-97.200865 +76524,TX,Eddy,31.326724,-97.270926 +76525,TX,Bee House,31.403967,-98.055175 +76526,TX,Flat,31.306475,-97.589777 +76527,TX,Florence,30.78137,-97.834423 +76528,TX,Turnersville,31.447646,-97.724286 +76530,TX,Granger,30.739813,-97.445065 +76531,TX,Hamilton,31.678116,-98.113051 +76534,TX,Holland,30.879977,-97.385695 +76537,TX,Jarrell,30.748406,-97.600833 +76538,TX,Jonesboro,31.599601,-97.775155 +76539,TX,Kempner,31.073051,-97.972068 +76541,TX,Killeen,31.116426,-97.727808 +76542,TX,Harker Heights,31.075056,-97.746736 +76543,TX,Harker Heights,31.100505,-97.676864 +76544,TX,Fort Hood,31.137953,-97.776404 +76550,TX,Lampasas,31.067957,-98.183361 +76556,TX,Milano,30.736612,-96.803477 +76557,TX,Moody,31.253321,-97.409957 +76559,TX,Nolanville,31.083271,-97.594109 +76561,TX,Oglesby,31.443767,-97.550093 +76565,TX,Pottsville,31.68374,-98.356077 +76566,TX,Purmela,31.472647,-97.888945 +76567,TX,Rockdale,30.658282,-97.0079 +76569,TX,Rogers,30.955013,-97.222793 +76570,TX,Rosebud,31.092208,-96.975455 +76571,TX,Salado,30.949388,-97.532999 +76574,TX,Taylor,30.58071,-97.440103 +76577,TX,Thorndale,30.608237,-97.176446 +76578,TX,Thrall,30.591981,-97.289261 +76579,TX,Troy,31.175855,-97.285205 +76621,TX,Abbott,31.891642,-97.067146 +76622,TX,Aquilla,31.858882,-97.22577 +76624,TX,Axtell,31.660966,-96.988178 +76626,TX,Blooming Grove,32.075839,-96.700991 +76627,TX,Blum,32.105183,-97.365183 +76629,TX,Bremond,31.156007,-96.669744 +76630,TX,Bruceville,31.326708,-97.234244 +76631,TX,Bynum,31.990668,-96.983702 +76632,TX,Chilton,31.310018,-97.09002 +76633,TX,China Spring,31.667266,-97.300221 +76634,TX,Laguna Park,31.799689,-97.515282 +76635,TX,Coolidge,31.743804,-96.657744 +76636,TX,Covington,32.159538,-97.259091 +76637,TX,Cranfills Gap,31.781071,-97.78537 +76638,TX,Crawford,31.559765,-97.389992 +76639,TX,Dawson,31.897429,-96.708483 +76640,TX,Elm Mott,31.672547,-97.113838 +76641,TX,Frost,32.027545,-96.768437 +76642,TX,Groesbeck,31.535667,-96.523381 +76643,TX,Hewitt,31.458166,-97.196556 +76645,TX,Hillsboro,32.014942,-97.119791 +76648,TX,Hubbard,31.843559,-96.80001 +76649,TX,Iredell,31.972197,-97.879283 +76651,TX,Italy,32.178508,-96.88229 +76652,TX,Kopperl,32.103491,-97.542085 +76653,TX,Kosse,31.314704,-96.619475 +76655,TX,Lorena,31.409271,-97.230161 +76656,TX,Lott,31.192462,-97.058143 +76657,TX,Mc Gregor,31.443099,-97.394318 +76660,TX,Malone,31.923979,-96.890682 +76661,TX,Marlin,31.303592,-96.888942 +76664,TX,Mart,31.545798,-96.838133 +76665,TX,Meridian,31.929022,-97.64433 +76666,TX,Mertens,32.02753,-96.898128 +76667,TX,Mexia,31.678386,-96.495186 +76670,TX,Milford,32.148198,-96.96115 +76671,TX,Morgan,32.01946,-97.560829 +76673,TX,Mount Calm,31.757504,-96.894393 +76675,TX,Otto,31.432733,-96.875904 +76676,TX,Penelope,31.855148,-96.937164 +76678,TX,Prairie Hill,31.659097,-96.809381 +76679,TX,Purdon,31.948285,-96.585619 +76680,TX,Reagan,31.229713,-96.741943 +76681,TX,Richland,31.901785,-96.437262 +76682,TX,Riesel,31.500247,-96.94764 +76687,TX,Thornton,31.408326,-96.502378 +76689,TX,Valley Mills,31.659876,-97.493461 +76690,TX,Walnut Springs,32.059268,-97.751423 +76691,TX,West,31.775385,-97.125843 +76692,TX,Bonanza,31.959201,-97.33495 +76693,TX,Wortham,31.786542,-96.420208 +76701,TX,Waco,31.552452,-97.139608 +76704,TX,Bellmead,31.575701,-97.126742 +76705,TX,Bellmead,31.610787,-97.094575 +76706,TX,Waco,31.517086,-97.119752 +76707,TX,Waco,31.552709,-97.158824 +76708,TX,Waco,31.576544,-97.178635 +76710,TX,Waco,31.534981,-97.189891 +76711,TX,Beverly Hills,31.519863,-97.150254 +76712,TX,Woodway,31.505074,-97.231062 +76801,TX,Early,31.704658,-98.975164 +76820,TX,Art,30.775419,-99.093732 +76821,TX,Ballinger,31.746836,-99.958927 +76823,TX,Bangs,31.768388,-99.107657 +76824,TX,Bend,31.11231,-98.482102 +76825,TX,Fife,31.128304,-99.3372 +76827,TX,Brookesmith,31.517602,-99.127729 +76828,TX,Burkett,31.998623,-99.255258 +76831,TX,Castell,30.697429,-98.931859 +76832,TX,Cherokee,30.980598,-98.66332 +76834,TX,Coleman,31.828651,-99.427007 +76836,TX,Doole,31.415743,-99.550605 +76837,TX,Eden,31.219219,-99.840658 +76841,TX,Fort Mc Kavett,30.82903,-100.080928 +76842,TX,Fredonia,30.921386,-99.12156 +76844,TX,Goldthwaite,31.445769,-98.574405 +76845,TX,Gouldbusk,31.551075,-99.51363 +76848,TX,Hext,30.881632,-99.554008 +76849,TX,Junction,30.47544,-99.74731 +76850,TX,76850,30.879689,-99.299552 +76852,TX,Lohn,31.317297,-99.38334 +76853,TX,Lometa,31.216712,-98.400553 +76854,TX,London,30.617101,-99.625527 +76856,TX,Mason,30.743392,-99.226117 +76857,TX,May,31.957082,-98.965646 +76858,TX,Melvin,31.185145,-99.5439 +76859,TX,Menard,30.911898,-99.784721 +76861,TX,Miles,31.612052,-100.182292 +76862,TX,Millersview,31.416745,-99.717137 +76864,TX,Mullin,31.574829,-98.663542 +76865,TX,Norton,31.879498,-100.131515 +76866,TX,Paint Rock,31.504808,-99.913936 +76867,TX,Pear Valley,31.297211,-99.494742 +76869,TX,Pontotoc,30.890617,-99.021224 +76870,TX,Priddy,31.687418,-98.501464 +76871,TX,Richland Springs,31.275317,-98.850731 +76872,TX,Rochelle,31.300011,-99.157229 +76873,TX,Rockwood,31.503677,-99.374579 +76874,TX,Roosevelt,30.532203,-99.916501 +76875,TX,Rowena,31.64355,-100.019094 +76877,TX,San Saba,31.162678,-98.730929 +76878,TX,Santa Anna,31.721477,-99.321197 +76880,TX,Star,31.479039,-98.415752 +76882,TX,Talpa,31.803424,-99.674679 +76883,TX,Telegraph,30.367365,-99.928369 +76884,TX,Valera,31.77314,-99.563962 +76885,TX,Valley Spring,30.836862,-98.832541 +76887,TX,Voca,30.995874,-99.168203 +76888,TX,Leaday,31.639194,-99.538536 +76890,TX,Zephyr,31.669429,-98.818199 +76901,TX,San Angelo,31.478165,-100.481752 +76903,TX,San Angelo,31.470735,-100.438586 +76904,TX,San Angelo,31.419411,-100.480036 +76905,TX,San Angelo,31.464738,-100.390005 +76930,TX,Barnhart,31.159647,-101.191752 +76932,TX,Best,31.240592,-101.478776 +76933,TX,Bronte,31.878939,-100.298765 +76934,TX,Carlsbad,31.597995,-100.627501 +76935,TX,Christoval,31.23461,-100.52031 +76936,TX,Eldorado,30.86667,-100.58894 +76937,TX,Eola,31.429812,-100.072892 +76940,TX,Mereta,31.48632,-100.183391 +76941,TX,Mertzon,31.282884,-100.822101 +76943,TX,Ozona,30.716369,-101.238802 +76945,TX,Robert Lee,31.895091,-100.510366 +76949,TX,Silver,32.048371,-100.692229 +76950,TX,Sonora,30.555752,-100.630667 +76951,TX,Sterling City,31.835063,-101.001729 +76955,TX,Vancourt,31.340417,-100.180367 +76957,TX,Wall,31.369445,-100.322132 +77002,TX,Houston,29.759366,-95.359361 +77003,TX,Houston,29.748903,-95.339108 +77004,TX,Houston,29.724687,-95.362546 +77005,TX,Houston,29.717856,-95.426261 +77006,TX,Houston,29.740899,-95.392255 +77007,TX,Houston,29.773603,-95.403421 +77008,TX,Houston,29.799096,-95.411797 +77009,TX,Houston,29.793558,-95.367481 +77010,TX,Houston,29.75125,-95.356549 +77011,TX,Houston,29.741992,-95.307262 +77012,TX,Houston,29.71491,-95.281925 +77013,TX,Houston,29.784169,-95.230134 +77014,TX,Houston,29.979637,-95.462497 +77015,TX,Houston,29.785287,-95.185189 +77016,TX,Houston,29.857855,-95.303199 +77017,TX,Houston,29.686301,-95.255485 +77018,TX,Houston,29.827166,-95.426631 +77019,TX,Houston,29.751651,-95.40539 +77020,TX,Houston,29.775759,-95.312101 +77021,TX,Houston,29.69538,-95.356151 +77022,TX,Houston,29.829862,-95.376862 +77023,TX,Houston,29.724179,-95.317777 +77024,TX,Houston,29.76958,-95.520063 +77025,TX,Houston,29.688897,-95.434107 +77026,TX,Houston,29.797168,-95.328775 +77027,TX,Houston,29.739571,-95.446032 +77028,TX,Houston,29.829657,-95.287886 +77029,TX,Jacinto City,29.760326,-95.254861 +77030,TX,V A Hospital,29.70372,-95.40619 +77031,TX,Houston,29.658144,-95.541281 +77032,TX,Houston,29.93676,-95.329883 +77033,TX,Houston,29.668566,-95.338157 +77034,TX,Houston,29.636395,-95.221615 +77035,TX,Houston,29.651833,-95.485368 +77036,TX,Houston,29.698447,-95.540464 +77037,TX,Houston,29.889161,-95.393515 +77038,TX,Houston,29.91956,-95.438601 +77039,TX,Houston,29.906731,-95.33338 +77040,TX,Jersey Village,29.879613,-95.529969 +77041,TX,Houston,29.860187,-95.581663 +77042,TX,Houston,29.740446,-95.558895 +77043,TX,Houston,29.805181,-95.560734 +77044,TX,Houston,29.863485,-95.19757 +77045,TX,Houston,29.629717,-95.438166 +77046,TX,Houston,29.73279,-95.431845 +77047,TX,Houston,29.625443,-95.374993 +77048,TX,Houston,29.632097,-95.341606 +77049,TX,Houston,29.823471,-95.184815 +77050,TX,Houston,29.901456,-95.284837 +77051,TX,Houston,29.65792,-95.368763 +77053,TX,Houston,29.596156,-95.458709 +77054,TX,Houston,29.685209,-95.401677 +77055,TX,Houston,29.797064,-95.495787 +77056,TX,Houston,29.744584,-95.468282 +77057,TX,Houston,29.74217,-95.490253 +77058,TX,Houston,29.574787,-95.057413 +77059,TX,Houston,29.597493,-95.113354 +77060,TX,Houston,29.933462,-95.398061 +77061,TX,Houston,29.665221,-95.278987 +77062,TX,Houston,29.572084,-95.130292 +77063,TX,Houston,29.734843,-95.522039 +77064,TX,Houston,29.918981,-95.556894 +77065,TX,Houston,29.931933,-95.61063 +77066,TX,Houston,29.961027,-95.494717 +77067,TX,Houston,29.954717,-95.452158 +77068,TX,Houston,30.006867,-95.489661 +77069,TX,Houston,29.986292,-95.520827 +77070,TX,Houston,29.978099,-95.58027 +77071,TX,Houston,29.651838,-95.517554 +77072,TX,Houston,29.699026,-95.586155 +77073,TX,Houston,30.019767,-95.408671 +77074,TX,Houston,29.689601,-95.510588 +77075,TX,Houston,29.622276,-95.259983 +77076,TX,Houston,29.85801,-95.383442 +77077,TX,Houston,29.747656,-95.602991 +77078,TX,Houston,29.849724,-95.258208 +77079,TX,Houston,29.773759,-95.597993 +77080,TX,Houston,29.815854,-95.522986 +77081,TX,Houston,29.711926,-95.484531 +77082,TX,Houston,29.722283,-95.628533 +77083,TX,Houston,29.694709,-95.651098 +77084,TX,Houston,29.844022,-95.662329 +77085,TX,Houston,29.621787,-95.481945 +77086,TX,Houston,29.922667,-95.493868 +77087,TX,Houston,29.687579,-95.301062 +77088,TX,Houston,29.881694,-95.453877 +77089,TX,Houston,29.593978,-95.221786 +77090,TX,Houston,30.016673,-95.447002 +77091,TX,Houston,29.853448,-95.443521 +77092,TX,Houston,29.832391,-95.472031 +77093,TX,Houston,29.861661,-95.340286 +77094,TX,Houston,29.770536,-95.710742 +77095,TX,Houston,29.894115,-95.648082 +77096,TX,Houston,29.672205,-95.486066 +77098,TX,Houston,29.734987,-95.411778 +77099,TX,Houston,29.670869,-95.586613 +77301,TX,Conroe,30.312535,-95.452667 +77302,TX,Grangerland,30.250357,-95.416087 +77303,TX,Cut And Shoot,30.344456,-95.369725 +77304,TX,Panorama Village,30.327351,-95.495244 +77327,TX,Cleveland,30.329977,-95.020152 +77331,TX,Coldspring,30.602661,-95.10858 +77335,TX,Goodrich,30.607909,-94.95922 +77336,TX,Huffman,30.056491,-95.105069 +77338,TX,Humble,30.004091,-95.282476 +77339,TX,Humble,30.056333,-95.210716 +77340,TX,Huntsville,30.73435,-95.534186 +77345,TX,Humble,30.056641,-95.170654 +77346,TX,Humble,30.004195,-95.172815 +77351,TX,Segno,30.718018,-94.935278 +77355,TX,Magnolia,30.1678,-95.688989 +77356,TX,Montgomery,30.363932,-95.650342 +77357,TX,New Caney,30.157933,-95.197968 +77358,TX,New Waverly,30.535357,-95.453194 +77359,TX,Oakhurst,30.71262,-95.309478 +77362,TX,Pinehurst,30.158052,-95.681406 +77363,TX,Plantersville,30.296931,-95.849812 +77364,TX,Pointblank,30.75926,-95.229494 +77365,TX,Porter,30.123731,-95.268613 +77371,TX,Shepherd,30.483396,-95.092913 +77372,TX,Splendora,30.232609,-95.199308 +77373,TX,Spring,30.053241,-95.377329 +77375,TX,Tomball,30.073923,-95.62006 +77378,TX,Willis,30.432025,-95.497583 +77379,TX,Klein,30.023377,-95.528481 +77380,TX,The Woodlands,30.13739,-95.468944 +77381,TX,The Woodlands,30.168887,-95.500743 +77384,TX,Conroe,30.225725,-95.492392 +77385,TX,Conroe,30.187695,-95.428789 +77386,TX,Spring,30.128805,-95.423943 +77388,TX,Spring,30.050546,-95.469456 +77389,TX,Spring,30.104398,-95.506624 +77396,TX,Humble,29.950697,-95.262186 +77401,TX,Bellaire,29.702313,-95.461106 +77414,TX,Sargent,28.96183,-95.92817 +77417,TX,Beasley,29.479045,-95.968145 +77418,TX,Bellville,29.96583,-96.253083 +77419,TX,Blessing,28.864947,-96.217956 +77420,TX,Boling,29.252874,-95.974045 +77422,TX,Brazoria,29.023642,-95.586683 +77423,TX,Brookshire,29.807168,-95.975537 +77426,TX,Chappell Hill,30.183271,-96.234739 +77429,TX,Cypress,29.976608,-95.635778 +77430,TX,Damon,29.301381,-95.703577 +77432,TX,Danevang,29.066969,-96.19765 +77433,TX,Cypress,29.883633,-95.702456 +77434,TX,Eagle Lake,29.584236,-96.335367 +77435,TX,East Bernard,29.470458,-96.121115 +77437,TX,El Campo,29.200776,-96.274266 +77440,TX,Elmaton,28.83209,-96.13351 +77441,TX,Fulshear,29.721698,-95.897682 +77442,TX,Garwood,29.476001,-96.491925 +77444,TX,Guy,29.332676,-95.770227 +77445,TX,Hempstead,30.091973,-96.071648 +77447,TX,Hockley,30.072888,-95.810447 +77449,TX,Park Row,29.819922,-95.729267 +77450,TX,Park Row,29.767632,-95.744506 +77455,TX,Louise,29.14908,-96.392374 +77456,TX,Markham,28.954701,-96.092768 +77457,TX,Matagorda,28.764926,-95.951891 +77458,TX,Midfield,28.936166,-96.226527 +77459,TX,Missouri City,29.570434,-95.542284 +77461,TX,Needville,29.41165,-95.827288 +77465,TX,Palacios,28.71504,-96.215439 +77468,TX,Pledger,29.179208,-95.898591 +77469,TX,Clodine,29.593226,-95.752122 +77471,TX,Rosenberg,29.549727,-95.798213 +77474,TX,Sealy,29.782632,-96.159189 +77477,TX,Stafford,29.622816,-95.567764 +77478,TX,Sugar Land,29.634153,-95.621856 +77479,TX,Sugar Land,29.578537,-95.606591 +77480,TX,Sweeny,29.041508,-95.700363 +77482,TX,Van Vleck,29.013879,-95.938903 +77483,TX,Wadsworth,28.614288,-95.971307 +77484,TX,Waller,30.086008,-95.961275 +77485,TX,Wallis,29.63968,-96.045574 +77486,TX,West Columbia,29.140823,-95.669388 +77488,TX,Wharton,29.320488,-96.085828 +77489,TX,Missouri City,29.596206,-95.511512 +77493,TX,Park Row,29.804876,-95.815988 +77494,TX,Park Row,29.750893,-95.811675 +77502,TX,Pasadena,29.678945,-95.198193 +77503,TX,Pasadena,29.687696,-95.15721 +77504,TX,Pasadena,29.650133,-95.188478 +77505,TX,Pasadena,29.651753,-95.146388 +77506,TX,Pasadena,29.70087,-95.19895 +77507,TX,Pasadena,29.6055,-95.079365 +77510,TX,Alta Loma,29.371854,-95.089429 +77511,TX,Alvin,29.41195,-95.251535 +77514,TX,Monroe City,29.780987,-94.554819 +77515,TX,Angleton,29.181049,-95.446661 +77517,TX,Arcadia,29.380259,-95.129003 +77518,TX,Bacliff,29.505506,-94.989293 +77519,TX,Batson,30.22502,-94.60959 +77520,TX,Baytown,29.746063,-94.965265 +77521,TX,Baytown,29.770482,-94.969549 +77530,TX,Channelview,29.791438,-95.131655 +77531,TX,Clute,29.032502,-95.402595 +77532,TX,Barrett,29.937812,-95.07522 +77534,TX,Danbury,29.229082,-95.343465 +77535,TX,Dayton,30.010208,-94.878747 +77536,TX,Deer Park,29.682571,-95.122192 +77538,TX,Devers,29.997835,-94.574615 +77539,TX,San Leon,29.466033,-95.034496 +77541,TX,Quintana,28.96968,-95.371389 +77545,TX,Fresno,29.52931,-95.462608 +77546,TX,Friendswood,29.522399,-95.187888 +77547,TX,Galena Park,29.739204,-95.240001 +77550,TX,Galveston,29.298272,-94.79297 +77551,TX,Galveston,29.276584,-94.830334 +77554,TX,Galveston,29.229638,-94.913716 +77560,TX,Hankamer,29.87524,-94.593846 +77562,TX,Highlands,29.829599,-95.039286 +77563,TX,Hitchcock,29.339835,-94.992591 +77564,TX,Hull,30.13337,-94.660382 +77565,TX,Clear Lake Shore,29.543823,-95.039209 +77566,TX,Lake Jackson,29.039275,-95.440119 +77568,TX,La Marque,29.3676,-94.974159 +77571,TX,Shoreacres,29.660098,-95.05721 +77573,TX,League City,29.517281,-95.096274 +77575,TX,Ames,30.072794,-94.763819 +77577,TX,Liverpool,29.311457,-95.240754 +77578,TX,Manvel,29.469381,-95.35033 +77581,TX,Pearland,29.561656,-95.272069 +77583,TX,Rosharon,29.420329,-95.453732 +77584,TX,Pearland,29.540479,-95.320778 +77585,TX,Saratoga,30.339817,-94.571718 +77586,TX,El Lago,29.572895,-95.028739 +77587,TX,South Houston,29.660097,-95.22582 +77590,TX,Texas City,29.396984,-94.920298 +77591,TX,Texas City,29.389097,-94.994204 +77597,TX,Wallisville,29.859096,-94.675896 +77598,TX,Webster,29.55641,-95.143985 +77611,TX,Bridge City,30.04054,-93.847293 +77612,TX,Buna,30.413209,-93.991263 +77614,TX,Deweyville,30.289295,-93.77305 +77616,TX,Fred,30.598657,-94.185948 +77619,TX,Groves,29.944779,-93.915187 +77622,TX,Hamshire,29.866769,-94.318739 +77624,TX,Hillister,30.689911,-94.407588 +77625,TX,Kountze,30.370316,-94.325905 +77627,TX,Nederland,29.971609,-94.001192 +77630,TX,West Orange,30.125167,-93.771883 +77640,TX,Port Acres,29.882557,-93.962562 +77642,TX,Port Arthur,29.92119,-93.926962 +77650,TX,Crystal Beach,29.459788,-94.611678 +77651,TX,Port Neches,29.976983,-93.962624 +77656,TX,Silsbee,30.324387,-94.190726 +77659,TX,Sour Lake,30.149134,-94.373341 +77660,TX,Spurger,30.778057,-94.212745 +77662,TX,Vidor,30.15018,-94.000779 +77664,TX,Warren,30.597776,-94.411974 +77665,TX,Winnie,29.815676,-94.339499 +77701,TX,Beaumont,30.068805,-94.103896 +77702,TX,Beaumont,30.087057,-94.125412 +77703,TX,Beaumont,30.113201,-94.119698 +77705,TX,Beaumont,30.021128,-94.115673 +77706,TX,Beaumont,30.094834,-94.164816 +77707,TX,Beaumont,30.068567,-94.175541 +77708,TX,Beaumont,30.139957,-94.160357 +77713,TX,Beaumont,30.084996,-94.260719 +77801,TX,Bryan,30.632698,-96.36616 +77802,TX,Bryan,30.658171,-96.335143 +77803,TX,Bryan,30.691293,-96.371398 +77830,TX,Anderson,30.544291,-96.001822 +77831,TX,Singleton,30.764059,-95.933569 +77833,TX,Brenham,30.17736,-96.402769 +77835,TX,Burton,30.176744,-96.592475 +77836,TX,Caldwell,30.529819,-96.714292 +77837,TX,Calvert,30.978211,-96.67107 +77840,TX,College Station,30.604476,-96.31227 +77843,TX,College Station,30.614738,-96.340001 +77845,TX,College Station,30.511811,-96.317113 +77850,TX,Concord,31.263144,-96.102643 +77853,TX,Dime Box,30.35786,-96.824781 +77856,TX,Franklin,31.035013,-96.442643 +77859,TX,Hearne,30.86686,-96.584256 +77861,TX,Iola,30.732637,-96.091075 +77864,TX,Madisonville,30.953335,-95.909094 +77865,TX,Marquez,31.230889,-96.237499 +77868,TX,Navasota,30.357645,-96.059357 +77871,TX,Hilltop Lakes,31.087473,-96.147274 +77872,TX,North Zulch,30.928531,-96.092486 +77873,TX,Richards,30.538166,-95.861053 +77879,TX,Somerville,30.407585,-96.535825 +77880,TX,Washington,30.31819,-96.224948 +77901,TX,Victoria,28.808953,-96.999347 +77904,TX,Victoria,28.867482,-96.998993 +77951,TX,Bloomington,28.68898,-96.884076 +77954,TX,Cuero,29.090969,-97.281247 +77957,TX,Edna,28.952714,-96.648766 +77962,TX,Ganado,29.03084,-96.503078 +77963,TX,Goliad,28.699257,-97.378321 +77964,TX,Hallettsville,29.442609,-96.923423 +77968,TX,Inez,28.899416,-96.800294 +77971,TX,Lolita,28.772449,-96.47933 +77974,TX,Meyersville,28.922921,-97.304161 +77975,TX,Moulton,29.569992,-97.103122 +77979,TX,Port Lavaca,28.601135,-96.625941 +77982,TX,Port O Connor,28.140032,-96.775131 +77983,TX,Seadrift,28.410113,-96.702279 +77984,TX,Shiner,29.428038,-97.163955 +77990,TX,Tivoli,28.440122,-96.887172 +77994,TX,Westhoff,29.054983,-97.351102 +77995,TX,Yoakum,29.283954,-97.13063 +78002,TX,Atascosa,29.270501,-98.74212 +78003,TX,Bandera,29.72755,-99.045279 +78004,TX,Bergheim,29.839873,-98.593258 +78005,TX,Bigfoot,29.053073,-98.85823 +78006,TX,Sisterdale,29.77774,-98.713406 +78007,TX,Calliham,28.417682,-98.407873 +78008,TX,Campbellton,28.76699,-98.256573 +78009,TX,Castroville,29.35532,-98.882391 +78010,TX,Camp Verde,29.939658,-99.00714 +78011,TX,Charlotte,28.864871,-98.707001 +78013,TX,Comfort,29.979072,-98.843772 +78014,TX,Cotulla,28.439837,-99.232818 +78016,TX,Devine,29.152078,-98.908994 +78017,TX,Dilley,28.678201,-99.174684 +78019,TX,Encinal,28.051329,-99.340902 +78021,TX,Fowlerton,28.488666,-98.851821 +78022,TX,George West,28.320388,-98.116159 +78023,TX,Grey Forest,29.592203,-98.703534 +78024,TX,Hunt,30.002694,-99.482329 +78025,TX,Ingram,30.073126,-99.269022 +78026,TX,Jourdanton,28.902985,-98.544037 +78027,TX,Kendalia,29.940619,-98.516556 +78028,TX,Kerrville,30.041647,-99.140817 +78039,TX,La Coste,29.308178,-98.812466 +78040,TX,Laredo,27.515538,-99.498579 +78041,TX,Laredo,27.556933,-99.490653 +78043,TX,Rio Bravo,27.481537,-99.465488 +78052,TX,Lytle,29.236568,-98.794489 +78053,TX,Mc Coy,28.792661,-98.371565 +78055,TX,Medina,29.790689,-99.306431 +78056,TX,Mico,29.59105,-98.882106 +78057,TX,Moore,29.035377,-98.987403 +78058,TX,Mountain Home,30.213249,-99.318607 +78059,TX,Natalia,29.211669,-98.855158 +78060,TX,Oakville,28.464402,-98.055392 +78061,TX,Pearsall,28.892317,-99.094361 +78063,TX,Lakehills,29.631513,-98.922118 +78064,TX,Pleasanton,28.992368,-98.483061 +78065,TX,Poteet,29.099405,-98.624071 +78066,TX,Riomedina,29.490395,-98.866865 +78067,TX,San Ygnacio,27.062523,-99.427148 +78069,TX,Somerset,29.211561,-98.621401 +78070,TX,Spring Branch,29.923815,-98.378786 +78071,TX,Three Rivers,28.475646,-98.178162 +78072,TX,Tilden,28.419755,-98.569322 +78073,TX,Von Ormy,29.274979,-98.667741 +78075,TX,Whitsett,28.637316,-98.256484 +78076,TX,Zapata,26.88966,-99.250625 +78101,TX,Adkins,29.380542,-98.26504 +78102,TX,Beeville,28.422246,-97.761571 +78108,TX,Cibolo,29.574971,-98.227983 +78109,TX,Converse,29.517331,-98.321673 +78111,TX,Ecleto,29.020128,-97.741185 +78112,TX,Elmendorf,29.230793,-98.371982 +78113,TX,Falls City,28.981413,-98.015632 +78114,TX,Floresville,29.169338,-98.193589 +78116,TX,Gillett,29.051353,-97.834325 +78117,TX,Hobson,28.944499,-97.970743 +78118,TX,Karnes City,28.882757,-97.90707 +78119,TX,Kenedy,28.804584,-97.845601 +78121,TX,La Vernia,29.350905,-98.112971 +78122,TX,Leesville,29.396142,-97.756622 +78123,TX,Mc Queeney,29.605655,-98.037591 +78124,TX,Marion,29.56835,-98.151709 +78130,TX,Canyon Lake,29.694733,-98.113041 +78132,TX,Canyon Lake,29.72939,-98.167212 +78133,TX,Canyon Lake,29.870984,-98.249412 +78140,TX,Nixon,29.301649,-97.752898 +78141,TX,Nordheim,28.914225,-97.594579 +78147,TX,Poth,29.06191,-98.08247 +78148,TX,Randolph A F B,29.551608,-98.306742 +78150,TX,Randolph A F B,29.53021,-98.279193 +78151,TX,Runge,28.887556,-97.713824 +78152,TX,Saint Hedwig,29.435284,-98.195223 +78154,TX,Selma,29.568159,-98.272214 +78155,TX,Seguin,29.561316,-97.962801 +78159,TX,Smiley,29.265529,-97.622712 +78160,TX,Stockdale,29.231907,-97.935082 +78161,TX,Sutherland Sprin,29.277831,-98.070794 +78163,TX,Wetmore,29.780175,-98.437846 +78164,TX,Yorktown,28.989191,-97.512056 +78201,TX,Balcones Heights,29.468525,-98.526352 +78202,TX,San Antonio,29.427462,-98.460112 +78203,TX,San Antonio,29.414799,-98.460127 +78204,TX,San Antonio,29.400217,-98.5063 +78205,TX,San Antonio,29.423711,-98.492509 +78207,TX,San Antonio,29.422855,-98.525967 +78208,TX,San Antonio,29.440039,-98.458983 +78209,TX,Alamo Heights,29.488623,-98.455774 +78210,TX,San Antonio,29.397718,-98.465796 +78211,TX,San Antonio,29.358366,-98.545219 +78212,TX,Olmos Park,29.461181,-98.495815 +78213,TX,Castle Hills,29.513406,-98.522679 +78214,TX,San Antonio,29.364115,-98.492436 +78215,TX,San Antonio,29.441338,-98.479338 +78216,TX,San Antonio,29.533387,-98.497511 +78217,TX,San Antonio,29.539525,-98.419444 +78218,TX,San Antonio,29.496852,-98.403184 +78219,TX,Kirby,29.448794,-98.397315 +78220,TX,San Antonio,29.410641,-98.412791 +78221,TX,San Antonio,29.330913,-98.505417 +78222,TX,San Antonio,29.383113,-98.396005 +78223,TX,San Antonio,29.357869,-98.435628 +78224,TX,San Antonio,29.337432,-98.539335 +78225,TX,San Antonio,29.387497,-98.524494 +78226,TX,San Antonio,29.393001,-98.551095 +78227,TX,San Antonio,29.402687,-98.643311 +78228,TX,San Antonio,29.458937,-98.569871 +78229,TX,San Antonio,29.504228,-98.569726 +78230,TX,San Antonio,29.540738,-98.552117 +78231,TX,Shavano Park,29.571434,-98.536817 +78232,TX,Hollywood Park,29.582833,-98.4673 +78233,TX,Live Oak,29.554741,-98.369128 +78234,TX,Fort Sam Houston,29.461961,-98.435404 +78235,TX,Brooks A F B,29.341733,-98.439444 +78236,TX,Wilford Hall U S,29.394267,-98.613367 +78237,TX,San Antonio,29.420758,-98.564546 +78238,TX,Leon Valley,29.476833,-98.615451 +78239,TX,Windcrest,29.515686,-98.361604 +78240,TX,San Antonio,29.518896,-98.600566 +78241,TX,Kelly A F B,29.392432,-98.578063 +78242,TX,San Antonio,29.350905,-98.610927 +78244,TX,San Antonio,29.479264,-98.347585 +78245,TX,San Antonio,29.418927,-98.689494 +78247,TX,Wetmore,29.577604,-98.409783 +78248,TX,San Antonio,29.58936,-98.520105 +78249,TX,San Antonio,29.561245,-98.611666 +78250,TX,San Antonio,29.505394,-98.668765 +78251,TX,San Antonio,29.459743,-98.655472 +78252,TX,San Antonio,29.346015,-98.646395 +78253,TX,San Antonio,29.459923,-98.747931 +78254,TX,San Antonio,29.54091,-98.724841 +78255,TX,San Antonio,29.636875,-98.655572 +78256,TX,San Antonio,29.616946,-98.625215 +78257,TX,San Antonio,29.64953,-98.613701 +78258,TX,San Antonio,29.65624,-98.496699 +78259,TX,San Antonio,29.628331,-98.444495 +78260,TX,San Antonio,29.702578,-98.475908 +78261,TX,San Antonio,29.705463,-98.419092 +78263,TX,San Antonio,29.36143,-98.317386 +78264,TX,San Antonio,29.173345,-98.472272 +78266,TX,Garden Ridge,29.644226,-98.312774 +78332,TX,Alice,27.743171,-98.083622 +78336,TX,Aransas Pass,27.909498,-97.159091 +78338,TX,Armstrong,26.738706,-97.709291 +78340,TX,Bayside,28.096758,-97.210643 +78343,TX,Bishop,27.588564,-97.783031 +78344,TX,Bruni,27.435329,-98.850108 +78349,TX,Concepcion,27.544266,-98.381489 +78353,TX,Encino,26.924862,-98.192168 +78355,TX,Falfurrias,27.22416,-98.140844 +78357,TX,Freer,27.879984,-98.606129 +78358,TX,Fulton,28.223448,-96.808377 +78360,TX,Guerra,26.912753,-98.918886 +78361,TX,Hebbronville,27.2997,-98.682888 +78362,TX,Ingleside,27.868238,-97.206906 +78363,TX,Kingsville Naval,27.507418,-97.859598 +78368,TX,Mathis,28.080208,-97.809659 +78369,TX,Mirando City,27.445038,-99.001117 +78370,TX,Odem,27.940306,-97.583752 +78372,TX,Orange Grove,27.948659,-97.983835 +78374,TX,Portland,27.893547,-97.316931 +78375,TX,Premont,27.354444,-98.133018 +78376,TX,Realitos,27.416283,-98.535493 +78377,TX,Refugio,28.316944,-97.276665 +78379,TX,Riviera,27.321735,-97.778707 +78380,TX,Robstown,27.798395,-97.699523 +78382,TX,Rockport,28.030778,-97.068773 +78383,TX,Sandia,28.070879,-97.897849 +78384,TX,San Diego,27.76535,-98.250297 +78385,TX,Sarita,27.149622,-97.857627 +78387,TX,Sinton,28.033895,-97.519582 +78389,TX,Skidmore,28.230577,-97.666071 +78390,TX,Taft,27.976517,-97.396623 +78391,TX,Tynan,28.169341,-97.754881 +78393,TX,Woodsboro,28.223222,-97.31921 +78401,TX,Corpus Christi,27.794086,-97.402994 +78402,TX,Corpus Christi,27.82621,-97.385659 +78404,TX,Corpus Christi,27.768329,-97.401255 +78405,TX,Corpus Christi,27.776234,-97.427132 +78406,TX,Corpus Christi,27.768412,-97.51445 +78407,TX,Corpus Christi,27.804195,-97.435597 +78408,TX,Corpus Christi,27.794477,-97.43815 +78409,TX,Corpus Christi,27.814555,-97.527034 +78410,TX,Corpus Christi,27.84585,-97.596002 +78411,TX,Corpus Christi,27.731139,-97.387732 +78412,TX,Corpus Christi,27.70608,-97.353694 +78413,TX,Corpus Christi,27.691041,-97.39832 +78414,TX,Corpus Christi,27.677016,-97.365016 +78415,TX,Corpus Christi,27.726204,-97.40778 +78416,TX,Corpus Christi,27.753593,-97.43468 +78417,TX,Corpus Christi,27.728964,-97.449429 +78418,TX,Corpus Christi,27.668531,-97.266558 +78419,TX,Corpus Christi,27.692502,-97.27636 +78473,TX,Corpus Christi,27.79515,-97.396624 +78501,TX,Mcallen,26.21544,-98.235871 +78503,TX,Mcallen,26.177115,-98.251974 +78504,TX,Mcallen,26.255645,-98.230253 +78516,TX,Alamo,26.190578,-98.116445 +78520,TX,Brownsville,25.933743,-97.517413 +78521,TX,Brownsville,25.922103,-97.461236 +78536,TX,Delmita,26.656571,-98.396553 +78537,TX,Donna,26.167138,-98.052925 +78538,TX,Monte Alto,26.304208,-97.975473 +78539,TX,Edinburg,26.304221,-98.156922 +78547,TX,Garciasville,26.312894,-98.669112 +78548,TX,Grulla,26.293714,-98.596041 +78549,TX,Hargill,26.433812,-97.99933 +78550,TX,Harlingen,26.195142,-97.688981 +78552,TX,Harlingen,26.183069,-97.746771 +78557,TX,Hidalgo,26.102832,-98.253641 +78559,TX,La Feria,26.166556,-97.826115 +78563,TX,Linn,26.542054,-98.17987 +78566,TX,Bayview,26.091068,-97.490402 +78569,TX,Lyford,26.408926,-97.781653 +78570,TX,Mercedes,26.15133,-97.918503 +78572,TX,Alton,26.24153,-98.342647 +78577,TX,Pharr,26.177053,-98.187022 +78578,TX,Port Isabel,26.08764,-97.254389 +78580,TX,Raymondville,26.479243,-97.79666 +78582,TX,Rio Grande City,26.394194,-98.810444 +78583,TX,Rio Hondo,26.233855,-97.551311 +78584,TX,Roma,26.421545,-99.002479 +78586,TX,San Benito,26.133659,-97.644748 +78588,TX,San Isidro,26.721404,-98.416147 +78589,TX,San Juan,26.204375,-98.153729 +78590,TX,San Perlita,26.483156,-97.615699 +78591,TX,Santa Elena,26.73364,-98.519412 +78593,TX,Santa Rosa,26.255508,-97.825663 +78594,TX,Sebastian,26.34524,-97.774728 +78595,TX,Sullivan City,26.27197,-98.562713 +78596,TX,Weslaco,26.169444,-97.988714 +78597,TX,South Padre Isla,26.111105,-97.167294 +78598,TX,Port Mansfield,26.555237,-97.427982 +78602,TX,Bastrop,30.13883,-97.292101 +78603,TX,Bebe,29.422211,-97.626594 +78605,TX,Bertram,30.741082,-98.052932 +78606,TX,Blanco,30.087359,-98.410663 +78607,TX,Bluffton,30.825633,-98.51503 +78608,TX,Briggs,30.932546,-97.970228 +78609,TX,Buchanan Dam,30.759765,-98.453226 +78610,TX,Buda,30.091758,-97.853422 +78611,TX,Burnet,30.776597,-98.26424 +78612,TX,Cedar Creek,30.096636,-97.497602 +78613,TX,Cedar Park,30.477165,-97.817571 +78614,TX,Cost,29.432098,-97.553124 +78615,TX,Coupland,30.532357,-97.330364 +78616,TX,Dale,29.952785,-97.580968 +78617,TX,Del Valle,30.174492,-97.613443 +78618,TX,Doss,30.461319,-99.17072 +78619,TX,Driftwood,30.159351,-98.052372 +78620,TX,Dripping Springs,30.226768,-98.102947 +78621,TX,Elgin,30.323136,-97.373748 +78623,TX,Fischer,29.969588,-98.258283 +78624,TX,Fredericksburg,30.281658,-98.879928 +78626,TX,Georgetown,30.633038,-97.670704 +78628,TX,Andice,30.659364,-97.700939 +78629,TX,Gonzales,29.50857,-97.449456 +78631,TX,Harper,30.281637,-99.241048 +78632,TX,Harwood,29.666108,-97.490622 +78634,TX,Hutto,30.525725,-97.567203 +78635,TX,Hye,30.226866,-98.539607 +78636,TX,Johnson City,30.294806,-98.369082 +78638,TX,Kingsbury,29.672566,-97.830634 +78639,TX,Kingsland,30.666212,-98.447492 +78640,TX,Uhland,30.0043,-97.837106 +78641,TX,Leander,30.552888,-97.875166 +78642,TX,Liberty Hill,30.662953,-97.931598 +78643,TX,Sunrise Beach,30.722533,-98.652727 +78644,TX,Lockhart,29.886759,-97.676922 +78645,TX,Jonestown,30.459796,-97.97023 +78648,TX,Luling,29.682621,-97.649947 +78650,TX,Mc Dade,30.296816,-97.238556 +78652,TX,Manchaca,30.127267,-97.853793 +78653,TX,Manor,30.338817,-97.532295 +78654,TX,Cypress Mill,30.57228,-98.306992 +78655,TX,Martindale,29.793328,-97.79332 +78656,TX,Maxwell,29.878628,-97.852852 +78659,TX,Paige,30.185799,-97.119771 +78660,TX,Pflugerville,30.442133,-97.629895 +78662,TX,Red Rock,29.990616,-97.408058 +78663,TX,Round Mountain,30.442879,-98.436514 +78664,TX,Round Rock,30.51452,-97.668028 +78665,TX,Sandy,30.339127,-98.509846 +78666,TX,San Marcos,29.875359,-97.940418 +78669,TX,Spicewood,30.389945,-98.05392 +78671,TX,Albert,30.224921,-98.655468 +78672,TX,Tow,30.860867,-98.459647 +78675,TX,Willow City,30.454889,-98.664589 +78676,TX,Wimberley,30.026471,-98.11231 +78677,TX,Wrightsboro,29.357772,-97.503531 +78681,TX,Round Rock,30.508431,-97.706171 +78701,TX,Austin,30.271289,-97.742559 +78702,TX,Austin,30.263817,-97.716589 +78703,TX,Austin,30.290671,-97.764809 +78704,TX,Austin,30.242831,-97.765788 +78705,TX,Austin,30.289619,-97.739627 +78717,TX,Austin,30.505972,-97.747187 +78719,TX,Austin,30.180243,-97.666701 +78721,TX,Austin,30.272144,-97.686798 +78722,TX,Austin,30.289305,-97.71495 +78723,TX,Austin,30.308515,-97.684941 +78724,TX,Austin,30.295982,-97.639587 +78725,TX,Austin,30.256186,-97.624301 +78726,TX,Austin,30.43,-97.832649 +78727,TX,Austin,30.425422,-97.719488 +78728,TX,Austin,30.441679,-97.681123 +78729,TX,Austin,30.45206,-97.768787 +78730,TX,Austin,30.360745,-97.824062 +78731,TX,Austin,30.347129,-97.760887 +78732,TX,Austin,30.375233,-97.900685 +78733,TX,Austin,30.331355,-97.866633 +78734,TX,Lakeway,30.377404,-97.957558 +78735,TX,Austin,30.248978,-97.841423 +78736,TX,Austin,30.244433,-97.915968 +78737,TX,Austin,30.210692,-97.942749 +78738,TX,Austin,30.333708,-97.982367 +78739,TX,Austin,30.172026,-97.878433 +78741,TX,Austin,30.231513,-97.722317 +78742,TX,Austin,30.231296,-97.670349 +78744,TX,Austin,30.18764,-97.74723 +78745,TX,Austin,30.206298,-97.795599 +78746,TX,West Lake Hills,30.285009,-97.808129 +78747,TX,Creedmoor,30.130235,-97.762127 +78748,TX,Austin,30.174311,-97.822474 +78749,TX,Austin,30.216641,-97.850755 +78750,TX,Austin,30.422401,-97.796676 +78751,TX,Austin,30.309288,-97.724163 +78752,TX,Austin,30.331562,-97.700394 +78753,TX,Austin,30.36485,-97.682658 +78754,TX,Austin,30.342331,-97.667267 +78756,TX,Austin,30.322312,-97.739032 +78757,TX,Austin,30.343732,-97.731617 +78758,TX,Austin,30.376431,-97.707758 +78759,TX,Austin,30.403614,-97.752602 +78801,TX,Uvalde,29.217238,-99.793074 +78827,TX,Asherton,28.436421,-99.748611 +78828,TX,Barksdale,29.708488,-100.070983 +78829,TX,Batesville,28.928648,-99.611457 +78830,TX,Big Wells,28.569344,-99.578083 +78832,TX,Brackettville,29.30963,-100.415495 +78833,TX,Camp Wood,29.679491,-100.00838 +78834,TX,Carrizo Springs,28.52779,-99.863513 +78837,TX,Comstock,29.74842,-101.262755 +78838,TX,Concan,29.524057,-99.684244 +78839,TX,Crystal City,28.686953,-99.826412 +78840,TX,Laughlin A F B,29.373881,-100.891555 +78850,TX,D Hanis,29.3398,-99.283488 +78851,TX,Dryden,30.165108,-102.33207 +78852,TX,Eagle Pass,28.702786,-100.48176 +78861,TX,Dunlay,29.356065,-99.127637 +78870,TX,Knippa,29.291119,-99.637171 +78872,TX,La Pryor,28.948848,-99.85074 +78873,TX,Leakey,29.768951,-99.747913 +78877,TX,Spofford,28.942688,-100.574181 +78879,TX,Rio Frio,29.658295,-99.772337 +78880,TX,Rocksprings,30.018756,-100.231029 +78881,TX,Sabinal,29.326668,-99.478109 +78883,TX,Tarpley,29.645494,-99.246874 +78884,TX,Utopia,29.597197,-99.558454 +78885,TX,Vanderpool,29.741779,-99.555542 +78886,TX,Yancey,29.140398,-99.14277 +78931,TX,Bleiblerville,29.967572,-96.418719 +78932,TX,Carmine,30.140351,-96.686077 +78933,TX,Cat Spring,29.751204,-96.390029 +78934,TX,Columbus,29.703247,-96.5527 +78935,TX,Alleyton,29.745286,-96.46312 +78938,TX,Ellinger,29.845915,-96.69663 +78940,TX,Fayetteville,29.886789,-96.646317 +78941,TX,Flatonia,29.709493,-97.098685 +78942,TX,Giddings,30.177725,-96.93322 +78944,TX,Industry,29.971789,-96.518849 +78945,TX,La Grange,29.903978,-96.885988 +78946,TX,Ledbetter,30.238307,-96.761276 +78947,TX,Lexington,30.419144,-97.052387 +78948,TX,Lincoln,30.317693,-96.970159 +78949,TX,Muldoon,29.799305,-97.100562 +78950,TX,New Ulm,29.814248,-96.537963 +78953,TX,Rosanky,29.924122,-97.311875 +78954,TX,Round Top,30.041131,-96.734058 +78956,TX,Schulenburg,29.688247,-96.910564 +78957,TX,Smithville,30.017813,-97.149396 +78959,TX,Waelder,29.6868,-97.295798 +78962,TX,Weimar,29.678707,-96.755045 +78963,TX,West Point,29.95235,-97.036129 +79001,TX,Adrian,35.275807,-102.69699 +79005,TX,Booker,36.442948,-100.523791 +79007,TX,Phillips,35.664299,-101.403245 +79009,TX,Bovina,34.481504,-102.806115 +79011,TX,Briscoe,35.58547,-100.167923 +79014,TX,Glazier,35.885906,-100.353875 +79015,TX,Canyon,34.977222,-101.924705 +79018,TX,Channing,35.782572,-102.334269 +79019,TX,Claude,35.096715,-101.381271 +79022,TX,Dalhart,36.073183,-102.517658 +79027,TX,Dimmitt,34.534089,-102.304634 +79029,TX,Dumas,35.882315,-101.967984 +79031,TX,Earth,34.241521,-102.421284 +79034,TX,Follett,36.430923,-100.206776 +79035,TX,Black,34.640298,-102.719139 +79036,TX,Fritch,35.644121,-101.584482 +79039,TX,Groom,35.216761,-101.12846 +79040,TX,Gruver,36.286805,-101.408906 +79041,TX,Hale Center,34.066943,-101.873623 +79042,TX,Happy,34.721899,-101.825632 +79043,TX,Hart,34.387838,-102.115534 +79044,TX,Hartley,35.931122,-102.52213 +79045,TX,Hereford,34.837037,-102.40503 +79046,TX,Higgins,36.136504,-100.095191 +79052,TX,Kress,34.373703,-101.73705 +79056,TX,Lipscomb,36.223031,-100.270164 +79057,TX,Kellerville,35.234051,-100.611303 +79059,TX,Miami,35.719301,-100.702715 +79061,TX,Mobeetie,35.529717,-100.424158 +79062,TX,Morse,36.059579,-101.47288 +79063,TX,Nazareth,34.544356,-102.106914 +79064,TX,Olton,34.184418,-102.141415 +79065,TX,Pampa,35.538043,-100.957885 +79068,TX,Panhandle,35.380841,-101.43037 +79070,TX,Perryton,36.374825,-100.815558 +79072,TX,Plainview,34.196194,-101.725896 +79079,TX,Twitty,35.220596,-100.262152 +79080,TX,Skellytown,35.568489,-101.172134 +79081,TX,Spearman,36.192689,-101.195234 +79082,TX,Springlake,34.23932,-102.308999 +79083,TX,Stinnett,35.837661,-101.450011 +79084,TX,Stratford,36.33349,-101.988568 +79085,TX,Summerfield,34.727244,-102.49919 +79086,TX,Sunray,36.009707,-101.812334 +79087,TX,Texline,36.374034,-102.984516 +79088,TX,Vigo Park,34.540258,-101.762864 +79092,TX,Vega,35.373212,-102.356572 +79094,TX,Wayside,34.803353,-101.545434 +79095,TX,Wellington,34.871726,-100.220721 +79096,TX,Wheeler,35.431852,-100.256824 +79097,TX,White Deer,35.42781,-101.173993 +79098,TX,Wildorado,35.19156,-102.211754 +79101,TX,Amarillo,35.203238,-101.842052 +79102,TX,Amarillo,35.199854,-101.84963 +79103,TX,Amarillo,35.175134,-101.797587 +79104,TX,Amarillo,35.193918,-101.797503 +79106,TX,Amarillo,35.197741,-101.894918 +79107,TX,Amarillo,35.230866,-101.805962 +79108,TX,Amarillo,35.277866,-101.830025 +79109,TX,Amarillo,35.166332,-101.886764 +79110,TX,Amarillo,35.154468,-101.864063 +79111,TX,Amarillo,35.228619,-101.670342 +79118,TX,Amarillo,35.07629,-101.834936 +79119,TX,Amarillo,35.064214,-101.97432 +79121,TX,Amarillo,35.169689,-101.926594 +79124,TX,Amarillo,35.270269,-101.942952 +79201,TX,Kirkland,34.428124,-100.21017 +79220,TX,Afton,33.771837,-100.802131 +79225,TX,Chillicothe,34.243946,-99.515669 +79226,TX,Clarendon,34.952878,-100.895157 +79227,TX,Crowell,33.991208,-99.698345 +79229,TX,Dickens,33.627996,-100.819695 +79230,TX,Dodson,34.764354,-100.028593 +79232,TX,Dumont,33.656735,-100.319829 +79234,TX,Flomot,34.232076,-101.003824 +79235,TX,Floydada,33.974296,-101.334564 +79237,TX,Hedley,34.869787,-100.680632 +79239,TX,Lakeview,34.672437,-100.725921 +79241,TX,Lockney,34.145827,-101.425934 +79243,TX,Mcadoo,33.741265,-100.983293 +79244,TX,Matador,34.052507,-100.836138 +79245,TX,Memphis,34.712237,-100.534653 +79248,TX,Chalk,34.019154,-100.305917 +79250,TX,Petersburg,33.876806,-101.604591 +79251,TX,Quail,34.917969,-100.425243 +79252,TX,Quanah,34.29555,-99.749438 +79255,TX,Quitaque,34.379605,-101.046458 +79256,TX,Roaring Springs,33.897669,-100.852818 +79257,TX,Silverton,34.464089,-101.316899 +79259,TX,Tell,34.378164,-100.396482 +79260,TX,Truscott,33.75323,-99.662455 +79261,TX,Turkey,34.403644,-100.844875 +79311,TX,Abernathy,33.849961,-101.861111 +79312,TX,Amherst,33.997608,-102.441614 +79313,TX,Anton,33.804278,-102.165165 +79316,TX,Brownfield,33.169801,-102.276157 +79320,TX,Bula,33.89696,-102.656426 +79322,TX,Crosbyton,33.656159,-101.228733 +79323,TX,Denver City,32.971114,-102.831251 +79324,TX,Enochs,33.850225,-102.764107 +79325,TX,Farwell,34.386025,-102.990064 +79326,TX,Fieldton,34.091878,-102.269692 +79329,TX,Idalou,33.650376,-101.678579 +79331,TX,Lamesa,32.736677,-101.956914 +79336,TX,Levelland,33.578778,-102.367591 +79339,TX,Littlefield,33.921195,-102.320697 +79342,TX,Loop,32.916169,-102.422084 +79343,TX,Lorenzo,33.666626,-101.527736 +79344,TX,Maple,33.8622,-102.926588 +79345,TX,Meadow,33.332098,-102.249196 +79346,TX,Morton,33.715718,-102.779619 +79347,TX,Muleshoe,34.219308,-102.749631 +79351,TX,Odonnell,32.977331,-101.827099 +79353,TX,Pep,33.810434,-102.56558 +79355,TX,Plains,33.189354,-102.829367 +79356,TX,Post,33.201695,-101.39216 +79357,TX,Cone,33.678977,-101.382738 +79358,TX,Ropesville,33.457499,-102.15841 +79359,TX,Seagraves,32.93172,-102.578075 +79360,TX,Seminole,32.721045,-102.682761 +79363,TX,Shallowater,33.691859,-101.983626 +79364,TX,Ransom Canyon,33.436795,-101.65192 +79366,TX,Ransom Canyon,33.533019,-101.690805 +79370,TX,Spur,33.479016,-100.857116 +79371,TX,Sudan,34.069661,-102.525525 +79373,TX,Tahoka,33.198803,-101.821976 +79376,TX,Tokio,33.18259,-102.576753 +79377,TX,Welch,32.893827,-102.106792 +79379,TX,Whiteface,33.586575,-102.638941 +79381,TX,Wilson,33.329862,-101.712231 +79382,TX,Wolfforth,33.530381,-102.026101 +79401,TX,Lubbock,33.586527,-101.860634 +79403,TX,Lubbock,33.619573,-101.80982 +79404,TX,Lubbock,33.525979,-101.833263 +79405,TX,Lubbock,33.570972,-101.850655 +79406,TX,Lubbock,33.581934,-101.877828 +79407,TX,Lubbock,33.568369,-101.942333 +79410,TX,Lubbock,33.56931,-101.890377 +79411,TX,Lubbock,33.570393,-101.862593 +79412,TX,Lubbock,33.546313,-101.857737 +79413,TX,Lubbock,33.546597,-101.887142 +79414,TX,Lubbock,33.549728,-101.918666 +79415,TX,Lubbock,33.602117,-101.876015 +79416,TX,Lubbock,33.592397,-101.936705 +79423,TX,Lubbock,33.514604,-101.87946 +79424,TX,Lubbock,33.515866,-101.93439 +79489,TX,Reese Air Force,33.594344,-102.028792 +79501,TX,Anson,32.748894,-99.895301 +79502,TX,Aspermont,33.130059,-100.234372 +79503,TX,Avoca,32.883225,-99.69642 +79504,TX,Baird,32.391557,-99.37766 +79506,TX,Blackwell,32.082044,-100.311078 +79510,TX,Clyde,32.380289,-99.518445 +79511,TX,Coahoma,32.294215,-101.319681 +79512,TX,Colorado City,32.398736,-100.860948 +79517,TX,Fluvanna,32.781022,-101.041966 +79518,TX,Girard,33.363202,-100.693688 +79519,TX,Goldsboro,32.048213,-99.677457 +79520,TX,Hamlin,32.879893,-100.128014 +79521,TX,Haskell,33.157993,-99.730923 +79525,TX,Hawley,32.594965,-99.795994 +79526,TX,Hermleigh,32.629441,-100.754714 +79527,TX,Ira,32.621274,-101.025419 +79528,TX,Jayton,33.251774,-100.582482 +79529,TX,Knox City,33.418294,-99.8137 +79530,TX,Lawn,32.136012,-99.735081 +79532,TX,Loraine,32.385047,-100.72851 +79533,TX,Lueders,32.762339,-99.672792 +79534,TX,Mc Caulley,32.778654,-100.216784 +79535,TX,Maryneal,32.202639,-100.497178 +79536,TX,Merkel,32.444371,-99.992443 +79537,TX,Nolan,32.279333,-100.267053 +79538,TX,Novice,32.000927,-99.59353 +79539,TX,O Brien,33.374869,-99.847303 +79540,TX,Old Glory,33.184162,-100.153155 +79541,TX,Ovalo,32.155257,-99.822873 +79542,TX,79542,33.204065,-100.394624 +79543,TX,Roby,32.722016,-100.400766 +79544,TX,Rochester,33.310457,-99.859366 +79545,TX,Roscoe,32.427558,-100.539088 +79546,TX,Rotan,32.855521,-100.470489 +79547,TX,Rule,33.184163,-99.889354 +79548,TX,Sagerton,33.051321,-99.892329 +79549,TX,Dermott,32.715105,-100.907485 +79553,TX,Stamford,32.945323,-99.78593 +79556,TX,Sweetwater,32.472589,-100.397908 +79560,TX,Sylvester,32.717909,-100.242497 +79561,TX,Trent,32.489752,-100.119488 +79562,TX,Tuscola,32.234955,-99.82439 +79563,TX,Tye,32.447728,-99.868434 +79565,TX,Westbrook,32.353195,-100.990719 +79566,TX,Wingate,32.031777,-100.118311 +79567,TX,Winters,31.962028,-99.955114 +79601,TX,Abilene,32.468155,-99.718208 +79602,TX,Abilene,32.41783,-99.721448 +79603,TX,Abilene,32.467852,-99.761916 +79605,TX,Abilene,32.431987,-99.772374 +79606,TX,Abilene,32.392038,-99.774578 +79607,TX,Dyess Afb,32.418956,-99.82214 +79701,TX,Midland,31.989636,-102.06261 +79703,TX,Midland,31.972106,-102.136854 +79705,TX,Midland,32.029473,-102.091483 +79707,TX,Midland,32.019911,-102.147599 +79713,TX,Ackerly,32.609085,-101.795132 +79714,TX,Andrews,32.320125,-102.540926 +79718,TX,Balmorhea,31.012361,-103.693316 +79719,TX,Barstow,31.463908,-103.397086 +79720,TX,Vealmoor,32.241767,-101.467517 +79730,TX,Coyanosa,31.229547,-103.053815 +79731,TX,Crane,31.396949,-102.354382 +79734,TX,Fort Davis,30.613144,-103.936434 +79735,TX,Fort Stockton,30.890785,-102.879942 +79738,TX,Gail,32.752334,-101.450032 +79739,TX,Garden City,31.849078,-101.526912 +79741,TX,Goldsmith,31.95412,-102.625047 +79742,TX,Grandfalls,31.345856,-102.856778 +79743,TX,Imperial,31.237264,-102.710918 +79744,TX,Iraan,30.915564,-101.915175 +79745,TX,Kermit,31.85496,-103.091269 +79748,TX,Knott,32.412489,-101.651731 +79749,TX,Lenorah,32.439157,-101.761137 +79752,TX,Mc Camey,31.131894,-102.215325 +79754,TX,Mentone,31.738374,-103.550316 +79755,TX,Midkiff,31.306761,-101.926913 +79756,TX,Monahans,31.581294,-102.900273 +79758,TX,Gardendale,32.024476,-102.357237 +79761,TX,Odessa,31.857945,-102.352252 +79762,TX,Odessa,31.889029,-102.354806 +79763,TX,Odessa,31.834085,-102.416179 +79764,TX,Odessa,31.876683,-102.437465 +79765,TX,Odessa,31.937548,-102.394403 +79766,TX,Odessa,31.782683,-102.344863 +79772,TX,Verhalen,31.414384,-103.508129 +79777,TX,Pyote,31.539491,-103.139676 +79781,TX,Sheffield,30.693549,-101.859963 +79782,TX,Stanton,32.139992,-101.809887 +79783,TX,Tarzan,32.357523,-101.960723 +79789,TX,Wink,31.752673,-103.156084 +79821,TX,Anthony,31.990718,-106.597625 +79830,TX,Alpine,30.263111,-103.654089 +79834,TX,Big Bend Nationa,29.147657,-103.330626 +79835,TX,Canutillo,31.934379,-106.592888 +79836,TX,Clint,31.549418,-106.20383 +79837,TX,Dell City,31.923975,-105.209902 +79839,TX,Fort Hancock,31.296887,-105.823448 +79842,TX,Marathon,30.18858,-103.221397 +79843,TX,Marfa,30.292982,-104.084835 +79845,TX,Presidio,29.557302,-104.35511 +79847,TX,Salt Flat,31.359027,-104.611467 +79851,TX,Sierra Blanca,31.193821,-105.321874 +79852,TX,Terlingua,29.31648,-103.559671 +79854,TX,Valentine,30.620043,-104.481096 +79855,TX,Kent,31.042879,-104.832249 +79901,TX,El Paso,31.758411,-106.478311 +79902,TX,El Paso,31.776317,-106.493165 +79903,TX,El Paso,31.786213,-106.440569 +79904,TX,El Paso,31.853334,-106.438135 +79905,TX,El Paso,31.767447,-106.430445 +79906,TX,Fort Bliss,31.807631,-106.421611 +79907,TX,El Paso,31.708908,-106.329281 +79908,TX,Fort Bliss,31.82753,-106.386711 +79912,TX,El Paso,31.838309,-106.536433 +79915,TX,El Paso,31.743234,-106.368605 +79916,TX,Fort Bliss,31.794873,-106.159157 +79922,TX,El Paso,31.821767,-106.573176 +79924,TX,El Paso,31.902098,-106.414857 +79925,TX,El Paso,31.781402,-106.361317 +79927,TX,Horizon City,31.653014,-106.273064 +79930,TX,El Paso,31.804795,-106.456754 +79932,TX,El Paso,31.862334,-106.593186 +79934,TX,El Paso,31.938585,-106.407328 +79935,TX,El Paso,31.771847,-106.330258 +79936,TX,El Paso,31.767655,-106.30159 +84001,UT,Altamont,40.370225,-110.446356 +84002,UT,Altonah,40.441894,-110.438499 +84003,UT,American Fork,40.392784,-111.794107 +84004,UT,Alpine,40.461591,-111.768861 +84006,UT,Bingham Canyon,40.564614,-112.097718 +84007,UT,Bluebell,40.351728,-110.294122 +84010,UT,Bountiful,40.877513,-111.872658 +84012,UT,Bridgeland,40.230411,-110.160264 +84013,UT,Cedar Valley,40.142516,-111.968985 +84014,UT,Centerville,40.926772,-111.87701 +84015,UT,Clearfield,41.129388,-112.048224 +84017,UT,Coalville,40.924385,-111.407108 +84018,UT,Croydon,41.068915,-111.523092 +84020,UT,Draper,40.504599,-111.88096 +84021,UT,Duchesne,39.95398,-110.618094 +84022,UT,Dugway,40.526892,-112.872905 +84023,UT,Dutch John,40.932244,-109.354255 +84025,UT,Farmington,40.988913,-111.893785 +84026,UT,Fort Duchesne,40.301411,-109.863726 +84028,UT,Garden City,41.93764,-111.407033 +84029,UT,Grantsville,40.60054,-112.461766 +84031,UT,Hanna,40.450135,-110.809748 +84032,UT,Heber City,40.494703,-111.405088 +84035,UT,Jensen,40.378715,-109.350982 +84036,UT,Kamas,40.641432,-111.261877 +84037,UT,Kaysville,41.037527,-111.932607 +84038,UT,Laketown,41.81068,-111.268853 +84039,UT,Lapoint,40.400285,-109.804102 +84040,UT,Layton,41.084576,-111.927365 +84041,UT,Layton,41.087905,-111.970354 +84042,UT,Lindon,40.34119,-111.714358 +84043,UT,Lehi,40.395845,-111.850606 +84044,UT,Magna,40.700879,-112.080867 +84046,UT,Manila,40.968494,-109.723503 +84047,UT,Midvale,40.615178,-111.885066 +84049,UT,Midway,40.50934,-111.477575 +84050,UT,Morgan,41.067832,-111.716339 +84051,UT,Mountain Home,40.191999,-110.767018 +84052,UT,Myton,40.194049,-110.048056 +84053,UT,Neola,40.449149,-110.037221 +84054,UT,North Salt Lake,40.844064,-111.904116 +84056,UT,Hill Air Force B,41.116962,-111.995565 +84057,UT,Orem,40.313407,-111.695293 +84058,UT,Vineyard,40.280761,-111.694301 +84060,UT,Park City,40.695724,-111.528021 +84061,UT,Peoa,40.720937,-111.302467 +84062,UT,Pleasant Grove,40.371986,-111.733284 +84063,UT,Randlett,40.21865,-109.730102 +84064,UT,Randolph,41.656328,-111.185578 +84065,UT,Lark,40.53789,-111.954661 +84066,UT,Roosevelt,40.310229,-110.010782 +84067,UT,Roy,41.172365,-112.038177 +84069,UT,Rush Valley,40.233625,-112.744033 +84070,UT,Sandy,40.579379,-111.881625 +84071,UT,Stockton,40.350451,-112.425214 +84072,UT,Tabiona,40.382691,-110.702108 +84073,UT,Talmage,40.174569,-110.396529 +84074,UT,Tooele,40.545445,-112.300214 +84075,UT,Syracuse,41.086423,-112.0451 +84076,UT,Tridell,40.443593,-109.835906 +84078,UT,Vernal,40.440613,-109.546883 +84080,UT,Vernon,40.082609,-112.425961 +84082,UT,Wallsburg,40.365697,-111.464934 +84083,UT,Trout Creek,40.597396,-113.993573 +84084,UT,West Jordan,40.625429,-111.967662 +84085,UT,Whiterocks,40.452771,-109.917244 +84086,UT,Woodruff,41.488783,-111.186848 +84087,UT,Woods Cross,40.887447,-111.902712 +84088,UT,West Jordan,40.595913,-111.964385 +84092,UT,Alta,40.560245,-111.82736 +84093,UT,Sandy,40.592651,-111.830989 +84094,UT,Sandy,40.568757,-111.861716 +84101,UT,Salt Lake City,40.755851,-111.896657 +84102,UT,Salt Lake City,40.760034,-111.862721 +84103,UT,Salt Lake City,40.777584,-111.874891 +84104,UT,Salt Lake City,40.74985,-111.925979 +84105,UT,Salt Lake City,40.737236,-111.858087 +84106,UT,Salt Lake City,40.705597,-111.854841 +84107,UT,Murray,40.659014,-111.878383 +84108,UT,Salt Lake City,40.737136,-111.825822 +84109,UT,Salt Lake City,40.704251,-111.814218 +84111,UT,Salt Lake City,40.754834,-111.881 +84112,UT,Salt Lake City,40.752372,-111.827827 +84113,UT,Salt Lake City,40.763057,-111.841825 +84115,UT,South Salt Lake,40.715797,-111.883828 +84116,UT,Salt Lake City,40.785697,-111.929054 +84117,UT,Holladay,40.666302,-111.832943 +84118,UT,Kearns,40.652759,-111.98521 +84119,UT,West Valley City,40.690977,-111.952964 +84120,UT,West Valley City,40.68708,-112.009783 +84121,UT,Cottonwood,40.623247,-111.82468 +84123,UT,Murray,40.660479,-111.919483 +84124,UT,Holladay,40.67966,-111.820833 +84302,UT,Brigham City,41.507921,-112.015177 +84305,UT,Clarkston,41.91877,-112.04859 +84306,UT,Collinston,41.78777,-112.124219 +84307,UT,Corinne,41.544986,-112.151388 +84308,UT,Cornish,41.970178,-111.954241 +84309,UT,Deweyville,41.697226,-112.094717 +84310,UT,Eden,41.330279,-111.855765 +84311,UT,Fielding,41.811817,-112.118978 +84312,UT,Garland,41.741319,-112.151635 +84313,UT,Grouse Creek,41.629727,-113.854043 +84314,UT,Honeyville,41.623754,-112.097425 +84315,UT,Hooper,41.18267,-112.090371 +84317,UT,Huntsville,41.272139,-111.761821 +84319,UT,Hyrum,41.631096,-111.849 +84320,UT,Lewiston,41.970087,-111.876814 +84321,UT,Logan,41.747025,-111.822613 +84324,UT,Mantua,41.497496,-111.941646 +84325,UT,Mendon,41.709989,-111.981692 +84328,UT,Paradise,41.560009,-111.829665 +84329,UT,Park Valley,41.855125,-113.34776 +84332,UT,Providence,41.69522,-111.824389 +84333,UT,Richmond,41.928223,-111.806922 +84335,UT,Smithfield,41.840328,-111.852813 +84336,UT,Snowville,41.840321,-112.353391 +84337,UT,Tremonton,41.701564,-112.181293 +84338,UT,Trenton,41.910453,-111.934033 +84339,UT,Wellsville,41.634302,-111.931676 +84340,UT,Willard,41.398944,-112.031653 +84401,UT,Ogden,41.22148,-111.962121 +84403,UT,Ogden,41.189412,-111.948927 +84404,UT,Ogden,41.262727,-111.983686 +84405,UT,Ogden,41.173928,-111.980945 +84414,UT,Ogden,41.311201,-111.968924 +84501,UT,Price,39.602013,-110.808117 +84510,UT,Aneth,37.214671,-109.298281 +84511,UT,Blanding,37.586342,-109.486599 +84520,UT,East Carbon,39.546088,-110.411308 +84523,UT,Ferron,39.069196,-111.146698 +84525,UT,Green River,39.000243,-110.159817 +84526,UT,Helper,39.673684,-110.856 +84528,UT,Huntington,39.29202,-110.974094 +84531,UT,Mexican Hat,37.118429,-109.991865 +84532,UT,Moab,38.567674,-109.527087 +84533,UT,Bullfrog,37.459898,-110.506917 +84535,UT,Monticello,37.921709,-109.315289 +84536,UT,Monument Valley,37.061425,-110.427335 +84540,UT,Thompson,38.988065,-109.794482 +84542,UT,Wellington,39.537257,-110.736954 +84601,UT,Provo,40.231949,-111.675504 +84604,UT,Provo,40.260681,-111.654906 +84606,UT,Provo,40.234675,-111.644724 +84621,UT,Axtell,39.053248,-111.824303 +84622,UT,Centerfield,39.125083,-111.818516 +84624,UT,Delta,39.375534,-112.531892 +84627,UT,Ephraim,39.359983,-111.582301 +84628,UT,Eureka,39.954094,-112.117448 +84629,UT,Fairview,39.645318,-111.495287 +84630,UT,Fayette,39.231533,-111.849712 +84631,UT,Fillmore,38.980539,-112.331321 +84634,UT,Gunnison,39.154464,-111.816701 +84635,UT,Hinckley,39.330842,-112.671577 +84642,UT,Manti,39.235389,-111.651372 +84645,UT,Mona,39.838165,-111.848001 +84647,UT,Mount Pleasant,39.523227,-111.503854 +84648,UT,Nephi,39.692275,-111.8359 +84650,UT,Oasis,39.27067,-112.648079 +84651,UT,Payson,40.044866,-111.732138 +84653,UT,Woodland Hills,40.042702,-111.65906 +84654,UT,Salina,38.956028,-111.881072 +84655,UT,Genola,39.980356,-111.793819 +84660,UT,Spanish Fork,40.10991,-111.646246 +84663,UT,Springville,40.162528,-111.598664 +84664,UT,Mapleton,40.133711,-111.580122 +84701,UT,Venice,38.757075,-112.062253 +84710,UT,Alton,37.469905,-112.548389 +84712,UT,Antimony,38.1015,-111.993029 +84713,UT,Beaver,38.28071,-112.629916 +84714,UT,Beryl,37.96005,-113.619586 +84716,UT,Boulder,37.916606,-111.426646 +84717,UT,Bryce Canyon,37.608427,-112.074311 +84719,UT,Brian Head,37.698465,-112.843698 +84720,UT,Pintura,37.689544,-113.074513 +84722,UT,Central,37.567734,-113.717199 +84726,UT,Escalante,37.769839,-111.603695 +84728,UT,Garrison,39.074382,-113.894858 +84729,UT,Glendale,37.321897,-112.603491 +84731,UT,Greenville,38.263582,-112.708404 +84734,UT,Hanksville,38.252051,-110.813744 +84737,UT,Hurricane,37.169098,-113.224706 +84739,UT,Joseph,38.622092,-112.225119 +84741,UT,Big Water,37.072085,-112.345374 +84743,UT,Kingston,38.215772,-112.204864 +84747,UT,Fremont,38.417266,-111.629233 +84750,UT,Marysvale,38.444924,-112.251848 +84751,UT,Milford,38.331071,-112.993377 +84753,UT,Modena,37.799452,-113.919282 +84754,UT,Austin,38.645305,-112.132434 +84755,UT,Mount Carmel,37.237821,-112.670034 +84756,UT,Newcastle,37.736049,-113.661479 +84758,UT,Orderville,37.274419,-112.642045 +84759,UT,Panguitch,37.80777,-112.436886 +84760,UT,Paragonah,37.89172,-112.773972 +84761,UT,Parowan,37.844861,-112.832251 +84766,UT,Sevier,38.590709,-112.392126 +84770,UT,St George,37.106651,-113.595261 +84772,UT,Summit,37.803397,-112.913407 +84773,UT,Teasdale,38.285334,-111.43346 +84775,UT,Torrey,38.334993,-111.547439 +84780,UT,Washington,37.136379,-113.505043 +84781,UT,Pine Valley,37.389772,-113.517708 +84782,UT,Veyo,37.35896,-113.666758 +84783,UT,Dammeron Valley,37.284899,-113.658553 +5001,VT,White River Junc,43.663431,-72.350351 +5032,VT,Bethel,43.819464,-72.652807 +5033,VT,Bradford,44.0006,-72.140638 +5034,VT,Bridgewater,43.580428,-72.646704 +5035,VT,Bridgewater Corn,43.602147,-72.682212 +5036,VT,Brookfield,44.032083,-72.595259 +5037,VT,Brownsville,43.464584,-72.494405 +5038,VT,Chelsea,44.003931,-72.479303 +5039,VT,Corinth,44.032533,-72.282241 +5040,VT,East Corinth,44.061851,-72.215144 +5041,VT,East Randolph,43.955297,-72.548746 +5042,VT,Ryegate,44.193453,-72.072669 +5043,VT,East Thetford,43.825757,-72.19668 +5045,VT,Fairlee,43.90105,-72.190214 +5046,VT,Groton,44.220435,-72.217548 +5048,VT,Hartland,43.570764,-72.413103 +5051,VT,Newbury,44.096555,-72.107231 +5052,VT,North Hartland,43.596721,-72.352591 +5053,VT,North Pomfret,43.720401,-72.494287 +5055,VT,Norwich,43.740373,-72.30162 +5056,VT,Plymouth,43.498653,-72.710655 +5058,VT,Post Mills,43.893288,-72.262031 +5060,VT,Randolph,43.944399,-72.67258 +5061,VT,Randolph Center,43.9379,-72.596975 +5062,VT,Reading,43.47935,-72.570446 +5065,VT,Sharon,43.774843,-72.424283 +5067,VT,South Pomfret,43.679665,-72.534907 +5068,VT,South Royalton,43.808931,-72.523228 +5069,VT,South Ryegate,44.211075,-72.129558 +5070,VT,South Strafford,43.828238,-72.369959 +5071,VT,South Woodstock,43.560137,-72.538383 +5072,VT,Strafford,43.872306,-72.36363 +5073,VT,Taftsville,43.629819,-72.467331 +5075,VT,Thetford Center,43.814883,-72.266204 +5077,VT,Tunbridge,43.9169,-72.478578 +5079,VT,Vershire,43.961811,-72.319015 +5081,VT,Wells River,44.152438,-72.052958 +5083,VT,West Fairlee,43.92232,-72.26163 +5084,VT,West Hartford,43.716068,-72.444618 +5086,VT,West Topsham,44.119925,-72.270051 +5089,VT,Windsor,43.476032,-72.410998 +5091,VT,Woodstock,43.62482,-72.538455 +5101,VT,Bellows Falls,43.148198,-72.466373 +5141,VT,Cambridgeport,43.153363,-72.565511 +5142,VT,Cavendish,43.376621,-72.609247 +5143,VT,Chester,43.283124,-72.603125 +5146,VT,Grafton,43.160095,-72.597229 +5148,VT,Bromley Mtn,43.223961,-72.801756 +5149,VT,Ludlow,43.392909,-72.700184 +5150,VT,North Springfiel,43.335452,-72.529096 +5151,VT,Perkinsville,43.387885,-72.503813 +5152,VT,Peru,43.256532,-72.886797 +5153,VT,Proctorsville,43.4005,-72.61962 +5154,VT,Saxtons River,43.137861,-72.508107 +5155,VT,South Londonderr,43.183082,-72.811787 +5156,VT,Springfield,43.303433,-72.477769 +5161,VT,Weston,43.29409,-72.793523 +5201,VT,Bennington,42.882658,-73.192321 +5250,VT,Arlington,43.085681,-73.159364 +5251,VT,Dorset,43.263561,-73.076603 +5252,VT,East Arlington,43.063801,-73.138904 +5253,VT,East Dorset,43.236982,-73.008146 +5255,VT,Manchester Cente,43.175223,-73.052313 +5257,VT,North Bennington,42.92385,-73.237531 +5260,VT,North Pownal,42.809775,-73.25343 +5261,VT,Pownal,42.787955,-73.21624 +5262,VT,Shaftsbury,42.96144,-73.216591 +5301,VT,Brattleboro,42.857353,-72.593322 +5340,VT,Bondville,43.161831,-72.912768 +5341,VT,East Dover,42.950508,-72.783032 +5342,VT,Jacksonville,42.777752,-72.807121 +5343,VT,Jamaica,43.104235,-72.794409 +5345,VT,Newfane,42.97043,-72.678078 +5346,VT,Putney,43.035561,-72.512272 +5350,VT,Readsboro,42.78367,-72.960886 +5352,VT,Stamford,42.76962,-73.069068 +5353,VT,Townshend,43.062174,-72.668676 +5354,VT,Vernon,42.756468,-72.511547 +5355,VT,Wardsboro,43.032649,-72.807687 +5356,VT,Mount Snow,42.956029,-72.854235 +5358,VT,West Halifax,42.776103,-72.750142 +5359,VT,West Townshend,43.130044,-72.720985 +5360,VT,West Wardsboro,43.047221,-72.880537 +5361,VT,Whitingham,42.790071,-72.856001 +5362,VT,Williamsville,42.948151,-72.658406 +5363,VT,Wilmington,42.881216,-72.861316 +5401,VT,Burlington,44.484023,-73.219875 +5403,VT,South Burlington,44.451324,-73.179617 +5404,VT,Winooski,44.494898,-73.187413 +5405,VT,Univ Of Vermont,44.477733,-73.2002 +5440,VT,Alburg,44.968454,-73.280963 +5441,VT,Bakersfield,44.790518,-72.796834 +5443,VT,Bristol,44.146031,-73.071742 +5444,VT,Cambridge,44.651013,-72.865728 +5445,VT,Charlotte,44.311277,-73.227969 +5446,VT,Colchester,44.535956,-73.202216 +5447,VT,East Berkshire,44.929798,-72.706564 +5448,VT,East Fairfield,44.801805,-72.910995 +5450,VT,Enosburg Falls,44.898491,-72.791037 +5452,VT,Essex Junction,44.503466,-73.090644 +5454,VT,Fairfax,44.692387,-73.024078 +5455,VT,Fairfield,44.784087,-73.022187 +5456,VT,Ferrisburg,44.212822,-73.258575 +5457,VT,Franklin,44.961408,-72.903694 +5458,VT,Grand Isle,44.719711,-73.30561 +5459,VT,Highgate Center,44.940395,-73.015468 +5461,VT,Hinesburg,44.334621,-73.097955 +5462,VT,Huntington,44.322655,-72.996432 +5463,VT,Isle La Motte,44.874829,-73.339095 +5464,VT,Smugglers Notch,44.662499,-72.780577 +5465,VT,Jericho Center,44.484318,-72.979398 +5468,VT,Milton,44.648275,-73.131692 +5471,VT,Montgomery Cente,44.874606,-72.599352 +5472,VT,New Haven,44.112575,-73.17347 +5473,VT,North Ferrisburg,44.251461,-73.203254 +5474,VT,North Hero,44.829392,-73.284169 +5476,VT,Richford,44.971453,-72.690472 +5477,VT,Bolton Valley,44.399846,-72.993256 +5478,VT,Saint Albans,44.811138,-73.089025 +5482,VT,Shelburne,44.389967,-73.217124 +5483,VT,Sheldon,44.887167,-72.952989 +5486,VT,South Hero,44.640044,-73.311344 +5487,VT,Starksboro,44.2261,-73.0157 +5488,VT,Swanton,44.916754,-73.121124 +5489,VT,Underhill,44.539069,-72.925845 +5491,VT,Vergennes,44.132569,-73.279293 +5492,VT,Waterville,44.712375,-72.759557 +5494,VT,Westford,44.618191,-73.006021 +5495,VT,Williston,44.436745,-73.095704 +5602,VT,Montpelier,44.264082,-72.576992 +5640,VT,Adamant,44.35747,-72.504649 +5641,VT,Barre,44.194522,-72.493619 +5647,VT,Cabot,44.404215,-72.306443 +5648,VT,Calais,44.393438,-72.474113 +5649,VT,East Barre,44.158277,-72.446003 +5650,VT,East Calais,44.355599,-72.439829 +5651,VT,East Montpelier,44.282844,-72.492636 +5652,VT,Eden,44.734267,-72.5863 +5653,VT,Eden Mills,44.693123,-72.513447 +5654,VT,Graniteville,44.157326,-72.484529 +5655,VT,Hyde Park,44.622453,-72.594971 +5656,VT,Johnson,44.64204,-72.671154 +5658,VT,Marshfield,44.321841,-72.374994 +5660,VT,Moretown,44.259602,-72.749395 +5661,VT,Morrisville,44.554335,-72.602625 +5663,VT,Riverton,44.149961,-72.659795 +5666,VT,North Montpelier,44.256612,-72.482119 +5667,VT,Plainfield,44.262164,-72.42243 +5669,VT,Roxbury,44.084571,-72.720151 +5672,VT,Stowe,44.469512,-72.692282 +5673,VT,Waitsfield,44.188917,-72.828321 +5674,VT,Sugarbush Valley,44.114222,-72.848179 +5675,VT,Washgtin,44.086448,-72.430002 +5676,VT,Waterbury,44.345103,-72.779768 +5677,VT,Waterbury Center,44.382797,-72.708006 +5679,VT,Williamstown,44.118191,-72.53811 +5680,VT,Wolcott,44.555753,-72.484416 +5681,VT,Woodbury,44.432507,-72.417766 +5682,VT,Worcester,44.394389,-72.560925 +5701,VT,Rutland,43.614131,-72.970773 +5730,VT,Belmont,43.428441,-72.825701 +5732,VT,Hubbardton,43.622413,-73.206424 +5733,VT,Brandon,43.806467,-73.088182 +5734,VT,Bridport,43.95383,-73.347557 +5735,VT,Castleton,43.622312,-73.170797 +5736,VT,Center Rutland,43.602345,-73.016986 +5737,VT,Chittenden,43.703382,-72.936001 +5738,VT,Cuttingsville,43.522084,-72.869089 +5739,VT,Danby,43.358341,-73.01285 +5742,VT,East Wallingford,43.446063,-72.884375 +5743,VT,Fair Haven,43.62345,-73.270068 +5744,VT,Florence,43.709294,-73.078988 +5746,VT,Gaysville,43.752912,-72.731149 +5747,VT,Granville,43.984912,-72.8245 +5748,VT,Hancock,43.912525,-72.913285 +5751,VT,Killington,43.663364,-72.79631 +5753,VT,Bread Loaf,44.007042,-73.16613 +5757,VT,Middletown Sprin,43.484864,-73.11452 +5758,VT,Mount Holly,43.44865,-72.795562 +5759,VT,North Clarendon,43.552208,-72.956096 +5760,VT,Orwell,43.783722,-73.294855 +5761,VT,Pawlet,43.358679,-73.144404 +5762,VT,Pittsfield,43.753823,-72.853376 +5763,VT,Pittsford,43.71524,-73.013492 +5764,VT,Poultney,43.53321,-73.225281 +5765,VT,Proctor,43.657951,-73.034816 +5766,VT,Ripton,43.992862,-73.01874 +5767,VT,Rochester,43.880382,-72.815917 +5769,VT,Salisbury,43.90172,-73.100793 +5770,VT,Shoreham,43.886214,-73.305385 +5772,VT,Stockbridge,43.773808,-72.781394 +5773,VT,Wallingford,43.4573,-72.987722 +5774,VT,Wells,43.430456,-73.202684 +5775,VT,West Pawlet,43.36673,-73.231327 +5776,VT,West Rupert,43.261792,-73.202847 +5777,VT,West Rutland,43.578072,-73.04242 +5778,VT,Leicester Juncti,43.874972,-73.213312 +5819,VT,Saint Johnsbury,44.427195,-72.005062 +5820,VT,Albany,44.734427,-72.34181 +5821,VT,Barnet,44.317923,-72.078326 +5822,VT,Barton,44.739465,-72.160005 +5824,VT,Concord,44.446055,-71.867554 +5825,VT,Coventry,44.880853,-72.254471 +5826,VT,Craftsbury,44.64341,-72.366007 +5827,VT,Craftsbury Commo,44.652917,-72.414578 +5828,VT,Danville,44.433241,-72.113319 +5829,VT,Derby,44.950182,-72.137555 +5830,VT,Derby Line,44.990183,-72.082367 +5832,VT,East Burke,44.607849,-71.935674 +5833,VT,East Charleston,44.829896,-71.97627 +5836,VT,East Hardwick,44.528833,-72.303351 +5837,VT,East Haven,44.651724,-71.867491 +5839,VT,Glover,44.719979,-72.203819 +5841,VT,Greensboro,44.595069,-72.285017 +5842,VT,Greensboro Bend,44.548488,-72.252478 +5843,VT,Hardwick,44.507026,-72.363818 +5845,VT,Irasburg,44.808056,-72.276269 +5846,VT,Island Pond,44.809452,-71.883964 +5847,VT,Lowell,44.796107,-72.450132 +5850,VT,Lyndon Center,44.54719,-72.031062 +5851,VT,Lyndonville,44.540766,-72.009168 +5853,VT,Morgan Ctr,44.90659,-71.994052 +5855,VT,Newport,44.939344,-72.206505 +5857,VT,Newport Center,44.944175,-72.297412 +5858,VT,North Concord,44.550099,-71.786662 +5859,VT,Jay Peak,44.961861,-72.457231 +5860,VT,Orleans,44.80544,-72.165328 +5862,VT,Peacham,44.335563,-72.177039 +5866,VT,Sheffield,44.61784,-72.123927 +5867,VT,Sutton,44.646543,-72.021133 +5868,VT,Troy,44.959381,-72.393808 +5871,VT,West Burke,44.663647,-71.95718 +5872,VT,West Charleston,44.872894,-72.05209 +5873,VT,West Danville,44.446509,-72.219771 +5874,VT,Westfield,44.882457,-72.439628 +5875,VT,West Glover,44.703145,-72.259936 +5901,VT,Averill,44.992304,-71.700268 +5902,VT,Beecher Falls,45.006103,-71.519901 +5903,VT,Canaan,44.976439,-71.560214 +5904,VT,Gilman,44.413985,-71.71786 +5905,VT,Guildhall,44.690218,-71.599057 +5906,VT,Lunenburg,44.466262,-71.69304 +5907,VT,Norton,44.988781,-71.78844 +22001,VA,Aldie,38.957878,-77.602281 +22002,VA,Amissville,38.710055,-78.038053 +22003,VA,Annandale,38.830699,-77.214245 +22010,VA,Arcola,38.973626,-77.538721 +22011,VA,Ashburn,39.039918,-77.480612 +22012,VA,Bluemont,39.097732,-77.831416 +22013,VA,Bristow,38.74644,-77.578843 +22014,VA,Broad Run,38.828653,-77.68611 +22015,VA,Burke,38.789408,-77.28175 +22018,VA,Catharpin,38.853007,-77.561155 +22019,VA,Catlett,38.635067,-77.653548 +22020,VA,Centreville,38.841805,-77.451175 +22021,VA,Chantilly,38.884131,-77.435436 +22024,VA,Clifton,38.800662,-77.406955 +22025,VA,Delaplane,38.911293,-77.930176 +22026,VA,Dumfries,38.602344,-77.338704 +22027,VA,Dunn Loring,38.895368,-77.221351 +22030,VA,Fairfax,38.845826,-77.324151 +22031,VA,Fairfax,38.860353,-77.264937 +22032,VA,Fairfax,38.817729,-77.292527 +22033,VA,Fairfax,38.877627,-77.388451 +22039,VA,Fairfax Station,38.760205,-77.306388 +22041,VA,Baileys Crossroa,38.848506,-77.136928 +22042,VA,Mosby,38.866272,-77.192271 +22043,VA,Pimmit,38.901226,-77.20005 +22044,VA,Seven Corners,38.863544,-77.150819 +22046,VA,Falls Church,38.88559,-77.180231 +22060,VA,Fort Belvoir,38.694699,-77.143315 +22065,VA,Gainesville,38.823192,-77.618673 +22066,VA,Great Falls,39.003893,-77.308287 +22068,VA,Hamilton,39.135741,-77.663538 +22069,VA,Haymarket,38.876234,-77.647485 +22070,VA,Herndon,38.977833,-77.386573 +22071,VA,Herndon,38.919537,-77.395155 +22075,VA,Leesburg,39.116517,-77.565918 +22079,VA,Mason Neck,38.704716,-77.218004 +22080,VA,Lovettsville,39.265367,-77.639144 +22090,VA,Lake Anne,38.964439,-77.337607 +22091,VA,Reston,38.935007,-77.35144 +22094,VA,Reston,38.975627,-77.350757 +22101,VA,Mc Lean,38.932624,-77.170628 +22102,VA,West Mclean,38.936318,-77.221934 +22110,VA,Manassas,38.768922,-77.489474 +22111,VA,Manassas Park,38.736143,-77.44568 +22115,VA,Marshall,38.831584,-77.887567 +22117,VA,Middleburg,38.996438,-77.735511 +22123,VA,Nokesville,38.685015,-77.534249 +22124,VA,Oakton,38.885187,-77.323345 +22129,VA,Paeonian Springs,39.159792,-77.619845 +22130,VA,Paris,38.989926,-77.893855 +22132,VA,Hillsboro,39.150484,-77.721305 +22134,VA,Quantico,38.531039,-77.335819 +22141,VA,Round Hill,39.113378,-77.783305 +22150,VA,Springfield,38.779718,-77.186582 +22151,VA,North Springfiel,38.803323,-77.213908 +22152,VA,West Springfield,38.776488,-77.233243 +22153,VA,Springfield,38.744859,-77.237026 +22170,VA,Sterling,39.02147,-77.398624 +22171,VA,The Plains,38.87393,-77.772092 +22172,VA,Triangle,38.550894,-77.322877 +22176,VA,Upperville,39.008747,-77.848438 +22180,VA,Vienna,38.893527,-77.253219 +22181,VA,Vienna,38.897695,-77.288048 +22182,VA,Vienna,38.928005,-77.264876 +22186,VA,Airlie,38.72593,-77.764809 +22190,VA,Waterford,39.208102,-77.642134 +22191,VA,Woodbridge,38.635573,-77.268264 +22192,VA,Lakeridge,38.68328,-77.305221 +22193,VA,Dale City,38.647188,-77.343238 +22201,VA,Arlington,38.887103,-77.093197 +22202,VA,Arlington,38.856547,-77.059228 +22203,VA,Arlington,38.873799,-77.114191 +22204,VA,Arlington,38.858962,-77.099688 +22205,VA,Arlington,38.883557,-77.139488 +22206,VA,Arlington,38.841508,-77.09046 +22207,VA,Arlington,38.903321,-77.126287 +22209,VA,Arlington,38.8926,-77.07531 +22211,VA,Arlington,38.8795,-77.080258 +22213,VA,Arlington,38.895375,-77.163295 +22301,VA,Alexandria,38.820042,-77.058901 +22302,VA,Alexandria,38.83354,-77.092412 +22303,VA,Jefferson Manor,38.791143,-77.076608 +22304,VA,Alexandria,38.814871,-77.120989 +22305,VA,Alexandria,38.837184,-77.064039 +22306,VA,Community,38.755769,-77.085389 +22307,VA,Belle View,38.77056,-77.062511 +22308,VA,Wellington,38.729122,-77.060639 +22309,VA,Engleside,38.727855,-77.108139 +22310,VA,Franconia,38.769132,-77.131707 +22311,VA,Alexandria,38.832039,-77.119962 +22312,VA,Alexandria,38.819099,-77.148438 +22314,VA,Alexandria,38.806018,-77.052867 +22401,VA,Fredericksburg,38.299538,-77.477152 +22405,VA,Falmouth,38.314557,-77.404537 +22406,VA,Fredericksburg,38.379627,-77.534892 +22407,VA,Fredericksburg,38.268803,-77.547584 +22408,VA,Fredericksburg,38.248141,-77.468068 +22427,VA,Bowling Green,38.013651,-77.180242 +22432,VA,Burgess,37.868682,-76.354164 +22433,VA,Burr Hill,38.365841,-77.876166 +22435,VA,Callao,37.977268,-76.573245 +22436,VA,Caret,37.971255,-76.915254 +22437,VA,Center Cross,37.792875,-76.754837 +22438,VA,Champlain,38.021422,-76.971942 +22439,VA,Chance,38.084061,-77.021051 +22443,VA,Oak Grove,38.229076,-76.981158 +22448,VA,Dahlgren,38.337485,-77.042905 +22454,VA,Howertons,37.840429,-76.837022 +22460,VA,Farnham,37.873972,-76.605011 +22469,VA,Hague,38.057289,-76.661574 +22473,VA,Heathsville,37.907187,-76.41783 +22476,VA,Hustle,38.022219,-77.036426 +22480,VA,Irvington,37.664516,-76.416016 +22482,VA,Kilmarnock,37.716222,-76.381986 +22485,VA,King George,38.281142,-77.126023 +22488,VA,Kinsale,38.050472,-76.585525 +22503,VA,Lancaster,37.750091,-76.5102 +22504,VA,Laneview,37.768138,-76.711732 +22508,VA,Locust Grove,38.335202,-77.770874 +22509,VA,Loretto,38.062055,-76.966888 +22511,VA,Lottsburg,37.979228,-76.501763 +22514,VA,Milford,38.005834,-77.318498 +22520,VA,Montross,38.110483,-76.782806 +22534,VA,Partlow,38.064146,-77.658574 +22535,VA,Port Royal,38.162088,-77.183657 +22538,VA,Rappahannock Aca,38.201817,-77.287437 +22539,VA,Reedville,37.856964,-76.282864 +22542,VA,Rhoadesville,38.286324,-77.923044 +22546,VA,Ruther Glen,37.945059,-77.47135 +22553,VA,Snell,38.19953,-77.648688 +22554,VA,Stafford,38.458629,-77.430618 +22559,VA,Supply,38.082544,-77.109689 +22560,VA,Tappahannock,37.914551,-76.912455 +22567,VA,Unionville,38.238302,-77.919299 +22568,VA,Mine Run,38.266106,-77.819493 +22572,VA,Nomini Grove,37.949992,-76.736517 +22576,VA,Weems,37.684678,-76.431323 +22578,VA,Windmill Point,37.647458,-76.368626 +22579,VA,Wicomico Church,37.779027,-76.356522 +22580,VA,Woodford,38.084664,-77.439879 +22601,VA,Winchester,39.185803,-78.182697 +22610,VA,Browntown,38.827272,-78.279111 +22611,VA,Berryville,39.153178,-77.968759 +22620,VA,Boyce,39.069797,-78.020302 +22624,VA,Clear Brook,39.265461,-78.098788 +22625,VA,Whitacre,39.3762,-78.299724 +22627,VA,Flint Hill,38.733653,-78.075558 +22630,VA,Front Royal,38.926783,-78.179617 +22637,VA,Gore,39.288685,-78.341687 +22639,VA,Hume,38.827318,-77.994892 +22640,VA,Huntly,38.813333,-78.130104 +22641,VA,Lebanon Church,39.056242,-78.359511 +22642,VA,Linden,38.881181,-78.047847 +22643,VA,Markham,38.930001,-77.994252 +22644,VA,Maurertown,38.944052,-78.465815 +22645,VA,Middletown,39.036676,-78.281455 +22649,VA,Reliance,39.000946,-78.249152 +22650,VA,Rileyville,38.756374,-78.387326 +22652,VA,Saint Davids Chu,38.827683,-78.439989 +22654,VA,Star Tannery,39.090803,-78.434306 +22655,VA,Stephens City,39.083415,-78.190677 +22656,VA,Stephenson,39.197285,-78.094105 +22657,VA,Strasburg,38.988417,-78.33862 +22660,VA,Toms Brook,38.97016,-78.403757 +22663,VA,White Post,39.057956,-78.11046 +22664,VA,Woodstock,38.887024,-78.521704 +22701,VA,Raccoon Ford,38.48115,-78.00406 +22709,VA,Aroda,38.325626,-78.236615 +22712,VA,Morrisville,38.569667,-77.800436 +22713,VA,Boston,38.538241,-78.142285 +22714,VA,Brandy Station,38.511003,-77.903745 +22715,VA,Brightwood,38.411365,-78.169801 +22716,VA,Castleton,38.603235,-78.120801 +22718,VA,Elkwood,38.465229,-77.817031 +22719,VA,Etlan,38.509458,-78.263793 +22720,VA,Goldvein,38.488641,-77.639488 +22722,VA,Haywood,38.46861,-78.179759 +22724,VA,Jeffersonton,38.625578,-77.906943 +22725,VA,Leon,38.45724,-78.154579 +22726,VA,Lignum,38.395625,-77.829957 +22727,VA,Aylor,38.384495,-78.296458 +22728,VA,Midland,38.567061,-77.712709 +22729,VA,Mitchells,38.374429,-78.010546 +22731,VA,Pratts,38.349207,-78.272212 +22732,VA,Radiant,38.322706,-78.179799 +22733,VA,Rapidan,38.339217,-78.047607 +22734,VA,Remington,38.535091,-77.761365 +22735,VA,Reva,38.460446,-78.157195 +22736,VA,Richardsville,38.392388,-77.719519 +22737,VA,Rixeyville,38.585168,-78.028229 +22738,VA,Uno,38.274342,-78.265358 +22740,VA,Sperryville,38.620252,-78.246571 +22741,VA,Stevensburg,38.444135,-77.88423 +22742,VA,Sumerduck,38.467355,-77.70436 +22743,VA,Syria,38.497229,-78.322939 +22746,VA,Viewtown,38.645704,-78.025769 +22747,VA,Washington,38.707838,-78.1566 +22749,VA,Woodville,38.648176,-78.173855 +22801,VA,Harrisonburg,38.448864,-78.871438 +22810,VA,Basye,38.795806,-78.767363 +22811,VA,Bergton,38.792509,-78.966752 +22812,VA,Bridgewater,38.385866,-78.993684 +22815,VA,Broadway,38.608336,-78.787494 +22820,VA,Criders,38.749656,-78.997357 +22821,VA,Montezuma,38.433864,-78.993731 +22824,VA,Edinburg,38.843206,-78.60033 +22827,VA,Elkton,38.40252,-78.632143 +22830,VA,Fulks Run,38.633871,-78.935799 +22831,VA,Hinton,38.483378,-79.010084 +22832,VA,Keezletown,38.439588,-78.776998 +22834,VA,Linville,38.555733,-78.896102 +22835,VA,Luray,38.654839,-78.459559 +22840,VA,Mc Gaheysville,38.371228,-78.741128 +22841,VA,Mount Crawford,38.345656,-78.895679 +22842,VA,Conicville,38.768819,-78.676655 +22843,VA,Mount Solon,38.332755,-79.102832 +22844,VA,New Market,38.660555,-78.671433 +22845,VA,Orkney Springs,38.793708,-78.811106 +22846,VA,Montevideo,38.369729,-78.797903 +22847,VA,Shenandoah Caver,38.714443,-78.698866 +22849,VA,Shenandoah,38.501034,-78.608975 +22851,VA,Stanley,38.566036,-78.509263 +22853,VA,Timberville,38.647606,-78.771702 +22901,VA,Charlottesville,38.054752,-78.490869 +22903,VA,University,38.032728,-78.505758 +22920,VA,Afton,37.962624,-78.841046 +22922,VA,Tye River,37.687713,-78.918473 +22923,VA,Burnleys,38.199648,-78.312716 +22929,VA,Cobham,38.037835,-78.37849 +22931,VA,Covesville,37.907974,-78.712741 +22932,VA,Yancey Mills,38.081288,-78.704405 +22935,VA,Boonesville,38.253276,-78.554612 +22936,VA,Earlysville,38.157761,-78.491945 +22937,VA,Esmont,37.812543,-78.610646 +22938,VA,Faber,37.847545,-78.756495 +22939,VA,Woodrow Wilson,38.097361,-78.969579 +22940,VA,Mission Home,38.206217,-78.595906 +22942,VA,Cashs Corner,38.107261,-78.195195 +22943,VA,Greenwood,38.041545,-78.783282 +22946,VA,Keene,37.931273,-78.561386 +22947,VA,Boyd Tavern,38.001265,-78.340429 +22948,VA,Locust Dale,38.334043,-78.101576 +22949,VA,Lovingston,37.792405,-78.868433 +22951,VA,Lowesville,37.749797,-79.083346 +22952,VA,Sherando,37.997903,-78.951506 +22958,VA,Wintergreen,37.860398,-78.893972 +22959,VA,Alberene,37.961992,-78.695414 +22960,VA,Montford,38.233937,-78.091224 +22963,VA,Bybee,37.881807,-78.297983 +22964,VA,Piney River,37.715785,-79.020571 +22967,VA,Roseland,37.807697,-78.971173 +22968,VA,Advance Mills,38.233871,-78.391033 +22969,VA,Schuyler,37.797584,-78.692475 +22971,VA,Rockfish,37.747974,-78.824608 +22972,VA,Somerset,38.204657,-78.25042 +22973,VA,Geer,38.302556,-78.470755 +22974,VA,Troy,37.9636,-78.253494 +22980,VA,Waynesboro,38.077412,-78.903461 +23002,VA,Amelia Court Hou,37.35017,-77.955177 +23004,VA,Arvonia,37.671355,-78.38888 +23005,VA,Ashland,37.73948,-77.478373 +23009,VA,Aylett,37.822113,-77.188473 +23011,VA,Barhamsville,37.461662,-76.832097 +23013,VA,23013,37.331428,-76.279433 +23015,VA,Beaverdam,37.903767,-77.630829 +23016,VA,Beaverlett,37.41587,-76.322425 +23020,VA,23020,37.502082,-76.363655 +23021,VA,Bohannon,37.390457,-76.36136 +23022,VA,Bremo Bluff,37.745256,-78.267158 +23023,VA,Bruington,37.780112,-76.940199 +23024,VA,Bumpass,37.898381,-77.796614 +23025,VA,Miles,37.427339,-76.393959 +23027,VA,Tamworth,37.641314,-78.128699 +23029,VA,Cauthornville,37.858957,-77.039625 +23030,VA,Charles City,37.366271,-77.108183 +23032,VA,Church View,37.674956,-76.66287 +23037,VA,Cologne,37.555866,-76.683356 +23038,VA,Columbia,37.714707,-78.179403 +23039,VA,Crozier,37.671764,-77.793958 +23040,VA,Cumberland,37.501861,-78.258149 +23042,VA,23042,37.751953,-77.812016 +23043,VA,Deltaville,37.554852,-76.346781 +23045,VA,Diggs,37.436273,-76.287172 +23047,VA,Doswell,37.841682,-77.512521 +23050,VA,Dutton,37.486897,-76.435782 +23055,VA,Fork Union,37.771526,-78.235498 +23060,VA,Glen Allen,37.662848,-77.534016 +23061,VA,Pinero,37.41922,-76.553312 +23062,VA,Gloucester Point,37.258534,-76.49586 +23063,VA,Goochland,37.768789,-78.011216 +23065,VA,Gum Spring,37.818374,-77.907049 +23066,VA,Gwynn,37.500594,-76.29042 +23069,VA,Hanover,37.770116,-77.321572 +23070,VA,Hardyville,37.547821,-76.418937 +23071,VA,Hartfield,37.559437,-76.476949 +23072,VA,Hayes,37.291577,-76.490457 +23075,VA,Highland Springs,37.543723,-77.32261 +23079,VA,Jamaica,37.729997,-76.688962 +23080,VA,James Store,37.480594,-76.464972 +23083,VA,Jetersville,37.31757,-78.104011 +23084,VA,Kents Store,37.89425,-78.120776 +23085,VA,King And Queen C,37.717644,-76.863059 +23086,VA,King William,37.720194,-77.099837 +23089,VA,Lanexa,37.419391,-76.902684 +23091,VA,Little Plymouth,37.664218,-76.825456 +23092,VA,Locust Hill,37.598328,-76.501857 +23093,VA,Louisa,38.01317,-78.034666 +23102,VA,Dabneys,37.703193,-77.871032 +23103,VA,Manakin Sabot,37.638036,-77.707699 +23106,VA,Manquin,37.718441,-77.186016 +23108,VA,Mascot,37.60683,-76.738324 +23109,VA,Mathews,37.438349,-76.354416 +23110,VA,Shanghai,37.641698,-76.78398 +23111,VA,Mechanicsville,37.628146,-77.339464 +23112,VA,Midlothian,37.431027,-77.654458 +23113,VA,Midlothian,37.510893,-77.642864 +23114,VA,23114,37.411851,-76.367526 +23117,VA,Mineral,37.998609,-77.878069 +23118,VA,Mobjack,37.377579,-76.355244 +23119,VA,Moon,37.449276,-76.306472 +23120,VA,Moseley,37.426026,-77.758458 +23123,VA,New Canton,37.664499,-78.311231 +23124,VA,New Kent,37.553013,-77.074242 +23125,VA,New Point,37.349291,-76.283465 +23126,VA,Newtown,37.878236,-77.113825 +23128,VA,North,37.477066,-76.370661 +23129,VA,Oilville,37.708879,-77.769955 +23130,VA,Onemo,37.398517,-76.294056 +23137,VA,23137,37.518018,-76.724658 +23138,VA,Bavon,37.374252,-76.304463 +23139,VA,Powhatan,37.556442,-77.879761 +23140,VA,Providence Forge,37.425907,-77.071117 +23141,VA,Quinton,37.518466,-77.148607 +23146,VA,Rockville,37.733729,-77.699994 +23148,VA,Indian Neck,37.905052,-77.084206 +23149,VA,Saluda,37.594944,-76.592082 +23150,VA,Sandston,37.515658,-77.27578 +23153,VA,Sandy Hook,37.751892,-77.904553 +23156,VA,Plain View,37.569811,-76.726901 +23157,VA,23157,37.340897,-76.297135 +23161,VA,Stevensville,37.714577,-76.935228 +23163,VA,Shadow,37.361945,-76.318617 +23168,VA,Toano,37.39013,-76.825263 +23169,VA,Syringa,37.597824,-76.454876 +23175,VA,Remlik,37.655003,-76.612611 +23176,VA,Wake,37.568077,-76.432327 +23177,VA,Walkerton,37.755437,-77.018475 +23179,VA,Warner,37.651127,-76.646167 +23180,VA,Water View,37.710486,-76.62268 +23181,VA,West Point,37.555604,-76.82373 +23185,VA,Merrimac,37.262698,-76.701686 +23188,VA,Williamsburg,37.317768,-76.763424 +23192,VA,Montpelier,37.817729,-77.692441 +23219,VA,Richmond,37.546265,-77.437798 +23220,VA,Richmond,37.549808,-77.458798 +23221,VA,Richmond,37.558301,-77.4845 +23222,VA,Richmond,37.574802,-77.426725 +23223,VA,Richmond,37.547721,-77.394772 +23224,VA,Richmond,37.495512,-77.471014 +23225,VA,Richmond,37.515842,-77.504709 +23226,VA,Richmond,37.582473,-77.519657 +23227,VA,Bellevue,37.604181,-77.446309 +23228,VA,Lakeside,37.623503,-77.493308 +23229,VA,Regency,37.596351,-77.566202 +23230,VA,West End,37.588376,-77.496828 +23231,VA,Richmond,37.491529,-77.368002 +23233,VA,Ridge,37.619354,-77.614933 +23234,VA,Ampthill,37.453158,-77.469798 +23235,VA,Bon Air,37.512034,-77.565103 +23236,VA,Richmond,37.478165,-77.585413 +23237,VA,Richmond,37.401145,-77.461471 +23294,VA,Richmond,37.632923,-77.545125 +23301,VA,Accomac,37.71588,-75.680272 +23302,VA,Assawoman,37.86629,-75.52966 +23306,VA,Belle Haven,37.56448,-75.869443 +23307,VA,Birdsnest,37.432077,-75.904347 +23308,VA,Bloxom,37.827264,-75.615568 +23310,VA,Cape Charles,37.279874,-75.972129 +23314,VA,Carrollton,36.954994,-76.542963 +23315,VA,Carrsville,36.74544,-76.83648 +23320,VA,Chesapeake,36.735246,-76.23843 +23321,VA,Bowers Hill,36.827964,-76.411012 +23322,VA,Fentress,36.634008,-76.213064 +23323,VA,Chesapeake,36.763424,-76.339743 +23324,VA,Chesapeake,36.805568,-76.266557 +23325,VA,Chesapeake,36.813963,-76.240555 +23336,VA,Chincoteague,37.927682,-75.371369 +23337,VA,Wallops Island,37.827338,-75.506503 +23350,VA,Exmore,37.511689,-75.852624 +23354,VA,Franktown,37.462009,-75.888971 +23356,VA,Greenbackville,38.006404,-75.402899 +23357,VA,Greenbush,37.768121,-75.6664 +23359,VA,Hallwood,37.853644,-75.561334 +23395,VA,Horntown,37.969916,-75.471608 +23396,VA,Horsey,37.933232,-75.56236 +23399,VA,Jenkins Bridge,37.919219,-75.631943 +23404,VA,Locustville,37.6534,-75.673508 +23405,VA,Machipongo,37.401429,-75.908241 +23407,VA,Mappsville,37.835419,-75.569886 +23409,VA,Mears,37.869189,-75.635443 +23410,VA,Melfa,37.6407,-75.745355 +23415,VA,New Church,37.952527,-75.511188 +23416,VA,Oak Hall,37.953686,-75.606483 +23417,VA,Onancock,37.710237,-75.752798 +23418,VA,Onley,37.670422,-75.6992 +23420,VA,Painter,37.582821,-75.806612 +23421,VA,Parksley,37.774404,-75.638634 +23426,VA,Sanford,37.92433,-75.695704 +23430,VA,Smithfield,36.981057,-76.63682 +23432,VA,Suffolk,36.866823,-76.559811 +23433,VA,Suffolk,36.909027,-76.49286 +23434,VA,Suffolk,36.730433,-76.593147 +23435,VA,Suffolk,36.854427,-76.466397 +23436,VA,Suffolk,36.892625,-76.514157 +23437,VA,Suffolk,36.652611,-76.792043 +23438,VA,Suffolk,36.591311,-76.687097 +23440,VA,Tangier,37.824485,-75.993003 +23442,VA,Temperanceville,37.895421,-75.55283 +23451,VA,Virginia Beach,36.858451,-76.001928 +23452,VA,Virginia Beach,36.83481,-76.096142 +23454,VA,Virginia Beach,36.828187,-76.023723 +23455,VA,Virginia Beach,36.888121,-76.144552 +23456,VA,Virginia Beach,36.779851,-76.089162 +23457,VA,Blackwater Bridg,36.624793,-76.037816 +23459,VA,Virginia Beach,36.9216,-76.017122 +23462,VA,Virginia Beach,36.839193,-76.152184 +23464,VA,Virginia Beach,36.797772,-76.175909 +23481,VA,Walters,36.708974,-76.870156 +23487,VA,Windsor,36.836881,-76.732372 +23502,VA,Norfolk,36.854648,-76.214253 +23503,VA,Norfolk,36.944196,-76.252008 +23504,VA,Norfolk,36.858554,-76.268628 +23505,VA,Norfolk,36.91675,-76.28748 +23507,VA,Norfolk,36.864506,-76.300385 +23508,VA,Norfolk,36.885922,-76.300356 +23509,VA,Norfolk,36.878743,-76.260361 +23510,VA,Norfolk,36.852929,-76.287784 +23511,VA,Fleet,36.951164,-76.309206 +23513,VA,Norfolk,36.891395,-76.239578 +23517,VA,Norfolk,36.869547,-76.294519 +23518,VA,Norfolk,36.920246,-76.216027 +23521,VA,Naval Amphibious,36.916923,-76.163715 +23523,VA,Norfolk,36.82942,-76.270125 +23601,VA,Newport News,37.057951,-76.460722 +23602,VA,Newport News,37.131684,-76.532125 +23603,VA,Newport News,37.198887,-76.582059 +23604,VA,Newport News,37.122112,-76.589727 +23605,VA,Newport News,37.015583,-76.433158 +23606,VA,Newport News,37.076777,-76.496724 +23607,VA,Newport News,36.986352,-76.416469 +23651,VA,Hampton,37.029671,-76.296896 +23661,VA,Hampton,37.007432,-76.380085 +23662,VA,Poquoson,37.131252,-76.380702 +23663,VA,Hampton,37.03181,-76.319875 +23664,VA,Hampton,37.056611,-76.296639 +23665,VA,Hampton,37.100565,-76.409939 +23666,VA,Hampton,37.046241,-76.409617 +23669,VA,Hampton,37.043559,-76.342573 +23690,VA,Yorktown,37.228657,-76.542346 +23692,VA,Grafton,37.170859,-76.459648 +23693,VA,Tabb,37.122586,-76.450743 +23696,VA,Seaford,37.188468,-76.428992 +23701,VA,Portsmouth,36.808902,-76.36714 +23702,VA,Portsmouth,36.803534,-76.326979 +23703,VA,Portsmouth,36.869501,-76.386872 +23704,VA,Portsmouth,36.829821,-76.314604 +23707,VA,Portsmouth,36.836234,-76.344011 +23709,VA,Portsmouth,36.813883,-76.305188 +23801,VA,Fort Lee,37.244738,-77.33405 +23803,VA,Ettrick,37.220001,-77.432594 +23805,VA,Petersburg,37.181937,-77.385385 +23821,VA,Alberta,36.880609,-77.905518 +23824,VA,Blackstone,37.091578,-77.985063 +23827,VA,Boykins,36.595061,-77.197519 +23828,VA,Branchville,36.578701,-77.270441 +23829,VA,Capron,36.724332,-77.239363 +23830,VA,Carson,37.039311,-77.435093 +23831,VA,Chester,37.342934,-77.41557 +23832,VA,Chesterfield,37.392327,-77.566799 +23833,VA,Church Road,37.194964,-77.664588 +23834,VA,Colonial Heights,37.269968,-77.403829 +23837,VA,Courtland,36.722516,-77.078272 +23839,VA,Dendron,37.098076,-76.896642 +23840,VA,Dewitt,37.053522,-77.642558 +23841,VA,Dinwiddie,37.083283,-77.558539 +23842,VA,Disputanta,37.148268,-77.273172 +23843,VA,Dolphin,36.831774,-77.788719 +23844,VA,Drewryville,36.685433,-77.359098 +23845,VA,Ebony,36.584993,-77.999431 +23846,VA,Elberon,37.070133,-76.833723 +23847,VA,Emporia,36.685689,-77.562953 +23850,VA,Ammon,37.139672,-77.737189 +23851,VA,Franklin,36.678625,-76.939108 +23856,VA,Freeman,36.789342,-77.720772 +23857,VA,Gasburg,36.576552,-77.902927 +23859,VA,Handsom,36.609854,-77.023797 +23860,VA,Hopewell,37.287576,-77.295013 +23866,VA,Ivor,36.907099,-76.886146 +23867,VA,Jarratt,36.819129,-77.483162 +23868,VA,Triplet,36.744874,-77.838437 +23872,VA,Mc Kenney,36.998609,-77.739556 +23874,VA,Newsoms,36.614814,-77.106949 +23875,VA,Prince George,37.233339,-77.274706 +23876,VA,Rawlings,36.953043,-77.82372 +23878,VA,Sedley,36.790752,-77.012531 +23879,VA,Skippers,36.579685,-77.543663 +23881,VA,Spring Grove,37.190098,-76.992337 +23882,VA,Stony Creek,36.936132,-77.444276 +23883,VA,Surry,37.126024,-76.76514 +23885,VA,Sutherland,37.190149,-77.565463 +23887,VA,Valentines,36.565024,-77.838405 +23888,VA,Wakefield,36.975734,-76.97898 +23889,VA,Warfield,36.901122,-77.767317 +23890,VA,Waverly,37.025032,-77.105453 +23893,VA,White Plains,36.633549,-77.959245 +23894,VA,Wilsons,37.115678,-77.835193 +23897,VA,Yale,36.837279,-77.286986 +23898,VA,Zuni,36.843666,-76.810967 +23901,VA,Farmville,37.302692,-78.407592 +23915,VA,Baskerville,36.723595,-78.279047 +23917,VA,Boydton,36.654422,-78.375174 +23919,VA,Bracey,36.576295,-78.105862 +23920,VA,Brodnax,36.731879,-77.989843 +23921,VA,Buckingham,37.583335,-78.598537 +23922,VA,Burkeville,37.195203,-78.196084 +23923,VA,Charlotte Court,37.086379,-78.660622 +23924,VA,Chase City,36.805305,-78.455268 +23927,VA,Clarksville,36.631437,-78.535294 +23930,VA,Crewe,37.165676,-78.105866 +23934,VA,Cullen,37.155211,-78.645912 +23936,VA,Sprouses Corner,37.545804,-78.460929 +23937,VA,Drakes Branch,36.968767,-78.561542 +23938,VA,Dundas,36.90532,-78.010016 +23942,VA,Green Bay,37.123417,-78.307195 +23944,VA,Kenbridge,36.932965,-78.124238 +23947,VA,Keysville,37.041086,-78.469912 +23950,VA,Blackridge,36.68609,-78.095251 +23952,VA,Lunenburg,36.922624,-78.290644 +23954,VA,Meherrin,37.101283,-78.387357 +23958,VA,Pamplin,37.265333,-78.65166 +23959,VA,Phenix,37.092506,-78.791195 +23960,VA,Prospect,37.305838,-78.546162 +23962,VA,Randolph,36.963079,-78.699249 +23963,VA,Red House,37.191431,-78.814467 +23964,VA,Red Oak,36.772403,-78.632057 +23966,VA,Rice,37.272132,-78.279262 +23967,VA,Saxe,36.90569,-78.605699 +23968,VA,Skipwith,36.731704,-78.530552 +23970,VA,South Hill,36.712388,-78.153388 +23973,VA,23973,36.766267,-78.219555 +23974,VA,Victoria,36.983543,-78.237243 +23976,VA,Wylliesburg,36.838968,-78.612655 +24011,VA,Roanoke,37.268997,-79.942019 +24012,VA,Roanoke,37.302912,-79.932179 +24013,VA,Roanoke,37.267685,-79.924747 +24014,VA,Roanoke,37.23268,-79.946332 +24015,VA,Roanoke,37.258363,-79.980694 +24016,VA,Roanoke,37.270407,-79.953495 +24017,VA,Roanoke,37.293655,-79.990248 +24018,VA,Cave Spring,37.231554,-80.021749 +24019,VA,Hollins,37.33585,-79.956328 +24053,VA,Ararat,36.613946,-80.50934 +24054,VA,Axton,36.654839,-79.73964 +24055,VA,Bassett,36.753425,-80.005506 +24059,VA,Bent Mountain,37.206793,-80.145501 +24060,VA,Whitethorne,37.228804,-80.427313 +24064,VA,Blue Ridge,37.388542,-79.817178 +24065,VA,Boones Mill,37.13313,-79.955554 +24066,VA,Lithia,37.52844,-79.705287 +24067,VA,Callaway,37.028495,-80.049592 +24069,VA,Cascade,36.592697,-79.657438 +24070,VA,Catawba,37.369649,-80.128384 +24072,VA,Simpsons,37.032642,-80.236747 +24073,VA,Christiansburg,37.135286,-80.418774 +24076,VA,Claudville,36.583899,-80.444179 +24077,VA,Cloverdale,37.366293,-79.912765 +24078,VA,Collinsville,36.72379,-79.914192 +24079,VA,Copper Hill,37.055568,-80.152469 +24082,VA,Critz,36.621059,-80.129765 +24083,VA,Daleville,37.41253,-79.921095 +24084,VA,Dublin,37.098879,-80.669696 +24085,VA,Eagle Rock,37.666727,-79.817215 +24086,VA,Eggleston,37.290576,-80.652758 +24087,VA,Ironto,37.212651,-80.249658 +24088,VA,Ferrum,36.916834,-80.034923 +24089,VA,Fieldale,36.706414,-79.965245 +24090,VA,Fincastle,37.491099,-79.851116 +24091,VA,Alum Ridge,36.919523,-80.319054 +24092,VA,Gladehill,37.016866,-79.776271 +24093,VA,Glen Lyn,37.366853,-80.863358 +24094,VA,Goldbond,37.387221,-80.66315 +24095,VA,Goodview,37.347167,-79.726284 +24101,VA,Hardy,37.214473,-79.812661 +24102,VA,Henry,36.839322,-79.99036 +24104,VA,Huddleston,37.144155,-79.491017 +24105,VA,Indian Valley,36.898993,-80.57571 +24112,VA,Martinsville,36.687067,-79.869136 +24120,VA,Meadows Of Dan,36.72504,-80.402227 +24121,VA,Moneta,37.178383,-79.652111 +24122,VA,Montvale,37.40696,-79.717462 +24124,VA,Narrows,37.319846,-80.85485 +24127,VA,New Castle,37.487132,-80.17042 +24128,VA,Newport,37.306852,-80.50992 +24131,VA,Paint Bank,37.574482,-80.254436 +24133,VA,Patrick Springs,36.674435,-80.138769 +24134,VA,Pearisburg,37.304121,-80.726703 +24136,VA,Mountain Lake,37.33027,-80.615507 +24137,VA,Penhook,36.920125,-79.664493 +24138,VA,Pilot,37.056476,-80.322901 +24139,VA,Pittsville,36.971578,-79.479413 +24141,VA,Fairlawn,37.135816,-80.571721 +24147,VA,Rich Creek,37.385048,-80.822718 +24148,VA,Ridgeway,36.5874,-79.86859 +24149,VA,Riner,37.032209,-80.435309 +24150,VA,Ripplemead,37.366455,-80.671728 +24151,VA,Rocky Mount,36.989101,-79.883959 +24153,VA,Salem,37.2853,-80.069185 +24161,VA,Sandy Level,36.991042,-79.561404 +24162,VA,Shawsville,37.146619,-80.27153 +24165,VA,Spencer,36.59676,-80.037345 +24167,VA,Staffordsville,37.245378,-80.740334 +24168,VA,Stanleytown,36.734759,-79.935482 +24171,VA,Stuart,36.651744,-80.23923 +24174,VA,Thaxton,37.360008,-79.652187 +24175,VA,Troutville,37.401855,-79.878636 +24176,VA,Union Hall,37.013111,-79.686447 +24179,VA,Stewartsville,37.271139,-79.835466 +24184,VA,Wirtz,37.081794,-79.757254 +24185,VA,Woolwine,36.792076,-80.277426 +24201,VA,Bristol,36.618093,-82.182297 +24210,VA,Abingdon,36.691644,-82.019989 +24216,VA,Exeter,36.906001,-82.791394 +24217,VA,Bee,37.101358,-82.185632 +24219,VA,Big Stone Gap,36.858073,-82.762727 +24220,VA,Birchleaf,37.169481,-82.248346 +24221,VA,Blackwater,36.639011,-82.98658 +24224,VA,Castlewood,36.876409,-82.287574 +24225,VA,Cleveland,36.950215,-82.131758 +24226,VA,Clinchco,37.140581,-82.342476 +24228,VA,Clintwood,37.159206,-82.445339 +24230,VA,Coeburn,36.960489,-82.473497 +24236,VA,Damascus,36.640264,-81.777633 +24237,VA,Dante,37.005419,-82.281519 +24239,VA,Davenport,37.068044,-82.122946 +24243,VA,Dryden,36.781825,-82.930478 +24244,VA,Clinchport,36.704402,-82.80651 +24245,VA,Dungannon,36.82416,-82.496025 +24248,VA,Ewing,36.623694,-83.504737 +24250,VA,Fort Blackmore,36.743828,-82.610178 +24251,VA,Gate City,36.646026,-82.611179 +24256,VA,Haysi,37.220552,-82.285306 +24258,VA,Hiltons,36.649778,-82.429929 +24260,VA,Council,37.027292,-81.996883 +24263,VA,Jonesville,36.689647,-83.13615 +24265,VA,Keokee,36.823931,-82.977161 +24266,VA,Lebanon,36.880895,-82.09563 +24269,VA,Mc Clure,37.081412,-82.380553 +24270,VA,Mendota,36.722302,-82.264888 +24271,VA,Nickelsville,36.750221,-82.420172 +24272,VA,Nora,37.018229,-82.350023 +24273,VA,Norton,36.937797,-82.624923 +24277,VA,Pennington Gap,36.750752,-83.022299 +24279,VA,Pound,37.092734,-82.601555 +24280,VA,Rosedale,36.973981,-81.888793 +24281,VA,Rose Hill,36.658257,-83.348565 +24282,VA,Saint Charles,36.831515,-83.051838 +24283,VA,Saint Paul,36.932295,-82.341844 +24285,VA,Stonega,36.950176,-82.819194 +24289,VA,Trammel,37.022959,-82.217563 +24290,VA,Weber City,36.620213,-82.545227 +24292,VA,Whitetop,36.610559,-81.583938 +24293,VA,Wise,36.975,-82.594679 +24301,VA,Pulaski,37.056708,-80.770961 +24311,VA,Atkins,36.866532,-81.404791 +24312,VA,Austinville,36.819461,-80.858322 +24313,VA,Barren Springs,36.907787,-80.809006 +24314,VA,Bastian,37.15742,-81.198855 +24315,VA,Bland,37.137644,-81.020064 +24316,VA,Broadford,36.93299,-81.659388 +24317,VA,Cana,36.59574,-80.670452 +24318,VA,Ceres,37.00456,-81.364272 +24319,VA,Chilhowie,36.771912,-81.665103 +24322,VA,Cripple Creek,36.808612,-81.103928 +24323,VA,Crockett,36.876755,-81.208883 +24324,VA,Draper,36.969743,-80.818752 +24325,VA,Dugspur,36.814546,-80.612348 +24326,VA,Elk Creek,36.730579,-81.191488 +24328,VA,Fancy Gap,36.663972,-80.69075 +24329,VA,24329,36.889764,-80.827174 +24330,VA,Fries,36.724683,-81.004157 +24333,VA,Galax,36.656503,-80.911744 +24340,VA,Glade Spring,36.7779,-81.767639 +24343,VA,Hillsville,36.744225,-80.71973 +24347,VA,Allisonia,36.997815,-80.638173 +24348,VA,Independence,36.629444,-81.158202 +24350,VA,Ivanhoe,36.827225,-80.977911 +24351,VA,Lambsburg,36.577483,-80.760133 +24352,VA,Laurel Fork,36.707347,-80.514776 +24354,VA,Marion,36.827316,-81.534914 +24360,VA,Foster Falls,36.91708,-80.921391 +24361,VA,Meadowview,36.761175,-81.851205 +24363,VA,Mouth Of Wilson,36.610379,-81.395452 +24366,VA,Rocky Gap,37.244242,-81.155236 +24368,VA,Rural Retreat,36.883616,-81.287872 +24370,VA,Saltville,36.892699,-81.740201 +24373,VA,Seven Mile Ford,36.815329,-81.645672 +24374,VA,Speedwell,36.799843,-81.183404 +24375,VA,Sugar Grove,36.773633,-81.408443 +24377,VA,Tannersville,36.976331,-81.628017 +24378,VA,Trout Dale,36.68546,-81.435004 +24380,VA,Willis,36.874927,-80.490861 +24381,VA,Woodlawn,36.787948,-80.882437 +24382,VA,Wytheville,36.940669,-81.094082 +24401,VA,Woodrum,38.145104,-79.07519 +24413,VA,Blue Grass,38.515231,-79.561272 +24416,VA,Buena Vista,37.739585,-79.352311 +24421,VA,Churchville,38.234605,-79.179126 +24422,VA,Clifton Forge,37.820342,-79.805423 +24426,VA,Alleghany,37.784203,-80.003176 +24430,VA,Craigsville,38.076826,-79.361883 +24431,VA,Crimora,38.168422,-78.841275 +24432,VA,Deerfield,38.184231,-79.415186 +24433,VA,Doe Hill,38.390248,-79.482176 +24435,VA,Fairfield,37.877825,-79.297922 +24437,VA,Fort Defiance,38.210928,-78.932583 +24439,VA,Goshen,37.987813,-79.477325 +24440,VA,Greenville,38.001804,-79.135876 +24441,VA,Grottoes,38.248371,-78.825528 +24442,VA,Head Waters,38.294611,-79.435272 +24444,VA,Hightown,38.464597,-79.592927 +24445,VA,Hot Springs,37.963784,-79.871662 +24450,VA,Lexington,37.788463,-79.458111 +24458,VA,Mc Dowell,38.326588,-79.498798 +24459,VA,Middlebrook,38.024158,-79.281165 +24460,VA,Millboro Spring,38.005795,-79.640649 +24464,VA,Montebello,37.839931,-79.061079 +24465,VA,Monterey,38.405821,-79.59407 +24467,VA,Mount Sidney,38.261185,-78.97296 +24468,VA,Mustoe,38.286216,-79.659137 +24471,VA,Port Republic,38.317167,-78.810388 +24472,VA,Raphine,37.937353,-79.221903 +24473,VA,Rockbridge Baths,37.896458,-79.387421 +24475,VA,Spottswood,37.968418,-79.221141 +24477,VA,Stuarts Draft,38.014423,-79.029821 +24479,VA,Swoope,38.159117,-79.187281 +24482,VA,Verona,38.203726,-79.005872 +24483,VA,Vesuvius,37.83777,-79.213485 +24484,VA,Bolar,38.085119,-79.807792 +24485,VA,West Augusta,38.274397,-79.320139 +24486,VA,Weyers Cave,38.293145,-78.923454 +24487,VA,Burnsville,38.177907,-79.650607 +24501,VA,Lynchburg,37.386228,-79.171464 +24502,VA,Timberlake,37.359635,-79.211783 +24503,VA,Lynchburg,37.437646,-79.204982 +24504,VA,Lynchburg,37.390422,-79.12142 +24517,VA,Altavista,37.122162,-79.291145 +24520,VA,Alton,36.589352,-79.020237 +24521,VA,Amherst,37.602677,-79.050572 +24522,VA,Appomattox,37.352951,-78.822445 +24523,VA,Bedford,37.315345,-79.53311 +24526,VA,Big Island,37.530556,-79.382706 +24527,VA,Blairs,36.667408,-79.378869 +24528,VA,Brookneal,37.082663,-78.922679 +24529,VA,Buffalo Junction,36.61676,-78.609266 +24530,VA,Callands,36.764748,-79.628779 +24531,VA,Chatham,36.83099,-79.429659 +24534,VA,Clover,36.863695,-78.78618 +24536,VA,Coleman Falls,37.488659,-79.315757 +24538,VA,Concord,37.336953,-78.980353 +24539,VA,Crystal Hill,36.873217,-78.970634 +24540,VA,Danville,36.621789,-79.412441 +24541,VA,Danville,36.577937,-79.441112 +24549,VA,Dry Fork,36.743008,-79.457966 +24550,VA,Evington,37.261049,-79.231723 +24551,VA,Forest,37.337878,-79.279116 +24553,VA,Gladstone,37.547252,-78.850838 +24554,VA,Gladys,37.138581,-79.104794 +24555,VA,Glasgow,37.643,-79.45898 +24556,VA,Goode,37.348098,-79.381277 +24557,VA,Gretna,36.969515,-79.338874 +24558,VA,Halifax,36.762571,-78.941494 +24562,VA,Howardsville,37.765891,-78.582355 +24563,VA,Hurt,37.079787,-79.299995 +24565,VA,Java,36.858582,-79.187034 +24566,VA,Keeling,36.715577,-79.278284 +24569,VA,Long Island,37.064374,-79.121933 +24570,VA,Lowry,37.33361,-79.455599 +24571,VA,Lynch Station,37.152826,-79.329716 +24572,VA,Madison Heights,37.453102,-79.114089 +24574,VA,Monroe,37.541366,-79.17034 +24577,VA,Lennig,36.944179,-78.989766 +24578,VA,Natural Bridge,37.660625,-79.533045 +24579,VA,Natural Bridge S,37.595667,-79.503905 +24580,VA,Nelson,36.558558,-78.670959 +24586,VA,Ringgold,36.603483,-79.298835 +24588,VA,Rustburg,37.25454,-79.121507 +24589,VA,Scottsburg,36.786194,-78.786601 +24590,VA,Scottsville,37.804937,-78.473981 +24592,VA,South Boston,36.696335,-78.918829 +24593,VA,Spout Spring,37.364345,-78.905887 +24594,VA,Sutherlin,36.625831,-79.19495 +24597,VA,Ingram,36.786684,-79.110874 +24598,VA,Virgilina,36.606231,-78.760516 +24599,VA,Wingina,37.641473,-78.755709 +24602,VA,Bandy,37.166112,-81.6508 +24603,VA,Conaway,37.318638,-82.224596 +24605,VA,Bluefield,37.249512,-81.325114 +24609,VA,Cedar Bluff,37.079076,-81.766788 +24613,VA,Falls Mills,37.271023,-81.318234 +24614,VA,Grundy,37.296678,-82.106077 +24620,VA,Hurley,37.401741,-82.026164 +24622,VA,Jewell Valley,37.222372,-81.810654 +24627,VA,Mavisdale,37.200817,-82.221599 +24630,VA,Tiptop,37.152447,-81.525256 +24631,VA,Patterson,37.184074,-81.991577 +24633,VA,24633,37.235477,-81.988789 +24634,VA,Pilgrims Knob,37.298944,-81.911896 +24637,VA,Pounding Mill,37.059584,-81.730052 +24639,VA,Raven,37.148056,-81.889557 +24641,VA,Richlands,37.094051,-81.812286 +24646,VA,Rowe,37.127593,-82.027381 +24649,VA,Swords Creek,37.073792,-81.908385 +24651,VA,Tazewell,37.107773,-81.509976 +24656,VA,Vansant,37.173811,-82.127715 +24657,VA,Whitewood,37.264409,-81.890361 +98001,WA,Algona,47.316339,-122.270057 +98002,WA,Auburn,47.30503,-122.206741 +98003,WA,Federal Way,47.3203,-122.311726 +98004,WA,Beaux Arts,47.619899,-122.207371 +98005,WA,Bellevue,47.614961,-122.166288 +98006,WA,Bellevue,47.561425,-122.155179 +98007,WA,Bellevue,47.617443,-122.142572 +98008,WA,Bellevue,47.611468,-122.116173 +98010,WA,Black Diamond,47.311372,-122.005265 +98011,WA,Bothell,47.749692,-122.2159 +98012,WA,Mill Creek,47.848941,-122.206981 +98014,WA,Carnation,47.638007,-121.911095 +98019,WA,Duvall,47.724987,-121.936906 +98020,WA,Woodway,47.800693,-122.366949 +98021,WA,Bothell,47.791806,-122.224339 +98022,WA,Enumclaw,47.266545,-122.031429 +98023,WA,Federal Way,47.310358,-122.36123 +98024,WA,Fall City,47.568233,-121.889646 +98026,WA,Edmonds,47.823324,-122.334463 +98027,WA,Issaquah,47.550911,-122.033517 +98031,WA,Kent,47.388004,-122.193184 +98032,WA,Kent,47.377633,-122.285362 +98033,WA,Kirkland,47.678597,-122.189442 +98034,WA,Kirkland,47.718777,-122.196571 +98036,WA,Brier,47.811825,-122.287789 +98037,WA,Lynnwood,47.850532,-122.282139 +98038,WA,Maple Valley,47.384526,-122.057413 +98040,WA,Mercer Island,47.563149,-122.226562 +98042,WA,Kent,47.368044,-122.120615 +98043,WA,Mountlake Terrac,47.793061,-122.304036 +98045,WA,North Bend,47.475546,-121.757142 +98047,WA,Pacific,47.266605,-122.243481 +98051,WA,Ravensdale,47.415476,-121.987897 +98052,WA,Redmond,47.671796,-122.123242 +98053,WA,Redmond,47.646238,-122.038578 +98055,WA,Renton,47.464759,-122.207484 +98056,WA,Renton,47.507336,-122.181942 +98058,WA,Renton,47.446507,-122.121586 +98059,WA,Renton,47.467383,-122.151178 +98065,WA,Snoqualmie,47.529286,-121.822533 +98070,WA,Vashon,47.425949,-122.464415 +98072,WA,Woodinville,47.768384,-122.127087 +98101,WA,Seattle,47.611435,-122.330456 +98102,WA,Seattle,47.63025,-122.320993 +98103,WA,Seattle,47.67335,-122.342621 +98104,WA,Seattle,47.603631,-122.325644 +98105,WA,Seattle,47.663266,-122.302236 +98106,WA,Seattle,47.534362,-122.354688 +98107,WA,Seattle,47.67012,-122.37626 +98108,WA,Tukwila,47.547448,-122.306823 +98109,WA,Seattle,47.633875,-122.347615 +98110,WA,Bainbridge Islan,47.645048,-122.531297 +98112,WA,Seattle,47.630115,-122.297157 +98115,WA,Seattle,47.684918,-122.296828 +98116,WA,Seattle,47.574591,-122.393445 +98117,WA,Seattle,47.687263,-122.377223 +98118,WA,Seattle,47.541234,-122.275021 +98119,WA,Seattle,47.637917,-122.364272 +98121,WA,Seattle,47.615135,-122.344696 +98122,WA,Seattle,47.611633,-122.305608 +98125,WA,Seattle,47.717002,-122.301546 +98126,WA,Seattle,47.544361,-122.373458 +98133,WA,Seattle,47.737717,-122.343132 +98134,WA,Seattle,47.590276,-122.326346 +98136,WA,Seattle,47.539769,-122.387768 +98144,WA,Seattle,47.584624,-122.300457 +98146,WA,Burien,47.501069,-122.353989 +98148,WA,Normandy Park,47.450209,-122.326112 +98155,WA,Lk Forest Park,47.758161,-122.296305 +98158,WA,Seatac,47.442739,-122.318454 +98166,WA,Normandy Park,47.455052,-122.347392 +98168,WA,Tukwila,47.48851,-122.302376 +98177,WA,Seattle,47.746678,-122.368585 +98178,WA,Tukwila,47.499489,-122.247366 +98188,WA,Tukwila,47.449808,-122.281159 +98198,WA,Des Moines,47.407286,-122.309559 +98199,WA,Seattle,47.648845,-122.396357 +98201,WA,Everett,47.988431,-122.200571 +98203,WA,Everett,47.941937,-122.221846 +98204,WA,Everett,47.901659,-122.247217 +98205,WA,Everett,47.990065,-122.115759 +98208,WA,Everett,47.894822,-122.198722 +98220,WA,Acme,48.675248,-122.191391 +98221,WA,Anacortes,48.500438,-122.630873 +98223,WA,Arlington,48.18293,-122.112126 +98224,WA,Baring,47.757787,-121.44757 +98225,WA,Bellingham,48.748957,-122.488676 +98226,WA,Bellingham,48.762763,-122.441457 +98230,WA,Blaine,48.963572,-122.732327 +98232,WA,Bow,48.562037,-122.413438 +98233,WA,Burlington,48.478577,-122.33449 +98236,WA,Clinton,47.950845,-122.391588 +98237,WA,Concrete,48.530962,-121.664294 +98239,WA,Coupeville,48.218911,-122.682346 +98240,WA,Custer,48.937412,-122.622571 +98241,WA,Darrington,48.249285,-121.591807 +98244,WA,Glacier,48.803366,-122.153957 +98245,WA,Eastsound,48.665554,-122.937045 +98247,WA,Everson,48.90447,-122.332474 +98248,WA,Ferndale,48.862531,-122.595293 +98249,WA,Freeland,48.03417,-122.564086 +98250,WA,Friday Harbor,48.545416,-123.094717 +98252,WA,Granite Falls,48.078977,-121.942752 +98253,WA,Greenbank,48.124432,-122.587086 +98257,WA,La Conner,48.409306,-122.53134 +98258,WA,Lake Stevens,48.017103,-122.067153 +98260,WA,Langley,48.018672,-122.452992 +98261,WA,Lopez,48.520804,-122.967434 +98262,WA,Lummi Island,48.712765,-122.682285 +98263,WA,Lyman,48.525744,-122.016183 +98264,WA,Lynden,48.937225,-122.459153 +98270,WA,Marysville,48.065639,-122.156168 +98271,WA,Marysville,48.096572,-122.197956 +98272,WA,Monroe,47.85853,-121.947376 +98273,WA,Mount Vernon,48.416427,-122.326548 +98275,WA,Mukilteo,47.919896,-122.301906 +98277,WA,Oak Harbor,48.315096,-122.637439 +98278,WA,Whidbey Island N,48.295271,-122.69005 +98279,WA,Olga,48.655526,-122.836224 +98281,WA,Point Roberts,48.987876,-123.055474 +98283,WA,Rockport,48.470388,-121.555352 +98284,WA,Sedro Woolley,48.527405,-122.232943 +98288,WA,Skykomish,47.692158,-121.371297 +98290,WA,Snohomish,47.895381,-122.071562 +98292,WA,Stanwood,48.201067,-122.377978 +98294,WA,Sultan,47.858942,-121.736869 +98295,WA,Sumas,48.970763,-122.207425 +98303,WA,Anderson Island,47.15872,-122.696025 +98304,WA,Ashford,46.753121,-121.989791 +98305,WA,Beaver,48.067263,-124.305424 +98310,WA,Bremerton,47.601916,-122.629913 +98312,WA,Bremerton,47.575424,-122.695786 +98314,WA,Puget Sound Nava,47.746255,-122.724354 +98315,WA,Silverdale,47.692017,-122.716106 +98320,WA,Brinnon,47.677596,-122.937509 +98321,WA,Buckley,47.152449,-122.062098 +98323,WA,Carbonado,47.080242,-122.051339 +98325,WA,Chimacum,47.98607,-122.788323 +98326,WA,Clallam Bay,48.225486,-124.201512 +98328,WA,Eatonville,46.870778,-122.269626 +98329,WA,Gig Harbor,47.378579,-122.7 +98330,WA,Elbe,46.766607,-122.150344 +98331,WA,Forks,47.928732,-124.398949 +98332,WA,Gig Harbor,47.3607,-122.600144 +98333,WA,Fox Island,47.25238,-122.628579 +98335,WA,Gig Harbor,47.300154,-122.608377 +98336,WA,Glenoma,46.528266,-122.099014 +98338,WA,Graham,47.024575,-122.293648 +98339,WA,Port Hadlock,48.034531,-122.768151 +98340,WA,Hansville,47.906143,-122.565509 +98346,WA,Kingston,47.810844,-122.525503 +98349,WA,Home,47.247366,-122.74273 +98351,WA,Longbranch,47.200737,-122.756126 +98354,WA,Milton,47.24827,-122.315514 +98355,WA,Mineral,46.709635,-122.186056 +98356,WA,Morton,46.558056,-122.249573 +98358,WA,Nordland,48.04321,-122.692553 +98359,WA,Olalla,47.424088,-122.574512 +98360,WA,Orting,47.082206,-122.185978 +98361,WA,Packwood,46.650038,-121.655254 +98362,WA,Port Angeles,48.106489,-123.438442 +98365,WA,Port Ludlow,47.922192,-122.689615 +98366,WA,South Park Villa,47.504838,-122.615276 +98368,WA,Port Townsend,48.104012,-122.794457 +98370,WA,Poulsbo,47.742278,-122.627721 +98371,WA,Puyallup,47.199123,-122.315097 +98372,WA,Puyallup,47.204202,-122.273415 +98373,WA,Puyallup,47.128363,-122.321868 +98374,WA,Puyallup,47.142427,-122.265248 +98376,WA,Quilcene,47.832429,-122.858304 +98377,WA,Randle,46.549195,-121.855533 +98380,WA,Seabeck,47.625497,-122.822685 +98381,WA,Sekiu,48.303166,-124.468467 +98382,WA,Sequim,48.088136,-123.119814 +98383,WA,Silverdale,47.662139,-122.698054 +98387,WA,Spanaway,47.073218,-122.394336 +98388,WA,Steilacoom,47.170369,-122.588837 +98390,WA,Bonney Lake,47.188801,-122.180275 +98392,WA,Suquamish,47.734303,-122.557295 +98394,WA,Vaughn,47.330921,-122.773598 +98402,WA,Tacoma,47.254508,-122.440536 +98403,WA,Tacoma,47.26428,-122.457538 +98404,WA,Tacoma,47.211312,-122.412625 +98405,WA,Tacoma,47.248351,-122.46435 +98406,WA,Tacoma,47.26325,-122.499349 +98407,WA,Tacoma,47.282479,-122.503881 +98408,WA,Tacoma,47.207267,-122.444381 +98409,WA,Tacoma,47.20381,-122.482503 +98421,WA,Tacoma,47.266373,-122.401457 +98422,WA,Tacoma,47.294805,-122.398349 +98424,WA,Fife,47.243632,-122.350962 +98433,WA,Fort Lewis,47.100864,-122.583486 +98439,WA,Lakewood Center,47.122905,-122.529326 +98443,WA,Tacoma,47.204369,-122.372815 +98444,WA,Parkland,47.156553,-122.448842 +98445,WA,Parkland,47.133967,-122.411614 +98446,WA,Parkland,47.14041,-122.37189 +98465,WA,Tacoma,47.249139,-122.527272 +98466,WA,Fircrest,47.22788,-122.53503 +98467,WA,Tacoma,47.205395,-122.533562 +98498,WA,Lakewood Center,47.164269,-122.555357 +98499,WA,Lakewood Center,47.160786,-122.509074 +98501,WA,Olympia,47.012906,-122.876311 +98502,WA,Olympia,47.029828,-122.95214 +98503,WA,Lacey,47.023967,-122.782665 +98506,WA,Lacey,47.076259,-122.832844 +98520,WA,Aberdeen,46.984293,-123.79629 +98524,WA,Allyn,47.385004,-122.853571 +98526,WA,Amanda Park,47.470579,-123.907375 +98528,WA,Bear Creek,47.454956,-122.822381 +98531,WA,Centralia,46.724635,-122.967068 +98532,WA,Chehalis,46.638193,-122.965764 +98533,WA,Cinebar,46.567131,-122.566005 +98535,WA,Copalis Beach,47.065044,-124.135881 +98536,WA,Copalis Crossing,47.12535,-124.13471 +98537,WA,Cosmopolis,46.953789,-123.77394 +98538,WA,Curtis,46.558372,-123.156974 +98541,WA,Elma,47.005813,-123.39969 +98542,WA,Ethel,46.53581,-122.776009 +98546,WA,Grapeview,47.305783,-122.949742 +98547,WA,Grayland,46.853201,-124.056194 +98548,WA,Hoodsport,47.423526,-123.173932 +98550,WA,Hoquiam,46.982269,-123.884169 +98552,WA,Humptulips,47.135632,-123.971695 +98555,WA,Lilliwaup,47.512773,-123.063119 +98557,WA,Mc Cleary,47.053987,-123.273301 +98560,WA,Matlock,47.177545,-123.337638 +98562,WA,Moclips,47.222619,-124.20438 +98563,WA,Montesano,47.09013,-123.500584 +98564,WA,Mossyrock,46.513136,-122.478935 +98568,WA,Oakville,46.843366,-123.249329 +98569,WA,Ocean City,46.982905,-124.15323 +98570,WA,Onalaska,46.573016,-122.707503 +98571,WA,Pacific Beach,47.198144,-124.158833 +98572,WA,Pe Ell,46.56558,-123.285244 +98575,WA,Quinault,47.448505,-123.803744 +98576,WA,Rainier,46.882942,-122.679468 +98577,WA,Raymond,46.671046,-123.692889 +98579,WA,Rochester,46.819295,-123.040634 +98580,WA,Roy,46.956048,-122.448271 +98581,WA,Ryderwood,46.375176,-123.043134 +98582,WA,Salkum,46.515059,-122.645364 +98584,WA,Shelton,47.20863,-123.072862 +98585,WA,Silver Creek,46.549077,-122.475716 +98586,WA,South Bend,46.6544,-123.820315 +98587,WA,Taholah,47.340711,-124.2827 +98588,WA,Tahuya,47.435618,-122.921126 +98589,WA,Tenino,46.864119,-122.849269 +98590,WA,Tokeland,46.746874,-124.046008 +98591,WA,Toledo,46.439552,-122.826559 +98592,WA,Union,47.351305,-123.034364 +98593,WA,Vader,46.398505,-122.958493 +98595,WA,Westport,46.883619,-124.106055 +98596,WA,Winlock,46.494014,-122.915806 +98597,WA,Yelm,46.920589,-122.588049 +98601,WA,Amboy,45.9195,-122.457418 +98602,WA,Appleton,45.909041,-121.148618 +98603,WA,Ariel,45.995154,-122.46769 +98604,WA,Battle Ground,45.790667,-122.531845 +98605,WA,Cook,45.6341,-121.175778 +98606,WA,Brush Prairie,45.730432,-122.484342 +98607,WA,Camas,45.605772,-122.414231 +98610,WA,Carson,45.749332,-121.835138 +98611,WA,Castle Rock,46.278291,-122.9139 +98612,WA,Cathlamet,46.195383,-123.362716 +98613,WA,Centerville,45.703183,-120.945973 +98616,WA,Cougar,46.069012,-122.294186 +98619,WA,Glenwood,46.007104,-121.28849 +98620,WA,Goldendale,45.832021,-120.812981 +98621,WA,Grays River,46.353481,-123.588845 +98624,WA,Ilwaco,46.314214,-124.02822 +98625,WA,Kalama,46.011229,-122.816588 +98626,WA,Kelso,46.148491,-122.886994 +98628,WA,Klickitat,45.751534,-121.229231 +98629,WA,La Center,45.880587,-122.623972 +98631,WA,Long Beach,46.377369,-124.047041 +98632,WA,Longview,46.151354,-122.963421 +98635,WA,Lyle,45.74495,-121.250112 +98638,WA,Naselle,46.352758,-123.804381 +98640,WA,Ocean Park,46.502867,-124.043582 +98642,WA,Ridgefield,45.784634,-122.693354 +98643,WA,Rosburg,46.307076,-123.657105 +98645,WA,Silverlake,46.316322,-122.764886 +98647,WA,Skamokawa,46.295186,-123.43316 +98648,WA,Stevenson,45.688173,-121.909346 +98649,WA,Toutle,46.295605,-122.647696 +98650,WA,Trout Lake,45.982789,-121.516272 +98651,WA,Underwood,45.740872,-121.597408 +98660,WA,Vancouver,45.64183,-122.68014 +98661,WA,Vancouver,45.641807,-122.625146 +98662,WA,Orchards,45.674519,-122.576182 +98663,WA,Vancouver,45.6514,-122.660385 +98664,WA,Vancouver,45.623086,-122.576741 +98665,WA,Hazel Dell,45.68217,-122.664223 +98670,WA,Wahkiacus,45.815567,-121.148586 +98671,WA,Washougal,45.595921,-122.310396 +98672,WA,White Salmon,45.755142,-121.479459 +98674,WA,Woodland,45.921859,-122.71256 +98675,WA,Yacolt,45.862247,-122.427545 +98682,WA,Vancouver,45.664399,-122.521224 +98684,WA,Cascade Park,45.617522,-122.524969 +98685,WA,Felida,45.707313,-122.682474 +98686,WA,Vancouver,45.712017,-122.632226 +98801,WA,Wenatchee,47.425269,-120.327345 +98802,WA,East Wenatchee,47.418596,-120.273136 +98812,WA,Brewster,48.120641,-119.771999 +98813,WA,Bridgeport,48.016083,-119.702772 +98814,WA,Carlton,48.252615,-120.10551 +98815,WA,Cashmere,47.517293,-120.503274 +98816,WA,Chelan,47.848263,-120.027306 +98822,WA,Entiat,47.705653,-120.276031 +98823,WA,Ephrata,47.277051,-119.533582 +98826,WA,Leavenworth,47.6438,-120.674792 +98827,WA,Loomis,48.869627,-119.642675 +98828,WA,Malaga,47.355306,-120.208562 +98830,WA,Mansfield,47.902136,-119.405315 +98831,WA,Manson,47.895764,-120.148963 +98832,WA,Marlin,47.320929,-119.090897 +98833,WA,Mazama,48.597728,-120.38796 +98834,WA,Methow,48.09001,-120.0059 +98837,WA,Moses Lake,47.137363,-119.289149 +98840,WA,Okanogan,48.351328,-119.604563 +98841,WA,Omak,48.414347,-119.527156 +98843,WA,Orondo,47.696928,-120.172143 +98844,WA,Oroville,48.939681,-119.403236 +98845,WA,Palisades,47.469367,-119.802264 +98846,WA,Pateros,48.059147,-119.913322 +98847,WA,Peshastin,47.581294,-120.613928 +98848,WA,Quincy,47.197574,-119.845922 +98849,WA,Riverside,48.487567,-119.580316 +98850,WA,Rock Island,47.370558,-120.137794 +98851,WA,Soap Lake,47.383034,-119.485962 +98852,WA,Stehekin,48.298034,-120.755185 +98855,WA,Tonasket,48.71944,-119.394252 +98856,WA,Twisp,48.363231,-120.135035 +98857,WA,Warden,46.97697,-119.053932 +98858,WA,Waterville,47.62951,-119.988743 +98859,WA,Wauconda,48.822449,-118.946947 +98862,WA,Winthrop,48.475607,-120.180468 +98901,WA,Terrace Heights,46.606991,-120.477336 +98902,WA,Yakima,46.593393,-120.531084 +98903,WA,Union Gap,46.5572,-120.556587 +98908,WA,Wide Hollow,46.605865,-120.605175 +98922,WA,Cle Elum,47.206319,-120.968505 +98923,WA,Cowiche,46.66611,-120.714893 +98926,WA,Ellensburg,46.999632,-120.516274 +98930,WA,Grandview,46.253846,-119.915734 +98932,WA,Granger,46.348045,-120.181848 +98933,WA,Harrah,46.410383,-120.573606 +98935,WA,Mabton,46.212082,-120.015141 +98936,WA,Moxee,46.554205,-120.368463 +98937,WA,White Pass,46.735335,-120.826699 +98938,WA,Outlook,46.352497,-120.097005 +98942,WA,Selah,46.67671,-120.540813 +98944,WA,Sunnyside,46.321273,-120.012631 +98946,WA,Thorp,47.017785,-120.678557 +98947,WA,Tieton,46.706331,-120.747275 +98948,WA,Toppenish,46.375123,-120.330534 +98951,WA,Wapato,46.45066,-120.426484 +98952,WA,White Swan,46.371558,-120.745317 +98953,WA,Zillah,46.415777,-120.266161 +99003,WA,Chattaroy,47.919178,-117.29209 +99004,WA,Cheney,47.494257,-117.583372 +99005,WA,Colbert,47.841093,-117.375895 +99006,WA,Deer Park,47.948615,-117.443559 +99008,WA,Edwall,47.537896,-117.907095 +99009,WA,Elk,48.020523,-117.296253 +99011,WA,Fairchild Air Fo,47.613068,-117.643746 +99012,WA,Fairfield,47.398726,-117.192054 +99013,WA,Ford,47.916873,-117.811858 +99016,WA,Greenacres,47.658357,-117.156801 +99017,WA,Lamont,47.17304,-117.830239 +99018,WA,Latah,47.303815,-117.16884 +99019,WA,Liberty Lake,47.651672,-117.083808 +99021,WA,Mead,47.793268,-117.311716 +99022,WA,Espanola,47.583696,-117.679351 +99023,WA,Mica,47.553814,-117.163711 +99025,WA,Newman Lake,47.727371,-117.064041 +99026,WA,Nine Mile Falls,47.801945,-117.589359 +99027,WA,Otis Orchards,47.70273,-117.11209 +99029,WA,Reardan,47.705407,-117.866264 +99030,WA,Rockford,47.452804,-117.131842 +99031,WA,Spangle,47.4338,-117.382696 +99032,WA,Sprague,47.324725,-117.989684 +99033,WA,Tekoa,47.227081,-117.081919 +99034,WA,Tumtum,47.898173,-117.698996 +99036,WA,Valleyford,47.529176,-117.268601 +99037,WA,Veradale,47.642103,-117.197706 +99039,WA,Waverly,47.335393,-117.233108 +99040,WA,Wellpinit,47.86974,-117.985646 +99101,WA,Addy,48.44769,-117.892383 +99103,WA,Almira,47.763175,-118.91225 +99105,WA,Benge,46.867636,-117.969895 +99107,WA,Boyds,48.691919,-118.19906 +99109,WA,Chewelah,48.287585,-117.77539 +99110,WA,Clayton,47.955206,-117.574021 +99111,WA,Colfax,46.879996,-117.366975 +99113,WA,Colton,46.590098,-117.169243 +99114,WA,Colville,48.57799,-117.864463 +99115,WA,Coulee City,47.596571,-119.27582 +99116,WA,Coulee Dam,48.173861,-119.180907 +99117,WA,Creston,47.797681,-118.530656 +99118,WA,Curlew,48.910775,-118.645182 +99119,WA,Cusick,48.391513,-117.329464 +99121,WA,Danville,48.972524,-118.488408 +99122,WA,Davenport,47.680855,-118.166657 +99123,WA,Electric City,47.926446,-119.036728 +99125,WA,Endicott,46.936407,-117.723005 +99126,WA,Evans,48.745787,-118.00012 +99128,WA,Farmington,47.084742,-117.076327 +99129,WA,Fruitland,47.979746,-118.215906 +99130,WA,Garfield,46.994639,-117.152293 +99131,WA,Gifford,48.22287,-118.12989 +99133,WA,Grand Coulee,47.938511,-118.997835 +99134,WA,Harrington,47.4555,-118.277793 +99135,WA,Hartline,47.725631,-119.104467 +99137,WA,Hunters,48.133261,-118.152491 +99138,WA,Inchelium,48.292411,-118.355166 +99139,WA,Ione,48.713023,-117.404859 +99140,WA,Keller,48.023594,-118.654731 +99141,WA,Kettle Falls,48.636375,-118.054801 +99143,WA,Lacrosse,46.771684,-117.770277 +99147,WA,Lincoln,47.78204,-118.481012 +99148,WA,Loon Lake,48.078393,-117.632496 +99150,WA,Malo,48.81862,-118.623712 +99153,WA,Metaline Falls,48.859747,-117.36332 +99156,WA,Newport,48.169465,-117.150784 +99157,WA,Northport,48.924663,-117.793052 +99158,WA,Oakesdale,47.080556,-117.280326 +99159,WA,Odessa,47.339491,-118.698316 +99161,WA,Palouse,46.907555,-117.085475 +99163,WA,Pullman,46.735247,-117.172936 +99166,WA,Republic,48.670366,-118.699942 +99167,WA,Rice,48.406169,-118.124865 +99169,WA,Ritzville,47.131528,-118.395812 +99170,WA,Rosalia,47.221777,-117.41468 +99171,WA,Saint John,47.075539,-117.573002 +99173,WA,Springdale,47.992737,-117.873273 +99176,WA,Thornton,47.12525,-117.386416 +99179,WA,Uniontown,46.525818,-117.090756 +99180,WA,Usk,48.295969,-117.318947 +99181,WA,Valley,48.135114,-117.760967 +99185,WA,Wilbur,47.741012,-118.706271 +99201,WA,Spokane,47.666485,-117.436527 +99202,WA,Spokane,47.654741,-117.380972 +99203,WA,Spokane,47.629443,-117.404121 +99204,WA,Spokane,47.640682,-117.471896 +99205,WA,Spokane,47.69641,-117.439912 +99206,WA,Spokane,47.649588,-117.258126 +99207,WA,Spokane,47.697712,-117.374565 +99208,WA,Spokane,47.737434,-117.435207 +99212,WA,Spokane,47.668598,-117.304853 +99216,WA,Spokane,47.663389,-117.219307 +99218,WA,Spokane,47.755648,-117.4146 +99223,WA,Spokane,47.61558,-117.362215 +99301,WA,Pasco,46.249183,-119.104387 +99320,WA,Benton City,46.280624,-119.491349 +99321,WA,Beverly,46.848429,-119.912074 +99322,WA,Bickleton,45.959687,-120.104223 +99324,WA,College Place,46.045723,-118.385338 +99326,WA,Connell,46.66426,-118.85454 +99327,WA,Cunningham,46.757333,-119.107604 +99328,WA,Dayton,46.307459,-117.973791 +99330,WA,Eltopia,46.474996,-119.101333 +99336,WA,Kennewick,46.210913,-119.167951 +99337,WA,Kennewick,46.181387,-119.138289 +99341,WA,Lind,46.955954,-118.706057 +99343,WA,Mesa,46.578223,-119.137324 +99344,WA,Mattawa,46.792518,-119.316405 +99345,WA,Paterson,45.991139,-119.755873 +99346,WA,Plymouth,46.038184,-119.502998 +99347,WA,Pomeroy,46.469838,-117.599282 +99348,WA,Prescott,46.353879,-118.409663 +99350,WA,Prosser,46.223183,-119.771014 +99352,WA,Richland,46.283265,-119.289201 +99356,WA,Roosevelt,45.82962,-120.356611 +99357,WA,Royal City,46.91557,-119.581473 +99360,WA,Lowden,46.04851,-118.655411 +99361,WA,Waitsburg,46.269092,-118.144734 +99362,WA,Walla Walla,46.061373,-118.331544 +99371,WA,Washtucna,46.820912,-118.286203 +99401,WA,Anatone,46.128466,-117.088316 +99402,WA,Asotin,46.134318,-117.001548 +99403,WA,Clarkston,46.394622,-117.064457 +24701,WV,Bluewell,37.279788,-81.229023 +24712,WV,Athens,37.432298,-80.997362 +24714,WV,Beeson,37.490894,-81.206215 +24715,WV,Bramwell,37.332114,-81.32556 +24726,WV,Herndon,37.526431,-81.346777 +24731,WV,Kegley,37.408384,-81.140117 +24733,WV,Lashmeet,37.441997,-81.213845 +24736,WV,Dott,37.441778,-81.268017 +24740,WV,Elgood,37.366817,-81.086386 +24747,WV,Duhring,37.38889,-81.218766 +24801,WV,Welch,37.400032,-81.534412 +24810,WV,Mc Dowell,37.414348,-81.387601 +24818,WV,Brenton,37.584362,-81.649502 +24819,WV,Vallscreek,37.295548,-81.69552 +24822,WV,Clear Fork,37.646301,-81.689268 +24823,WV,Coal Mountain,37.688486,-81.707862 +24827,WV,Cyclone,37.74466,-81.650458 +24828,WV,Asco,37.468339,-81.667889 +24834,WV,Fanrock,37.562721,-81.623631 +24839,WV,Hanover,37.563029,-81.813617 +24844,WV,Iaeger,37.449878,-81.811992 +24849,WV,Jesse,37.660844,-81.562831 +24850,WV,Jolo,37.332431,-81.831602 +24859,WV,Marianna,37.611425,-81.576052 +24860,WV,Matheny,37.661956,-81.595711 +24862,WV,Mohawk,37.487926,-81.914174 +24868,WV,Algoma,37.395262,-81.415839 +24869,WV,North Spring,37.517954,-81.797276 +24870,WV,Oceana,37.703874,-81.621564 +24873,WV,Paynesville,37.365273,-81.68449 +24874,WV,Pineville,37.584022,-81.533642 +24882,WV,Simon,37.619708,-81.758566 +24884,WV,Squire,37.237019,-81.580478 +24901,WV,Lewisburg,37.808253,-80.440669 +24910,WV,Dawson,37.730148,-80.671306 +24915,WV,Arbovale,38.454575,-79.793403 +24916,WV,Asbury,37.848766,-80.565319 +24917,WV,Auto,37.981697,-80.117105 +24918,WV,Ballard,37.49803,-80.76139 +24919,WV,Ballengee,37.616931,-80.740339 +24920,WV,Bartow,38.551266,-79.795242 +24923,WV,Bozoo,37.457015,-80.814954 +24924,WV,Buckeye,38.181506,-80.139342 +24925,WV,Caldwell,37.773488,-80.377298 +24927,WV,Stony Bottom,38.433659,-79.885278 +24928,WV,Clintonville,37.906141,-80.626192 +24931,WV,Crawley,37.939676,-80.6309 +24934,WV,Dunmore,38.363605,-79.855557 +24935,WV,Indian Mills,37.56005,-80.814923 +24936,WV,Fort Spring,37.745661,-80.566723 +24938,WV,Anthony,37.90361,-80.364692 +24939,WV,24939,38.027868,-80.458919 +24941,WV,Gap Mills,37.527978,-80.390497 +24942,WV,Glace,37.609381,-80.374716 +24943,WV,Grassy Meadows,37.842757,-80.73024 +24944,WV,Green Bank,38.409664,-79.801535 +24945,WV,Greenville,37.521184,-80.676128 +24946,WV,Droop,38.125942,-80.244578 +24950,WV,Kieffer,37.942998,-80.59022 +24951,WV,Lindside,37.481651,-80.62028 +24954,WV,Minnehaha Spring,38.229303,-80.060884 +24957,WV,Maxwelton,37.900465,-80.427492 +24958,WV,Meadow Bluff,37.89587,-80.728162 +24962,WV,Pence Springs,37.676694,-80.709234 +24963,WV,Peterstown,37.414709,-80.768605 +24966,WV,Renick,37.992168,-80.365294 +24970,WV,Ronceverte,37.741758,-80.462583 +24974,WV,Secondcreek,37.660246,-80.418079 +24976,WV,Pickaway,37.662078,-80.516905 +24977,WV,Smoot,37.877166,-80.668038 +24980,WV,Sweet Springs,37.611159,-80.298959 +24981,WV,Talcott,37.649079,-80.746143 +24983,WV,Union,37.580175,-80.524767 +24984,WV,Waiteville,37.464514,-80.463447 +24985,WV,Wayside,37.593657,-80.745806 +24986,WV,Neola,37.814618,-80.27464 +24991,WV,Trout,37.94421,-80.517321 +24993,WV,Wolfcreek,37.618788,-80.611254 +25003,WV,Alum Creek,38.285814,-81.786258 +25004,WV,Ameagle,37.964068,-81.406507 +25005,WV,Amma,38.545518,-81.253182 +25007,WV,Arnett,37.850214,-81.435484 +25008,WV,Artie,37.918139,-81.378772 +25009,WV,Ashford,38.182291,-81.711324 +25010,WV,Bald Knob,37.844023,-81.622943 +25013,WV,Barrett,37.880201,-81.64831 +25015,WV,Diamond,38.225381,-81.505812 +25018,WV,Bentree,38.297088,-81.21565 +25019,WV,Fola,38.365947,-81.106838 +25021,WV,Bim,37.893437,-81.688047 +25024,WV,Bloomingrose,38.141189,-81.636737 +25025,WV,Blount,38.312116,-81.405194 +25028,WV,Bob White,37.958711,-81.720884 +25030,WV,Bomont,38.407295,-81.21999 +25033,WV,Buffalo,38.60924,-81.949971 +25034,WV,Burnwell,38.053014,-81.37647 +25035,WV,Cabin Creek,38.185795,-81.515258 +25039,WV,Cedar Grove,38.213286,-81.406711 +25043,WV,Clay,38.476354,-81.069588 +25044,WV,Clear Creek,37.89158,-81.320866 +25045,WV,Quick,38.477687,-81.356039 +25046,WV,Clio,38.572686,-81.307188 +25047,WV,Clothier,37.79333,-81.988142 +25048,WV,Colcord,37.949166,-81.443699 +25049,WV,Comfort,38.137191,-81.596177 +25051,WV,Costa,38.164693,-81.708015 +25053,WV,Danville,38.03356,-81.854227 +25059,WV,Dixie,38.26631,-81.186249 +25060,WV,Dorothy,37.96219,-81.496842 +25062,WV,Dry Creek,37.860686,-81.481398 +25063,WV,Duck,38.564652,-80.976416 +25064,WV,Dunbar,38.368271,-81.742467 +25071,WV,Frame,38.432317,-81.481739 +25079,WV,Falling Rock,38.475579,-81.380874 +25081,WV,Foster,38.090819,-81.765876 +25082,WV,Fraziers Bottom,38.551678,-82.011068 +25083,WV,Whittaker,38.189406,-81.386231 +25085,WV,Gauley Bridge,38.168899,-81.19596 +25088,WV,Glen,38.368989,-81.223401 +25093,WV,Gordon,37.978191,-81.67132 +25103,WV,Hansford,38.127158,-81.395026 +25105,WV,Harrison,38.498979,-80.916068 +25106,WV,Henderson,38.826512,-82.136381 +25107,WV,Hernshaw,38.194212,-81.612986 +25108,WV,Hewett,37.958097,-81.850919 +25111,WV,Indore,38.339672,-81.157495 +25113,WV,Big Otter,38.530476,-81.033506 +25114,WV,Ramage,37.957023,-81.800305 +25115,WV,Kanawha Falls,38.107932,-81.162753 +25118,WV,Kimberly,38.124928,-81.321721 +25119,WV,Kincaid,38.032065,-81.26897 +25121,WV,Lake,37.946191,-81.951152 +25122,WV,Carbon,38.098249,-81.451228 +25123,WV,Arbuckle,38.753046,-81.909244 +25124,WV,Liberty,38.619978,-81.767813 +25125,WV,Lizemores,38.336609,-81.163255 +25130,WV,Madison,38.044426,-81.793757 +25132,WV,Mammoth,38.258319,-81.350893 +25133,WV,Maysel,38.493924,-81.122653 +25136,WV,Montgomery,38.141232,-81.281354 +25139,WV,Mount Carbon,38.160097,-81.333373 +25140,WV,Naoma,37.915381,-81.521372 +25141,WV,Nebo,38.627069,-81.025657 +25142,WV,Nellis,38.152066,-81.739905 +25143,WV,Nitro,38.419323,-81.829311 +25148,WV,Orgas,38.073646,-81.57383 +25150,WV,Ovapa,38.523398,-81.14846 +25154,WV,Peytona,38.124952,-81.701836 +25158,WV,Pliny,38.614206,-82.015494 +25159,WV,Lanham,38.488297,-81.80511 +25160,WV,Pond Gap,38.290434,-81.28658 +25161,WV,Powellton,38.099172,-81.317923 +25163,WV,Williams Mountai,38.008351,-81.623901 +25164,WV,Pigeon,38.472167,-81.226286 +25165,WV,Racine,38.149524,-81.655742 +25168,WV,Red House,38.546298,-81.904474 +25169,WV,Ridgeview,38.148576,-81.772548 +25172,WV,Robertsburg,38.644143,-81.9109 +25173,WV,Robson,38.097263,-81.248758 +25174,WV,Rock Creek,37.836673,-81.483674 +25177,WV,Saint Albans,38.37743,-81.830463 +25180,WV,Saxon,37.786108,-81.432279 +25181,WV,Seth,38.097057,-81.639258 +25187,WV,Southside,38.711994,-81.996596 +25189,WV,Stickney,37.876844,-81.497001 +25193,WV,Sylvester,38.009075,-81.549151 +25202,WV,Tornado,38.335697,-81.847555 +25203,WV,Turtle Creek,38.042715,-81.853499 +25204,WV,Bandytown,37.921015,-81.635204 +25206,WV,Van,37.971152,-81.702175 +25209,WV,Garrison,37.978677,-81.534013 +25213,WV,Winfield,38.507178,-81.889965 +25214,WV,Winifrede,38.185245,-81.558747 +25231,WV,Advent,38.623595,-81.572063 +25234,WV,Arnoldsburg,38.822704,-81.155135 +25235,WV,Floe,38.671201,-81.090126 +25239,WV,Cottageville,38.863285,-81.818609 +25241,WV,Evans,38.811281,-81.790858 +25242,WV,25242,38.646191,-81.034134 +25243,WV,Gandeeville,38.703382,-81.424329 +25244,WV,Gay,38.797842,-81.570301 +25245,WV,Given,38.713046,-81.682542 +25246,WV,Harmony,38.692086,-81.507636 +25248,WV,Romance,38.623894,-81.651717 +25249,WV,Kentuck,38.663886,-81.596018 +25251,WV,Left Hand,38.606288,-81.246675 +25252,WV,Duncan,38.957552,-81.57245 +25253,WV,Letart,38.931079,-81.975129 +25255,WV,Letter Gap,38.897074,-80.883768 +25256,WV,Linden,38.698938,-81.229061 +25258,WV,Lockney,38.852919,-80.945075 +25259,WV,Looneyville,38.664113,-81.28219 +25260,WV,Mason,39.006442,-82.028215 +25261,WV,Millstone,38.86029,-81.086352 +25262,WV,Millwood,38.896206,-81.824832 +25264,WV,Mount Alto,38.863937,-81.878374 +25266,WV,Uler,38.605219,-81.167579 +25267,WV,Normantown,38.880173,-80.941936 +25268,WV,Minnora,38.735979,-81.09614 +25270,WV,Reedy,38.837119,-81.419785 +25271,WV,Ripley,38.809042,-81.701987 +25272,WV,Rock Castle,38.708357,-81.767414 +25274,WV,Sand Ridge,38.850721,-81.032372 +25275,WV,Sandyville,38.909282,-81.654315 +25276,WV,Spencer,38.789696,-81.33026 +25279,WV,Statts Mills,38.74076,-81.615579 +25280,WV,Stumptown,38.831619,-80.970026 +25281,WV,Tariff,38.652707,-81.212361 +25283,WV,Valley Fork,38.486906,-81.152177 +25285,WV,Wallback,38.57254,-81.093535 +25286,WV,Walton,38.602264,-81.395757 +25287,WV,West Columbia,38.926169,-82.090529 +25301,WV,Charleston,38.349,-81.630606 +25302,WV,Big Chimney,38.383178,-81.623876 +25303,WV,South Charleston,38.359226,-81.684079 +25304,WV,Charleston,38.317289,-81.590272 +25306,WV,Malden,38.30028,-81.536813 +25309,WV,South Charleston,38.344903,-81.734462 +25311,WV,Charleston,38.349032,-81.599282 +25312,WV,Charleston,38.409563,-81.674688 +25313,WV,Cross Lanes,38.424982,-81.764877 +25314,WV,Charleston,38.327442,-81.668988 +25315,WV,Marmet,38.233309,-81.554361 +25320,WV,Sissonville,38.509586,-81.629585 +25401,WV,Martinsburg,39.459959,-77.958915 +25411,WV,Hancock,39.58736,-78.219217 +25413,WV,Bunker Hill,39.327554,-78.048718 +25414,WV,Charles Town,39.277085,-77.856254 +25419,WV,Falling Waters,39.586473,-77.885152 +25420,WV,Gerrardstown,39.378039,-78.114119 +25422,WV,Great Cacapon,39.583557,-78.33312 +25425,WV,Harpers Ferry,39.315283,-77.769449 +25427,WV,Cherry Run,39.547034,-78.056016 +25428,WV,Inwood,39.370093,-78.024189 +25430,WV,Kearneysville,39.321994,-77.958762 +25431,WV,Levels,39.497637,-78.55078 +25434,WV,Paw Paw,39.492297,-78.458573 +25437,WV,Points,39.457208,-78.564148 +25438,WV,Ranson,39.299531,-77.860572 +25442,WV,Shenandoah Junct,39.371084,-77.88924 +25443,WV,Shepherdstown,39.431124,-77.815819 +25444,WV,Slanesville,39.402631,-78.505971 +25446,WV,Summit Point,39.233753,-77.958552 +25501,WV,Alkol,38.160884,-81.983972 +25502,WV,Apple Grove,38.713066,-82.172556 +25503,WV,Ashton,38.657102,-82.108907 +25504,WV,Barboursville,38.389272,-82.295973 +25505,WV,Big Creek,38.004555,-82.016056 +25506,WV,Branchland,38.269444,-82.268367 +25508,WV,Chapmanville,37.938535,-82.051241 +25510,WV,Culloden,38.419831,-82.068963 +25511,WV,Dunlow,38.02829,-82.38266 +25512,WV,East Lynn,38.199474,-82.327931 +25514,WV,Fort Gay,38.133496,-82.554124 +25515,WV,Gallipolis Ferry,38.765028,-82.153496 +25517,WV,Radnor,38.088908,-82.46692 +25520,WV,Glenwood,38.544936,-82.143431 +25521,WV,Griffithsville,38.246985,-81.982028 +25523,WV,Hamlin,38.289556,-82.104695 +25524,WV,Ferrellsburg,38.008878,-82.155358 +25526,WV,Hurricane,38.425741,-81.994329 +25529,WV,Julian,38.126437,-81.864185 +25530,WV,Kenova,38.386031,-82.573649 +25534,WV,Cove Gap,38.077744,-82.256206 +25535,WV,Lavalette,38.33046,-82.428707 +25536,WV,25536,38.087553,-82.076761 +25537,WV,Lesage,38.477028,-82.295667 +25540,WV,Midkiff,38.143908,-82.154227 +25541,WV,Milton,38.413981,-82.145784 +25544,WV,Myra,38.21978,-82.135097 +25545,WV,Ona,38.452851,-82.218093 +25546,WV,Palermo,38.12817,-82.046018 +25547,WV,Pecks Mill,37.929784,-81.965382 +25550,WV,Point Pleasant,38.863249,-82.113247 +25555,WV,Prichard,38.230009,-82.575297 +25557,WV,Ranger,38.155608,-82.19078 +25559,WV,Salt Rock,38.326542,-82.247041 +25560,WV,Scott Depot,38.450063,-81.900481 +25563,WV,Sias,38.189434,-82.085779 +25564,WV,Sod,38.262967,-81.86814 +25565,WV,Morrisvale,38.077015,-81.991778 +25567,WV,Sumerco,38.205292,-81.894317 +25568,WV,Sweetland,38.262874,-82.034464 +25570,WV,Wayne,38.225814,-82.433926 +25571,WV,West Hamlin,38.288571,-82.184348 +25572,WV,Woodville,38.157027,-81.911281 +25573,WV,Yawkey,38.219252,-81.956828 +25601,WV,West Logan,37.847488,-82.002092 +25607,WV,Robinette,37.795586,-81.758912 +25608,WV,Baisden,37.571492,-81.932758 +25617,WV,Davin,37.726499,-81.805706 +25621,WV,Gilbert,37.594153,-81.866468 +25623,WV,Hampden,37.639691,-81.947014 +25632,WV,Earling,37.774266,-81.929291 +25635,WV,Hunt,37.729525,-81.865228 +25638,WV,Barnabus,37.722368,-82.004931 +25650,WV,Verner,37.64554,-81.864801 +25651,WV,Wharncliffe,37.545161,-81.956604 +25654,WV,Dehue,37.866513,-81.872699 +25661,WV,Williamson,37.690248,-82.264163 +25666,WV,Breeden,37.919751,-82.254748 +25669,WV,Crum,37.938879,-82.462359 +25670,WV,Myrtle,37.703833,-82.131922 +25671,WV,Dingess,37.870336,-82.195108 +25674,WV,Kermit,37.864246,-82.374065 +25676,WV,Lenore,37.799436,-82.269336 +25678,WV,Lobata,37.649539,-82.145694 +25682,WV,Meador,37.592373,-82.065904 +25694,WV,Thacker,37.608293,-82.127333 +25699,WV,Wilsondale,37.951598,-82.381358 +25701,WV,Huntington,38.409726,-82.442348 +25702,WV,Huntington,38.42862,-82.391083 +25703,WV,Huntington,38.421116,-82.422666 +25704,WV,Huntington,38.384943,-82.503646 +25705,WV,Huntington,38.409588,-82.36901 +25801,WV,Beckley,37.793214,-81.206084 +25811,WV,Amigo,37.59211,-81.349145 +25812,WV,Ansted,38.13686,-81.095487 +25813,WV,Beaver,37.751581,-81.073104 +25817,WV,Bolt,37.767303,-81.415612 +25820,WV,Camp Creek,37.484053,-81.111073 +25825,WV,Cool Ridge,37.65735,-81.10528 +25827,WV,Crab Orchard,37.720515,-81.249098 +25831,WV,Clifftop,37.903615,-80.947114 +25832,WV,Daniels,37.732247,-81.139108 +25837,WV,Edmond,38.054441,-81.032634 +25839,WV,Fairdale,37.786578,-81.401758 +25840,WV,Cunard,38.062774,-81.080969 +25841,WV,Flat Top,37.550028,-81.127976 +25843,WV,Ghent,37.62079,-81.101921 +25844,WV,Glen Daniel,37.754698,-81.403294 +25845,WV,Glen Fork,37.644691,-81.540209 +25847,WV,Sullivan,37.790384,-81.13048 +25848,WV,Glen Rogers,37.721685,-81.428989 +25854,WV,Hico,38.109373,-80.963763 +25857,WV,Josephine,37.622135,-81.217584 +25862,WV,Lansing,38.110793,-81.02772 +25864,WV,Lawton,37.865779,-80.992449 +25865,WV,Lester,37.726522,-81.309542 +25868,WV,Lookout,38.052822,-80.92006 +25870,WV,Maben,37.654294,-81.391371 +25876,WV,Saulsville,37.655573,-81.457706 +25880,WV,Mount Hope,37.911048,-81.170419 +25882,WV,Mullens,37.584172,-81.389015 +25901,WV,Harvey,37.984874,-81.134425 +25902,WV,Odd,37.592997,-81.187183 +25908,WV,Winding Gulf,37.643456,-81.231022 +25912,WV,Ramsey,38.178142,-81.015047 +25913,WV,Ravencliff,37.697961,-81.496736 +25915,WV,East Gulf,37.628587,-81.294753 +25917,WV,Scarbro,37.947073,-81.245731 +25918,WV,Abraham,37.697802,-81.1023 +25920,WV,Slab Fork,37.679605,-81.227928 +25922,WV,Spanishburg,37.46314,-81.106941 +25928,WV,Stephenson,37.579847,-81.333914 +25932,WV,Surveyor,37.748,-81.33919 +25936,WV,Thurmond,37.955437,-81.071428 +25938,WV,Victor,38.140194,-81.032223 +25951,WV,Hinton,37.663983,-80.867779 +25958,WV,Charmco,37.98948,-80.707745 +25962,WV,Rainelle,37.966112,-80.782064 +25965,WV,Elton,37.846825,-80.825207 +25966,WV,Green Sulphur Sp,37.808553,-80.839922 +25969,WV,Streeter,37.639732,-80.995717 +25971,WV,Lerona,37.492498,-80.979574 +25976,WV,Meadow Bridge,37.878048,-80.852144 +25977,WV,Meadow Creek,37.804824,-80.91742 +25978,WV,Nimitz,37.628584,-80.94462 +25979,WV,Pipestem,37.530345,-80.946345 +25981,WV,Marfrance,38.051937,-80.717286 +25984,WV,Kessler,37.963882,-80.689971 +25985,WV,Sandstone,37.759879,-80.871564 +25986,WV,Spring Dale,37.86947,-80.814996 +25988,WV,True,37.580031,-80.930837 +25989,WV,White Oak,37.68008,-81.058875 +26003,WV,Elm Grove,40.072736,-80.685126 +26031,WV,Benwood,40.013299,-80.71603 +26032,WV,Bethany,40.202,-80.55463 +26033,WV,Cameron,39.82272,-80.566876 +26034,WV,Chester,40.598109,-80.558439 +26035,WV,Colliers,40.348391,-80.549341 +26036,WV,Dallas,39.978343,-80.550804 +26037,WV,Follansbee,40.329552,-80.584954 +26038,WV,Glen Dale,39.959732,-80.732263 +26039,WV,Glen Easton,39.853121,-80.666069 +26040,WV,Mc Mechen,39.987793,-80.73082 +26041,WV,Moundsville,39.914819,-80.730971 +26047,WV,New Cumberland,40.522777,-80.590108 +26050,WV,Newell,40.613971,-80.601126 +26055,WV,Proctor,39.720683,-80.761779 +26059,WV,Triadelphia,40.069945,-80.59529 +26060,WV,Valley Grove,40.094649,-80.555059 +26062,WV,Weirton,40.413673,-80.568307 +26070,WV,Wellsburg,40.254792,-80.596061 +26101,WV,Parkersburg,39.264433,-81.535412 +26104,WV,North Parkersbur,39.285316,-81.526109 +26105,WV,Vienna,39.325089,-81.541143 +26133,WV,Belleville,39.131417,-81.692316 +26134,WV,Willow Island,39.367927,-81.27881 +26135,WV,Bens Run,39.44641,-81.066534 +26136,WV,Big Bend,38.971941,-81.13603 +26137,WV,Nobe,38.996306,-81.069813 +26138,WV,Brohard,39.033756,-81.177528 +26141,WV,Creston,38.937805,-81.236905 +26142,WV,Davisville,39.212635,-81.479863 +26143,WV,Elizabeth,39.056618,-81.398889 +26145,WV,Five Forks,38.975331,-81.086623 +26146,WV,Friendly,39.502444,-81.034544 +26147,WV,Grantsville,38.932436,-81.076294 +26148,WV,Macfarlan,39.08058,-81.177627 +26149,WV,Middlebourne,39.50537,-80.886067 +26150,WV,Mineralwells,39.179846,-81.519096 +26151,WV,Mount Zion,38.877455,-81.119473 +26152,WV,Munday,39.021423,-81.204048 +26153,WV,Murraysville,39.059143,-81.771368 +26155,WV,New Martinsville,39.658798,-80.856541 +26159,WV,Paden City,39.604408,-80.926482 +26160,WV,Palestine,38.974141,-81.42803 +26161,WV,Petroleum,39.174139,-81.240607 +26164,WV,Ravenswood,38.94675,-81.752377 +26167,WV,Reader,39.583595,-80.751583 +26169,WV,Rockport,39.079774,-81.571333 +26170,WV,Saint Marys,39.38597,-81.172499 +26173,WV,Sherman,39.013094,-81.700916 +26175,WV,Sistersville,39.558365,-80.981828 +26178,WV,Smithville,39.067078,-81.061953 +26179,WV,Tanner,38.966435,-80.959719 +26180,WV,Walker,39.182082,-81.386577 +26181,WV,New England,39.233911,-81.640719 +26184,WV,Waverly,39.315681,-81.381938 +26185,WV,Wick,39.421653,-80.968044 +26186,WV,Wileyville,39.662593,-80.647251 +26187,WV,Williamstown,39.38243,-81.456608 +26201,WV,Tennerton,38.98407,-80.217824 +26202,WV,Fenwick,38.244657,-80.634972 +26203,WV,Erbacon,38.541864,-80.574232 +26205,WV,Craigsville,38.325389,-80.64438 +26206,WV,Cowen,38.413273,-80.535807 +26208,WV,Gauley Mills,38.379246,-80.591408 +26210,WV,Adrian,38.913422,-80.288663 +26214,WV,Century,39.093287,-80.175688 +26215,WV,Cleveland,38.839225,-80.342849 +26217,WV,Diana,38.575471,-80.431962 +26218,WV,Alexander,38.851145,-80.274339 +26222,WV,Replete,38.679583,-80.402345 +26224,WV,Helvetia,38.771258,-80.138167 +26228,WV,Kanawha Head,38.76183,-80.372734 +26230,WV,Pickens,38.684242,-80.209784 +26234,WV,Rock Cave,38.781128,-80.316276 +26236,WV,Selbyville,38.719393,-80.312955 +26237,WV,Tallmansville,38.856405,-80.15799 +26238,WV,Volga,39.068445,-80.143209 +26241,WV,Elkins,38.925304,-79.847115 +26250,WV,Belington,39.024439,-79.949508 +26253,WV,Beverly,38.828021,-79.865121 +26254,WV,Wymer,38.934863,-79.619347 +26257,WV,Coalton,38.91438,-79.976724 +26260,WV,Davis,39.088227,-79.456278 +26261,WV,Richwood,38.222988,-80.544481 +26263,WV,Dryfork,38.957616,-79.453403 +26264,WV,Durbin,38.616313,-79.793464 +26266,WV,Upperglade,38.418528,-80.496464 +26267,WV,Ellamore,38.933966,-80.092611 +26268,WV,Glady,38.866925,-79.734202 +26269,WV,Hambleton,39.116836,-79.641565 +26270,WV,Harman,38.923369,-79.524599 +26271,WV,Hendricks,39.074814,-79.630302 +26273,WV,Huttonsville,38.678433,-79.977544 +26276,WV,Kerens,39.029854,-79.775427 +26278,WV,Mabie,38.822158,-80.013061 +26280,WV,Mill Creek,38.732493,-79.978569 +26282,WV,Monterville,38.551707,-80.122391 +26283,WV,Montrose,39.096357,-79.789577 +26287,WV,Parsons,39.105857,-79.673448 +26288,WV,Bolair,38.476362,-80.399798 +26289,WV,Red Creek,39.019628,-79.53009 +26291,WV,Slatyfork,38.381207,-80.040353 +26292,WV,Thomas,39.150517,-79.503 +26293,WV,Valley Bend,38.784903,-79.916037 +26294,WV,Mingo,38.536637,-80.044911 +26296,WV,Job,38.808289,-79.557752 +26299,WV,Boggs,38.482119,-80.607389 +26301,WV,Nutter Fort Ston,39.278422,-80.348683 +26320,WV,Wilbur,39.429757,-80.817157 +26321,WV,Alum Bridge,39.042474,-80.688196 +26322,WV,Alvy,39.451106,-80.668921 +26325,WV,Auburn,39.086382,-80.883656 +26327,WV,Berea,39.130452,-80.922322 +26328,WV,Blandville,39.265169,-80.735856 +26330,WV,Bridgeport,39.29537,-80.242692 +26332,WV,Bristol,39.290425,-80.510541 +26335,WV,Gem,38.850391,-80.658989 +26337,WV,Cairo,39.23249,-81.155427 +26338,WV,Camden,39.089268,-80.591531 +26339,WV,Center Point,39.412472,-80.635227 +26342,WV,Coxs Mills,39.002102,-80.874592 +26343,WV,Crawford,38.840065,-80.400749 +26346,WV,Highland,39.282364,-81.060382 +26347,WV,Wendel,39.271069,-80.128179 +26348,WV,Folsom,39.469345,-80.525806 +26351,WV,Baldwin,38.933619,-80.82783 +26354,WV,Grafton,39.341386,-80.028509 +26360,WV,Greenwood,39.290761,-80.878899 +26362,WV,Mahone,39.199608,-81.045967 +26367,WV,Hazelgreen,39.063075,-80.980578 +26372,WV,Horner,38.972628,-80.365576 +26374,WV,Independence,39.446372,-79.882161 +26376,WV,Wildcat,38.767689,-80.477002 +26377,WV,Jacksonburg,39.541553,-80.643697 +26378,WV,Jane Lew,39.109989,-80.431059 +26383,WV,Lima,39.438973,-80.724703 +26384,WV,Linn,38.957294,-80.730046 +26385,WV,Lost Creek,39.172528,-80.377674 +26386,WV,Lumberport,39.378108,-80.367635 +26404,WV,Meadowbrook,39.335367,-80.325668 +26405,WV,Kasson,39.212271,-79.921574 +26408,WV,Mount Clare,39.210708,-80.289948 +26409,WV,Newberne,39.040743,-80.902838 +26410,WV,Newburg,39.402722,-79.828036 +26411,WV,New Milton,39.189917,-80.707617 +26412,WV,Orlando,38.885349,-80.560122 +26415,WV,Toll Gate,39.292064,-80.958482 +26416,WV,Broaddus,39.150789,-80.038531 +26419,WV,Hastings,39.565069,-80.677213 +26421,WV,Pullman,39.190013,-80.934685 +26423,WV,Roanoke,38.930494,-80.498537 +26425,WV,Manheim,39.221575,-79.642977 +26426,WV,Salem,39.294761,-80.589792 +26431,WV,Shinnston,39.388809,-80.283399 +26437,WV,Smithfield,39.5134,-80.558245 +26439,WV,Stouts Mills,38.893335,-80.741131 +26440,WV,Thornton,39.332879,-79.909645 +26443,WV,Troy,39.083881,-80.754921 +26444,WV,Tunnelton,39.362502,-79.747818 +26447,WV,Walkersville,38.850738,-80.480221 +26448,WV,Wallace,39.411667,-80.486468 +26451,WV,West Milford,39.203906,-80.363049 +26452,WV,Weston,39.041104,-80.473656 +26456,WV,West Union,39.276185,-80.791057 +26462,WV,Wolf Summit,39.232985,-80.438704 +26505,WV,Star City,39.633858,-79.954225 +26519,WV,Albright,39.570116,-79.635811 +26521,WV,Blacksville,39.695821,-80.232646 +26525,WV,Bruceton Mills,39.645394,-79.615941 +26529,WV,Core,39.654037,-80.23068 +26537,WV,Kingwood,39.481912,-79.70629 +26541,WV,Maidsville,39.709308,-80.083193 +26542,WV,Cascade,39.576413,-79.800993 +26546,WV,Pursglove,39.699543,-80.061798 +26547,WV,Reedsville,39.51823,-79.810061 +26554,WV,Monongah,39.472677,-80.146041 +26560,WV,Baxter,39.536056,-80.141691 +26561,WV,Big Run,39.59414,-80.583717 +26562,WV,Coburn,39.667984,-80.405931 +26568,WV,Enterprise,39.425998,-80.316704 +26570,WV,Fairview,39.610335,-80.252918 +26571,WV,Farmington,39.50287,-80.256643 +26575,WV,Hundred,39.691744,-80.474552 +26581,WV,Littleton,39.659205,-80.569478 +26582,WV,Mannington,39.522031,-80.355243 +26585,WV,Metz,39.607762,-80.416815 +26587,WV,Rachel,39.52254,-80.295694 +26588,WV,Rivesville,39.556839,-80.141744 +26589,WV,Wadestown,39.636926,-80.327462 +26590,WV,Wana,39.702072,-80.305106 +26591,WV,Worthington,39.452213,-80.290468 +26601,WV,Herold,38.673855,-80.681072 +26610,WV,Birch River,38.491424,-80.745873 +26611,WV,Flower,38.839711,-80.840342 +26615,WV,Copen,38.830556,-80.728481 +26617,WV,Dille,38.474704,-80.853784 +26618,WV,Elmira,38.658907,-80.984972 +26619,WV,Riffle,38.806866,-80.768123 +26620,WV,Falls Mill,38.77566,-80.550618 +26621,WV,Corley,38.724475,-80.638478 +26623,WV,Clem,38.636828,-80.877416 +26624,WV,Gassaway,38.686193,-80.786339 +26626,WV,Glendon,38.610857,-80.939459 +26627,WV,Heaters,38.755807,-80.642884 +26629,WV,Tesla,38.581046,-80.706293 +26631,WV,Napier,38.77462,-80.584104 +26633,WV,Nicut,38.715133,-81.011 +26634,WV,Perkins,38.809049,-80.919336 +26636,WV,Rosedale,38.770103,-80.906127 +26638,WV,Shock,38.757527,-80.968663 +26639,WV,Strange Creek,38.573823,-80.903077 +26641,WV,Wilsie,38.672723,-80.868051 +26651,WV,Summersville,38.30089,-80.835278 +26656,WV,Belva,38.249105,-81.156572 +26660,WV,Calvin,38.327679,-80.70163 +26662,WV,Canvas,38.262445,-80.744637 +26667,WV,Drennen,38.258729,-81.008868 +26671,WV,Gilboa,38.298304,-80.952232 +26674,WV,Jodie,38.208319,-81.134657 +26675,WV,Keslers Cross La,38.225762,-80.933365 +26676,WV,Leivasy,38.135019,-80.717213 +26678,WV,Mount Lookout,38.182109,-80.91077 +26679,WV,Runa,38.197064,-80.820204 +26680,WV,Russelville,38.10829,-80.885777 +26681,WV,Nettie,38.209042,-80.695271 +26683,WV,Poe,38.256458,-80.952167 +26684,WV,Pool,38.146004,-80.885907 +26690,WV,Swiss,38.279058,-81.080703 +26691,WV,Tioga,38.375989,-80.661663 +26704,WV,Augusta,39.299821,-78.593089 +26705,WV,Amboy,39.304719,-79.571088 +26710,WV,Burlington,39.388709,-78.912278 +26711,WV,Capon Bridge,39.280198,-78.464413 +26713,WV,Corinth,39.43183,-79.503965 +26714,WV,Delray,39.179564,-78.639427 +26716,WV,Eglon,39.292514,-79.510919 +26717,WV,Elk Garden,39.363088,-79.153871 +26719,WV,Fort Ashby,39.497045,-78.774296 +26720,WV,Gormania,39.271499,-79.340136 +26722,WV,Green Spring,39.502931,-78.627191 +26726,WV,Scherr,39.430406,-78.988667 +26729,WV,Kirby,39.195588,-78.731468 +26731,WV,Lahmansville,39.164225,-79.043319 +26734,WV,Medley,39.236079,-79.0984 +26739,WV,Mount Storm,39.265224,-79.225454 +26743,WV,New Creek,39.361155,-79.045212 +26750,WV,Piedmont,39.479901,-79.048862 +26753,WV,Patterson Creek,39.581796,-78.792006 +26755,WV,Rio,39.180663,-78.693548 +26757,WV,Romney,39.342369,-78.748075 +26761,WV,Shanks,39.284859,-78.699531 +26763,WV,Springfield,39.462996,-78.695019 +26764,WV,Hopemont,39.441575,-79.557234 +26765,WV,Three Churches,39.351578,-78.661061 +26767,WV,Wiley Ford,39.613308,-78.774992 +26769,WV,Horse Shoe Run,39.252842,-79.512312 +26801,WV,Baker,39.065588,-78.774826 +26802,WV,Brandywine,38.635701,-79.209629 +26804,WV,Circleville,38.623039,-79.53672 +26806,WV,Fort Seybert,38.739489,-79.140781 +26807,WV,Franklin,38.639985,-79.353776 +26808,WV,High View,39.222497,-78.442548 +26810,WV,Lost City,38.895361,-78.822684 +26811,WV,Lost River,38.93448,-78.79317 +26812,WV,Mathias,38.874443,-78.881413 +26813,WV,Moyers,38.500561,-79.383011 +26814,WV,Riverton,38.697871,-79.465531 +26815,WV,Sugar Grove,38.52011,-79.290329 +26816,WV,Arthur,39.101237,-79.099576 +26817,WV,Bloomery,39.328606,-78.381561 +26818,WV,Fisher,39.04796,-78.988756 +26824,WV,Junction,39.330441,-78.832785 +26833,WV,Maysville,39.071174,-79.1937 +26836,WV,Rig,39.056812,-78.97793 +26838,WV,Milam,38.812526,-79.072936 +26845,WV,Old Fields,39.150245,-78.950944 +26847,WV,Dorcas,38.976602,-79.130701 +26851,WV,Wardensville,39.056238,-78.617457 +26852,WV,Purgitsville,39.268065,-78.905951 +26855,WV,Cabins,38.951199,-79.278332 +26865,WV,Lehew,39.183038,-78.494998 +26866,WV,Upper Tract,38.794952,-79.258589 +26884,WV,Seneca Rocks,38.829615,-79.386577 +26886,WV,Onego,38.801718,-79.450702 +53001,WI,Adell,43.615071,-88.025394 +53002,WI,Allenton,43.468065,-88.353901 +53004,WI,Belgium,43.499465,-87.850908 +53005,WI,Brookfield,43.062173,-88.098 +53006,WI,South Byron,43.610934,-88.509729 +53007,WI,Butler,43.105405,-88.071043 +53010,WI,Campbellsport,43.604183,-88.272855 +53011,WI,Cascade,43.659106,-88.094658 +53012,WI,Cedarburg,43.303413,-88.002867 +53013,WI,Cedar Grove,43.575076,-87.840108 +53014,WI,Chilton,44.024242,-88.182689 +53015,WI,Cleveland,43.921732,-87.767314 +53017,WI,Colgate,43.199767,-88.240614 +53018,WI,Delafield,43.050019,-88.397248 +53019,WI,Eden,43.695878,-88.326607 +53020,WI,Elkhart Lake,43.843553,-87.97667 +53021,WI,Waubeka,43.484319,-87.982243 +53022,WI,Germantown,43.218871,-88.116508 +53023,WI,Glenbeulah,43.766611,-88.104886 +53024,WI,Grafton,43.323146,-87.952087 +53027,WI,Hartford,43.315749,-88.370727 +53029,WI,Hartland,43.117153,-88.344572 +53032,WI,Horicon,43.446859,-88.631049 +53033,WI,Hubertus,43.234269,-88.231147 +53035,WI,Iron Ridge,43.393415,-88.544072 +53036,WI,Ixonia,43.170667,-88.580567 +53037,WI,Jackson,43.325243,-88.162592 +53038,WI,Johnson Creek,43.075051,-88.783602 +53039,WI,Juneau,43.379199,-88.684517 +53040,WI,Kewaskum,43.521446,-88.19253 +53042,WI,Kiel,43.934105,-87.995644 +53044,WI,Kohler,43.738096,-87.78673 +53045,WI,Brookfield,43.066791,-88.146946 +53046,WI,Lannon,43.149651,-88.163863 +53048,WI,Knowles,43.588489,-88.441309 +53049,WI,Malone,43.869002,-88.307289 +53050,WI,Mayville,43.504496,-88.545084 +53051,WI,Menomonee Falls,43.160174,-88.112774 +53057,WI,Mount Calvary,43.814211,-88.239922 +53058,WI,Nashotah,43.111791,-88.408913 +53059,WI,Neosho,43.297841,-88.520482 +53061,WI,New Holstein,43.944639,-88.091083 +53063,WI,Newton,43.983621,-87.784764 +53065,WI,Oakfield,43.686371,-88.556919 +53066,WI,Oconomowoc,43.109497,-88.486229 +53069,WI,Okauchee,43.113011,-88.432287 +53070,WI,Oostburg,43.622939,-87.796955 +53072,WI,Pewaukee,43.078777,-88.272922 +53073,WI,Plymouth,43.75258,-87.977906 +53074,WI,Port Washington,43.395463,-87.879659 +53075,WI,Random Lake,43.567206,-87.981553 +53076,WI,Richfield,43.273925,-88.215467 +53078,WI,Rubicon,43.312144,-88.452793 +53079,WI,Saint Cloud,43.807431,-88.184482 +53080,WI,Saukville,43.391265,-87.956765 +53081,WI,Sheboygan,43.740981,-87.724667 +53083,WI,Howards Grove,43.788609,-87.748552 +53085,WI,Sheboygan Falls,43.726598,-87.824228 +53086,WI,Slinger,43.332211,-88.282377 +53089,WI,Sussex,43.144059,-88.227064 +53091,WI,Theresa,43.504477,-88.447766 +53092,WI,Mequon,43.225145,-87.959357 +53093,WI,Waldo,43.657087,-87.97217 +53094,WI,Watertown,43.192971,-88.71851 +53095,WI,West Bend,43.422444,-88.184549 +53103,WI,Big Bend,42.888463,-88.212182 +53104,WI,Bristol,42.532525,-88.047779 +53105,WI,Burlington,42.666034,-88.274886 +53108,WI,Caledonia,42.829473,-87.92278 +53110,WI,Cudahy,42.948976,-87.861983 +53114,WI,Darien,42.6435,-88.714217 +53115,WI,Delavan,42.622715,-88.627717 +53118,WI,Dousman,42.98506,-88.456754 +53119,WI,Eagle,42.880942,-88.46742 +53120,WI,East Troy,42.803531,-88.409215 +53121,WI,Elkhorn,42.700928,-88.546209 +53122,WI,Elm Grove,43.047943,-88.085374 +53125,WI,Fontana,42.542928,-88.568424 +53126,WI,Franksville,42.785892,-87.987273 +53128,WI,Genoa City,42.532276,-88.348456 +53129,WI,Greendale,42.937293,-87.994277 +53130,WI,Hales Corners,42.941034,-88.0503 +53132,WI,Franklin,42.901728,-88.008582 +53137,WI,Helenville,43.01007,-88.726887 +53139,WI,Kansasville,42.701246,-88.118037 +53140,WI,Kenosha,42.605228,-87.829945 +53142,WI,Kenosha,42.556038,-87.870526 +53143,WI,Kenosha,42.561726,-87.830053 +53144,WI,Kenosha,42.605788,-87.876171 +53146,WI,New Berlin,42.97397,-88.155274 +53147,WI,Lake Geneva,42.588111,-88.455379 +53149,WI,Mukwonago,42.882054,-88.345116 +53150,WI,Muskego,42.904651,-88.121411 +53151,WI,New Berlin,42.982151,-88.094642 +53153,WI,North Prairie,42.938501,-88.394988 +53154,WI,Oak Creek,42.88916,-87.902661 +53156,WI,Palmyra,42.879263,-88.590255 +53168,WI,Salem,42.570922,-88.128731 +53172,WI,South Milwaukee,42.910468,-87.864626 +53177,WI,Sturtevant,42.69673,-87.903082 +53178,WI,Sullivan,42.99825,-88.602569 +53179,WI,Trevor,42.520112,-88.13869 +53181,WI,Twin Lakes,42.523173,-88.257318 +53182,WI,Union Grove,42.689643,-88.039004 +53183,WI,Wales,43.008787,-88.378742 +53184,WI,Walworth,42.535005,-88.602738 +53185,WI,Wind Lake,42.796882,-88.19335 +53186,WI,Waukesha,42.999304,-88.219559 +53188,WI,Waukesha,43.012848,-88.27048 +53190,WI,Whitewater,42.827174,-88.742864 +53191,WI,Williams Bay,42.576678,-88.543089 +53202,WI,Milwaukee,43.050601,-87.896792 +53203,WI,Milwaukee,43.040299,-87.915375 +53204,WI,Milwaukee,43.015778,-87.931685 +53205,WI,Milwaukee,43.052841,-87.935332 +53206,WI,Milwaukee,43.075324,-87.934714 +53207,WI,Bay View,42.981405,-87.894598 +53208,WI,Milwaukee,43.048775,-87.962454 +53209,WI,Milwaukee,43.118765,-87.947834 +53210,WI,Milwaukee,43.068545,-87.971466 +53211,WI,Shorewood,43.080517,-87.885078 +53212,WI,Milwaukee,43.071195,-87.908415 +53213,WI,Wauwatosa,43.051316,-88.000757 +53214,WI,West Allis,43.019113,-88.010757 +53215,WI,West Milwaukee,43.000411,-87.94174 +53216,WI,Milwaukee,43.085868,-87.974218 +53217,WI,Milwaukee,43.14086,-87.907261 +53218,WI,Milwaukee,43.11218,-87.993161 +53219,WI,Milwaukee,42.995909,-87.994368 +53220,WI,Greenfield,42.968186,-87.992209 +53221,WI,Milwaukee,42.954864,-87.944734 +53222,WI,Milwaukee,43.08283,-88.02687 +53223,WI,Milwaukee,43.162374,-87.989818 +53224,WI,Milwaukee,43.159415,-88.032744 +53225,WI,Milwaukee,43.115416,-88.03464 +53226,WI,Wauwatosa,43.050006,-88.041386 +53227,WI,Milwaukee,42.994919,-88.036384 +53228,WI,Greenfield,42.970251,-88.034638 +53233,WI,Milwaukee,43.040738,-87.93566 +53402,WI,Racine,42.772596,-87.795985 +53403,WI,Racine,42.706015,-87.801375 +53404,WI,Racine,42.743348,-87.8053 +53405,WI,Racine,42.716112,-87.823329 +53406,WI,Racine,42.724162,-87.855104 +53502,WI,Albany,42.715535,-89.435695 +53503,WI,Arena,43.152111,-89.938614 +53504,WI,Argyle,42.695532,-89.859834 +53505,WI,Avalon,42.65979,-88.837142 +53506,WI,Avoca,43.157137,-90.288859 +53507,WI,Barneveld,43.015797,-89.904229 +53508,WI,Belleville,42.866906,-89.53773 +53510,WI,Belmont,42.730784,-90.335881 +53511,WI,Shopiere,42.522871,-89.039897 +53515,WI,Black Earth,43.132213,-89.738974 +53516,WI,Blanchardville,42.806186,-89.855511 +53517,WI,Blue Mounds,43.004964,-89.834455 +53518,WI,Blue River,43.236567,-90.587312 +53520,WI,Brodhead,42.611074,-89.371409 +53521,WI,Brooklyn,42.842327,-89.381814 +53522,WI,Browntown,42.557872,-89.78158 +53523,WI,Cambridge,42.99176,-89.020901 +53525,WI,Clinton,42.553481,-88.870477 +53526,WI,Cobb,42.966009,-90.332408 +53527,WI,Cottage Grove,43.078405,-89.201692 +53528,WI,Cross Plains,43.113214,-89.639665 +53529,WI,Dane,43.242414,-89.51174 +53530,WI,Darlington,42.687816,-90.110648 +53531,WI,Deerfield,43.057106,-89.086199 +53532,WI,De Forest,43.235748,-89.329652 +53533,WI,Dodgeville,42.969779,-90.140433 +53534,WI,Edgerton,42.838605,-89.064157 +53536,WI,Evansville,42.773216,-89.287712 +53538,WI,Fort Atkinson,42.922902,-88.846689 +53541,WI,Gratiot,42.575852,-90.024344 +53543,WI,Highland,43.052368,-90.36501 +53544,WI,Hollandale,42.877321,-89.912973 +53545,WI,Janesville,42.691542,-89.033124 +53546,WI,Janesville,42.668254,-89.002534 +53549,WI,Jefferson,43.000557,-88.807765 +53550,WI,Juda,42.567874,-89.502608 +53551,WI,Lake Mills,43.081576,-88.913335 +53553,WI,Linden,42.918419,-90.279726 +53554,WI,Livingston,42.904432,-90.441986 +53555,WI,Lodi,43.326964,-89.555421 +53556,WI,Lone Rock,43.220773,-90.235229 +53557,WI,Lowell,43.342018,-88.787263 +53558,WI,Mc Farland,43.010651,-89.294773 +53559,WI,Marshall,43.163639,-89.075331 +53560,WI,Mazomanie,43.184746,-89.763616 +53561,WI,Merrimac,43.385527,-89.632254 +53562,WI,Middleton,43.105196,-89.507258 +53563,WI,Milton,42.779087,-88.953087 +53565,WI,Mineral Point,42.854696,-90.164556 +53566,WI,Monroe,42.599076,-89.6403 +53569,WI,Montfort,42.975745,-90.44473 +53570,WI,Monticello,42.741482,-89.608069 +53572,WI,Mount Horeb,43.002022,-89.741448 +53573,WI,Muscoda,43.207375,-90.456998 +53574,WI,New Glarus,42.814344,-89.643666 +53575,WI,Oregon,42.929485,-89.387002 +53576,WI,Orfordville,42.627766,-89.253292 +53577,WI,Plain,43.292693,-90.055825 +53578,WI,Prairie Du Sac,43.295631,-89.745233 +53579,WI,Reeseville,43.301278,-88.857117 +53580,WI,Rewey,42.859393,-90.380361 +53581,WI,Gillingham,43.362714,-90.391378 +53582,WI,Ridgeway,43.007654,-89.988946 +53583,WI,Sauk City,43.268558,-89.741777 +53585,WI,Sharon,42.519367,-88.726522 +53586,WI,Shullsburg,42.57856,-90.226619 +53587,WI,South Wayne,42.582199,-89.888844 +53588,WI,Spring Green,43.18835,-90.067608 +53589,WI,Stoughton,42.929007,-89.223989 +53590,WI,Sun Prairie,43.186901,-89.222662 +53593,WI,Verona,42.999913,-89.552247 +53594,WI,Waterloo,43.183171,-88.983835 +53597,WI,Waunakee,43.181828,-89.45317 +53598,WI,Windsor,43.214121,-89.341469 +53703,WI,Madison,43.077535,-89.383068 +53704,WI,Madison,43.120526,-89.352295 +53705,WI,Madison,43.072999,-89.452823 +53706,WI,Madison,43.076929,-89.409362 +53711,WI,Madison,43.035644,-89.452558 +53713,WI,Fitchburg,43.037381,-89.390008 +53714,WI,Madison,43.097735,-89.311758 +53715,WI,Madison,43.065287,-89.400045 +53716,WI,Monona,43.067413,-89.315921 +53717,WI,Madison,43.073587,-89.507984 +53718,WI,Madison,43.152143,-89.407339 +53719,WI,Madison,43.03207,-89.499324 +53801,WI,Bagley,42.920734,-91.068502 +53803,WI,Benton,42.534901,-90.338045 +53804,WI,Bloomington,42.872598,-90.909905 +53805,WI,Boscobel,43.139327,-90.706101 +53806,WI,Cassville,42.728791,-90.960751 +53807,WI,Cuba City,42.599073,-90.474907 +53809,WI,Fennimore,42.988558,-90.655009 +53810,WI,Glen Haven,42.820372,-91.000451 +53811,WI,Hazel Green,42.535913,-90.511782 +53813,WI,Lancaster,42.844469,-90.710906 +53816,WI,Mount Hope,42.968862,-90.86648 +53818,WI,Platteville,42.73932,-90.485406 +53820,WI,Potosi,42.6884,-90.700153 +53821,WI,Prairie Du Chien,43.042649,-91.119305 +53825,WI,Stitzer,42.92142,-90.607924 +53826,WI,Wauzeka,43.114264,-90.923885 +53827,WI,Woodman,43.057697,-90.824539 +53901,WI,Portage,43.550145,-89.47139 +53910,WI,Adams,43.896688,-89.821869 +53911,WI,Arlington,43.326868,-89.363082 +53913,WI,Baraboo,43.482531,-89.746168 +53916,WI,Beaver Dam,43.461574,-88.840681 +53919,WI,Brandon,43.72579,-88.784099 +53920,WI,Briggsville,43.675865,-89.580259 +53922,WI,Burnett,43.511609,-88.717606 +53923,WI,Cambria,43.57239,-89.115614 +53924,WI,Cazenovia,43.498715,-90.279572 +53925,WI,Columbus,43.331494,-89.027089 +53926,WI,Dalton,43.67178,-89.191768 +53929,WI,Elroy,43.751616,-90.288857 +53930,WI,Endeavor,43.696305,-89.461699 +53932,WI,Fall River,43.400838,-89.062513 +53933,WI,Fox Lake,43.581507,-88.904081 +53934,WI,Friendship,43.989629,-89.814875 +53936,WI,Grand Marsh,43.856789,-89.655663 +53937,WI,Hillpoint,43.395129,-90.158792 +53939,WI,Kingston,43.69236,-89.131997 +53941,WI,La Valle,43.569874,-90.127966 +53943,WI,Loganville,43.405046,-90.033688 +53944,WI,Lyndon Station,43.689875,-89.891543 +53946,WI,Markesan,43.714015,-89.006971 +53947,WI,Marquette,43.745886,-89.139654 +53948,WI,Mauston,43.793383,-90.064085 +53949,WI,Montello,43.768984,-89.358641 +53950,WI,New Lisbon,43.88775,-90.152407 +53951,WI,North Freedom,43.410562,-89.849019 +53952,WI,Oxford,43.779914,-89.563175 +53954,WI,Pardeeville,43.533975,-89.326514 +53955,WI,Poynette,43.401342,-89.418857 +53956,WI,Randolph,43.539696,-89.002992 +53959,WI,Reedsburg,43.531581,-89.995948 +53960,WI,Rio,43.423053,-89.235362 +53961,WI,Rock Springs,43.468098,-89.921834 +53963,WI,Waupun,43.632441,-88.737253 +53964,WI,Westfield,43.896788,-89.502015 +53965,WI,Wisconsin Dells,43.650789,-89.76652 +53968,WI,Wonewoc,43.62848,-90.239357 +54001,WI,Deronda,45.325238,-92.361527 +54002,WI,Baldwin,44.9657,-92.365498 +54003,WI,Beldenville,44.7721,-92.437202 +54004,WI,Clayton,45.306297,-92.139462 +54005,WI,Clear Lake,45.236481,-92.27488 +54006,WI,Cushing,45.560359,-92.624136 +54007,WI,Deer Park,45.169046,-92.358464 +54009,WI,Dresser,45.354585,-92.5623 +54011,WI,Ellsworth,44.730191,-92.489038 +54012,WI,Emerald,45.078578,-92.312786 +54013,WI,Glenwood City,45.062339,-92.181588 +54014,WI,Hager City,44.626969,-92.550146 +54015,WI,Hammond,44.967004,-92.447215 +54016,WI,Hudson,44.984187,-92.727062 +54017,WI,New Richmond,45.159819,-92.551333 +54020,WI,Osceola,45.321757,-92.697108 +54021,WI,Prescott,44.747648,-92.753528 +54022,WI,River Falls,44.85501,-92.631275 +54023,WI,Roberts,44.987356,-92.559773 +54024,WI,Saint Croix Fall,45.413215,-92.638371 +54025,WI,Somerset,45.133064,-92.686466 +54026,WI,Star Prairie,45.2013,-92.551353 +54027,WI,Wilson,44.94658,-92.196538 +54028,WI,Woodville,44.940806,-92.284803 +54082,WI,Saint Joseph,45.070123,-92.760803 +54101,WI,Abrams,44.78693,-88.057101 +54102,WI,Amberg,45.498878,-87.964256 +54103,WI,Armstrong Creek,45.67261,-88.490847 +54104,WI,Athelstane,45.422819,-88.175282 +54106,WI,Center Valley,44.485595,-88.444776 +54107,WI,Navarino,44.73794,-88.439026 +54110,WI,Brillion,44.17792,-88.083337 +54111,WI,Cecil,44.811027,-88.418253 +54112,WI,Coleman,45.072157,-88.058667 +54113,WI,Combined Locks,44.266581,-88.313271 +54114,WI,Beaver,45.254053,-88.061265 +54115,WI,De Pere,44.438779,-88.080613 +54119,WI,Dunbar,45.600944,-88.106669 +54120,WI,Fence,45.759652,-88.364873 +54121,WI,Florence,45.902724,-88.228921 +54123,WI,Forest Junction,44.20613,-88.151716 +54124,WI,Gillett,44.901753,-88.324221 +54125,WI,Goodman,45.646895,-88.362901 +54126,WI,Greenleaf,44.29373,-88.027519 +54128,WI,Gresham,44.852963,-88.78873 +54129,WI,Hilbert,44.127129,-88.206961 +54130,WI,Kaukauna,44.29561,-88.271692 +54135,WI,Keshena,44.914635,-88.635686 +54136,WI,Kimberly,44.27008,-88.338374 +54137,WI,Krakow,44.763457,-88.25933 +54138,WI,Lakewood,45.316285,-88.503189 +54139,WI,Stiles,44.940494,-88.054308 +54140,WI,Little Chute,44.284248,-88.311989 +54141,WI,Little Suamico,44.67751,-88.027245 +54143,WI,Marinette,45.087403,-87.669684 +54149,WI,Mountain,45.199127,-88.45828 +54150,WI,Neopit,44.987323,-88.861116 +54151,WI,Niagara,45.765343,-88.030927 +54153,WI,Oconto,44.891359,-87.891728 +54154,WI,Oconto Falls,44.875499,-88.155528 +54155,WI,Oneida,44.516641,-88.185851 +54156,WI,Pembine,45.607398,-87.970363 +54157,WI,Peshtigo,45.045778,-87.729795 +54159,WI,Porterfield,45.193399,-87.806243 +54161,WI,Pound,45.127317,-88.139621 +54162,WI,Pulaski,44.66112,-88.263447 +54165,WI,Seymour,44.509096,-88.317243 +54166,WI,Shawano,44.785133,-88.603599 +54170,WI,Shiocton,44.497202,-88.556236 +54171,WI,Sobieski,44.710495,-88.107605 +54174,WI,Suring,45.018551,-88.362767 +54175,WI,Townsend,45.314819,-88.610743 +54176,WI,Underhill,44.731836,-88.168898 +54177,WI,Wausaukee,45.349507,-87.909877 +54180,WI,Wrightstown,44.338377,-88.121769 +54201,WI,Algoma,44.610051,-87.457792 +54202,WI,Baileys Harbor,45.056549,-87.167626 +54204,WI,Brussels,44.747558,-87.62252 +54205,WI,Casco,44.58328,-87.623122 +54206,WI,Cato,44.148521,-87.864688 +54208,WI,Denmark,44.359392,-87.827036 +54209,WI,Egg Harbor,45.010039,-87.280521 +54210,WI,Ellison Bay,45.257206,-87.051209 +54212,WI,Fish Creek,45.11554,-87.206432 +54213,WI,Forestville,44.696863,-87.492832 +54214,WI,Francis Creek,44.199964,-87.720007 +54215,WI,Kellnersville,44.22493,-87.803596 +54216,WI,Kewaunee,44.440143,-87.559442 +54217,WI,Luxemburg,44.550612,-87.715606 +54220,WI,Manitowoc,44.097122,-87.682303 +54227,WI,Maribel,44.285151,-87.805482 +54228,WI,Mishicot,44.260942,-87.644703 +54229,WI,New Franken,44.559193,-87.823482 +54230,WI,Reedsville,44.157566,-87.966028 +54232,WI,Saint Nazianz,44.006425,-87.922906 +54234,WI,Sister Bay,45.187544,-87.113865 +54235,WI,Sturgeon Bay,44.84384,-87.375311 +54241,WI,Two Rivers,44.166008,-87.585504 +54245,WI,Valders,44.041977,-87.881183 +54246,WI,Washington Islan,45.374042,-86.913664 +54247,WI,Whitelaw,44.157269,-87.826698 +54301,WI,Allouez,44.485313,-88.016868 +54302,WI,Green Bay,44.502508,-87.977136 +54303,WI,Howard,44.530146,-88.045262 +54304,WI,Ashwaubenon,44.505525,-88.066799 +54311,WI,Green Bay,44.491405,-87.926685 +54313,WI,Green Bay,44.546289,-88.102054 +54401,WI,Wausau,44.963433,-89.633955 +54405,WI,Abbotsford,44.964057,-90.299438 +54406,WI,Amherst,44.423052,-89.303482 +54407,WI,Amherst Junction,44.506458,-89.303754 +54408,WI,Aniwa,45.01039,-89.268254 +54409,WI,Antigo,45.131362,-89.141871 +54410,WI,Arpin,44.54194,-90.037049 +54411,WI,Hamburg,45.032037,-90.062612 +54412,WI,Auburndale,44.637836,-90.013577 +54413,WI,Babcock,44.303064,-90.098574 +54414,WI,Birnamwood,44.926896,-89.212433 +54416,WI,Bowler,44.933667,-88.976071 +54418,WI,Bryant,45.202962,-88.998325 +54419,WI,Chelsea,45.288166,-90.303685 +54420,WI,Chili,44.630135,-90.359952 +54421,WI,Colby,44.911651,-90.314432 +54422,WI,Curtiss,44.960186,-90.459223 +54423,WI,Custer,44.56622,-89.415275 +54424,WI,Deerbrook,45.236791,-89.187257 +54425,WI,Dorchester,45.004192,-90.359648 +54426,WI,Fenwood,44.903831,-89.998029 +54427,WI,Eland,44.830888,-89.246117 +54428,WI,Elcho,45.440906,-89.15157 +54430,WI,Elton,45.156216,-88.883743 +54433,WI,Gilman,45.18906,-90.825672 +54435,WI,Gleason,45.338428,-89.475264 +54436,WI,Granton,44.560558,-90.448383 +54437,WI,Greenwood,44.740373,-90.622913 +54440,WI,Hatley,44.825638,-89.377728 +54441,WI,Hewitt,44.643651,-90.103054 +54442,WI,Irma,45.348483,-89.661138 +54443,WI,Junction City,44.59634,-89.743758 +54445,WI,Lily,45.318723,-88.838451 +54446,WI,Loyal,44.727243,-90.492238 +54447,WI,Lublin,45.073933,-90.733678 +54448,WI,Marathon,44.965664,-89.829948 +54449,WI,Marshfield,44.661453,-90.17845 +54451,WI,Medford,45.151185,-90.350306 +54452,WI,Merrill,45.180924,-89.690696 +54454,WI,Milladore,44.604416,-89.887532 +54455,WI,Mosinee,44.799736,-89.684491 +54456,WI,Neillsville,44.549429,-90.611197 +54457,WI,Nekoosa,44.281979,-89.881394 +54459,WI,Ogema,45.439187,-90.256513 +54460,WI,Owen,44.957817,-90.5469 +54462,WI,Pearson,45.388119,-89.075824 +54463,WI,Pelican Lake,45.504886,-89.181707 +54465,WI,Pickerel,45.356658,-88.91365 +54466,WI,Pittsville,44.43747,-90.189174 +54467,WI,Plover,44.450673,-89.542805 +54469,WI,Port Edwards,44.349705,-89.865246 +54470,WI,Rib Lake,45.298376,-90.176322 +54471,WI,Ringle,44.92383,-89.432845 +54473,WI,Rosholt,44.662224,-89.335637 +54474,WI,Rothschild,44.88429,-89.619262 +54475,WI,Rudolph,44.474061,-89.800252 +54476,WI,Schofield,44.906407,-89.581789 +54479,WI,Spencer,44.739148,-90.311406 +54480,WI,Stetsonville,45.07923,-90.282931 +54481,WI,Stevens Point,44.521221,-89.558764 +54484,WI,Stratford,44.789878,-90.058317 +54485,WI,Summit Lake,45.320414,-89.180743 +54486,WI,Tigerton,44.729938,-89.056893 +54487,WI,Tomahawk,45.496308,-89.727269 +54488,WI,Unity,44.822676,-90.322074 +54489,WI,Vesper,44.467656,-89.982553 +54490,WI,Westboro,45.344539,-90.307194 +54491,WI,White Lake,45.171465,-88.755489 +54493,WI,Willard,44.727378,-90.749897 +54494,WI,Wisconsin Rapids,44.375803,-89.806229 +54498,WI,Withee,44.975726,-90.604862 +54499,WI,Wittenberg,44.823247,-89.166479 +54501,WI,Monico,45.646718,-89.409285 +54511,WI,Cavour,45.658309,-88.888566 +54512,WI,Boulder Junction,46.111183,-89.632454 +54513,WI,Brantwood,45.551413,-90.115952 +54514,WI,Butternut,46.018358,-90.482114 +54515,WI,Catawba,45.508123,-90.514564 +54517,WI,Clam Lake,46.245675,-90.884107 +54519,WI,Conover,46.043968,-89.238919 +54520,WI,Crandon,45.541553,-88.911619 +54521,WI,Eagle River,45.916084,-89.253058 +54524,WI,Fifield,45.862148,-90.4246 +54526,WI,Ingram,45.488807,-90.855183 +54527,WI,Glidden,46.133668,-90.588856 +54529,WI,Harshaw,45.676244,-89.650346 +54530,WI,Hawkins,45.524129,-90.711373 +54531,WI,Hazelhurst,45.77446,-89.747836 +54534,WI,Hurley,46.44482,-90.1975 +54536,WI,Iron Belt,46.395545,-90.324528 +54537,WI,Kennan,45.53497,-90.590987 +54538,WI,Lac Du Flambeau,45.97175,-89.890078 +54539,WI,Lake Tomahawk,45.803455,-89.585609 +54540,WI,Land O Lakes,46.156305,-89.321787 +54541,WI,Laona,45.553416,-88.671525 +54542,WI,Alvin,45.921841,-88.695308 +54545,WI,Manitowish Water,46.123909,-89.830767 +54546,WI,Mellen,46.300659,-90.655233 +54547,WI,Mercer,46.169594,-90.067914 +54548,WI,Minocqua,45.871909,-89.757954 +54550,WI,Pence,46.425736,-90.244195 +54552,WI,Park Falls,45.936345,-90.424648 +54554,WI,Phelps,46.064481,-89.081547 +54555,WI,Phillips,45.697463,-90.404131 +54556,WI,Prentice,45.548201,-90.294217 +54557,WI,Winchester,46.221735,-89.772795 +54558,WI,Saint Germain,45.918315,-89.486556 +54559,WI,Saxon,46.495855,-90.438273 +54560,WI,Sayner,45.986664,-89.519437 +54562,WI,Three Lakes,45.804633,-89.132792 +54563,WI,Tony,45.474082,-90.986938 +54564,WI,Tripoli,45.581387,-89.985218 +54565,WI,Upson,46.376124,-90.405135 +54566,WI,Wabeno,45.433172,-88.662456 +54568,WI,Woodruff,45.918583,-89.69545 +54601,WI,La Crosse,43.798938,-91.217494 +54603,WI,La Crosse,43.848675,-91.248439 +54610,WI,Alma,44.429437,-91.807931 +54611,WI,Alma Center,44.445218,-90.935602 +54612,WI,Arcadia,44.253937,-91.480453 +54613,WI,Arkdale,44.052886,-89.896215 +54614,WI,Bangor,43.868697,-90.980888 +54615,WI,Black River Fall,44.292101,-90.847952 +54616,WI,Blair,44.296843,-91.223501 +54617,WI,Bloom City,43.509034,-90.666458 +54618,WI,Cutler,43.936705,-90.268861 +54619,WI,Cashton,43.745649,-90.761197 +54621,WI,Chaseburg,43.679372,-91.079934 +54622,WI,Waumandee,44.251591,-91.858677 +54623,WI,Coon Valley,43.721783,-91.014338 +54624,WI,Victory,43.494707,-91.193015 +54625,WI,Dodge,44.12886,-91.524341 +54626,WI,Eastman,43.19592,-91.01927 +54627,WI,Ettrick,44.172428,-91.263546 +54628,WI,Ferryville,43.395857,-91.044578 +54629,WI,Fountain City,44.136436,-91.677861 +54630,WI,Galesville,44.088848,-91.358789 +54631,WI,Gays Mills,43.293639,-90.867636 +54632,WI,Genoa,43.605134,-91.134999 +54634,WI,Yuba,43.635009,-90.370595 +54635,WI,Northfield,44.397778,-91.039086 +54636,WI,Holmen,43.976125,-91.2497 +54638,WI,Kendall,43.81614,-90.410691 +54639,WI,West Lima,43.616955,-90.648257 +54641,WI,Mather,44.147706,-90.295264 +54642,WI,Melrose,44.138156,-91.044463 +54644,WI,Mindoro,44.02873,-91.064181 +54646,WI,Necedah,44.034481,-90.059976 +54648,WI,Norwalk,43.812823,-90.680134 +54650,WI,Onalaska,43.897392,-91.231419 +54651,WI,Ontario,43.717197,-90.620534 +54652,WI,Readstown,43.450791,-90.757872 +54653,WI,Rockland,43.938159,-90.948846 +54655,WI,Soldiers Grove,43.391857,-90.766293 +54656,WI,Sparta,43.954045,-90.814566 +54657,WI,Steuben,43.195464,-90.860878 +54658,WI,Stoddard,43.691227,-91.19188 +54659,WI,Taylor,44.289855,-91.112752 +54660,WI,Wyeville,43.994833,-90.491704 +54661,WI,Trempealeau,44.021843,-91.4282 +54664,WI,Viola,43.504758,-90.655416 +54665,WI,Viroqua,43.54419,-90.893865 +54666,WI,Warrens,44.15697,-90.496692 +54667,WI,Westby,43.663123,-90.87403 +54669,WI,West Salem,43.906253,-91.089311 +54670,WI,Wilton,43.832209,-90.516185 +54701,WI,Eau Claire,44.783972,-91.487686 +54703,WI,Eau Claire,44.827122,-91.499701 +54720,WI,Altoona,44.802142,-91.43825 +54721,WI,Arkansaw,44.626659,-92.056646 +54722,WI,Augusta,44.694737,-91.123154 +54723,WI,Bay City,44.6166,-92.446889 +54724,WI,Bloomer,45.102477,-91.489974 +54725,WI,Boyceville,45.064238,-92.024803 +54726,WI,Boyd,44.943737,-91.029355 +54727,WI,Cadott,44.963014,-91.169884 +54728,WI,Chetek,45.317046,-91.654154 +54729,WI,Chippewa Falls,44.932202,-91.384376 +54730,WI,Colfax,44.999326,-91.735737 +54731,WI,Conrath,45.353281,-91.062132 +54732,WI,Cornell,45.16191,-91.173252 +54733,WI,Dallas,45.254883,-91.836844 +54734,WI,Downing,45.103032,-92.113384 +54736,WI,Durand,44.630042,-91.929476 +54737,WI,Eau Galle,44.721433,-92.040816 +54738,WI,Eleva,44.598493,-91.48037 +54739,WI,Elk Mound,44.866973,-91.675229 +54740,WI,Elmwood,44.756088,-92.202195 +54741,WI,Fairchild,44.596253,-90.990568 +54742,WI,Fall Creek,44.768385,-91.285631 +54744,WI,Hillsdale,45.32136,-91.859857 +54745,WI,Holcombe,45.251263,-91.132955 +54746,WI,Humbird,44.536676,-90.888257 +54747,WI,Independence,44.395926,-91.453511 +54748,WI,Jim Falls,45.064439,-91.264909 +54749,WI,Knapp,44.954495,-92.075201 +54750,WI,Maiden Rock,44.608599,-92.278212 +54751,WI,Menomonie,44.87182,-91.92651 +54754,WI,Merrillan,44.436938,-90.810496 +54755,WI,Modena,44.609853,-91.669576 +54756,WI,Nelson,44.42947,-92.000742 +54757,WI,New Auburn,45.23562,-91.519747 +54758,WI,Osseo,44.559923,-91.219148 +54759,WI,Pepin,44.458687,-92.139353 +54761,WI,Plum City,44.635979,-92.183725 +54762,WI,Prairie Farm,45.246183,-91.974205 +54763,WI,Ridgeland,45.186773,-91.879024 +54765,WI,Sand Creek,45.170513,-91.701446 +54766,WI,Sheldon,45.318171,-90.914148 +54767,WI,Spring Valley,44.835569,-92.290599 +54768,WI,Stanley,44.968872,-90.938935 +54769,WI,Stockholm,44.500441,-92.228429 +54770,WI,Strum,44.567356,-91.383271 +54771,WI,Thorp,44.957319,-90.802861 +54772,WI,Wheeler,45.071856,-91.887055 +54773,WI,Whitehall,44.382683,-91.302953 +54801,WI,Spooner,45.850468,-91.91555 +54805,WI,Almena,45.419507,-92.002691 +54806,WI,Moquah,46.577948,-90.876712 +54810,WI,Balsam Lake,45.458845,-92.414954 +54812,WI,Barron,45.400535,-91.84996 +54813,WI,Barronett,45.618995,-92.019595 +54814,WI,Bayfield,46.835359,-90.821681 +54817,WI,Birchwood,45.640296,-91.577564 +54819,WI,Bruce,45.447923,-91.290622 +54820,WI,Brule,46.576318,-91.553862 +54821,WI,Cable,46.217155,-91.224438 +54822,WI,Cameron,45.403836,-91.730992 +54824,WI,Centuria,45.448369,-92.547741 +54826,WI,Comstock,45.491114,-92.085961 +54827,WI,Cornucopia,46.837171,-91.097421 +54828,WI,New Post,45.809664,-91.327825 +54829,WI,Cumberland,45.5403,-92.029709 +54830,WI,Dairyland,46.029681,-92.265995 +54832,WI,Drummond,46.311896,-91.285569 +54835,WI,Exeland,45.675298,-91.223819 +54836,WI,Foxboro,46.487511,-92.149254 +54837,WI,Clam Falls,45.665314,-92.426482 +54838,WI,Gordon,46.233603,-91.803301 +54839,WI,Grand View,46.357682,-91.107465 +54840,WI,Evergreen,45.761312,-92.662685 +54843,WI,North Woods Beac,46.001404,-91.397659 +54844,WI,Herbster,46.82128,-91.233193 +54845,WI,Hertel,45.807561,-92.140419 +54846,WI,High Bridge,46.379613,-90.73826 +54847,WI,Iron River,46.578984,-91.421056 +54848,WI,Ladysmith,45.471941,-91.108804 +54849,WI,Lake Nebagamon,46.502347,-91.740243 +54850,WI,La Pointe,46.846675,-90.603622 +54853,WI,Luck,45.556799,-92.416391 +54854,WI,Maple,46.620591,-91.702015 +54855,WI,Marengo,46.407112,-90.839991 +54856,WI,Delta,46.457285,-91.057511 +54858,WI,Milltown,45.527082,-92.501739 +54859,WI,Minong,46.10445,-91.850628 +54862,WI,Ojibwa,45.785351,-91.110922 +54864,WI,Poplar,46.57708,-91.825345 +54865,WI,Port Wing,46.76204,-91.392016 +54867,WI,Radisson,45.773359,-91.22615 +54868,WI,Canton,45.510466,-91.733544 +54870,WI,Sarona,45.708532,-91.762103 +54871,WI,Shell Lake,45.753598,-91.960606 +54872,WI,Siren,45.78214,-92.389151 +54873,WI,Barnes,46.388821,-91.770154 +54874,WI,Wentworth,46.588659,-91.945805 +54875,WI,Earl,45.960384,-91.677734 +54876,WI,Stone Lake,45.833733,-91.509291 +54880,WI,Superior,46.701552,-92.091174 +54888,WI,Trego,45.951556,-91.858051 +54889,WI,Turtle Lake,45.421349,-92.178142 +54891,WI,Washburn,46.680595,-90.909516 +54893,WI,Webster,45.874001,-92.322722 +54895,WI,Weyerhaeuser,45.426347,-91.428944 +54896,WI,Loretta,45.841419,-90.949591 +54901,WI,Oshkosh,44.021962,-88.543635 +54904,WI,Oshkosh,44.030356,-88.607015 +54909,WI,Almond,44.289832,-89.358364 +54911,WI,Appleton,44.277325,-88.397649 +54914,WI,Appleton,44.270992,-88.432608 +54915,WI,Appleton,44.26351,-88.399902 +54921,WI,Bancroft,44.30648,-89.530438 +54922,WI,Bear Creek,44.5348,-88.740375 +54923,WI,Berlin,43.976936,-88.949009 +54928,WI,Caroline,44.727574,-88.888749 +54929,WI,Clintonville,44.636442,-88.742999 +54930,WI,Coloma,44.027462,-89.494332 +54932,WI,Eldorado,43.841471,-88.638827 +54935,WI,Taycheedah,43.770446,-88.429149 +54937,WI,North Fond Du La,43.792633,-88.481264 +54940,WI,Fremont,44.237884,-88.844852 +54941,WI,Green Lake,43.844383,-88.96847 +54942,WI,Greenville,44.299747,-88.569579 +54943,WI,Hancock,44.129743,-89.534448 +54944,WI,Hortonville,44.327306,-88.62813 +54945,WI,Iola,44.532183,-89.137311 +54946,WI,King,44.267332,-89.113739 +54947,WI,Larsen,44.198421,-88.696305 +54948,WI,Leopolis,44.781188,-88.872223 +54949,WI,Manawa,44.470148,-88.916444 +54950,WI,Marion,44.679414,-88.876706 +54952,WI,Menasha,44.211164,-88.417536 +54956,WI,Neenah,44.181094,-88.479201 +54960,WI,Neshkoro,43.898943,-89.233572 +54961,WI,New London,44.392847,-88.755428 +54962,WI,Ogdensburg,44.467803,-89.011851 +54963,WI,Omro,44.035678,-88.751933 +54964,WI,Pickett,43.900917,-88.713457 +54965,WI,Pine River,44.160393,-89.040415 +54966,WI,Plainfield,44.209079,-89.455896 +54967,WI,Poy Sippi,44.110069,-88.926835 +54968,WI,Princeton,43.843827,-89.124913 +54970,WI,Redgranite,44.04381,-89.098125 +54971,WI,Ripon,43.845402,-88.842433 +54974,WI,Rosendale,43.788903,-88.641704 +54977,WI,Scandinavia,44.460436,-89.165042 +54978,WI,Tilleda,44.811812,-88.907498 +54979,WI,Van Dyne,43.873399,-88.510008 +54981,WI,Waupaca,44.348101,-89.110143 +54982,WI,Wautoma,44.065576,-89.266551 +54983,WI,Weyauwega,44.320973,-88.941047 +54984,WI,Wild Rose,44.183433,-89.195252 +54986,WI,Winneconne,44.118704,-88.721384 +82001,WY,Cheyenne,41.143719,-104.796234 +82007,WY,Cheyenne,41.108433,-104.810745 +82009,WY,Cheyenne,41.183566,-104.802328 +82050,WY,Albin,41.434237,-104.150542 +82051,WY,Laramie,41.562721,-105.819708 +82052,WY,Buford,41.142115,-105.469697 +82053,WY,Burns,41.200297,-104.315521 +82054,WY,Carpenter,41.042819,-104.276514 +82055,WY,Centennial,41.339149,-105.99451 +82057,WY,82057,41.070928,-106.164358 +82058,WY,Garrett,42.142015,-105.550534 +82063,WY,Jelm,41.145723,-105.925727 +82070,WY,Laramie,41.312907,-105.581146 +82080,WY,Mc Fadden,41.6327,-106.137861 +82081,WY,Meriden,41.54236,-104.286606 +82082,WY,Pine Bluffs,41.178799,-104.066591 +82083,WY,Rock River,41.746073,-105.974629 +82084,WY,Tie Siding,41.052785,-105.446222 +82190,WY,Fishing Bridge,44.853913,-110.674366 +82201,WY,Wheatland,42.049467,-104.967852 +82210,WY,Chugwater,41.748668,-104.817916 +82212,WY,Fort Laramie,42.213314,-104.522595 +82213,WY,Glendo,42.500352,-105.000013 +82214,WY,Guernsey,42.265513,-104.751164 +82215,WY,Hartville,42.33339,-104.729564 +82217,WY,Hawk Springs,41.741481,-104.329498 +82219,WY,Jay Em,42.357399,-104.311437 +82220,WY,Keeline,42.839062,-104.720277 +82221,WY,Lagrange,41.642311,-104.19738 +82222,WY,Lance Creek,43.231636,-104.544958 +82223,WY,Lingle,42.134624,-104.331992 +82224,WY,Lost Springs,42.729835,-104.920901 +82225,WY,Lusk,42.765953,-104.465076 +82229,WY,Shawnee,42.839464,-105.032447 +82240,WY,Torrington,42.062377,-104.191662 +82242,WY,Van Tassell,42.830004,-104.315073 +82243,WY,Veteran,41.982091,-104.370899 +82244,WY,Yoder,41.912018,-104.353507 +82301,WY,Rawlins,41.795131,-107.234883 +82310,WY,Jeffrey City,42.540201,-107.872422 +82321,WY,Baggs,41.031191,-107.668733 +82322,WY,Bairoil,42.232721,-107.563288 +82323,WY,Dixon,41.044631,-107.560354 +82325,WY,Encampment,41.205353,-106.780285 +82327,WY,Hanna,41.87264,-106.528283 +82329,WY,Medicine Bow,41.903002,-106.201228 +82331,WY,Ryan Park,41.446293,-106.797538 +82332,WY,Savery,41.039485,-107.42338 +82334,WY,Sinclair,41.779741,-107.109083 +82336,WY,Wamsutter,41.658278,-108.151674 +82401,WY,Worland,44.013796,-107.95626 +82410,WY,Basin,44.378765,-108.043787 +82411,WY,Burlington,44.444218,-108.432669 +82414,WY,Cody,44.523135,-109.075611 +82421,WY,Deaver,44.925695,-108.597948 +82426,WY,Greybull,44.491881,-108.079503 +82428,WY,Hyattville,44.250693,-107.605318 +82431,WY,Lovell,44.833637,-108.414107 +82432,WY,Manderson,44.311931,-107.953423 +82433,WY,Meeteetse,44.196202,-108.950045 +82434,WY,Otto,44.405644,-108.304673 +82435,WY,Powell,44.756077,-108.777322 +82441,WY,Shell,44.563649,-107.824333 +82442,WY,Ten Sleep,43.997848,-107.415305 +82443,WY,Grass Creek,43.662152,-108.231297 +82450,WY,Wapiti,44.47967,-109.432629 +82501,WY,Gas Hills,43.045786,-108.411335 +82510,WY,Arapahoe,42.967936,-108.494134 +82512,WY,Crowheart,43.371569,-109.296043 +82513,WY,Dubois,43.545136,-109.649175 +82514,WY,Fort Washakie,43.004761,-108.896445 +82516,WY,Kinnear,43.131777,-108.615428 +82520,WY,Ethete,42.859678,-108.738288 +82523,WY,Pavillion,43.198515,-108.604394 +82601,WY,Casper,42.845763,-106.316571 +82604,WY,Casper,42.826073,-106.389634 +82609,WY,Casper,42.840629,-106.280649 +82620,WY,Alcova,42.568383,-106.610199 +82630,WY,Arminto,43.120883,-107.343611 +82633,WY,Douglas,42.762558,-105.385484 +82636,WY,Evansville,42.861384,-106.263886 +82637,WY,Glenrock,42.867495,-105.857911 +82639,WY,Kaycee,43.723625,-106.56323 +82642,WY,Lysite,43.328417,-107.648781 +82643,WY,Midwest,43.410829,-106.266818 +82649,WY,Shoshoni,43.245707,-108.100667 +82701,WY,Newcastle,43.851098,-104.226205 +82710,WY,Aladdin,44.747331,-104.19314 +82712,WY,Beulah,44.573575,-104.153095 +82714,WY,Devils Tower,44.617067,-104.793638 +82715,WY,Four Corners,44.100747,-104.122897 +82716,WY,Gillette,44.282009,-105.497442 +82720,WY,Hulett,44.735222,-104.617367 +82721,WY,Pine Haven,44.299932,-104.905904 +82723,WY,Osage,43.998982,-104.4226 +82724,WY,Oshoto,44.583023,-104.937659 +82725,WY,Recluse,44.786149,-105.776005 +82727,WY,Rozet,44.305825,-105.245875 +82729,WY,Sundance,44.405755,-104.383696 +82730,WY,Upton,44.089271,-104.635159 +82731,WY,Gillette,44.835689,-105.373236 +82732,WY,Wright,43.829349,-105.532327 +82801,WY,Sheridan,44.78486,-106.964795 +82831,WY,Arvada,44.689876,-106.109191 +82832,WY,Banner,44.590804,-106.87331 +82834,WY,Buffalo,44.34847,-106.70726 +82835,WY,Clearmont,44.66101,-106.458071 +82836,WY,Dayton,44.877958,-107.302605 +82838,WY,Parkman,44.964965,-107.325393 +82839,WY,Acme,44.904789,-107.159833 +82842,WY,Story,44.607169,-107.049229 +82844,WY,Ranchester,44.768228,-107.303429 +82901,WY,Rock Springs,41.605957,-109.230047 +82922,WY,Bondurant,43.223798,-110.335287 +82923,WY,Boulder,42.688146,-109.540105 +82925,WY,Cora,43.139921,-109.915351 +82930,WY,Evanston,41.260947,-110.963067 +82933,WY,Fort Bridger,41.28282,-110.347428 +82935,WY,Green River,41.51959,-109.471445 +82936,WY,Lonetree,41.049144,-110.172862 +82937,WY,Lyman,41.329136,-110.292629 +82938,WY,Mc Kinnon,41.040898,-109.874536 +82941,WY,Pinedale,42.854331,-109.856088 +83001,WY,Colter Bay,43.460734,-110.766277 +83011,WY,Kelly,43.609361,-110.544186 +83012,WY,Moose,43.771201,-110.857493 +83013,WY,Moran,43.881635,-110.329429 +83014,WY,Wilson,43.49922,-110.874199 +83101,WY,Kemmerer,41.788661,-110.52834 +83110,WY,Afton,42.712829,-110.941976 +83111,WY,Auburn,42.805114,-110.994415 +83112,WY,Bedford,42.932336,-110.95556 +83113,WY,Marbleton,42.552059,-110.132954 +83114,WY,Cokeville,42.057983,-110.916419 +83115,WY,Daniel,42.917629,-110.133624 +83118,WY,Etna,43.138606,-111.015996 +83120,WY,Freedom,43.017167,-111.029178 +83122,WY,Grover,42.796472,-110.924392 +83123,WY,La Barge,42.24734,-110.210865 +83126,WY,Smoot,42.619238,-110.922351 +83127,WY,Thayne,42.933026,-111.011354 diff --git a/content/gswp_2e/examples/12_Data/Ex_12_04/Ex_12_04.pde b/content/gswp_2e/examples/12_Data/Ex_12_04/Ex_12_04.pde new file mode 100644 index 000000000..37b3a7100 --- /dev/null +++ b/content/gswp_2e/examples/12_Data/Ex_12_04/Ex_12_04.pde @@ -0,0 +1,11 @@ +JSONObject film; + +void setup() { + film = loadJSONObject("film.json"); + String title = film.getString("title"); + String dir = film.getString("director"); + int year = film.getInt("year"); + float rating = film.getFloat("rating"); + println(title + " by " + dir + ", " + year); + println("Rating: " + rating); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/12_Data/Ex_12_04/data/film.json b/content/gswp_2e/examples/12_Data/Ex_12_04/data/film.json new file mode 100644 index 000000000..3ca120aa0 --- /dev/null +++ b/content/gswp_2e/examples/12_Data/Ex_12_04/data/film.json @@ -0,0 +1,6 @@ +{ + "title": "Alphaville", + "director": "Jean-Luc Godard", + "year": 1964, + "rating": 7.2 +} \ No newline at end of file diff --git a/content/gswp_2e/examples/12_Data/Ex_12_05/Ex_12_05.pde b/content/gswp_2e/examples/12_Data/Ex_12_05/Ex_12_05.pde new file mode 100644 index 000000000..10c181f42 --- /dev/null +++ b/content/gswp_2e/examples/12_Data/Ex_12_05/Ex_12_05.pde @@ -0,0 +1,44 @@ +Film[] films; + +void setup() { + size(480, 120); + JSONArray filmArray = loadJSONArray("films.json"); + films = new Film[filmArray.size()]; + for (int i = 0; i < films.length; i++) { + JSONObject o = filmArray.getJSONObject(i); + films[i] = new Film(o); + } +} + +void draw() { + background(0); + for (int i = 0; i < films.length; i++) { + int x = i*32 + 32; + films[i].display(x, 105); + } +} + +class Film { + + String title; + String director; + int year; + float rating; + + Film(JSONObject f) { + title = f.getString("title"); + director = f.getString("director"); + year = f.getInt("year"); + rating = f.getFloat("rating"); + } + + void display(int x, int y) { + float ratingGray = map(rating, 6.5, 8.1, 102, 255); + pushMatrix(); + translate(x, y); + rotate(-QUARTER_PI); + fill(ratingGray); + text(title, 0, 0); + popMatrix(); + } +} \ No newline at end of file diff --git a/content/gswp_2e/examples/12_Data/Ex_12_05/data/films.json b/content/gswp_2e/examples/12_Data/Ex_12_05/data/films.json new file mode 100644 index 000000000..cef68246b --- /dev/null +++ b/content/gswp_2e/examples/12_Data/Ex_12_05/data/films.json @@ -0,0 +1,74 @@ +[ + { + "title": "Breathless", + "director": "Jean-Luc Godard", + "year": 1960, + "rating": 8.0 + }, + { + "title": "Le Petit Soldat", + "director": "Jean-Luc Godard", + "year": 1960, + "rating": 7.2 + }, + { + "title": "A Woman Is a Woman", + "director": "Jean-Luc Godard", + "year": 1961, + "rating": 7.7 + }, + { + "title": "My Life to Live", + "director": "Jean-Luc Godard", + "year": 1962, + "rating": 8.1 + }, + { + "title": "Les Carabiniers", + "director": "Jean-Luc Godard", + "year": 1963, + "rating": 7.0 + }, + { + "title": "Contempt", + "director": "Jean-Luc Godard", + "year": 1963, + "rating": 7.8 + }, + { + "title": "Band of Outsiders", + "director": "Jean-Luc Godard", + "year": 1964, + "rating": 7.9 + }, + { + "title": "A Married Woman", + "director": "Jean-Luc Godard", + "year": 1964, + "rating": 7.4 + }, + { + "title": "Alphaville", + "director": "Jean-Luc Godard", + "year": 1964, + "rating": 7.2 + }, + { + "title": "Pierrot le Fou", + "director": "Jean-Luc Godard", + "year": 1965, + "rating": 7.7 + }, + { + "title": "Masculin Féminin", + "director": "Jean-Luc Godard", + "year": 1966, + "rating": 7.7 + }, + { + "title": "Made in U.S.A.", + "director": "Jean-Luc Godard", + "year": 1966, + "rating": 6.5 + } +] \ No newline at end of file diff --git a/content/gswp_2e/examples/12_Data/Ex_12_06/Ex_12_06.pde b/content/gswp_2e/examples/12_Data/Ex_12_06/Ex_12_06.pde new file mode 100644 index 000000000..fa132a26b --- /dev/null +++ b/content/gswp_2e/examples/12_Data/Ex_12_06/Ex_12_06.pde @@ -0,0 +1,13 @@ +void setup() { + float temp = getTemp("cincinnati.json"); + println(temp); +} + +float getTemp(String fileName) { + JSONObject weather = loadJSONObject(fileName); + JSONArray list = weather.getJSONArray("list"); + JSONObject item = list.getJSONObject(0); + JSONObject main = item.getJSONObject("main"); + float temperature = main.getFloat("temp"); + return temperature; +} \ No newline at end of file diff --git a/content/gswp_2e/examples/12_Data/Ex_12_06/data/cincinnati.json b/content/gswp_2e/examples/12_Data/Ex_12_06/data/cincinnati.json new file mode 100644 index 000000000..3c6afb3bd --- /dev/null +++ b/content/gswp_2e/examples/12_Data/Ex_12_06/data/cincinnati.json @@ -0,0 +1 @@ +{"message":"accurate","cod":"200","count":1,"list":[{"id":4508722,"name":"Cincinnati","coord":{"lon":-84.456886,"lat":39.161999},"main":{"temp":34.16,"temp_min":34.16,"temp_max":34.16,"pressure":999.98,"sea_level":1028.34,"grnd_level":999.98,"humidity":77},"dt":1423501526,"wind":{"speed":9.48,"deg":354.002},"sys":{"country":"US"},"clouds":{"all":80},"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04d"}]}]} \ No newline at end of file diff --git a/content/gswp_2e/examples/12_Data/Ex_12_07/Ex_12_07.pde b/content/gswp_2e/examples/12_Data/Ex_12_07/Ex_12_07.pde new file mode 100644 index 000000000..5b10ea015 --- /dev/null +++ b/content/gswp_2e/examples/12_Data/Ex_12_07/Ex_12_07.pde @@ -0,0 +1,12 @@ + +JSONObject weather; + +void setup() { + float temp = getTemp("cincinnati.json"); + println(temp); +} + +float getTemp(String fileName) { + JSONObject weather = loadJSONObject(fileName); + return weather.getJSONArray("list").getJSONObject(0).getJSONObject("main").getFloat("temp"); +} diff --git a/content/gswp_2e/examples/12_Data/Ex_12_07/data/cincinnati.json b/content/gswp_2e/examples/12_Data/Ex_12_07/data/cincinnati.json new file mode 100644 index 000000000..3c6afb3bd --- /dev/null +++ b/content/gswp_2e/examples/12_Data/Ex_12_07/data/cincinnati.json @@ -0,0 +1 @@ +{"message":"accurate","cod":"200","count":1,"list":[{"id":4508722,"name":"Cincinnati","coord":{"lon":-84.456886,"lat":39.161999},"main":{"temp":34.16,"temp_min":34.16,"temp_max":34.16,"pressure":999.98,"sea_level":1028.34,"grnd_level":999.98,"humidity":77},"dt":1423501526,"wind":{"speed":9.48,"deg":354.002},"sys":{"country":"US"},"clouds":{"all":80},"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04d"}]}]} \ No newline at end of file diff --git a/content/gswp_2e/examples/13_Extend/Ex_13_01/Ex_13_01.pde b/content/gswp_2e/examples/13_Extend/Ex_13_01/Ex_13_01.pde new file mode 100644 index 000000000..3a5b9934f --- /dev/null +++ b/content/gswp_2e/examples/13_Extend/Ex_13_01/Ex_13_01.pde @@ -0,0 +1,28 @@ +import processing.sound.*; + +SoundFile blip; +int radius = 120; +float x = 0; +float speed = 1.0; +int direction = 1; + +void setup() { + size(440, 440); + ellipseMode(RADIUS); + blip = new SoundFile(this, "blip.wav"); + x = width/2; // Start in the center +} + +void draw() { + background(0); + x += speed * direction; + if ((x > width-radius) || (x < radius)) { + direction = -direction; // Flip direction + blip.play(); + } + if (direction == 1) { + arc(x, 220, radius, radius, 0.52, 5.76); // Face right + } else { + arc(x, 220, radius, radius, 3.67, 8.9); // Face left + } +} \ No newline at end of file diff --git a/content/gswp_2e/examples/13_Extend/Ex_13_01/data/blip.wav b/content/gswp_2e/examples/13_Extend/Ex_13_01/data/blip.wav new file mode 100644 index 000000000..5a1677c4e Binary files /dev/null and b/content/gswp_2e/examples/13_Extend/Ex_13_01/data/blip.wav differ diff --git a/content/gswp_2e/examples/13_Extend/Ex_13_02/Ex_13_02.pde b/content/gswp_2e/examples/13_Extend/Ex_13_02/Ex_13_02.pde new file mode 100644 index 000000000..36b6a5087 --- /dev/null +++ b/content/gswp_2e/examples/13_Extend/Ex_13_02/Ex_13_02.pde @@ -0,0 +1,28 @@ +import processing.sound.*; + +AudioIn mic; +Amplitude amp; + +void setup() { + size(440, 440); + background(0); + // Create an audio input and start it + mic = new AudioIn(this, 0); + mic.start(); + // Create a new amplitude analyzer and patch into input + amp = new Amplitude(this); + amp.input(mic); +} + +void draw() { + // Draw a background that fades to black + noStroke(); + fill(26, 76, 102, 10); + rect(0, 0, width, height); + // The analyze() method returns values between 0 and 1, + // so map() is used to convert the values to larger numbers + float diameter = map(amp.analyze(), 0, 1, 10, width); + // Draw the circle based on the volume + fill(255); + ellipse(width/2, height/2, diameter, diameter); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/13_Extend/Ex_13_03/Ex_13_03.pde b/content/gswp_2e/examples/13_Extend/Ex_13_03/Ex_13_03.pde new file mode 100644 index 000000000..a428ca01b --- /dev/null +++ b/content/gswp_2e/examples/13_Extend/Ex_13_03/Ex_13_03.pde @@ -0,0 +1,25 @@ +import processing.sound.*; + +SinOsc sine; +float freq = 400; + +void setup() { + size(440, 440); + // Create and start the sine oscillator + sine = new SinOsc(this); + sine.play(); +} + +void draw() { + background(176, 204, 176); + // Map the mouseX value from 20Hz to 440Hz for frequency + float hertz = map(mouseX, 0, width, 20.0, 440.0); + sine.freq(hertz); + // Draw a wave to visualize the frequency of the sound + stroke(26, 76, 102); + for (int x = 0; x < width; x++) { + float angle = map(x, 0, width, 0, TWO_PI * hertz); + float sinValue = sin(angle) * 120; + line(x, 0, x, height/2 + sinValue); + } +} \ No newline at end of file diff --git a/content/gswp_2e/examples/13_Extend/Ex_13_04/Ex_13_04.pde b/content/gswp_2e/examples/13_Extend/Ex_13_04/Ex_13_04.pde new file mode 100644 index 000000000..34f581eea --- /dev/null +++ b/content/gswp_2e/examples/13_Extend/Ex_13_04/Ex_13_04.pde @@ -0,0 +1,19 @@ +PShape bot; +float x = 0; + +void setup() { + size(720, 480); + bot = loadShape("robot1.svg"); + frameRate(30); +} + +void draw() { + background(0, 153, 204); + translate(x, 0); + shape(bot, 0, 80); + saveFrame("frames/SaveExample-####.tif"); + x += 12; + if (frameCount > 60) { + exit(); + } +} \ No newline at end of file diff --git a/content/gswp_2e/examples/13_Extend/Ex_13_04/data/robot1.svg b/content/gswp_2e/examples/13_Extend/Ex_13_04/data/robot1.svg new file mode 100644 index 000000000..db2476b39 --- /dev/null +++ b/content/gswp_2e/examples/13_Extend/Ex_13_04/data/robot1.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/gswp_2e/examples/13_Extend/Ex_13_05/Ex_13_05.pde b/content/gswp_2e/examples/13_Extend/Ex_13_05/Ex_13_05.pde new file mode 100644 index 000000000..11ed79e38 --- /dev/null +++ b/content/gswp_2e/examples/13_Extend/Ex_13_05/Ex_13_05.pde @@ -0,0 +1,17 @@ +import processing.pdf.*; +PShape bot; + +void setup() { + size(600, 800, PDF, "Ex-13-5.pdf"); + bot = loadShape("robot1.svg"); +} + +void draw() { + background(0, 153, 204); + for (int i = 0; i < 100; i++) { + float rx = random(-bot.width, width); + float ry = random(-bot.height, height); + shape(bot, rx, ry); + } + exit(); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/13_Extend/Ex_13_05/data/robot1.svg b/content/gswp_2e/examples/13_Extend/Ex_13_05/data/robot1.svg new file mode 100644 index 000000000..db2476b39 --- /dev/null +++ b/content/gswp_2e/examples/13_Extend/Ex_13_05/data/robot1.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/gswp_2e/examples/13_Extend/Ex_13_06/Ex_13_06.ino b/content/gswp_2e/examples/13_Extend/Ex_13_06/Ex_13_06.ino new file mode 100644 index 000000000..ca75a0d07 --- /dev/null +++ b/content/gswp_2e/examples/13_Extend/Ex_13_06/Ex_13_06.ino @@ -0,0 +1,14 @@ +// Note: This is code for an Arduino board, not Processing + +int sensorPin = 0; // Select input pin +int val = 0; + +void setup() { + Serial.begin(9600); // Open serial port +} + +void loop() { + val = analogRead(sensorPin) / 4; // Read value from sensor + Serial.write((byte)val); // Print variable to serial port + delay(100); // Wait 100 milliseconds +} \ No newline at end of file diff --git a/content/gswp_2e/examples/13_Extend/Ex_13_07/Ex_13_07.pde b/content/gswp_2e/examples/13_Extend/Ex_13_07/Ex_13_07.pde new file mode 100644 index 000000000..57c410289 --- /dev/null +++ b/content/gswp_2e/examples/13_Extend/Ex_13_07/Ex_13_07.pde @@ -0,0 +1,26 @@ +import processing.serial.*; + +Serial port; // Create object from Serial class +float val; // Data received from the serial port + +void setup() { + size(440, 220); + // IMPORTANT NOTE: + // The first serial port retrieved by Serial.list() + // should be your Arduino. If not, uncomment the next + // line by deleting the // before it. Run the sketch + // again to see a list of serial ports. Then, change + // the 0 in between [ and ] to the number of the port + // that your Arduino is connected to. + //printArray(Serial.list()); + String arduinoPort = Serial.list()[0]; + port = new Serial(this, arduinoPort, 9600); +} + +void draw() { + if (port.available() > 0) { // If data is available, + val = port.read(); // read it and store it in val + val = map(val, 0, 255, 0, height); // Convert the value + } + rect(40, val-10, 360, 20); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/13_Extend/Ex_13_08/Ex_13_08.pde b/content/gswp_2e/examples/13_Extend/Ex_13_08/Ex_13_08.pde new file mode 100644 index 000000000..b73707c8e --- /dev/null +++ b/content/gswp_2e/examples/13_Extend/Ex_13_08/Ex_13_08.pde @@ -0,0 +1,34 @@ +import processing.serial.*; + +Serial port; // Create object from Serial class +float val; // Data received from the serial port +int x; +float easing = 0.05; +float easedVal; + +void setup() { + size(440, 440); + frameRate(30); + String arduinoPort = Serial.list()[0]; + port = new Serial(this, arduinoPort, 9600); + background(0); +} + +void draw() { + if ( port.available() > 0) { // If data is available, + val = port.read(); // read it and store it in val + val = map(val, 0, 255, 0, height/2); // Convert the values + } + float targetVal = val; + easedVal += (targetVal - easedVal) * easing; + stroke(0); + line(x, 0, x, height); // Black line + stroke(255); + line(x+1, 0, x+1, height); // White line + line(x, 220, x, val); // Raw value + line(x, 440, x, easedVal + 220); // Averaged value + x++; + if (x > width) { + x = 0; + } +} \ No newline at end of file diff --git a/content/gswp_2e/examples/13_Extend/Ex_13_09/Ex_13_09.pde b/content/gswp_2e/examples/13_Extend/Ex_13_09/Ex_13_09.pde new file mode 100644 index 000000000..7db9d83de --- /dev/null +++ b/content/gswp_2e/examples/13_Extend/Ex_13_09/Ex_13_09.pde @@ -0,0 +1,34 @@ +import processing.serial.*; + +Serial port; // Create object from Serial class +float val; // Data received from the serial port +float angle; +float radius; + +void setup() { + size(440, 440); + frameRate(30); + strokeWeight(2); + String arduinoPort = Serial.list()[3]; + port = new Serial(this, arduinoPort, 9600); + background(0); +} + +void draw() { + if ( port.available() > 0) { // If data is available, + val = port.read(); // read it and store it in val + // Convert the values to set the radius + radius = map(val, 0, 255, 0, height * 0.45); + } + int middleX = width/2; + int middleY = height/2; + float x = middleX + cos(angle) * height/2; + float y = middleY + sin(angle) * height/2; + stroke(0); + line(middleX, middleY, x, y); + x = middleX + cos(angle) * radius; + y = middleY + sin(angle) * radius; + stroke(255); + line(middleX, middleY, x, y); + angle += 0.01; +} \ No newline at end of file diff --git a/content/gswp_2e/examples/Robots/Robot01_Draw/Robot01_Draw.pde b/content/gswp_2e/examples/Robots/Robot01_Draw/Robot01_Draw.pde new file mode 100644 index 000000000..790458555 --- /dev/null +++ b/content/gswp_2e/examples/Robots/Robot01_Draw/Robot01_Draw.pde @@ -0,0 +1,36 @@ +size(720, 480); +strokeWeight(2); +background(0, 153, 204); // Blue background +ellipseMode(RADIUS); + +// Neck +stroke(255); // Set stroke to white +line(266, 257, 266, 162); // Left +line(276, 257, 276, 162); // Middle +line(286, 257, 286, 162); // Right + +// Antennae +line(276, 155, 246, 112); // Small +line(276, 155, 306, 56); // Tall +line(276, 155, 342, 170); // Medium + +// Body +noStroke(); // Disable stroke +fill(255, 204, 0); // Set fill to orange +ellipse(264, 377, 33, 33); // Antigravity orb +fill(0); // Set fill to black +rect(219, 257, 90, 120); // Main body +fill(255, 204, 0); // Set fill to yellow +rect(219, 274, 90, 6); // Yellow stripe + +// Head +fill(0); // Set fill to black +ellipse(276, 155, 45, 45); // Head +fill(255); // Set fill to white +ellipse(288, 150, 14, 14); // Large eye +fill(0); // Set fill to black +ellipse(288, 150, 3, 3); // Pupil +fill(153, 204, 255); // Set fill to light blue +ellipse(263, 148, 5, 5); // Small eye 1 +ellipse(296, 130, 4, 4); // Small eye 2 +ellipse(305, 162, 3, 3); // Small eye 3 \ No newline at end of file diff --git a/content/gswp_2e/examples/Robots/Robot02_Variables/Robot02_Variables.pde b/content/gswp_2e/examples/Robots/Robot02_Variables/Robot02_Variables.pde new file mode 100644 index 000000000..641d41c45 --- /dev/null +++ b/content/gswp_2e/examples/Robots/Robot02_Variables/Robot02_Variables.pde @@ -0,0 +1,43 @@ +int x = 60; // X-coordinate +int y = 390; // Y-coordinate +int bodyHeight = 180; // Body Height +int neckHeight = 40; // Neck Height +int radius = 45; +int ny = y - bodyHeight - neckHeight - radius; // Neck Y + +size(170, 480); +strokeWeight(2); +background(0, 153, 204); +ellipseMode(RADIUS); + +// Neck +stroke(255); +line(x+2, y-bodyHeight, x+2, ny); +line(x+12, y-bodyHeight, x+12, ny); +line(x+22, y-bodyHeight, x+22, ny); + +// Antennae +line(x+12, ny, x-18, ny-43); +line(x+12, ny, x+42, ny-99); +line(x+12, ny, x+78, ny+15); + +// Body +noStroke(); +fill(255, 204, 0); +ellipse(x, y-33, 33, 33); +fill(0); +rect(x-45, y-bodyHeight, 90, bodyHeight-33); +fill(255, 204, 0); +rect(x-45, y-bodyHeight+17, 90, 6); + +// Head +fill(0); +ellipse(x+12, ny, radius, radius); +fill(255); +ellipse(x+24, ny-6, 14, 14); +fill(0); +ellipse(x+24, ny-6, 3, 3); +fill(153, 204, 255); +ellipse(x, ny-8, 5, 5); +ellipse(x+30, ny-26, 4, 4); +ellipse(x+41, ny+6, 3, 3); \ No newline at end of file diff --git a/content/gswp_2e/examples/Robots/Robot03_Response/Robot03_Response.pde b/content/gswp_2e/examples/Robots/Robot03_Response/Robot03_Response.pde new file mode 100644 index 000000000..425699a21 --- /dev/null +++ b/content/gswp_2e/examples/Robots/Robot03_Response/Robot03_Response.pde @@ -0,0 +1,55 @@ +float x = 60; // X-coordinate +float y = 440; // Y-coordinate +int radius = 45; // Head Radius +int bodyHeight = 160; // Body Height +int neckHeight = 70; // Neck Height + +float easing = 0.04; + +void setup() { + size(360, 480); + ellipseMode(RADIUS); +} + +void draw() { + strokeWeight(2); + + int targetX = mouseX; + x += (targetX - x) * easing; + + if (mousePressed) { + neckHeight = 16; + bodyHeight = 90; + } else { + neckHeight = 70; + bodyHeight = 160; + } + + float neckY = y - bodyHeight - neckHeight - radius; + + background(0, 153, 204); + + // Neck + stroke(255); + line(x+12, y-bodyHeight, x+12, neckY); + + // Antennae + line(x+12, neckY, x-18, neckY-43); + line(x+12, neckY, x+42, neckY-99); + line(x+12, neckY, x+78, neckY+15); + + // Body + noStroke(); + fill(255, 204, 0); + ellipse(x, y-33, 33, 33); + fill(0); + rect(x-45, y-bodyHeight, 90, bodyHeight-33); + + // Head + fill(0); + ellipse(x+12, neckY, radius, radius); + fill(255); + ellipse(x+24, neckY-6, 14, 14); + fill(0); + ellipse(x+24, neckY-6, 3, 3); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/Robots/Robot04_Transform/Robot04_Transform.pde b/content/gswp_2e/examples/Robots/Robot04_Transform/Robot04_Transform.pde new file mode 100644 index 000000000..55494aa96 --- /dev/null +++ b/content/gswp_2e/examples/Robots/Robot04_Transform/Robot04_Transform.pde @@ -0,0 +1,58 @@ +float x = 60; // X-coordinate +float y = 440; // Y-coordinate +int radius = 45; // Head Radius +int bodyHeight = 180; // Body Height +int neckHeight = 40; // Neck Height + +float easing = 0.04; + +void setup() { + size(360, 480); + ellipseMode(RADIUS); +} + +void draw() { + strokeWeight(2); + + float neckY = -1 * (bodyHeight + neckHeight + radius); + + background(0, 153, 204); + + translate(mouseX, y); // Move all to (mouseX, y) + + if (mousePressed) { + scale(1.0); + } else { + scale(0.6); // 60% size when mouse is pressed + } + + // Body + noStroke(); + fill(255, 204, 0); + ellipse(0, -33, 33, 33); + fill(0); + rect(-45, -bodyHeight, 90, bodyHeight-33); + + // Neck + stroke(255); + line(12, -bodyHeight, 12, neckY); + + // Hair + pushMatrix(); + translate(12, neckY); + float angle = -PI/30.0; + for (int i = 0; i <= 30; i++) { + line(80, 0, 0, 0); + rotate(angle); + } + popMatrix(); + + // Head + noStroke(); + fill(0); + ellipse(12, neckY, radius, radius); + fill(255); + ellipse(24, neckY-6, 14, 14); + fill(0); + ellipse(24, neckY-6, 3, 3); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/Robots/Robot05_Media/Robot05_Media.pde b/content/gswp_2e/examples/Robots/Robot05_Media/Robot05_Media.pde new file mode 100644 index 000000000..23e544418 --- /dev/null +++ b/content/gswp_2e/examples/Robots/Robot05_Media/Robot05_Media.pde @@ -0,0 +1,37 @@ +PShape bot1; +PShape bot2; +PShape bot3; +PImage landscape; + +float easing = 0.05; +float offset = 0; + +void setup() { + size(720, 480); + bot1 = loadShape("robot1.svg"); + bot2 = loadShape("robot2.svg"); + bot3 = loadShape("robot3.svg"); + landscape = loadImage("alpine.png"); +} + +void draw() { + // Set the background to the "landscape" image, this image + // must be the same width and height as the program + background(landscape); + + // Set the left/right offset and apply easing to make + // the transition smooth + float targetOffset = map(mouseY, 0, height, -40, 40); + offset += (targetOffset - offset) * easing; + + // Draw the left robot + shape(bot1, 85 + offset, 65); + + // Draw the right robot smaller and give it a smaller offset + float smallerOffset = offset * 0.7; + shape(bot2, 510 + smallerOffset, 140, 78, 248); + + // Draw the smallest robot, give it a smaller offset + smallerOffset *= -0.5; + shape(bot3, 410 + smallerOffset, 225, 39, 124); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/Robots/Robot05_Media/data/alpine.png b/content/gswp_2e/examples/Robots/Robot05_Media/data/alpine.png new file mode 100644 index 000000000..d3cd33921 Binary files /dev/null and b/content/gswp_2e/examples/Robots/Robot05_Media/data/alpine.png differ diff --git a/content/gswp_2e/examples/Robots/Robot05_Media/data/robot1.svg b/content/gswp_2e/examples/Robots/Robot05_Media/data/robot1.svg new file mode 100644 index 000000000..db2476b39 --- /dev/null +++ b/content/gswp_2e/examples/Robots/Robot05_Media/data/robot1.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/gswp_2e/examples/Robots/Robot05_Media/data/robot2.svg b/content/gswp_2e/examples/Robots/Robot05_Media/data/robot2.svg new file mode 100644 index 000000000..7ca17d8c1 --- /dev/null +++ b/content/gswp_2e/examples/Robots/Robot05_Media/data/robot2.svg @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/gswp_2e/examples/Robots/Robot05_Media/data/robot3.svg b/content/gswp_2e/examples/Robots/Robot05_Media/data/robot3.svg new file mode 100644 index 000000000..b8d074b75 --- /dev/null +++ b/content/gswp_2e/examples/Robots/Robot05_Media/data/robot3.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/gswp_2e/examples/Robots/Robot06_Motion/Robot06_Motion.pde b/content/gswp_2e/examples/Robots/Robot06_Motion/Robot06_Motion.pde new file mode 100644 index 000000000..562d1309b --- /dev/null +++ b/content/gswp_2e/examples/Robots/Robot06_Motion/Robot06_Motion.pde @@ -0,0 +1,53 @@ +float x = 180; // X-coordinate +float y = 400; // Y-coordinate +float bodyHeight = 153; // Body Height +float neckHeight = 56; // Neck Height +float radius = 45; // Head Radius +float angle = 0.0; // Angle for motion + +void setup() { + size(360, 480); + ellipseMode(RADIUS); + background(0, 153, 204); // Blue background +} + +void draw() { + // Change position by a small random amount + x += random(-4, 4); + y += random(-1, 1); + + // Change height of neck + neckHeight = 80 + sin(angle) * 30; + angle += 0.05; + + // Adjust the height of the head + float ny = y - bodyHeight - neckHeight - radius; + + // Neck + stroke(255); + line(x+2, y-bodyHeight, x+2, ny); + line(x+12, y-bodyHeight, x+12, ny); + line(x+22, y-bodyHeight, x+22, ny); + + // Antennae + line(x+12, ny, x-18, ny-43); + line(x+12, ny, x+42, ny-99); + line(x+12, ny, x+78, ny+15); + + // Body + noStroke(); + fill(255, 204, 0); + ellipse(x, y-33, 33, 33); + fill(0); + rect(x-45, y-bodyHeight, 90, bodyHeight-33); + fill(255, 204, 0); + rect(x-45, y-bodyHeight+17, 90, 6); + + // Head + fill(0); + ellipse(x+12, ny, radius, radius); + fill(255); + ellipse(x+24, ny-6, 14, 14); + fill(0); + ellipse(x+24, ny-6, 3, 3); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/Robots/Robot07_Functions/Robot07_Functions.pde b/content/gswp_2e/examples/Robots/Robot07_Functions/Robot07_Functions.pde new file mode 100644 index 000000000..8b093a1f7 --- /dev/null +++ b/content/gswp_2e/examples/Robots/Robot07_Functions/Robot07_Functions.pde @@ -0,0 +1,51 @@ +void setup() { + size(720, 480); + strokeWeight(2); + ellipseMode(RADIUS); +} + +void draw() { + background(0, 153, 204); + drawRobot(120, 420, 110, 140); + drawRobot(270, 460, 260, 95); + drawRobot(420, 310, 80, 10); + drawRobot(570, 390, 180, 40); +} + +void drawRobot(int x, int y, int bodyHeight, int neckHeight) { + + int radius = 45; + int ny = y - bodyHeight - neckHeight - radius; // neckHeight Y + + // Neck + stroke(255); + line(x+2, y-bodyHeight, x+2, ny); + line(x+12, y-bodyHeight, x+12, ny); + line(x+22, y-bodyHeight, x+22, ny); + + // Antennae + line(x+12, ny, x-18, ny-43); + line(x+12, ny, x+42, ny-99); + line(x+12, ny, x+78, ny+15); + + // Body + noStroke(); + fill(255, 204, 0); + ellipse(x, y-33, 33, 33); + fill(0); + rect(x-45, y-bodyHeight, 90, bodyHeight-33); + fill(255, 204, 0); + rect(x-45, y-bodyHeight+17, 90, 6); + + // Head + fill(0); + ellipse(x+12, ny, radius, radius); + fill(255); + ellipse(x+24, ny-6, 14, 14); + fill(0); + ellipse(x+24, ny-6, 3, 3); + fill(153, 204, 255); + ellipse(x, ny-8, 5, 5); + ellipse(x+30, ny-26, 4, 4); + ellipse(x+41, ny+6, 3, 3); +} \ No newline at end of file diff --git a/content/gswp_2e/examples/Robots/Robot08_Objects/Robot08_Objects.pde b/content/gswp_2e/examples/Robots/Robot08_Objects/Robot08_Objects.pde new file mode 100644 index 000000000..2c6cbc01c --- /dev/null +++ b/content/gswp_2e/examples/Robots/Robot08_Objects/Robot08_Objects.pde @@ -0,0 +1,47 @@ +Robot bot1; +Robot bot2; + +void setup() { + size(720, 480); + bot1 = new Robot("robot1.svg", 90, 80); + bot2 = new Robot("robot2.svg", 440, 30); +} + +void draw() { + background(0, 153, 204); + + // Update and display first robot + bot1.update(); + bot1.display(); + + // Update and display second robot + bot2.update(); + bot2.display(); +} + +class Robot { + float xpos; + float ypos; + float angle; + PShape botShape; + float yoffset = 0.0; + + // Set initial values in constructor + Robot(String svgName, float tempX, float tempY) { + botShape = loadShape(svgName); + xpos = tempX; + ypos = tempY; + angle = random(0, TWO_PI); + } + + // Update the fields + void update() { + angle += 0.05; + yoffset = sin(angle) * 20; + } + + // Draw the robot to the screen + void display() { + shape(botShape, xpos, ypos + yoffset); + } +} \ No newline at end of file diff --git a/content/gswp_2e/examples/Robots/Robot08_Objects/data/robot1.svg b/content/gswp_2e/examples/Robots/Robot08_Objects/data/robot1.svg new file mode 100644 index 000000000..db2476b39 --- /dev/null +++ b/content/gswp_2e/examples/Robots/Robot08_Objects/data/robot1.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/gswp_2e/examples/Robots/Robot08_Objects/data/robot2.svg b/content/gswp_2e/examples/Robots/Robot08_Objects/data/robot2.svg new file mode 100644 index 000000000..7ca17d8c1 --- /dev/null +++ b/content/gswp_2e/examples/Robots/Robot08_Objects/data/robot2.svg @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/gswp_2e/examples/Robots/Robot09_Arrays/Robot09_Arrays.pde b/content/gswp_2e/examples/Robots/Robot09_Arrays/Robot09_Arrays.pde new file mode 100644 index 000000000..6bfd5c49c --- /dev/null +++ b/content/gswp_2e/examples/Robots/Robot09_Arrays/Robot09_Arrays.pde @@ -0,0 +1,52 @@ +Robot[] bots; // Declare array of Robot objects + +void setup() { + size(720, 480); + PShape robotShape = loadShape("robot2.svg"); + // Create the array of Robot objects + bots = new Robot[20]; + // Create each object + for (int i = 0; i < bots.length; i++) { + // Create a random x-coordinate + float x = random(-40, width-40); + // Assign the y-coordinate based on the order + float y = map(i, 0, bots.length, -100, height-200); + bots[i] = new Robot(robotShape, x, y); + } +} + +void draw() { + background(0, 153, 204); + // Update and display each bot in the array + for (int i = 0; i < bots.length; i++) { + bots[i].update(); + bots[i].display(); + } +} + +class Robot { + float xpos; + float ypos; + float angle; + PShape botShape; + float yoffset = 0.0; + + // Set initial values in constructor + Robot(PShape shape, float tempX, float tempY) { + botShape = shape; + xpos = tempX; + ypos = tempY; + angle = random(0, TWO_PI); + } + + // Update the fields + void update() { + angle += 0.05; + yoffset = sin(angle) * 20; + } + + // Draw the robot to the screen + void display() { + shape(botShape, xpos, ypos + yoffset); + } +} \ No newline at end of file diff --git a/content/gswp_2e/examples/Robots/Robot09_Arrays/data/robot2.svg b/content/gswp_2e/examples/Robots/Robot09_Arrays/data/robot2.svg new file mode 100644 index 000000000..7ca17d8c1 --- /dev/null +++ b/content/gswp_2e/examples/Robots/Robot09_Arrays/data/robot2.svg @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/gswp_2e/examples/Robots/Robot10_Data_01/Robot10_Data_01.pde b/content/gswp_2e/examples/Robots/Robot10_Data_01/Robot10_Data_01.pde new file mode 100644 index 000000000..41f531ae9 --- /dev/null +++ b/content/gswp_2e/examples/Robots/Robot10_Data_01/Robot10_Data_01.pde @@ -0,0 +1,18 @@ +PrintWriter output; + +void setup() { + size(720, 480); + // Create the new file + output = createWriter("botArmy.tsv"); + // Write a header line with the column titles + output.println("type\tx\ty"); + for (int y = 0; y <= height; y += 120) { + for (int x = 0; x <= width; x += 60) { + int robotType = int(random(1, 4)); + output.println(robotType + "\t" + x + "\t" + y); + ellipse(x, y, 12, 12); + } + } + output.flush(); // Write the remaining data to the file + output.close(); // Finish the file +} \ No newline at end of file diff --git a/content/gswp_2e/examples/Robots/Robot10_Data_01/botArmy.tsv b/content/gswp_2e/examples/Robots/Robot10_Data_01/botArmy.tsv new file mode 100644 index 000000000..34050a319 --- /dev/null +++ b/content/gswp_2e/examples/Robots/Robot10_Data_01/botArmy.tsv @@ -0,0 +1,66 @@ +type x y +1 0 0 +2 60 0 +2 120 0 +1 180 0 +3 240 0 +3 300 0 +3 360 0 +3 420 0 +2 480 0 +3 540 0 +1 600 0 +1 660 0 +1 720 0 +2 0 120 +2 60 120 +2 120 120 +1 180 120 +3 240 120 +2 300 120 +3 360 120 +2 420 120 +1 480 120 +3 540 120 +2 600 120 +1 660 120 +3 720 120 +1 0 240 +1 60 240 +3 120 240 +2 180 240 +3 240 240 +3 300 240 +3 360 240 +3 420 240 +1 480 240 +2 540 240 +3 600 240 +2 660 240 +1 720 240 +1 0 360 +3 60 360 +2 120 360 +1 180 360 +3 240 360 +2 300 360 +2 360 360 +1 420 360 +1 480 360 +2 540 360 +2 600 360 +2 660 360 +1 720 360 +1 0 480 +2 60 480 +1 120 480 +2 180 480 +2 240 480 +3 300 480 +3 360 480 +3 420 480 +2 480 480 +2 540 480 +3 600 480 +3 660 480 +2 720 480 diff --git a/content/gswp_2e/examples/Robots/Robot10_Data_02/Robot10_Data_02.pde b/content/gswp_2e/examples/Robots/Robot10_Data_02/Robot10_Data_02.pde new file mode 100644 index 000000000..2815219da --- /dev/null +++ b/content/gswp_2e/examples/Robots/Robot10_Data_02/Robot10_Data_02.pde @@ -0,0 +1,27 @@ +Table robots; +PShape bot1; +PShape bot2; +PShape bot3; + +void setup() { + size(720, 480); + background(0, 153, 204); + bot1 = loadShape("robot1.svg"); + bot2 = loadShape("robot2.svg"); + bot3 = loadShape("robot3.svg"); + shapeMode(CENTER); + robots = loadTable("botArmy.tsv", "header"); + for (int i = 0; i < robots.getRowCount(); i++) { + int bot = robots.getInt(i, "type"); + int x = robots.getInt(i, "x"); + int y = robots.getInt(i, "y"); + float sc = 0.3; + if (bot == 1) { + shape(bot1, x, y, bot1.width*sc, bot1.height*sc); + } else if (bot == 2) { + shape(bot2, x, y, bot2.width*sc, bot2.height*sc); + } else { + shape(bot3, x, y, bot3.width*sc, bot3.height*sc); + } + } +} \ No newline at end of file diff --git a/content/gswp_2e/examples/Robots/Robot10_Data_02/data/botArmy.tsv b/content/gswp_2e/examples/Robots/Robot10_Data_02/data/botArmy.tsv new file mode 100644 index 000000000..97239b87f --- /dev/null +++ b/content/gswp_2e/examples/Robots/Robot10_Data_02/data/botArmy.tsv @@ -0,0 +1,66 @@ +type x y +3 0 0 +1 60 0 +2 120 0 +3 180 0 +1 240 0 +2 300 0 +2 360 0 +3 420 0 +3 480 0 +3 540 0 +3 600 0 +3 660 0 +1 720 0 +3 0 120 +2 60 120 +1 120 120 +2 180 120 +3 240 120 +1 300 120 +1 360 120 +3 420 120 +1 480 120 +2 540 120 +3 600 120 +3 660 120 +2 720 120 +1 0 240 +2 60 240 +3 120 240 +3 180 240 +2 240 240 +2 300 240 +2 360 240 +2 420 240 +1 480 240 +1 540 240 +2 600 240 +2 660 240 +2 720 240 +1 0 360 +1 60 360 +3 120 360 +1 180 360 +1 240 360 +3 300 360 +1 360 360 +1 420 360 +1 480 360 +3 540 360 +2 600 360 +3 660 360 +1 720 360 +3 0 480 +1 60 480 +1 120 480 +3 180 480 +3 240 480 +2 300 480 +1 360 480 +3 420 480 +3 480 480 +1 540 480 +3 600 480 +1 660 480 +2 720 480 diff --git a/content/gswp_2e/examples/Robots/Robot10_Data_02/data/robot1.svg b/content/gswp_2e/examples/Robots/Robot10_Data_02/data/robot1.svg new file mode 100644 index 000000000..db2476b39 --- /dev/null +++ b/content/gswp_2e/examples/Robots/Robot10_Data_02/data/robot1.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/gswp_2e/examples/Robots/Robot10_Data_02/data/robot2.svg b/content/gswp_2e/examples/Robots/Robot10_Data_02/data/robot2.svg new file mode 100644 index 000000000..7ca17d8c1 --- /dev/null +++ b/content/gswp_2e/examples/Robots/Robot10_Data_02/data/robot2.svg @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/gswp_2e/examples/Robots/Robot10_Data_02/data/robot3.svg b/content/gswp_2e/examples/Robots/Robot10_Data_02/data/robot3.svg new file mode 100644 index 000000000..b8d074b75 --- /dev/null +++ b/content/gswp_2e/examples/Robots/Robot10_Data_02/data/robot3.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/gswp_2e/examples/Robots/Robot10_Data_03/Robot10_Data_03.pde b/content/gswp_2e/examples/Robots/Robot10_Data_03/Robot10_Data_03.pde new file mode 100644 index 000000000..8249a39f1 --- /dev/null +++ b/content/gswp_2e/examples/Robots/Robot10_Data_03/Robot10_Data_03.pde @@ -0,0 +1,20 @@ +int numRobotTypes = 3; +PShape[] shapes = new PShape[numRobotTypes]; +float scalar = 0.3; + +void setup() { + size(720, 480); + background(0, 153, 204); + for (int i = 0; i < numRobotTypes; i++) { + shapes[i] = loadShape("robot" + (i+1) + ".svg"); + } + shapeMode(CENTER); + Table botArmy = loadTable("botArmy.tsv", "header"); + for (TableRow row : botArmy.rows()) { + int robotType = row.getInt("type"); + int x = row.getInt("x"); + int y = row.getInt("y"); + PShape bot = shapes[robotType - 1]; + shape(bot, x, y, bot.width*scalar, bot.height*scalar); + } +} \ No newline at end of file diff --git a/content/gswp_2e/examples/Robots/Robot10_Data_03/data/botArmy.tsv b/content/gswp_2e/examples/Robots/Robot10_Data_03/data/botArmy.tsv new file mode 100644 index 000000000..97239b87f --- /dev/null +++ b/content/gswp_2e/examples/Robots/Robot10_Data_03/data/botArmy.tsv @@ -0,0 +1,66 @@ +type x y +3 0 0 +1 60 0 +2 120 0 +3 180 0 +1 240 0 +2 300 0 +2 360 0 +3 420 0 +3 480 0 +3 540 0 +3 600 0 +3 660 0 +1 720 0 +3 0 120 +2 60 120 +1 120 120 +2 180 120 +3 240 120 +1 300 120 +1 360 120 +3 420 120 +1 480 120 +2 540 120 +3 600 120 +3 660 120 +2 720 120 +1 0 240 +2 60 240 +3 120 240 +3 180 240 +2 240 240 +2 300 240 +2 360 240 +2 420 240 +1 480 240 +1 540 240 +2 600 240 +2 660 240 +2 720 240 +1 0 360 +1 60 360 +3 120 360 +1 180 360 +1 240 360 +3 300 360 +1 360 360 +1 420 360 +1 480 360 +3 540 360 +2 600 360 +3 660 360 +1 720 360 +3 0 480 +1 60 480 +1 120 480 +3 180 480 +3 240 480 +2 300 480 +1 360 480 +3 420 480 +3 480 480 +1 540 480 +3 600 480 +1 660 480 +2 720 480 diff --git a/content/gswp_2e/examples/Robots/Robot10_Data_03/data/robot1.svg b/content/gswp_2e/examples/Robots/Robot10_Data_03/data/robot1.svg new file mode 100644 index 000000000..db2476b39 --- /dev/null +++ b/content/gswp_2e/examples/Robots/Robot10_Data_03/data/robot1.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/gswp_2e/examples/Robots/Robot10_Data_03/data/robot2.svg b/content/gswp_2e/examples/Robots/Robot10_Data_03/data/robot2.svg new file mode 100644 index 000000000..7ca17d8c1 --- /dev/null +++ b/content/gswp_2e/examples/Robots/Robot10_Data_03/data/robot2.svg @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/gswp_2e/examples/Robots/Robot10_Data_03/data/robot3.svg b/content/gswp_2e/examples/Robots/Robot10_Data_03/data/robot3.svg new file mode 100644 index 000000000..b8d074b75 --- /dev/null +++ b/content/gswp_2e/examples/Robots/Robot10_Data_03/data/robot3.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/handbook_2e/examples.properties b/content/handbook_2e/examples.properties new file mode 100644 index 000000000..8af696aa9 --- /dev/null +++ b/content/handbook_2e/examples.properties @@ -0,0 +1,10 @@ +name=Processing Handbook, 2nd Edition +category=Books +authorList=[Casey Reas](http://reas.com/) and [Ben Fry](http://benfry.com/) +url=http://www.processing.org +sentence=Example code for the book Processing: A Programming Handbook for Visual Designers and Artists, Second Edition. MIT Press, 2014. +paragraph= +version=1 +minVersion=0 +maxVersion=0 +prettyVersion=1.0 \ No newline at end of file diff --git a/content/handbook_2e/examples/02 Using Processing/Ex_01/Ex_01.pde b/content/handbook_2e/examples/02 Using Processing/Ex_01/Ex_01.pde new file mode 100644 index 000000000..32df30475 --- /dev/null +++ b/content/handbook_2e/examples/02 Using Processing/Ex_01/Ex_01.pde @@ -0,0 +1,5 @@ +line(10, 80, 30, 40); // Left line +line(20, 80, 40, 40); +line(30, 80, 50, 40); // Middle line +line(40, 80, 60, 40); +line(50, 80, 70, 40); // Right line diff --git a/content/handbook_2e/examples/02 Using Processing/Ex_02/Ex_02.pde b/content/handbook_2e/examples/02 Using Processing/Ex_02/Ex_02.pde new file mode 100644 index 000000000..a45d3b4a0 --- /dev/null +++ b/content/handbook_2e/examples/02 Using Processing/Ex_02/Ex_02.pde @@ -0,0 +1,9 @@ +background(0); // Set the black background +stroke(255); // Set line value to white +strokeWeight(5); // Set line width to 5 pixels + +line(10, 80, 30, 40); // Left line +line(20, 80, 40, 40); +line(30, 80, 50, 40); // Middle line +line(40, 80, 60, 40); +line(50, 80, 70, 40); // Right line diff --git a/content/handbook_2e/examples/02 Using Processing/Ex_03/Ex_03.pde b/content/handbook_2e/examples/02 Using Processing/Ex_03/Ex_03.pde new file mode 100644 index 000000000..032a87f7b --- /dev/null +++ b/content/handbook_2e/examples/02 Using Processing/Ex_03/Ex_03.pde @@ -0,0 +1,7 @@ +int x = 5; // Set the horizontal position +int y = 60; // Set the vertical position +line(x, y, x+20, y-40); // Line from [5,60] to [25,20] +line(x+10, y, x+30, y-40); // Line from [15,60] to [35,20] +line(x+20, y, x+40, y-40); // Line from [25,60] to [45,20] +line(x+30, y, x+50, y-40); // Line from [35,60] to [55,20] +line(x+40, y, x+60, y-40); // Line from [45,60] to [65,20] diff --git a/content/handbook_2e/examples/02 Using Processing/Ex_04/Ex_04.pde b/content/handbook_2e/examples/02 Using Processing/Ex_04/Ex_04.pde new file mode 100644 index 000000000..52d2553c1 --- /dev/null +++ b/content/handbook_2e/examples/02 Using Processing/Ex_04/Ex_04.pde @@ -0,0 +1,17 @@ +int x = 0; // Set the horizontal position +int y = 55; // Set the vertical position + +void setup() { + size(100, 100); // Set the window to 100 x 100 pixels +} + +void draw() { + background(204); + line(x, y, x+20, y-40); // Left line + line(x+10, y, x+30, y-40); // Middle line + line(x+20, y, x+40, y-40); // Right line + x = x + 1; // Add 1 to x + if (x > 100) { // If x is greater than 100, + x = -40; // assign -40 to x + } +} diff --git a/content/handbook_2e/examples/02 Using Processing/Ex_05/Ex_05.pde b/content/handbook_2e/examples/02 Using Processing/Ex_05/Ex_05.pde new file mode 100644 index 000000000..ba1275cbc --- /dev/null +++ b/content/handbook_2e/examples/02 Using Processing/Ex_05/Ex_05.pde @@ -0,0 +1,15 @@ +void setup() { + size(100, 100); +} + +void draw() { + background(204); + // Assign the horizontal value of the cursor to x + float x = mouseX; + // Assign the vertical value of the cursor to y + float y = mouseY; + line(x, y, x+20, y-40); + line(x+10, y, x+30, y-40); + line(x+20, y, x+40, y-40); +} + diff --git a/content/handbook_2e/examples/02 Using Processing/Ex_06/Ex_06.pde b/content/handbook_2e/examples/02 Using Processing/Ex_06/Ex_06.pde new file mode 100644 index 000000000..423f8687e --- /dev/null +++ b/content/handbook_2e/examples/02 Using Processing/Ex_06/Ex_06.pde @@ -0,0 +1,16 @@ +void setup() { + size(100, 100); +} + +void draw() { + background(204); + diagonals(40, 90); + diagonals(60, 62); + diagonals(20, 40); +} + +void diagonals(int x, int y) { + line(x, y, x+20, y-40); + line(x+10, y, x+30, y-40); + line(x+20, y, x+40, y-40); +} diff --git a/content/handbook_2e/examples/02 Using Processing/Ex_07/Ex_07.pde b/content/handbook_2e/examples/02 Using Processing/Ex_07/Ex_07.pde new file mode 100644 index 000000000..fdf9f0b11 --- /dev/null +++ b/content/handbook_2e/examples/02 Using Processing/Ex_07/Ex_07.pde @@ -0,0 +1,26 @@ +int num = 20; +int[] dx = new int[num]; // Declare and create an array +int[] dy = new int[num]; // Declare and create an array + +void setup() { + size(100, 100); + for (int i = 0; i < num; i++) { + dx[i] = i * 5; + dy[i] = 12 + (i * 6); + } +} + +void draw() { + background(204); + for (int i = 0; i < num; i++) { + dx[i] = dx[i] + 1; + if (dx[i] > 100) {dx[i] = -100;} + diagonals(dx[i], dy[i]); + } +} + +void diagonals(int x, int y) { + line(x, y, x+20, y-40); + line(x+10, y, x+30, y-40); + line(x+20, y, x+40, y-40); +}
 diff --git a/content/handbook_2e/examples/02 Using Processing/Ex_08/Ex_08.pde b/content/handbook_2e/examples/02 Using Processing/Ex_08/Ex_08.pde new file mode 100644 index 000000000..0177b4b0e --- /dev/null +++ b/content/handbook_2e/examples/02 Using Processing/Ex_08/Ex_08.pde @@ -0,0 +1,40 @@ +Diagonals da, db; + +void setup() { + size(100, 100); + + // Inputs: x, y, speed, thick, gray + da = new Diagonals(0, 80, 1, 2, 0); + db = new Diagonals(0, 55, 2, 6, 255); +} + +void draw() { + background(204); + da.update(); + db.update(); +} + +class Diagonals { + int x, y, speed, thick, gray; + 
 + Diagonals(int xpos, int ypos, int s, int t, int g) { + x = xpos; + y = ypos; + speed = s; + thick = t; + gray = g; + } + 
 + void update() { + strokeWeight(thick); + stroke(gray); + line(x, y, x+20, y-40); + line(x+10, y, x+30, y-40); + line(x+20, y, x+40, y-40); + x = x + speed; + if (x > 100) { + x = -100; + } + } +} + diff --git a/content/handbook_2e/examples/02 Using Processing/Ex_09/Ex_09.pde b/content/handbook_2e/examples/02 Using Processing/Ex_09/Ex_09.pde new file mode 100644 index 000000000..1f33451f8 --- /dev/null +++ b/content/handbook_2e/examples/02 Using Processing/Ex_09/Ex_09.pde @@ -0,0 +1,18 @@ +// Two forward slashes are used to denote a comment. +// All text on the same line is a part of the comment. +// There must be no spaces between the slashes. For example, 
// the code "/ /" is not a comment and will cause an error + +// If you want to have a comment that is many +// lines long, you may prefer to use the syntax for a +// multiline comment + +/* + A forward slash followed by an asterisk allows the + comment to continue until the opposite +*/ + +// All letters and symbols that are not comments are run +// by the computer. Because the following lines are not comments, +// they are run and draw a display window of 200 x 200 pixels +size(200, 200); +background(102); diff --git a/content/handbook_2e/examples/02 Using Processing/Ex_10/Ex_10.pde b/content/handbook_2e/examples/02 Using Processing/Ex_10/Ex_10.pde new file mode 100644 index 000000000..6d775c5eb --- /dev/null +++ b/content/handbook_2e/examples/02 Using Processing/Ex_10/Ex_10.pde @@ -0,0 +1,6 @@ +// The size function has two parameters. The first sets the width 
// of the display window and the second sets the height +size(200, 200); + +// This version of the background function has one parameter. 
// It sets the gray value for the background of the display window 
// in the range of 0 (black) to 255 (white) +background(102); + diff --git a/content/handbook_2e/examples/02 Using Processing/Ex_11/Ex_11.pde b/content/handbook_2e/examples/02 Using Processing/Ex_11/Ex_11.pde new file mode 100644 index 000000000..e17b14f37 --- /dev/null +++ b/content/handbook_2e/examples/02 Using Processing/Ex_11/Ex_11.pde @@ -0,0 +1,4 @@ +size(200, 200); // Runs the size() function +int x; // Declares a new variable x +x = 102; // Assigns the value 102 to the variable x +background(x); // Runs the background() function diff --git a/content/handbook_2e/examples/02 Using Processing/Ex_12/Ex_12.pde b/content/handbook_2e/examples/02 Using Processing/Ex_12/Ex_12.pde new file mode 100644 index 000000000..3ef24b87e --- /dev/null +++ b/content/handbook_2e/examples/02 Using Processing/Ex_12/Ex_12.pde @@ -0,0 +1,2 @@ +size(200, 200); +Background(102); // ERROR! The B in "background" is capitalized diff --git a/content/handbook_2e/examples/02 Using Processing/Ex_13/Ex_13.pde b/content/handbook_2e/examples/02 Using Processing/Ex_13/Ex_13.pde new file mode 100644 index 000000000..67df6fad6 --- /dev/null +++ b/content/handbook_2e/examples/02 Using Processing/Ex_13/Ex_13.pde @@ -0,0 +1,3 @@ +size(200, 200); +background(102); + diff --git a/content/handbook_2e/examples/02 Using Processing/Ex_14/Ex_14.pde b/content/handbook_2e/examples/02 Using Processing/Ex_14/Ex_14.pde new file mode 100644 index 000000000..749e4adba --- /dev/null +++ b/content/handbook_2e/examples/02 Using Processing/Ex_14/Ex_14.pde @@ -0,0 +1,6 @@ +size +( 200, + 200) ; +background ( 102) + ; + diff --git a/content/handbook_2e/examples/02 Using Processing/Ex_15/Ex_15.pde b/content/handbook_2e/examples/02 Using Processing/Ex_15/Ex_15.pde new file mode 100644 index 000000000..b579ca635 --- /dev/null +++ b/content/handbook_2e/examples/02 Using Processing/Ex_15/Ex_15.pde @@ -0,0 +1,24 @@ +// To print text to the console, place the desired output in quotes +println("Processing..."); // Prints "Processing..." to the console + +// To print the value of a variable, rather than its name, +// don’t put the name of the variable in quotes +int x = 20; +println(x); // Prints "20" to the console + +// While println() moves to the next line after the text +// is output, print() does not +print("10"); +println("20"); // Prints "1020" to the console +println("30"); // Prints "30" to the console + +// Use a comma inside println() to write more than one value +int x2 = 20; +int y2 = 80; +println(x2, y2); // Prints "20 80" to the console + +// Use the "+" operator to combine variables with +// custom text in between +int x3 = 20; +int y3 = 80; +println(x3 + " and " + y3); // Prints "20 and 80" to the console diff --git a/content/handbook_2e/examples/03 Draw/Ex_01/Ex_01.pde b/content/handbook_2e/examples/03 Draw/Ex_01/Ex_01.pde new file mode 100644 index 000000000..beebc2528 --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_01/Ex_01.pde @@ -0,0 +1,3 @@ +// Draw the display window 120 pixels +// wide and 200 pixels high +size(120, 200); diff --git a/content/handbook_2e/examples/03 Draw/Ex_02/Ex_02.pde b/content/handbook_2e/examples/03 Draw/Ex_02/Ex_02.pde new file mode 100644 index 000000000..f2aeceaed --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_02/Ex_02.pde @@ -0,0 +1,3 @@ +// Draw the display window 320 pixels +// wide and 240 pixels high +size(320, 240); diff --git a/content/handbook_2e/examples/03 Draw/Ex_03/Ex_03.pde b/content/handbook_2e/examples/03 Draw/Ex_03/Ex_03.pde new file mode 100644 index 000000000..945993d61 --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_03/Ex_03.pde @@ -0,0 +1,4 @@ +// Draw the display window 200 pixels +// wide and 200 pixels high +size(200, 200); + diff --git a/content/handbook_2e/examples/03 Draw/Ex_04/Ex_04.pde b/content/handbook_2e/examples/03 Draw/Ex_04/Ex_04.pde new file mode 100644 index 000000000..119083a5a --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_04/Ex_04.pde @@ -0,0 +1,9 @@ +// Points with the same X and Y parameters +// form a diagonal line from the +// upper-left corner to the lower-right corner +point(20, 20); +point(30, 30); +point(40, 40); +point(50, 50); +point(60, 60); + diff --git a/content/handbook_2e/examples/03 Draw/Ex_05/Ex_05.pde b/content/handbook_2e/examples/03 Draw/Ex_05/Ex_05.pde new file mode 100644 index 000000000..ceb902ba0 --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_05/Ex_05.pde @@ -0,0 +1,8 @@ +// Points with the same Y parameter have the +// same distance from the top and bottom +// edges of the frame +point(50, 30); +point(55, 30); +point(60, 30); +point(65, 30); +point(70, 30); diff --git a/content/handbook_2e/examples/03 Draw/Ex_06/Ex_06.pde b/content/handbook_2e/examples/03 Draw/Ex_06/Ex_06.pde new file mode 100644 index 000000000..54f46c45c --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_06/Ex_06.pde @@ -0,0 +1,8 @@ +// Points with the same X parameter have the +// same distance from the left and right +// edges of the frame +point(70, 50); +point(70, 55); +point(70, 60); +point(70, 65); +point(70, 70); diff --git a/content/handbook_2e/examples/03 Draw/Ex_07/Ex_07.pde b/content/handbook_2e/examples/03 Draw/Ex_07/Ex_07.pde new file mode 100644 index 000000000..c94ff98ca --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_07/Ex_07.pde @@ -0,0 +1,12 @@ +// Placing a group of points next to one +// another creates a line +point(50, 50); +point(50, 51); +point(50, 52); +point(50, 53); +point(50, 54); +point(50, 55); +point(50, 56); +point(50, 57); +point(50, 58); +point(50, 59); diff --git a/content/handbook_2e/examples/03 Draw/Ex_08/Ex_08.pde b/content/handbook_2e/examples/03 Draw/Ex_08/Ex_08.pde new file mode 100644 index 000000000..865fa2683 --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_08/Ex_08.pde @@ -0,0 +1,8 @@ +// Setting points outside the display +// area will not cause an error, +// but the points won't be visible +point(-500, 100); +point(400, -600); +point(140, 2500); +point(2500, 100); + diff --git a/content/handbook_2e/examples/03 Draw/Ex_09/Ex_09.pde b/content/handbook_2e/examples/03 Draw/Ex_09/Ex_09.pde new file mode 100644 index 000000000..96262cb5c --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_09/Ex_09.pde @@ -0,0 +1,5 @@ +// When the y-coordinates for a line are the +// same, the line is horizontal +line(10, 30, 90, 30); +line(10, 40, 90, 40); +line(10, 50, 90, 50); diff --git a/content/handbook_2e/examples/03 Draw/Ex_10/Ex_10.pde b/content/handbook_2e/examples/03 Draw/Ex_10/Ex_10.pde new file mode 100644 index 000000000..33f9e1b21 --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_10/Ex_10.pde @@ -0,0 +1,5 @@ +// When the x-coordinates for a line are the +// same, the line is vertical +line(40, 10, 40, 90); +line(50, 10, 50, 90); +line(60, 10, 60, 90); diff --git a/content/handbook_2e/examples/03 Draw/Ex_11/Ex_11.pde b/content/handbook_2e/examples/03 Draw/Ex_11/Ex_11.pde new file mode 100644 index 000000000..45133b537 --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_11/Ex_11.pde @@ -0,0 +1,5 @@ +// When all four parameters are different, +// the lines are diagonal +line(25, 90, 80, 60); +line(50, 12, 42, 90); +line(45, 30, 18, 36); diff --git a/content/handbook_2e/examples/03 Draw/Ex_12/Ex_12.pde b/content/handbook_2e/examples/03 Draw/Ex_12/Ex_12.pde new file mode 100644 index 000000000..dce518e5f --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_12/Ex_12.pde @@ -0,0 +1,4 @@ +// When two lines share the same point they connect +line(15, 20, 5, 80); +line(90, 65, 5, 80); + diff --git a/content/handbook_2e/examples/03 Draw/Ex_13/Ex_13.pde b/content/handbook_2e/examples/03 Draw/Ex_13/Ex_13.pde new file mode 100644 index 000000000..10abe64d5 --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_13/Ex_13.pde @@ -0,0 +1,4 @@ +triangle(60, 10, 25, 60, 75, 65); // Filled triangle +line(60, 30, 25, 80); // Outlined triangle edge +line(25, 80, 75, 85); // Outlined triangle edge +line(75, 85, 60, 30); // Outlined triangle edge diff --git a/content/handbook_2e/examples/03 Draw/Ex_14/Ex_14.pde b/content/handbook_2e/examples/03 Draw/Ex_14/Ex_14.pde new file mode 100644 index 000000000..8699ef76d --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_14/Ex_14.pde @@ -0,0 +1,4 @@ +triangle(55, 9, 110, 100, 85, 100); +triangle(55, 9, 85, 100, 75, 100); +triangle(-1, 46, 16, 34, -7, 100); +triangle(16, 34, -7, 100, 40, 100); diff --git a/content/handbook_2e/examples/03 Draw/Ex_15/Ex_15.pde b/content/handbook_2e/examples/03 Draw/Ex_15/Ex_15.pde new file mode 100644 index 000000000..ef4c104a1 --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_15/Ex_15.pde @@ -0,0 +1 @@ +quad(38, 31, 86, 20, 69, 63, 30, 76); diff --git a/content/handbook_2e/examples/03 Draw/Ex_16/Ex_16.pde b/content/handbook_2e/examples/03 Draw/Ex_16/Ex_16.pde new file mode 100644 index 000000000..6c141ca06 --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_16/Ex_16.pde @@ -0,0 +1,2 @@ +quad(20, 20, 20, 70, 60, 90, 60, 40); +quad(20, 20, 70, -20, 110, 0, 60, 40); diff --git a/content/handbook_2e/examples/03 Draw/Ex_17/Ex_17.pde b/content/handbook_2e/examples/03 Draw/Ex_17/Ex_17.pde new file mode 100644 index 000000000..f724dd374 --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_17/Ex_17.pde @@ -0,0 +1,3 @@ +rect(15, 15, 40, 40); // Large square +rect(55, 55, 25, 25); // Small square + diff --git a/content/handbook_2e/examples/03 Draw/Ex_18/Ex_18.pde b/content/handbook_2e/examples/03 Draw/Ex_18/Ex_18.pde new file mode 100644 index 000000000..c6bc3a8fe --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_18/Ex_18.pde @@ -0,0 +1,7 @@ +rect(0, 0, 90, 50); +rect(5, 50, 75, 4); +rect(24, 54, 6, 6); +rect(64, 54, 6, 6); +rect(20, 60, 75, 10); +rect(10, 70, 80, 2); + diff --git a/content/handbook_2e/examples/03 Draw/Ex_19/Ex_19.pde b/content/handbook_2e/examples/03 Draw/Ex_19/Ex_19.pde new file mode 100644 index 000000000..549e28a9e --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_19/Ex_19.pde @@ -0,0 +1,3 @@ +ellipse(40, 40, 60, 60); // Large circle +ellipse(75, 75, 32, 32); // Small circle + diff --git a/content/handbook_2e/examples/03 Draw/Ex_20/Ex_20.pde b/content/handbook_2e/examples/03 Draw/Ex_20/Ex_20.pde new file mode 100644 index 000000000..be83d7ceb --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_20/Ex_20.pde @@ -0,0 +1,4 @@ +ellipse(35, 0, 120, 120); +ellipse(38, 62, 6, 6); +ellipse(40, 100, 70, 70); + diff --git a/content/handbook_2e/examples/03 Draw/Ex_21/Ex_21.pde b/content/handbook_2e/examples/03 Draw/Ex_21/Ex_21.pde new file mode 100644 index 000000000..82f288adb --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_21/Ex_21.pde @@ -0,0 +1,3 @@ +//background(255); +arc(50, 50, 75, 75, radians(40), radians(320)); + diff --git a/content/handbook_2e/examples/03 Draw/Ex_22/Ex_22.pde b/content/handbook_2e/examples/03 Draw/Ex_22/Ex_22.pde new file mode 100644 index 000000000..c25a4ddcb --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_22/Ex_22.pde @@ -0,0 +1,5 @@ +arc(50, 55, 50, 50, radians(0), radians(90)); +arc(50, 55, 60, 60, radians(90), radians(180)); +arc(50, 55, 70, 70, radians(180), radians(270)); +arc(50, 55, 80, 80, radians(270), radians(360)); + diff --git a/content/handbook_2e/examples/03 Draw/Ex_23/Ex_23.pde b/content/handbook_2e/examples/03 Draw/Ex_23/Ex_23.pde new file mode 100644 index 000000000..cc57586e7 --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_23/Ex_23.pde @@ -0,0 +1,15 @@ +// Top row, filled and stroked +arc(20, 20, 28, 28, radians(0), radians(225), OPEN); +arc(50, 20, 28, 28, radians(0), radians(225), CHORD); +arc(80, 20, 28, 28, radians(0), radians(225), PIE); +// Middle row, not stroked +noStroke(); +arc(20, 50, 28, 28, radians(0), radians(225), OPEN); +arc(50, 50, 28, 28, radians(0), radians(225), CHORD); +arc(80, 50, 28, 28, radians(0), radians(225), PIE); +// Bottom row, not filled +stroke(0); +noFill(); +arc(20, 80, 28, 28, radians(0), radians(225), OPEN); +arc(50, 80, 28, 28, radians(0), radians(225), CHORD); +arc(80, 80, 28, 28, radians(0), radians(225), PIE); diff --git a/content/handbook_2e/examples/03 Draw/Ex_24/Ex_24.pde b/content/handbook_2e/examples/03 Draw/Ex_24/Ex_24.pde new file mode 100644 index 000000000..be92b8d79 --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_24/Ex_24.pde @@ -0,0 +1,6 @@ +bezier(32, 20, 80, 5, 80, 75, 30, 75); +// Draw the control points +line(32, 20, 80, 5); +ellipse(80, 5, 4, 4); +line(80, 75, 30, 75); +ellipse(80, 75, 4, 4); diff --git a/content/handbook_2e/examples/03 Draw/Ex_25/Ex_25.pde b/content/handbook_2e/examples/03 Draw/Ex_25/Ex_25.pde new file mode 100644 index 000000000..527e88040 --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_25/Ex_25.pde @@ -0,0 +1,6 @@ +bezier(85, 20, 40, 10, 60, 90, 15, 80); +// Draw the control points +line(85, 20, 40, 10); +ellipse(40, 10, 4, 4); +line(60, 90, 15, 80); +ellipse(60, 90, 4, 4); diff --git a/content/handbook_2e/examples/03 Draw/Ex_26/Ex_26.pde b/content/handbook_2e/examples/03 Draw/Ex_26/Ex_26.pde new file mode 100644 index 000000000..eeb73b93a --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_26/Ex_26.pde @@ -0,0 +1,2 @@ +rect(15, 15, 50, 50); // Bottom +ellipse(60, 60, 55, 55); // Top diff --git a/content/handbook_2e/examples/03 Draw/Ex_27/Ex_27.pde b/content/handbook_2e/examples/03 Draw/Ex_27/Ex_27.pde new file mode 100644 index 000000000..56d15a867 --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_27/Ex_27.pde @@ -0,0 +1,2 @@ +ellipse(60, 60, 55, 55); // Bottom +rect(15, 15, 50, 50); // Top diff --git a/content/handbook_2e/examples/03 Draw/Ex_28/Ex_28.pde b/content/handbook_2e/examples/03 Draw/Ex_28/Ex_28.pde new file mode 100644 index 000000000..3cf1df175 --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_28/Ex_28.pde @@ -0,0 +1 @@ +background(0); diff --git a/content/handbook_2e/examples/03 Draw/Ex_29/Ex_29.pde b/content/handbook_2e/examples/03 Draw/Ex_29/Ex_29.pde new file mode 100644 index 000000000..a361fde4a --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_29/Ex_29.pde @@ -0,0 +1 @@ +background(124); diff --git a/content/handbook_2e/examples/03 Draw/Ex_30/Ex_30.pde b/content/handbook_2e/examples/03 Draw/Ex_30/Ex_30.pde new file mode 100644 index 000000000..5ee7ddde6 --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_30/Ex_30.pde @@ -0,0 +1 @@ +background(230); diff --git a/content/handbook_2e/examples/03 Draw/Ex_31/Ex_31.pde b/content/handbook_2e/examples/03 Draw/Ex_31/Ex_31.pde new file mode 100644 index 000000000..417041a8b --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_31/Ex_31.pde @@ -0,0 +1,7 @@ +rect(10, 10, 50, 50); +fill(204); // Light gray +rect(20, 20, 50, 50); +fill(153); // Middle gray +rect(30, 30, 50, 50); +fill(102); // Dark gray +rect(40, 40, 50, 50); diff --git a/content/handbook_2e/examples/03 Draw/Ex_32/Ex_32.pde b/content/handbook_2e/examples/03 Draw/Ex_32/Ex_32.pde new file mode 100644 index 000000000..bbe07ec87 --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_32/Ex_32.pde @@ -0,0 +1,8 @@ +background(0); +rect(10, 10, 50, 50); +stroke(102); // Dark gray +rect(20, 20, 50, 50); +stroke(153); // Middle gray +rect(30, 30, 50, 50); +stroke(204); // Light gray +rect(40, 40, 50, 50); diff --git a/content/handbook_2e/examples/03 Draw/Ex_33/Ex_33.pde b/content/handbook_2e/examples/03 Draw/Ex_33/Ex_33.pde new file mode 100644 index 000000000..f64a72f14 --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_33/Ex_33.pde @@ -0,0 +1,7 @@ +fill(255); // White +rect(10, 10, 50, 50); +rect(20, 20, 50, 50); +rect(30, 30, 50, 50); +fill(0); // Black +rect(40, 40, 50, 50); + diff --git a/content/handbook_2e/examples/03 Draw/Ex_34/Ex_34.pde b/content/handbook_2e/examples/03 Draw/Ex_34/Ex_34.pde new file mode 100644 index 000000000..f54e97198 --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_34/Ex_34.pde @@ -0,0 +1,4 @@ +background(0); +fill(255, 220); // High opacity +rect(15, 15, 50, 50); +rect(35, 35, 50, 50); diff --git a/content/handbook_2e/examples/03 Draw/Ex_35/Ex_35.pde b/content/handbook_2e/examples/03 Draw/Ex_35/Ex_35.pde new file mode 100644 index 000000000..28cf4a367 --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_35/Ex_35.pde @@ -0,0 +1,8 @@ +fill(0); +rect(0, 40, 100, 20); +fill(255, 51); // Low opacity +rect(0, 20, 33, 60); +fill(255, 127); // Medium opacity +rect(33, 20, 33, 60); +fill(255, 204); // High opacity +rect(66, 20, 33, 60); diff --git a/content/handbook_2e/examples/03 Draw/Ex_36/Ex_36.pde b/content/handbook_2e/examples/03 Draw/Ex_36/Ex_36.pde new file mode 100644 index 000000000..da22be63b --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_36/Ex_36.pde @@ -0,0 +1,5 @@ +rect(10, 10, 50, 50); +noFill(); // Disable the fill +rect(20, 20, 50, 50); +rect(30, 30, 50, 50); + diff --git a/content/handbook_2e/examples/03 Draw/Ex_37/Ex_37.pde b/content/handbook_2e/examples/03 Draw/Ex_37/Ex_37.pde new file mode 100644 index 000000000..2d27c419d --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_37/Ex_37.pde @@ -0,0 +1,5 @@ +rect(20, 15, 20, 70); +noStroke(); // Disable the stroke +rect(50, 15, 20, 70); +rect(80, 15, 20, 70); + diff --git a/content/handbook_2e/examples/03 Draw/Ex_38/Ex_38.pde b/content/handbook_2e/examples/03 Draw/Ex_38/Ex_38.pde new file mode 100644 index 000000000..f21def39f --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_38/Ex_38.pde @@ -0,0 +1,4 @@ +ellipse(30, 48, 36, 36); +noSmooth(); +ellipse(70, 48, 36, 36); + diff --git a/content/handbook_2e/examples/03 Draw/Ex_39/Ex_39.pde b/content/handbook_2e/examples/03 Draw/Ex_39/Ex_39.pde new file mode 100644 index 000000000..3f46258bd --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_39/Ex_39.pde @@ -0,0 +1,5 @@ +noSmooth(); +ellipse(30, 48, 36, 36); +smooth(); +ellipse(70, 48, 36, 36); + diff --git a/content/handbook_2e/examples/03 Draw/Ex_40/Ex_40.pde b/content/handbook_2e/examples/03 Draw/Ex_40/Ex_40.pde new file mode 100644 index 000000000..4f9cf0941 --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_40/Ex_40.pde @@ -0,0 +1,5 @@ +line(20, 20, 80, 20); // Default line weight of 1 +strokeWeight(6); +line(20, 40, 80, 40); // Thicker line +strokeWeight(18); +line(20, 70, 80, 70); // Thickest line diff --git a/content/handbook_2e/examples/03 Draw/Ex_41/Ex_41.pde b/content/handbook_2e/examples/03 Draw/Ex_41/Ex_41.pde new file mode 100644 index 000000000..ddf878421 --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_41/Ex_41.pde @@ -0,0 +1,8 @@ +strokeWeight(12); +strokeCap(ROUND); +line(20, 30, 80, 30); // Top line +strokeCap(SQUARE); +line(20, 50, 80, 50); // Middle line +strokeCap(PROJECT); +line(20, 70, 80, 70); // Bottom line + diff --git a/content/handbook_2e/examples/03 Draw/Ex_42/Ex_42.pde b/content/handbook_2e/examples/03 Draw/Ex_42/Ex_42.pde new file mode 100644 index 000000000..c253f775d --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_42/Ex_42.pde @@ -0,0 +1,7 @@ +strokeWeight(12); +strokeJoin(BEVEL); +rect(12, 33, 15, 33); // Left shape +strokeJoin(MITER); +rect(42, 33, 15, 33); // Middle shape +strokeJoin(ROUND); +rect(72, 33, 15, 33); // Right shape diff --git a/content/handbook_2e/examples/03 Draw/Ex_43/Ex_43.pde b/content/handbook_2e/examples/03 Draw/Ex_43/Ex_43.pde new file mode 100644 index 000000000..5ed7ddcad --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_43/Ex_43.pde @@ -0,0 +1,10 @@ +noStroke(); +ellipseMode(RADIUS); +fill(126); +ellipse(33, 33, 60, 60); // Gray ellipse +fill(255); +ellipseMode(CORNER); +ellipse(33, 33, 60, 60); // White ellipse +fill(0); +ellipseMode(CORNERS); +ellipse(33, 33, 60, 60); // Black ellipse diff --git a/content/handbook_2e/examples/03 Draw/Ex_44/Ex_44.pde b/content/handbook_2e/examples/03 Draw/Ex_44/Ex_44.pde new file mode 100644 index 000000000..18cf6255e --- /dev/null +++ b/content/handbook_2e/examples/03 Draw/Ex_44/Ex_44.pde @@ -0,0 +1,11 @@ +noStroke(); +rectMode(CORNER); +fill(126); +rect(40, 40, 60, 60); // Gray ellipse +rectMode(CENTER); +fill(255); +rect(40, 40, 60, 60); // White ellipse +rectMode(CORNERS); +fill(0); +rect(40, 40, 60, 60); // Black ellipse + diff --git a/content/handbook_2e/examples/04 Color/Ex_01/Ex_01.pde b/content/handbook_2e/examples/04 Color/Ex_01/Ex_01.pde new file mode 100644 index 000000000..13139bd8c --- /dev/null +++ b/content/handbook_2e/examples/04 Color/Ex_01/Ex_01.pde @@ -0,0 +1 @@ +background(242, 204, 47); diff --git a/content/handbook_2e/examples/04 Color/Ex_02/Ex_02.pde b/content/handbook_2e/examples/04 Color/Ex_02/Ex_02.pde new file mode 100644 index 000000000..7c56c024d --- /dev/null +++ b/content/handbook_2e/examples/04 Color/Ex_02/Ex_02.pde @@ -0,0 +1 @@ +background(174, 221, 60); diff --git a/content/handbook_2e/examples/04 Color/Ex_03/Ex_03.pde b/content/handbook_2e/examples/04 Color/Ex_03/Ex_03.pde new file mode 100644 index 000000000..fe84399fc --- /dev/null +++ b/content/handbook_2e/examples/04 Color/Ex_03/Ex_03.pde @@ -0,0 +1,4 @@ +background(129, 130, 87); +noStroke(); +fill(174, 221, 60); +rect(17, 17, 66, 66); diff --git a/content/handbook_2e/examples/04 Color/Ex_04/Ex_04.pde b/content/handbook_2e/examples/04 Color/Ex_04/Ex_04.pde new file mode 100644 index 000000000..e3aa838ce --- /dev/null +++ b/content/handbook_2e/examples/04 Color/Ex_04/Ex_04.pde @@ -0,0 +1,5 @@ +background(129, 130, 87); +noFill(); +strokeWeight(4); +stroke(174, 221, 60); +rect(19, 19, 62, 62); diff --git a/content/handbook_2e/examples/04 Color/Ex_05/Ex_05.pde b/content/handbook_2e/examples/04 Color/Ex_05/Ex_05.pde new file mode 100644 index 000000000..1c90ea57a --- /dev/null +++ b/content/handbook_2e/examples/04 Color/Ex_05/Ex_05.pde @@ -0,0 +1,6 @@ +background(116, 193, 206); +noStroke(); +fill(129, 130, 87, 102); // More transparent +rect(20, 20, 30, 60); +fill(129, 130, 87, 204); // Less transparent +rect(50, 20, 30, 60); diff --git a/content/handbook_2e/examples/04 Color/Ex_06/Ex_06.pde b/content/handbook_2e/examples/04 Color/Ex_06/Ex_06.pde new file mode 100644 index 000000000..465a07900 --- /dev/null +++ b/content/handbook_2e/examples/04 Color/Ex_06/Ex_06.pde @@ -0,0 +1,12 @@ +background(116, 193, 206); +noStroke(); +fill(129, 130, 87, 51); +rect(0, 20, 20, 60); +fill(129, 130, 87, 102); +rect(20, 20, 20, 60); +fill(129, 130, 87, 153); +rect(40, 20, 20, 60); +fill(129, 130, 87, 204); +rect(60, 20, 20, 60); +fill(129, 130, 87, 255); +rect(80, 20, 20, 60); diff --git a/content/handbook_2e/examples/04 Color/Ex_07/Ex_07.pde b/content/handbook_2e/examples/04 Color/Ex_07/Ex_07.pde new file mode 100644 index 000000000..00bee6d5d --- /dev/null +++ b/content/handbook_2e/examples/04 Color/Ex_07/Ex_07.pde @@ -0,0 +1,6 @@ +background(56, 90, 94); +strokeWeight(12); +stroke(242, 204, 47, 102); // More transparency +line(30, 20, 50, 80); +stroke(242, 204, 47, 204); // Less transparency +line(50, 20, 70, 80); diff --git a/content/handbook_2e/examples/04 Color/Ex_08/Ex_08.pde b/content/handbook_2e/examples/04 Color/Ex_08/Ex_08.pde new file mode 100644 index 000000000..2d2ad5f92 --- /dev/null +++ b/content/handbook_2e/examples/04 Color/Ex_08/Ex_08.pde @@ -0,0 +1,12 @@ +background(56, 90, 94); +strokeWeight(12); +stroke(242, 204, 47, 51); +line(0, 20, 20, 80); +stroke(242, 204, 47, 102); +line(20, 20, 40, 80); +stroke(242, 204, 47, 153); +line(40, 20, 60, 80); +stroke(242, 204, 47, 204); +line(60, 20, 80, 80); +stroke(242, 204, 47, 255); +line(80, 20, 100, 80); diff --git a/content/handbook_2e/examples/04 Color/Ex_09/Ex_09.pde b/content/handbook_2e/examples/04 Color/Ex_09/Ex_09.pde new file mode 100644 index 000000000..b98baf644 --- /dev/null +++ b/content/handbook_2e/examples/04 Color/Ex_09/Ex_09.pde @@ -0,0 +1,8 @@ +background(0); +noStroke(); +fill(242, 204, 47, 160); // Yellow +ellipse(47, 36, 64, 64); +fill(174, 221, 60, 160); // Green +ellipse(90, 47, 64, 64); +fill(116, 193, 206, 160); // Blue +ellipse(57, 79, 64, 64); diff --git a/content/handbook_2e/examples/04 Color/Ex_10/Ex_10.pde b/content/handbook_2e/examples/04 Color/Ex_10/Ex_10.pde new file mode 100644 index 000000000..5c10e2b05 --- /dev/null +++ b/content/handbook_2e/examples/04 Color/Ex_10/Ex_10.pde @@ -0,0 +1,8 @@ +background(255); +noStroke(); +fill(242, 204, 47, 160); // Yellow +ellipse(47, 36, 64, 64); +fill(174, 221, 60, 160); // Green +ellipse(90, 47, 64, 64); +fill(116, 193, 206, 160); // Blue +ellipse(57, 79, 64, 64); diff --git a/content/handbook_2e/examples/04 Color/Ex_11/Ex_11.pde b/content/handbook_2e/examples/04 Color/Ex_11/Ex_11.pde new file mode 100644 index 000000000..cec777588 --- /dev/null +++ b/content/handbook_2e/examples/04 Color/Ex_11/Ex_11.pde @@ -0,0 +1,9 @@ +size(100, 100); +stroke(153, 204); +strokeWeight(12); +background(0); +line(20, 20, 40, 80); +line(40, 20, 20, 80); +blendMode(ADD); // Change blend mode +line(60, 20, 80, 80); +line(80, 20, 60, 80); diff --git a/content/handbook_2e/examples/04 Color/Ex_12/Ex_12.pde b/content/handbook_2e/examples/04 Color/Ex_12/Ex_12.pde new file mode 100644 index 000000000..dfbc26597 --- /dev/null +++ b/content/handbook_2e/examples/04 Color/Ex_12/Ex_12.pde @@ -0,0 +1,10 @@ +size(100, 100); +stroke(153, 204); +strokeWeight(12); +background(0); +blendMode(ADD); // Change blend mode +line(20, 20, 40, 80); +line(40, 20, 20, 80); +blendMode(BLEND); // Restore default blend mode +line(60, 20, 80, 80); +line(80, 20, 60, 80); diff --git a/content/handbook_2e/examples/04 Color/Ex_13/Ex_13.pde b/content/handbook_2e/examples/04 Color/Ex_13/Ex_13.pde new file mode 100644 index 000000000..20166c845 --- /dev/null +++ b/content/handbook_2e/examples/04 Color/Ex_13/Ex_13.pde @@ -0,0 +1,2 @@ +// Set the range for the red, green, and blue values from 0.0 to 1.0 +colorMode(RGB, 1.0); diff --git a/content/handbook_2e/examples/04 Color/Ex_14/Ex_14.pde b/content/handbook_2e/examples/04 Color/Ex_14/Ex_14.pde new file mode 100644 index 000000000..406c6f1d3 --- /dev/null +++ b/content/handbook_2e/examples/04 Color/Ex_14/Ex_14.pde @@ -0,0 +1,3 @@ +// Set the range for the hue to values from 0 to 360 and the +// saturation and brightness to values between 0 and 100 +colorMode(HSB, 360, 100, 100); diff --git a/content/handbook_2e/examples/04 Color/Ex_15/Ex_15.pde b/content/handbook_2e/examples/04 Color/Ex_15/Ex_15.pde new file mode 100644 index 000000000..633b07933 --- /dev/null +++ b/content/handbook_2e/examples/04 Color/Ex_15/Ex_15.pde @@ -0,0 +1,11 @@ +// Change the hue, same saturation and brightness +colorMode(HSB, 360, 100, 100); +noStroke(); +fill(0, 100, 100); +rect(0, 0, 25, 100); +fill(90, 100, 100); +rect(25, 0, 25, 100); +fill(180, 100, 100); +rect(50, 0, 25, 100); +fill(270, 100, 100); +rect(75, 0, 25, 100); diff --git a/content/handbook_2e/examples/04 Color/Ex_16/Ex_16.pde b/content/handbook_2e/examples/04 Color/Ex_16/Ex_16.pde new file mode 100644 index 000000000..131615e12 --- /dev/null +++ b/content/handbook_2e/examples/04 Color/Ex_16/Ex_16.pde @@ -0,0 +1,11 @@ +// Change the saturation, same hue and brightness +colorMode(HSB, 360, 100, 100); +noStroke(); +fill(180, 0, 80); +rect(0, 0, 25, 100); +fill(180, 25, 80); +rect(25, 0, 25, 100); +fill(180, 50, 80); +rect(50, 0, 25, 100); +fill(180, 75, 80); +rect(75, 0, 25, 100); diff --git a/content/handbook_2e/examples/04 Color/Ex_17/Ex_17.pde b/content/handbook_2e/examples/04 Color/Ex_17/Ex_17.pde new file mode 100644 index 000000000..ad90c9598 --- /dev/null +++ b/content/handbook_2e/examples/04 Color/Ex_17/Ex_17.pde @@ -0,0 +1,11 @@ +// Change the brightness, same hue and saturation +colorMode(HSB, 360, 100, 100); +noStroke(); +fill(180, 42, 0); +rect(0, 0, 25, 100); +fill(180, 42, 25); +rect(25, 0, 25, 100); +fill(180, 42, 50); +rect(50, 0, 25, 100); +fill(180, 42, 75); +rect(75, 0, 25, 100); diff --git a/content/handbook_2e/examples/04 Color/Ex_18/Ex_18.pde b/content/handbook_2e/examples/04 Color/Ex_18/Ex_18.pde new file mode 100644 index 000000000..2e48e7795 --- /dev/null +++ b/content/handbook_2e/examples/04 Color/Ex_18/Ex_18.pde @@ -0,0 +1,21 @@ +// Shift from red to green in RGB mode + + + + + + + + +colorMode(RGB, 255, 255, 255); +noStroke(); +fill(206, 60, 60); +rect(0, 0, 20, 100); +fill(186, 89, 60); +rect(20, 0, 20, 100); +fill(166, 118, 60); +rect(40, 0, 20, 100); +fill(147, 147, 60); +rect(60, 0, 20, 100); +fill(108, 206, 60); +rect(80, 0, 20, 100); diff --git a/content/handbook_2e/examples/04 Color/Ex_19/Ex_19.pde b/content/handbook_2e/examples/04 Color/Ex_19/Ex_19.pde new file mode 100644 index 000000000..d8383dd42 --- /dev/null +++ b/content/handbook_2e/examples/04 Color/Ex_19/Ex_19.pde @@ -0,0 +1,13 @@ +// Shift from red to green in HSB mode +colorMode(HSB, 360, 100, 100); +noStroke(); +fill(0, 70, 80); +rect(0, 0, 20, 100); +fill(25, 70, 80); +rect(20, 0, 20, 100); +fill(50, 70, 80); +rect(40, 0, 20, 100); +fill(75, 70, 80); +rect(60, 0, 20, 100); +fill(100, 70, 80); +rect(80, 0, 20, 100); diff --git a/content/handbook_2e/examples/04 Color/Ex_20/Ex_20.pde b/content/handbook_2e/examples/04 Color/Ex_20/Ex_20.pde new file mode 100644 index 000000000..19d6951a8 --- /dev/null +++ b/content/handbook_2e/examples/04 Color/Ex_20/Ex_20.pde @@ -0,0 +1,5 @@ +// Code 2-03 rewritten using hex numbers +background(#818257); +noStroke(); +fill(#AEDD3C); +rect(17, 17, 66, 66); diff --git a/content/handbook_2e/examples/05 Variables/Ex_01/Ex_01.pde b/content/handbook_2e/examples/05 Variables/Ex_01/Ex_01.pde new file mode 100644 index 000000000..ee0250e53 --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_01/Ex_01.pde @@ -0,0 +1,6 @@ +int x; // Declare the variable x of type int +float y; // Declare the variable y of type float +boolean b; // Declare the variable b of type boolean +x = 50; // Assign the value 50 to x +y = 12.6; // Assign the value 12.6 to y +b = true; // Assign the value true to b diff --git a/content/handbook_2e/examples/05 Variables/Ex_02/Ex_02.pde b/content/handbook_2e/examples/05 Variables/Ex_02/Ex_02.pde new file mode 100644 index 000000000..8c888e31a --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_02/Ex_02.pde @@ -0,0 +1,3 @@ +int x = 50; +float y = 12.6; +boolean b = true; diff --git a/content/handbook_2e/examples/05 Variables/Ex_03/Ex_03.pde b/content/handbook_2e/examples/05 Variables/Ex_03/Ex_03.pde new file mode 100644 index 000000000..001d725e4 --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_03/Ex_03.pde @@ -0,0 +1,4 @@ +float x, y, z; +x = -3.9; +y = 10.1; +z = 124.23; diff --git a/content/handbook_2e/examples/05 Variables/Ex_04/Ex_04.pde b/content/handbook_2e/examples/05 Variables/Ex_04/Ex_04.pde new file mode 100644 index 000000000..0b4eaa75a --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_04/Ex_04.pde @@ -0,0 +1,3 @@ +int x = 69; // Assign 69 to x +x = 70; // Assign 70 to x +int x = 71; // ERROR! The data type for x is duplicated diff --git a/content/handbook_2e/examples/05 Variables/Ex_05/Ex_05.pde b/content/handbook_2e/examples/05 Variables/Ex_05/Ex_05.pde new file mode 100644 index 000000000..c7f66b12b --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_05/Ex_05.pde @@ -0,0 +1,2 @@ +// Error! The left side of an assignment must be a variable +5 = 12; diff --git a/content/handbook_2e/examples/05 Variables/Ex_06/Ex_06.pde b/content/handbook_2e/examples/05 Variables/Ex_06/Ex_06.pde new file mode 100644 index 000000000..323aa3c4c --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_06/Ex_06.pde @@ -0,0 +1,2 @@ +// Error! It’s not possible to fit a floating-point number into an int +int x = 24.8; diff --git a/content/handbook_2e/examples/05 Variables/Ex_07/Ex_07.pde b/content/handbook_2e/examples/05 Variables/Ex_07/Ex_07.pde new file mode 100644 index 000000000..04339a640 --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_07/Ex_07.pde @@ -0,0 +1,3 @@ +float f = 12.5; +// Error! It’s not possible to fit a floating-point number into an int +int y = f; diff --git a/content/handbook_2e/examples/05 Variables/Ex_08/Ex_08.pde b/content/handbook_2e/examples/05 Variables/Ex_08/Ex_08.pde new file mode 100644 index 000000000..53b7375ad --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_08/Ex_08.pde @@ -0,0 +1,4 @@ +color c1 = color(51); // Creates gray +color c2 = color(51, 204); // Creates gray with transparency +color c3 = color(51, 102, 153); // Creates blue +color c4 = color(51, 102, 153, 51); // Creates blue with transparency diff --git a/content/handbook_2e/examples/05 Variables/Ex_09/Ex_09.pde b/content/handbook_2e/examples/05 Variables/Ex_09/Ex_09.pde new file mode 100644 index 000000000..540912cba --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_09/Ex_09.pde @@ -0,0 +1,6 @@ +color ruby = color(211, 24, 24, 160); +color pink = color(237, 159, 176); +background(pink); +noStroke(); +fill(ruby); +rect(35, 0, 20, 100); diff --git a/content/handbook_2e/examples/05 Variables/Ex_10/Ex_10.pde b/content/handbook_2e/examples/05 Variables/Ex_10/Ex_10.pde new file mode 100644 index 000000000..622576541 --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_10/Ex_10.pde @@ -0,0 +1 @@ +println(width + ", " + height); // Prints "100, 100" to the console diff --git a/content/handbook_2e/examples/05 Variables/Ex_11/Ex_11.pde b/content/handbook_2e/examples/05 Variables/Ex_11/Ex_11.pde new file mode 100644 index 000000000..248c00808 --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_11/Ex_11.pde @@ -0,0 +1,2 @@ +size(300, 400); +println(width + ", " + height); // Prints "300, 400" to the console diff --git a/content/handbook_2e/examples/05 Variables/Ex_12/Ex_12.pde b/content/handbook_2e/examples/05 Variables/Ex_12/Ex_12.pde new file mode 100644 index 000000000..763f5d378 --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_12/Ex_12.pde @@ -0,0 +1,2 @@ +size(1280, 1024); +println(width + ", " + height); // Prints "1280, 1024" to the console diff --git a/content/handbook_2e/examples/05 Variables/Ex_13/Ex_13.pde b/content/handbook_2e/examples/05 Variables/Ex_13/Ex_13.pde new file mode 100644 index 000000000..b08969e6d --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_13/Ex_13.pde @@ -0,0 +1,4 @@ +size(100, 100); +ellipse(width*0.5, height*0.5, width*0.66, height*0.66); +line(width*0.5, 0, width*0.5, height); +line(0, height*0.5, width, height*0.5); diff --git a/content/handbook_2e/examples/05 Variables/Ex_14/Ex_14.pde b/content/handbook_2e/examples/05 Variables/Ex_14/Ex_14.pde new file mode 100644 index 000000000..a26e66a84 --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_14/Ex_14.pde @@ -0,0 +1,6 @@ +int grayVal = 153; +fill(grayVal); +rect(10, 10, 55, 55); // Draw gray rectangle +grayVal = grayVal + 102; // Assign 255 to grayVal +fill(grayVal); +rect(35, 30, 55, 55); // Draw white triangle diff --git a/content/handbook_2e/examples/05 Variables/Ex_15/Ex_15.pde b/content/handbook_2e/examples/05 Variables/Ex_15/Ex_15.pde new file mode 100644 index 000000000..9b314d3d8 --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_15/Ex_15.pde @@ -0,0 +1,5 @@ +int a = 30; +line(a, 0, a, height); +a = a + 40; // Assign 70 to a +strokeWeight(4); +line(a, 0, a, height); diff --git a/content/handbook_2e/examples/05 Variables/Ex_16/Ex_16.pde b/content/handbook_2e/examples/05 Variables/Ex_16/Ex_16.pde new file mode 100644 index 000000000..b31960e7a --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_16/Ex_16.pde @@ -0,0 +1,7 @@ +int a = 30; +int b = 40; +line(a, 0, a, height); +line(b, 0, b, height); +strokeWeight(4); +// A calculation can be used as an input to a function +line(b-a, 0, b-a, height); diff --git a/content/handbook_2e/examples/05 Variables/Ex_17/Ex_17.pde b/content/handbook_2e/examples/05 Variables/Ex_17/Ex_17.pde new file mode 100644 index 000000000..b7d81533f --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_17/Ex_17.pde @@ -0,0 +1,6 @@ +int a = 8; +int b = 10; +line(a, 0, a, height); +line(b, 0, b, height); +strokeWeight(4); +line(a*b, 0, a*b, height); diff --git a/content/handbook_2e/examples/05 Variables/Ex_18/Ex_18.pde b/content/handbook_2e/examples/05 Variables/Ex_18/Ex_18.pde new file mode 100644 index 000000000..1743d416f --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_18/Ex_18.pde @@ -0,0 +1,6 @@ +int a = 8; +int b = 10; +line(a, 0, a, height); +line(b, 0, b, height); +strokeWeight(4); +line(a/b, 0, a/b, height); diff --git a/content/handbook_2e/examples/05 Variables/Ex_19/Ex_19.pde b/content/handbook_2e/examples/05 Variables/Ex_19/Ex_19.pde new file mode 100644 index 000000000..d8b1de859 --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_19/Ex_19.pde @@ -0,0 +1,9 @@ +int y = 20; +line(0, y, width, y); +y = y + 6; // Assign 26 to y +line(0, y, width, y); +y = y + 6; // Assign 32 to y +line(0, y, width, y); +y = y + 6; // Assign 38 to y +line(0, y, width, y); + diff --git a/content/handbook_2e/examples/05 Variables/Ex_20/Ex_20.pde b/content/handbook_2e/examples/05 Variables/Ex_20/Ex_20.pde new file mode 100644 index 000000000..0d3e0ed34 --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_20/Ex_20.pde @@ -0,0 +1,8 @@ +float y = 20; +line(0, y, width, y); +y = y * 1.6; // Assign 32.0 to y +line(0, y, width, y); +y = y * 1.6; // Assign 51.2 to y +line(0, y, width, y); +y = y * 1.6; // Assign 81.920006 to y +line(0, y, width, y); diff --git a/content/handbook_2e/examples/05 Variables/Ex_21/Ex_21.pde b/content/handbook_2e/examples/05 Variables/Ex_21/Ex_21.pde new file mode 100644 index 000000000..5f7c20fd7 --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_21/Ex_21.pde @@ -0,0 +1,4 @@ +println(4/3); // Prints "1" +println(4.0/3); // Prints "1.3333334" +println(4/3.0); // Prints "1.3333334" +println(4.0/3.0); // Prints "1.3333334" diff --git a/content/handbook_2e/examples/05 Variables/Ex_22/Ex_22.pde b/content/handbook_2e/examples/05 Variables/Ex_22/Ex_22.pde new file mode 100644 index 000000000..fa7fce0e4 --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_22/Ex_22.pde @@ -0,0 +1,6 @@ +int a = 4/3; // Assign 1 to a +int b = 3/4; // Assign 0 to b +int c = 4.0/3; // ERROR! +int d = 4.0/3.0; // ERROR! +float e = 4.0/3; // Assign 1.3333334 to e +float f = 4.0/3.0; // Assign 1.3333334 to f diff --git a/content/handbook_2e/examples/05 Variables/Ex_23/Ex_23.pde b/content/handbook_2e/examples/05 Variables/Ex_23/Ex_23.pde new file mode 100644 index 000000000..c57e1aa09 --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_23/Ex_23.pde @@ -0,0 +1,2 @@ +float a = 4/3; // Assign 1.0 to a +float b = 3/4; // Assign 0.0 to b diff --git a/content/handbook_2e/examples/05 Variables/Ex_24/Ex_24.pde b/content/handbook_2e/examples/05 Variables/Ex_24/Ex_24.pde new file mode 100644 index 000000000..14e27263d --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_24/Ex_24.pde @@ -0,0 +1,5 @@ +int i = 4; +float f = 3.0; +int a = i/f; // ERROR! Assign a float value to an int variable +float b = i/f; // Assign 1.3333334 to b + diff --git a/content/handbook_2e/examples/05 Variables/Ex_25/Ex_25.pde b/content/handbook_2e/examples/05 Variables/Ex_25/Ex_25.pde new file mode 100644 index 000000000..bd3c1b521 --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_25/Ex_25.pde @@ -0,0 +1,4 @@ +int a = 0; +int b = 12/a; // ERROR! ArithmeticException: / by zero + + diff --git a/content/handbook_2e/examples/05 Variables/Ex_26/Ex_26.pde b/content/handbook_2e/examples/05 Variables/Ex_26/Ex_26.pde new file mode 100644 index 000000000..55e996907 --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_26/Ex_26.pde @@ -0,0 +1,4 @@ +float a = 0.0001; +float b = 12/a; // Assign 120000.0 to b + + diff --git a/content/handbook_2e/examples/05 Variables/Ex_27/Ex_27.pde b/content/handbook_2e/examples/05 Variables/Ex_27/Ex_27.pde new file mode 100644 index 000000000..d2166991d --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_27/Ex_27.pde @@ -0,0 +1,6 @@ +float f = 12.6; +int i = 127; +f = i; // Converts 127 to 127.0 +i = f; // Error: Can't automatically convert a float to an int + + diff --git a/content/handbook_2e/examples/05 Variables/Ex_28/Ex_28.pde b/content/handbook_2e/examples/05 Variables/Ex_28/Ex_28.pde new file mode 100644 index 000000000..20a2cb6e1 --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_28/Ex_28.pde @@ -0,0 +1,6 @@ +int i = 0; +boolean b = boolean(i); // Assign false to b +int n = 12; +b = boolean(n); // Assign true to b +String s = "false"; +b = boolean(s); // Assign false to b diff --git a/content/handbook_2e/examples/05 Variables/Ex_29/Ex_29.pde b/content/handbook_2e/examples/05 Variables/Ex_29/Ex_29.pde new file mode 100644 index 000000000..85d576243 --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_29/Ex_29.pde @@ -0,0 +1,6 @@ +float f = 65.0; +byte b = byte(f); // Assign 65 to b +char c = 'E'; +b = byte(c); // Assign 69 to b +f = 130.0; +b = byte(f); // Assign -126 to b diff --git a/content/handbook_2e/examples/05 Variables/Ex_30/Ex_30.pde b/content/handbook_2e/examples/05 Variables/Ex_30/Ex_30.pde new file mode 100644 index 000000000..698e8d503 --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_30/Ex_30.pde @@ -0,0 +1,6 @@ +int i = 65; +byte y = 72; +char c = char(i); // Assign 'A' to c +c = char(y); // Assign 'H' to c + + diff --git a/content/handbook_2e/examples/05 Variables/Ex_31/Ex_31.pde b/content/handbook_2e/examples/05 Variables/Ex_31/Ex_31.pde new file mode 100644 index 000000000..5a1d02d7d --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_31/Ex_31.pde @@ -0,0 +1,4 @@ +int i = 2; +int j = 3; +float f1 = i/j; // Assign 0.0 to f1 +float f2 = i/float(j); // Assign 0.6666667 to f2 diff --git a/content/handbook_2e/examples/05 Variables/Ex_32/Ex_32.pde b/content/handbook_2e/examples/05 Variables/Ex_32/Ex_32.pde new file mode 100644 index 000000000..1a66ff714 --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_32/Ex_32.pde @@ -0,0 +1,6 @@ +float f = 65.9; +int i = int(f); // Assign 65 to i +char c = 'E'; +i = int(c); // Assign 69 to i + + diff --git a/content/handbook_2e/examples/05 Variables/Ex_33/Ex_33.pde b/content/handbook_2e/examples/05 Variables/Ex_33/Ex_33.pde new file mode 100644 index 000000000..e8113cb87 --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_33/Ex_33.pde @@ -0,0 +1,2 @@ +float x = 3 + 4 * 5; // Assign 23 to x +float y = (3 + 4) * 5; // Assign 35 to y diff --git a/content/handbook_2e/examples/05 Variables/Ex_34/Ex_34.pde b/content/handbook_2e/examples/05 Variables/Ex_34/Ex_34.pde new file mode 100644 index 000000000..b904df278 --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_34/Ex_34.pde @@ -0,0 +1,2 @@ +float x = 10 * 20 + 5; // Assign 205 to x +float y = (10 * 20) + 5; // Assign 205 to y diff --git a/content/handbook_2e/examples/05 Variables/Ex_35/Ex_35.pde b/content/handbook_2e/examples/05 Variables/Ex_35/Ex_35.pde new file mode 100644 index 000000000..d3f9f860e --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_35/Ex_35.pde @@ -0,0 +1,9 @@ +int x = 1; +println(x); // Prints "1" to the console +x++; // Equivalent to x = x + 1 +println(x); // Prints "2" to the console + +int y = 1; +println(y); // Prints "1" to the console +y--; // Equivalent to y = y - 1 +println(y); // Prints "0" to the console diff --git a/content/handbook_2e/examples/05 Variables/Ex_36/Ex_36.pde b/content/handbook_2e/examples/05 Variables/Ex_36/Ex_36.pde new file mode 100644 index 000000000..7172bff38 --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_36/Ex_36.pde @@ -0,0 +1,3 @@ +int x = 1; +println(x++); // Prints "1" to the console +println(x); // Prints "2" to the console diff --git a/content/handbook_2e/examples/05 Variables/Ex_37/Ex_37.pde b/content/handbook_2e/examples/05 Variables/Ex_37/Ex_37.pde new file mode 100644 index 000000000..7c7be7581 --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_37/Ex_37.pde @@ -0,0 +1,4 @@ +int x = 1; +println(++x); // Prints "2" to the console +println(x); // Prints "2" to the console + diff --git a/content/handbook_2e/examples/05 Variables/Ex_38/Ex_38.pde b/content/handbook_2e/examples/05 Variables/Ex_38/Ex_38.pde new file mode 100644 index 000000000..82cc49167 --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_38/Ex_38.pde @@ -0,0 +1,10 @@ +int x = 1; +println(x); // Prints "1" to the console +x += 5; // Equivalent to x = x + 5 +println(x); // Prints "6" to the console + +int y = 1; +println(y); // Prints "1" to the console +y -= 5; // Equivalent to y = y - 5 +println(y); // Prints "-4" to the console + diff --git a/content/handbook_2e/examples/05 Variables/Ex_39/Ex_39.pde b/content/handbook_2e/examples/05 Variables/Ex_39/Ex_39.pde new file mode 100644 index 000000000..013f75d42 --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_39/Ex_39.pde @@ -0,0 +1,10 @@ +int x = 4; +println(x); // Prints "4" to the console +x *= 2; // Equivalent to x = x * 2 +println(x); // Prints "8" to the console + +int y = 4; +println(y); // Prints "4" to the console +y /= 2; // Equivalent to y = y / 2 +println(y); // Prints "2" to the console + diff --git a/content/handbook_2e/examples/05 Variables/Ex_40/Ex_40.pde b/content/handbook_2e/examples/05 Variables/Ex_40/Ex_40.pde new file mode 100644 index 000000000..746b6ee67 --- /dev/null +++ b/content/handbook_2e/examples/05 Variables/Ex_40/Ex_40.pde @@ -0,0 +1,3 @@ +int x = 5; // Assigns 5 to x +x = -x; // Equivalent to x = x * -1 +println(x); // Prints "-5" diff --git a/content/handbook_2e/examples/06 Flow/Ex_01/Ex_01.pde b/content/handbook_2e/examples/06 Flow/Ex_01/Ex_01.pde new file mode 100644 index 000000000..d7df517d1 --- /dev/null +++ b/content/handbook_2e/examples/06 Flow/Ex_01/Ex_01.pde @@ -0,0 +1,4 @@ +// Print each frame number to the console +void draw() { + println(frameCount); +} diff --git a/content/handbook_2e/examples/06 Flow/Ex_02/Ex_02.pde b/content/handbook_2e/examples/06 Flow/Ex_02/Ex_02.pde new file mode 100644 index 000000000..2122e3604 --- /dev/null +++ b/content/handbook_2e/examples/06 Flow/Ex_02/Ex_02.pde @@ -0,0 +1,5 @@ +// Run at around 4 fps, print each frame number to the console +void draw() { + frameRate(4); + println(frameCount); +} diff --git a/content/handbook_2e/examples/06 Flow/Ex_03/Ex_03.pde b/content/handbook_2e/examples/06 Flow/Ex_03/Ex_03.pde new file mode 100644 index 000000000..db5b5bc29 --- /dev/null +++ b/content/handbook_2e/examples/06 Flow/Ex_03/Ex_03.pde @@ -0,0 +1,7 @@ +float y = 0.0; + +void draw() { + + line(0, y, 100, y); + y = y + 0.5; +} diff --git a/content/handbook_2e/examples/06 Flow/Ex_04/Ex_04.pde b/content/handbook_2e/examples/06 Flow/Ex_04/Ex_04.pde new file mode 100644 index 000000000..91933ed0a --- /dev/null +++ b/content/handbook_2e/examples/06 Flow/Ex_04/Ex_04.pde @@ -0,0 +1,7 @@ +float y = 0.0; + +void draw() { + background(204); + line(0, y, 100, y); + y = y + 0.5; +} diff --git a/content/handbook_2e/examples/06 Flow/Ex_05/Ex_05.pde b/content/handbook_2e/examples/06 Flow/Ex_05/Ex_05.pde new file mode 100644 index 000000000..a84f8af93 --- /dev/null +++ b/content/handbook_2e/examples/06 Flow/Ex_05/Ex_05.pde @@ -0,0 +1,7 @@ +float y = 0.0; + +void draw() { + background(y * 2.5); + line(0, y, 100, y); + y = y + 0.5; +} diff --git a/content/handbook_2e/examples/06 Flow/Ex_06/Ex_06.pde b/content/handbook_2e/examples/06 Flow/Ex_06/Ex_06.pde new file mode 100644 index 000000000..80a4a11c8 --- /dev/null +++ b/content/handbook_2e/examples/06 Flow/Ex_06/Ex_06.pde @@ -0,0 +1,12 @@ +float y = 0.0; + +void setup() { + size(100, 100); + fill(0); +} + +void draw() { + background(204); + ellipse(50, y, 70, 70); + y = y + 0.5; +} diff --git a/content/handbook_2e/examples/06 Flow/Ex_07/Ex_07.pde b/content/handbook_2e/examples/06 Flow/Ex_07/Ex_07.pde new file mode 100644 index 000000000..b635bedc5 --- /dev/null +++ b/content/handbook_2e/examples/06 Flow/Ex_07/Ex_07.pde @@ -0,0 +1,5 @@ +void setup() { + size(100, 100); + fill(0); + ellipse(50, 50, 66, 66); +} diff --git a/content/handbook_2e/examples/06 Flow/Ex_08/Ex_08.pde b/content/handbook_2e/examples/06 Flow/Ex_08/Ex_08.pde new file mode 100644 index 000000000..441e0e20e --- /dev/null +++ b/content/handbook_2e/examples/06 Flow/Ex_08/Ex_08.pde @@ -0,0 +1,9 @@ +void setup() { + size(100, 100); + fill(0); + noLoop(); +} + +void draw() { + ellipse(50, 50, 66, 66); +} diff --git a/content/handbook_2e/examples/06 Flow/Ex_09/Ex_09.pde b/content/handbook_2e/examples/06 Flow/Ex_09/Ex_09.pde new file mode 100644 index 000000000..4851b8116 --- /dev/null +++ b/content/handbook_2e/examples/06 Flow/Ex_09/Ex_09.pde @@ -0,0 +1,15 @@ +println(3 > 5); // Prints "false" +println(5 > 3); // Prints "true" +println(5 > 5); // Prints "false" + +println(3 < 5); // Prints "true" +println(5 < 3); // Prints "false" +println(5 < 5); // Prints "false" + +println(3 >= 5); // Prints "false" +println(5 >= 3); // Prints "true" +println(5 >= 5); // Prints "true" + +println(3 <= 5); // Prints "true" +println(5 <= 3); // Prints "false" +println(5 <= 5); // Prints "true" diff --git a/content/handbook_2e/examples/06 Flow/Ex_10/Ex_10.pde b/content/handbook_2e/examples/06 Flow/Ex_10/Ex_10.pde new file mode 100644 index 000000000..8b3779a73 --- /dev/null +++ b/content/handbook_2e/examples/06 Flow/Ex_10/Ex_10.pde @@ -0,0 +1,7 @@ +println(3 == 5); // Prints "false" +println(5 == 3); // Prints "false" +println(5 == 5); // Prints "true" + +println(3 != 5); // Prints "true" +println(5 != 3); // Prints "true" +println(5 != 5); // Prints "false" diff --git a/content/handbook_2e/examples/06 Flow/Ex_11/Ex_11.pde b/content/handbook_2e/examples/06 Flow/Ex_11/Ex_11.pde new file mode 100644 index 000000000..e6a774bf0 --- /dev/null +++ b/content/handbook_2e/examples/06 Flow/Ex_11/Ex_11.pde @@ -0,0 +1,11 @@ +float y = 0.0; + +void draw() { + background(204); + line(0, y, 100, y); + y = y + 0.5; + if (y > height) { + y = 0.0; + } + println(y); // Print value of y to the console +} diff --git a/content/handbook_2e/examples/06 Flow/Ex_12/Ex_12.pde b/content/handbook_2e/examples/06 Flow/Ex_12/Ex_12.pde new file mode 100644 index 000000000..59e9205d7 --- /dev/null +++ b/content/handbook_2e/examples/06 Flow/Ex_12/Ex_12.pde @@ -0,0 +1,17 @@ +float x = 0; + +void setup() { + size(100, 100); +} + +void draw() { + background(204); + if (x < 20) { // If x is less than 40, + ellipse(50, 50, 60, 60); // draw the ellipse + } + if (x > 80) { // If x is greater than 60 + rect(20, 20, 60, 60); // draw this rectangle + } + line(x, 0, x, 100); + x += 0.25; +} diff --git a/content/handbook_2e/examples/06 Flow/Ex_13/Ex_13.pde b/content/handbook_2e/examples/06 Flow/Ex_13/Ex_13.pde new file mode 100644 index 000000000..67e5a4f04 --- /dev/null +++ b/content/handbook_2e/examples/06 Flow/Ex_13/Ex_13.pde @@ -0,0 +1,16 @@ +float x = 0; + +void setup() { + size(100, 100); +} + +void draw() { + background(204); + if (x < 20) { // If x is less than 20, + ellipse(50, 50, 60, 60); // draw this ellipse, + } else { // else if x is not less, + rect(20, 20, 60, 60); // draw this rectangle + } + line(x, 0, x, 100); + x += 0.25; +} diff --git a/content/handbook_2e/examples/06 Flow/Ex_14/Ex_14.pde b/content/handbook_2e/examples/06 Flow/Ex_14/Ex_14.pde new file mode 100644 index 000000000..b80a48d9b --- /dev/null +++ b/content/handbook_2e/examples/06 Flow/Ex_14/Ex_14.pde @@ -0,0 +1,20 @@ +float x = 0; + +void setup() { + size(100, 100); +} + +void draw() { + background(204); + if (x < 80) { + if (x < 40) { + ellipse(50, 50, 20, 20); // Small circle + } else { + ellipse(50, 50, 60, 60); // Large circle + } + } else { + rect(20, 20, 60, 60); + } + line(x, 0, x, 100); + x += 0.25; +} diff --git a/content/handbook_2e/examples/06 Flow/Ex_15/Ex_15.pde b/content/handbook_2e/examples/06 Flow/Ex_15/Ex_15.pde new file mode 100644 index 000000000..4dba607d6 --- /dev/null +++ b/content/handbook_2e/examples/06 Flow/Ex_15/Ex_15.pde @@ -0,0 +1,23 @@ +float x = 0.0; + +void setup() { + size(100, 100); +} + +void draw() { + background(204); + if (x < 40) { + // If x is less than 40, draw a small circle + ellipse(50, 50, 20, 20); + } else if (x < 80) { + // If the previous test was false and x is + // also less than 80, draw a large circle + ellipse(50, 50, 60, 60); + } else { + // If neither test was true, x is larger than + // or equal to 80, so draw a rectangle + rect(20, 20, 60, 60); + } + line(x, 0, x, 100); + x += 0.25; +} diff --git a/content/handbook_2e/examples/06 Flow/Ex_16/Ex_16.pde b/content/handbook_2e/examples/06 Flow/Ex_16/Ex_16.pde new file mode 100644 index 000000000..196111500 --- /dev/null +++ b/content/handbook_2e/examples/06 Flow/Ex_16/Ex_16.pde @@ -0,0 +1,17 @@ +float x = 0; + +void setup() { + size(100, 100); +} + +void draw() { + background(204); + // The expression "x < 20" must be true OR "x > 80" + // must be true. When one of them is TRUE, the code + // in the block runs. + if ((x < 20) || (x > 80)) { + rect(20, 20, 60, 60); + } + line(x, 0, x, 100); + x += 0.25; +} diff --git a/content/handbook_2e/examples/06 Flow/Ex_17/Ex_17.pde b/content/handbook_2e/examples/06 Flow/Ex_17/Ex_17.pde new file mode 100644 index 000000000..90178b536 --- /dev/null +++ b/content/handbook_2e/examples/06 Flow/Ex_17/Ex_17.pde @@ -0,0 +1,17 @@ +float x = 0; + +void setup() { + size(100, 100); +} + +void draw() { + background(204); + // The expression "x > 20" must be true AND "x < 80" + // must be true. When both are TRUE, the code + // in the block runs. + if ((x > 20) && (x < 80)) { + rect(20, 20, 60, 60); + } + line(x, 0, x, 100); + x += 0.25; +} diff --git a/content/handbook_2e/examples/06 Flow/Ex_18/Ex_18.pde b/content/handbook_2e/examples/06 Flow/Ex_18/Ex_18.pde new file mode 100644 index 000000000..149974a11 --- /dev/null +++ b/content/handbook_2e/examples/06 Flow/Ex_18/Ex_18.pde @@ -0,0 +1,10 @@ +boolean b = true; // Assign true to b +println(b); // Prints "true" +println(!b); // Prints "false" +b = !b; // Assign false to b +println(b); // Prints "false" +println(!b); // Prints "true" +println(5 > 3); // Prints "true" +println(!(5 > 3)); // Prints "false" +int x = 5; +println(!x); // ERROR! It's only possible to ! a boolean variable diff --git a/content/handbook_2e/examples/06 Flow/Ex_19/Ex_19.pde b/content/handbook_2e/examples/06 Flow/Ex_19/Ex_19.pde new file mode 100644 index 000000000..5d48bf248 --- /dev/null +++ b/content/handbook_2e/examples/06 Flow/Ex_19/Ex_19.pde @@ -0,0 +1,8 @@ +// Because b is true, the line draws +boolean b = true; +if (b == true) { // If b is true, + line(20, 50, 80, 50); // draw the line +} +if (!b == true) { // If b is false, + ellipse(50, 50, 36, 36); // draw the ellipse +} diff --git a/content/handbook_2e/examples/06 Flow/Ex_20/Ex_20.pde b/content/handbook_2e/examples/06 Flow/Ex_20/Ex_20.pde new file mode 100644 index 000000000..d6718feab --- /dev/null +++ b/content/handbook_2e/examples/06 Flow/Ex_20/Ex_20.pde @@ -0,0 +1,14 @@ +int d = 51; // Variable d can be used everywhere + +void setup() { + size(100, 100); + int val = d * 2; // Local variable val can only be used in setup() + fill(val); +} + +void draw() { + int y = 60; // Local variable y can only be used in draw() + line(0, y, d, y); + y -= 25; + line(0, y, d, y); +} diff --git a/content/handbook_2e/examples/06 Flow/Ex_21/Ex_21.pde b/content/handbook_2e/examples/06 Flow/Ex_21/Ex_21.pde new file mode 100644 index 000000000..afc77cbcd --- /dev/null +++ b/content/handbook_2e/examples/06 Flow/Ex_21/Ex_21.pde @@ -0,0 +1,9 @@ +void draw() { + int d = 80; // This variable can be used everywhere in draw() + if (d > 50) { + int x = 10; // This variable can be used only in this if block + line(x, 40, x+d, 40); + } + line(0, 50, d, 50); + line(x, 60, x+d, 60); // ERROR! x can't be read outside block +} diff --git a/content/handbook_2e/examples/06 Flow/Ex_22/Ex_22.pde b/content/handbook_2e/examples/06 Flow/Ex_22/Ex_22.pde new file mode 100644 index 000000000..5e0987650 --- /dev/null +++ b/content/handbook_2e/examples/06 Flow/Ex_22/Ex_22.pde @@ -0,0 +1,11 @@ +int d = 45; // Assign 45 to variable d + +void setup() { + size(100, 100); + int d = 90; // Assign 90 to local variable d + rect(0, 0, 33, d); // Use local d with value 90 +} + +void draw() { + rect(33, 0, 33, d); // Use d with value 45 +} diff --git a/content/handbook_2e/examples/06 Flow/Ex_23/Ex_23.pde b/content/handbook_2e/examples/06 Flow/Ex_23/Ex_23.pde new file mode 100644 index 000000000..1bd55abf8 --- /dev/null +++ b/content/handbook_2e/examples/06 Flow/Ex_23/Ex_23.pde @@ -0,0 +1,7 @@ +int x = 50; + +if (x > 100) { + line(20, 20, 80, 80); +} else { + line(80, 20, 20, 80); +} diff --git a/content/handbook_2e/examples/06 Flow/Ex_24/Ex_24.pde b/content/handbook_2e/examples/06 Flow/Ex_24/Ex_24.pde new file mode 100644 index 000000000..4231218f3 --- /dev/null +++ b/content/handbook_2e/examples/06 Flow/Ex_24/Ex_24.pde @@ -0,0 +1,10 @@ +int x = 50; + +if (x > 100) +{ + line(20, 20, 80, 80); +} +else +{ + line(20, 80, 80, 20); +} diff --git a/content/handbook_2e/examples/06 Flow/Ex_25/Ex_25.pde b/content/handbook_2e/examples/06 Flow/Ex_25/Ex_25.pde new file mode 100644 index 000000000..7672892d6 --- /dev/null +++ b/content/handbook_2e/examples/06 Flow/Ex_25/Ex_25.pde @@ -0,0 +1,7 @@ +int x = 50; + +if (x > 100) { +line(20, 20, 80, 80); // Avoid formatting code like this +} else { // because it makes it difficult to see +line(80, 20, 20, 80); // what is inside the block +} diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_01/Ex_01.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_01/Ex_01.pde new file mode 100644 index 000000000..bd5bdc483 --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_01/Ex_01.pde @@ -0,0 +1,5 @@ +void draw() { + frameRate(12); + println(mouseX + " : " + mouseY); +} + diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_02/Ex_02.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_02/Ex_02.pde new file mode 100644 index 000000000..8e50a9610 --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_02/Ex_02.pde @@ -0,0 +1,9 @@ +void setup() { + size(100, 100); + noStroke(); +} + +void draw() { + background(126); + ellipse(mouseX, mouseY, 33, 33); +} diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_02/sketch.properties b/content/handbook_2e/examples/07 Interactivitiy/Ex_02/sketch.properties new file mode 100644 index 000000000..8630fa24a --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_02/sketch.properties @@ -0,0 +1,2 @@ +mode.id=processing.mode.java.JavaMode +mode=Java diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_03/Ex_03.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_03/Ex_03.pde new file mode 100644 index 000000000..cc7a23a34 --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_03/Ex_03.pde @@ -0,0 +1,12 @@ +void setup() { + size(100, 100); + noStroke(); +} + +void draw() { + background(126); + ellipse(mouseX, 16, 33, 33); // Top circle + ellipse(mouseX+20, 50, 33, 33); // Middle circle + ellipse(mouseX-20, 84, 33, 33); // Bottom circle +} + diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_04/Ex_04.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_04/Ex_04.pde new file mode 100644 index 000000000..66f002fa1 --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_04/Ex_04.pde @@ -0,0 +1,11 @@ +void setup() { + size(100, 100); + noStroke(); +} + +void draw() { + background(126); + ellipse(mouseX, 16, 33, 33); // Top circle + ellipse(mouseX/2, 50, 33, 33); // Middle circle + ellipse(mouseX*2, 84, 33, 33); // Bottom circle +} diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_05/Ex_05.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_05/Ex_05.pde new file mode 100644 index 000000000..5528fdd01 --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_05/Ex_05.pde @@ -0,0 +1,16 @@ +void setup() { + size(100, 100); + noStroke(); +} + +void draw() { + float x = mouseX; + float y = mouseY; + float ix = width - mouseX; // Inverse X + float iy = height - mouseY; // Inverse Y + background(126); + fill(255, 150); + ellipse(x, height/2, y, y); + fill(0, 159); + ellipse(ix, height/2, iy, iy); +} diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_06/Ex_06.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_06/Ex_06.pde new file mode 100644 index 000000000..d6f2195fd --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_06/Ex_06.pde @@ -0,0 +1,4 @@ +void draw() { + frameRate(12); + println(pmouseX - mouseX); +} diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_07/Ex_07.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_07/Ex_07.pde new file mode 100644 index 000000000..dc2cec736 --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_07/Ex_07.pde @@ -0,0 +1,9 @@ +void setup() { + size(100, 100); + strokeWeight(8); +} + +void draw() { + background(204); + line(mouseX, mouseY, pmouseX, pmouseY); +} diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_08/Ex_08.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_08/Ex_08.pde new file mode 100644 index 000000000..38089f55f --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_08/Ex_08.pde @@ -0,0 +1,15 @@ +void setup() { + size(100, 100); + noStroke(); + fill(0); +} + +void draw() { + background(204); + if (mouseX < 50) { + rect(0, 0, 50, 100); // Left + } else { + rect(50, 0, 50, 100); // Right + } +} + diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_09/Ex_09.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_09/Ex_09.pde new file mode 100644 index 000000000..f46ebf86c --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_09/Ex_09.pde @@ -0,0 +1,17 @@ +void setup() { + size(100, 100); + noStroke(); + fill(0); +} + +void draw() { + background(204); + if (mouseX < 33) { + rect(0, 0, 33, 100); // Left + } else if (mouseX < 66) { + rect(33, 0, 33, 100); // Middle + } else { + rect(66, 0, 33, 100); // Right + } +} + diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_10/Ex_10.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_10/Ex_10.pde new file mode 100644 index 000000000..b22d3cb85 --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_10/Ex_10.pde @@ -0,0 +1,17 @@ +void setup() { + size(100, 100); + noStroke(); + fill(0); +} + +void draw() { + background(204); + if ((mouseX > 40) && (mouseX < 80) && + (mouseY > 20) && (mouseY < 80)) { + fill(255); + } else { + fill(0); + } + rect(40, 20, 40, 60); +} + diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_11/Ex_11.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_11/Ex_11.pde new file mode 100644 index 000000000..a10f2a184 --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_11/Ex_11.pde @@ -0,0 +1,16 @@ +void setup() { + size(100, 100); + noStroke(); + fill(0); +} + +void draw() { + background(204); + if ((mouseX <= 50) && (mouseY <= 50)) { + rect(0, 0, 50, 50); // Upper-left + } else if ((mouseX <= 50) && (mouseY > 50)) { rect(0, 50, 50, 50); // Lower-left + } else if ((mouseX > 50) && (mouseY < 50)) { rect(50, 0, 50, 50); // Upper-right + } else { + rect(50, 50, 50, 50); // Lower-right + } +} diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_12/Ex_12.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_12/Ex_12.pde new file mode 100644 index 000000000..371560eab --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_12/Ex_12.pde @@ -0,0 +1,14 @@ +void setup() { + size(100, 100); +} + +void draw() { + background(204); + if (mousePressed == true) { + fill(255); // White + } else { + fill(0); // Black + } + rect(25, 25, 50, 50); +} + diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_13/Ex_13.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_13/Ex_13.pde new file mode 100644 index 000000000..2e9a7d31e --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_13/Ex_13.pde @@ -0,0 +1,15 @@ +void setup() { + size(100, 100); +} + +void draw() { + if (mouseButton == LEFT) { + fill(0); // Black + } else if (mouseButton == RIGHT) { + fill(255); // White + } else { + fill(126); // Gray + } + rect(25, 25, 50, 50); +} + diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_14/Ex_14.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_14/Ex_14.pde new file mode 100644 index 000000000..6abf9d93f --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_14/Ex_14.pde @@ -0,0 +1,15 @@ +void setup() { + size(100, 100); +} + +void draw() { + if (mousePressed == true) { + if (mouseButton == LEFT) { + fill(0); // Black + } else if (mouseButton == RIGHT) { + fill(255); // White + } + } else { + fill(126); // Gray + } rect(25, 25, 50, 50); +} diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_15/Ex_15.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_15/Ex_15.pde new file mode 100644 index 000000000..da8a9c635 --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_15/Ex_15.pde @@ -0,0 +1,15 @@ +void setup() { + size(100, 100); + + strokeWeight(4); +} + +void draw() { + background(204); + if (keyPressed == true) { // If the key is pressed, + line(20, 20, 80, 80); // draw a line + } else { // Otherwise, + rect(40, 40, 20, 20); // draw a rectangle + } +} + diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_16/Ex_16.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_16/Ex_16.pde new file mode 100644 index 000000000..a24074206 --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_16/Ex_16.pde @@ -0,0 +1,14 @@ +int x = 20; + +void setup() { + size(100, 100); + strokeWeight(4); +} + +void draw() { + background(204); + if (keyPressed == true) { // If the key is pressed + x++; // add 1 to x + } + line(x, 20, x-60, 80); +} diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_17/Ex_17.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_17/Ex_17.pde new file mode 100644 index 000000000..616eddcca --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_17/Ex_17.pde @@ -0,0 +1,9 @@ +void setup() { + size(100, 100); + textSize(60); +} + +void draw() { + background(0); + text(key, 20, 75); // Draw at coordinate (20,75) +} diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_18/Ex_18.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_18/Ex_18.pde new file mode 100644 index 000000000..cfa9cfb9c --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_18/Ex_18.pde @@ -0,0 +1,14 @@ +void setup() { + size(100, 100); + strokeWeight(4); +} + +void draw() { + background(204); + // If the 'A' key is pressed draw a line + if ((keyPressed == true) && (key == 'A')) { + line(50, 25, 50, 75); + } else { // Otherwise, draw an ellipse + ellipse(50, 50, 50, 50); + } +} diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_19/Ex_19.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_19/Ex_19.pde new file mode 100644 index 000000000..b06d91704 --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_19/Ex_19.pde @@ -0,0 +1,12 @@ +void setup() { + size(100, 100); + stroke(0); +} + +void draw() { + if (keyPressed == true) { + int x = key - 32; + line(x, 0, x, height); + } +} + diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_20/Ex_20.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_20/Ex_20.pde new file mode 100644 index 000000000..0d59fce80 --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_20/Ex_20.pde @@ -0,0 +1,19 @@ +float angle = 0; + +void setup() { + size(100, 100); + fill(0); +} + +void draw() { + background(204); + if (keyPressed == true) { + if ((key >= 32) && (key <= 126)) { + // If the key is alphanumeric, + // convert its value into an angle + angle = map(key, 32, 126, 0, 360); + } + } + arc(50, 50, 66, 66, 0, radians(angle)); +} + diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_21/Ex_21.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_21/Ex_21.pde new file mode 100644 index 000000000..a1bfaeeb0 --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_21/Ex_21.pde @@ -0,0 +1,21 @@ +int y = 35; + +void setup() { + size(100, 100); +} + +void draw() { + background(204); + line(10, 50, 90, 50); + if (key == CODED) { + if (keyCode == UP) { + y = 20; + } else if (keyCode == DOWN) { + y = 50; + } + } else { + y = 35; + } + rect(25, y, 50, 30); +} + diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_22/Ex_22.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_22/Ex_22.pde new file mode 100644 index 000000000..b64bc1ba0 --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_22/Ex_22.pde @@ -0,0 +1,13 @@ +int gray = 0; + +void setup() { + size(100, 100); +} + +void draw() { + background(gray); +} + +void mousePressed() { + gray += 20; +} diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_23/Ex_23.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_23/Ex_23.pde new file mode 100644 index 000000000..13b03cffb --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_23/Ex_23.pde @@ -0,0 +1,13 @@ +int gray = 0; + +void setup() { + size(100, 100); +} + +void draw() { + background(gray); +} + +void mouseReleased() { + gray += 20; +} diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_23/sketch.properties b/content/handbook_2e/examples/07 Interactivitiy/Ex_23/sketch.properties new file mode 100644 index 000000000..8630fa24a --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_23/sketch.properties @@ -0,0 +1,2 @@ +mode.id=processing.mode.java.JavaMode +mode=Java diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_24/Ex_24.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_24/Ex_24.pde new file mode 100644 index 000000000..20de75fa8 --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_24/Ex_24.pde @@ -0,0 +1,10 @@ +void setup() { + size(100, 100); + fill(0, 102); +} + +void draw() { } // Empty draw() keeps the program running + +void mousePressed() { + rect(mouseX, mouseY, 33, 33); +} diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_25/Ex_25.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_25/Ex_25.pde new file mode 100644 index 000000000..12fd34798 --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_25/Ex_25.pde @@ -0,0 +1,24 @@ +int dragX, dragY, moveX, moveY; + +void setup() { + size(100, 100); + noStroke(); +} + +void draw() { + background(204); + fill(0); + ellipse(dragX, dragY, 33, 33); // Black circle + fill(153); + ellipse(moveX, moveY, 33, 33); // Gray circle +} + +void mouseMoved() { // Move gray circle + moveX = mouseX; + moveY = mouseY; +} + +void mouseDragged() { // Move black circle + dragX = mouseX; + dragY = mouseY; +} diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_26/Ex_26.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_26/Ex_26.pde new file mode 100644 index 000000000..abc009c97 --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_26/Ex_26.pde @@ -0,0 +1,20 @@ +boolean drawT = false; + +void setup() { + size(100, 100); + noStroke(); +} + +void draw() { + background(204); + if (drawT == true) { + rect(20, 20, 60, 20); + rect(39, 40, 22, 45); + } +} +void keyPressed() { + if ((key == 'T') || (key == 't')) { + drawT = true; + } +} + diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_27/Ex_27.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_27/Ex_27.pde new file mode 100644 index 000000000..1b69b5d58 --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_27/Ex_27.pde @@ -0,0 +1,24 @@ +boolean drawT = false; + +void setup() { + size(100, 100); + noStroke(); +} + +void draw() { + background(204); + if (drawT == true) { + rect(20, 20, 60, 20); + rect(39, 40, 22, 45); + } +} + +void keyPressed() { + if ((key == 'T') || (key == 't')) { + drawT = true; + } +} + +void keyReleased() { + drawT = false; +} diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_28/Ex_28.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_28/Ex_28.pde new file mode 100644 index 000000000..a222db712 --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_28/Ex_28.pde @@ -0,0 +1,23 @@ +int frame = 0; + +void setup() { + size(100, 100); +} + +void draw() { + if (frame > 120) { // If 120 frames since the mouse + noLoop(); // was pressed, stop the program + background(0); // and turn the background black. + } else { // Otherwise, set the background + background(204); // to light gray and draw lines + line(mouseX, 0, mouseX, 100); // at the mouse position + line(0, mouseY, 100, mouseY); + frame++; + } +} + +void mousePressed() { + loop(); + frame = 0; +} + diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_29/Ex_29.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_29/Ex_29.pde new file mode 100644 index 000000000..bd3a7277d --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_29/Ex_29.pde @@ -0,0 +1,14 @@ +void setup() { + size(100, 100); + noLoop(); +} + +void draw() { + background(204); + line(mouseX, 0, mouseX, 100); + line(0, mouseY, 100, mouseY); +} + +void mousePressed() { + redraw(); // Run the code in draw one time +} diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_30/Ex_30.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_30/Ex_30.pde new file mode 100644 index 000000000..e829403ca --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_30/Ex_30.pde @@ -0,0 +1,10 @@ +void setup() { + size(100, 100); + strokeWeight(7); + noCursor(); +} + +void draw() { + background(204); + ellipse(mouseX, mouseY, 10, 10); +} diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_31/Ex_31.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_31/Ex_31.pde new file mode 100644 index 000000000..84d7e06d0 --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_31/Ex_31.pde @@ -0,0 +1,12 @@ +void setup() { + size(100, 100); + noCursor(); +} + +void draw() { + background(204); + if (mousePressed == true) { + cursor(); + } +} + diff --git a/content/handbook_2e/examples/07 Interactivitiy/Ex_32/Ex_32.pde b/content/handbook_2e/examples/07 Interactivitiy/Ex_32/Ex_32.pde new file mode 100644 index 000000000..301342303 --- /dev/null +++ b/content/handbook_2e/examples/07 Interactivitiy/Ex_32/Ex_32.pde @@ -0,0 +1,15 @@ +void setup() { + size(100, 100); +} + +void draw() { + background(204); + if (mousePressed == true) { + cursor(HAND); // Draw cursor as hand + } else { + cursor(CROSS); + } + line(mouseX, 0, mouseX, height); + line(0, mouseY, height, mouseY); +} + diff --git a/content/handbook_2e/examples/08 Repeat/Ex_01/Ex_01.pde b/content/handbook_2e/examples/08 Repeat/Ex_01/Ex_01.pde new file mode 100644 index 000000000..ad0cd037d --- /dev/null +++ b/content/handbook_2e/examples/08 Repeat/Ex_01/Ex_01.pde @@ -0,0 +1,6 @@ +int counter = 0; +while (counter < 12) { + int y = 20 + (counter * 5); + line(20, y, 80, y+15); + counter += 1; +} diff --git a/content/handbook_2e/examples/08 Repeat/Ex_02/Ex_02.pde b/content/handbook_2e/examples/08 Repeat/Ex_02/Ex_02.pde new file mode 100644 index 000000000..2657ad625 --- /dev/null +++ b/content/handbook_2e/examples/08 Repeat/Ex_02/Ex_02.pde @@ -0,0 +1,5 @@ +int y = 20; +while (y < 80) { + line(20, y, 80, y+15); + y += 5; +} diff --git a/content/handbook_2e/examples/08 Repeat/Ex_03/Ex_03.pde b/content/handbook_2e/examples/08 Repeat/Ex_03/Ex_03.pde new file mode 100644 index 000000000..e151a59ca --- /dev/null +++ b/content/handbook_2e/examples/08 Repeat/Ex_03/Ex_03.pde @@ -0,0 +1,11 @@ +int x = -16; +while (x < 100) { + line(x, 0, x+15, 50); + x += 10; +} +strokeWeight(4); +x = -8; +while (x < 100) { + line(x, 50, x+15, 100); + x += 10; +} diff --git a/content/handbook_2e/examples/08 Repeat/Ex_04/Ex_04.pde b/content/handbook_2e/examples/08 Repeat/Ex_04/Ex_04.pde new file mode 100644 index 000000000..36babb378 --- /dev/null +++ b/content/handbook_2e/examples/08 Repeat/Ex_04/Ex_04.pde @@ -0,0 +1,6 @@ +int n = 10; +while (n > 0) { + println(n); + n--; +} +println("Blastoff!"); diff --git a/content/handbook_2e/examples/08 Repeat/Ex_05/Ex_05.pde b/content/handbook_2e/examples/08 Repeat/Ex_05/Ex_05.pde new file mode 100644 index 000000000..2a09fc9c5 --- /dev/null +++ b/content/handbook_2e/examples/08 Repeat/Ex_05/Ex_05.pde @@ -0,0 +1,5 @@ +for (int y = 20; y < 80; y += 5) { + // This line will continue to run until "y" + // is greater than or equal to 80 + line(20, y, 80, y+15); +} diff --git a/content/handbook_2e/examples/08 Repeat/Ex_06/Ex_06.pde b/content/handbook_2e/examples/08 Repeat/Ex_06/Ex_06.pde new file mode 100644 index 000000000..134927f23 --- /dev/null +++ b/content/handbook_2e/examples/08 Repeat/Ex_06/Ex_06.pde @@ -0,0 +1,7 @@ +for (int x = -16; x < 100; x += 10) { + line(x, 0, x+15, 50); +} +strokeWeight(4); +for (int x = -8; x < 100; x += 10) { + line(x, 50, x+15, 100); +} diff --git a/content/handbook_2e/examples/08 Repeat/Ex_07/Ex_07.pde b/content/handbook_2e/examples/08 Repeat/Ex_07/Ex_07.pde new file mode 100644 index 000000000..f992abfbe --- /dev/null +++ b/content/handbook_2e/examples/08 Repeat/Ex_07/Ex_07.pde @@ -0,0 +1,4 @@ +noFill(); +for (int d = 150; d > 0; d -= 10) { + ellipse(50, 50, d, d); +} diff --git a/content/handbook_2e/examples/08 Repeat/Ex_08/Ex_08.pde b/content/handbook_2e/examples/08 Repeat/Ex_08/Ex_08.pde new file mode 100644 index 000000000..983b39afa --- /dev/null +++ b/content/handbook_2e/examples/08 Repeat/Ex_08/Ex_08.pde @@ -0,0 +1,7 @@ +background(255); +strokeWeight(2); +for (int i = 0; i < 100; i += 4) { + // The variable is used for the position and gray value + stroke(i*2.5); + line(i, 0, i, 200); +} diff --git a/content/handbook_2e/examples/08 Repeat/Ex_09/Ex_09.pde b/content/handbook_2e/examples/08 Repeat/Ex_09/Ex_09.pde new file mode 100644 index 000000000..04abab9ee --- /dev/null +++ b/content/handbook_2e/examples/08 Repeat/Ex_09/Ex_09.pde @@ -0,0 +1,6 @@ +// Calculates the powers of two from 2 to 1024 +int p = 1; +for (int i = 0; i < 10; i++) { + p = p * 2; + println(p); +} diff --git a/content/handbook_2e/examples/08 Repeat/Ex_10/Ex_10.pde b/content/handbook_2e/examples/08 Repeat/Ex_10/Ex_10.pde new file mode 100644 index 000000000..12d9b1b1b --- /dev/null +++ b/content/handbook_2e/examples/08 Repeat/Ex_10/Ex_10.pde @@ -0,0 +1,6 @@ +// Halves a number 10 times +float num = 20; +for (int i = 0; i < 10; i++) { + num = num / 2.0; + println(num); +} diff --git a/content/handbook_2e/examples/08 Repeat/Ex_11/Ex_11.pde b/content/handbook_2e/examples/08 Repeat/Ex_11/Ex_11.pde new file mode 100644 index 000000000..d12b31775 --- /dev/null +++ b/content/handbook_2e/examples/08 Repeat/Ex_11/Ex_11.pde @@ -0,0 +1,12 @@ +void setup() { + size(100, 100); + strokeWeight(2); +} + +void draw() { + background(204); + // Draw more lines as mouseX increases + for (int i = 10; i < mouseX; i+=5) { + line(i, 10, i, 90); + } +} diff --git a/content/handbook_2e/examples/08 Repeat/Ex_12/Ex_12.pde b/content/handbook_2e/examples/08 Repeat/Ex_12/Ex_12.pde new file mode 100644 index 000000000..8a9c8f742 --- /dev/null +++ b/content/handbook_2e/examples/08 Repeat/Ex_12/Ex_12.pde @@ -0,0 +1,11 @@ +void setup() { + size(100, 100); +} + +void draw() { + int x = 0; + while (x < width) { + line(x, 20, x, 80); + x += 2; + } +} diff --git a/content/handbook_2e/examples/08 Repeat/Ex_13/Ex_13.pde b/content/handbook_2e/examples/08 Repeat/Ex_13/Ex_13.pde new file mode 100644 index 000000000..4c0c31d14 --- /dev/null +++ b/content/handbook_2e/examples/08 Repeat/Ex_13/Ex_13.pde @@ -0,0 +1,10 @@ +int x = 0; + +void setup() { + size(100, 100); +} + +void draw() { + line(x, 20, x, 80); + x += 2; +} diff --git a/content/handbook_2e/examples/08 Repeat/Ex_14/Ex_14.pde b/content/handbook_2e/examples/08 Repeat/Ex_14/Ex_14.pde new file mode 100644 index 000000000..1d0d13fdf --- /dev/null +++ b/content/handbook_2e/examples/08 Repeat/Ex_14/Ex_14.pde @@ -0,0 +1,4 @@ +// The variable y iterates from 10 to 90 to draw the point 9 times +for (int y = 10; y < 100; y += 10) { + point(10, y); +} diff --git a/content/handbook_2e/examples/08 Repeat/Ex_15/Ex_15.pde b/content/handbook_2e/examples/08 Repeat/Ex_15/Ex_15.pde new file mode 100644 index 000000000..6f0b27545 --- /dev/null +++ b/content/handbook_2e/examples/08 Repeat/Ex_15/Ex_15.pde @@ -0,0 +1,4 @@ +// The variable x iterates from 10 to 90 to draw the point 9 times +for (int x = 10; x < 100; x += 10) { + point(x, 10); +} diff --git a/content/handbook_2e/examples/08 Repeat/Ex_16/Ex_16.pde b/content/handbook_2e/examples/08 Repeat/Ex_16/Ex_16.pde new file mode 100644 index 000000000..4896fe8ec --- /dev/null +++ b/content/handbook_2e/examples/08 Repeat/Ex_16/Ex_16.pde @@ -0,0 +1,8 @@ +// The variable y iterates from 10 to 90 to draw +// the point 9 times and the variable x iterates from +// 10 to 90 to draw the point 81 times +for (int y = 10; y < 100; y += 10) { + for (int x = 10; x < 100; x += 10) { + point(x, y); + } +} diff --git a/content/handbook_2e/examples/08 Repeat/Ex_17/Ex_17.pde b/content/handbook_2e/examples/08 Repeat/Ex_17/Ex_17.pde new file mode 100644 index 000000000..ae9a0a50c --- /dev/null +++ b/content/handbook_2e/examples/08 Repeat/Ex_17/Ex_17.pde @@ -0,0 +1,7 @@ +fill(0); +noStroke(); +for (int y = -10; y <= 100; y += 10) { + for (int x = -40; x <= 100; x += 10) { + ellipse(x + y/3.0, y + x/8.0, 4, 7); + } +} diff --git a/content/handbook_2e/examples/08 Repeat/Ex_18/Ex_18.pde b/content/handbook_2e/examples/08 Repeat/Ex_18/Ex_18.pde new file mode 100644 index 000000000..4b88ec5da --- /dev/null +++ b/content/handbook_2e/examples/08 Repeat/Ex_18/Ex_18.pde @@ -0,0 +1,7 @@ +noStroke(); +for (int y = 0; y < 100; y += 10) { + for (int x = 0; x < 100; x += 10) { + fill((x+y) * 1.4); + rect(x, y, 10, 10); + } +} diff --git a/content/handbook_2e/examples/08 Repeat/Ex_19/Ex_19.pde b/content/handbook_2e/examples/08 Repeat/Ex_19/Ex_19.pde new file mode 100644 index 000000000..0b16ed049 --- /dev/null +++ b/content/handbook_2e/examples/08 Repeat/Ex_19/Ex_19.pde @@ -0,0 +1,6 @@ +for (int y = 1; y < 100; y += 10) { + for (int x = 1; x < y; x += 10) { + line(x, y, x+6, y+6); + line(x+6, y, x, y+6); + } +} diff --git a/content/handbook_2e/examples/08 Repeat/Ex_20/Ex_20.pde b/content/handbook_2e/examples/08 Repeat/Ex_20/Ex_20.pde new file mode 100644 index 000000000..a4e0bf950 --- /dev/null +++ b/content/handbook_2e/examples/08 Repeat/Ex_20/Ex_20.pde @@ -0,0 +1,4 @@ +rectMode(CENTER); +for (int d = 18; d > 0; d -= 4) { + rect(50, 50, d, d); +} diff --git a/content/handbook_2e/examples/08 Repeat/Ex_21/Ex_21.pde b/content/handbook_2e/examples/08 Repeat/Ex_21/Ex_21.pde new file mode 100644 index 000000000..acc27ec07 --- /dev/null +++ b/content/handbook_2e/examples/08 Repeat/Ex_21/Ex_21.pde @@ -0,0 +1,9 @@ +background(255); +rectMode(CENTER); +for (int y = 9; y < height; y += 20) { + for (int x = 9; x < width; x += 20) { + for (int d = 18; d > 0; d -= 4) { + rect(x, y, d, d); + } + } +} diff --git a/content/handbook_2e/examples/08 Repeat/Ex_21/code/sketch.properties b/content/handbook_2e/examples/08 Repeat/Ex_21/code/sketch.properties new file mode 100644 index 000000000..a4db1e37a --- /dev/null +++ b/content/handbook_2e/examples/08 Repeat/Ex_21/code/sketch.properties @@ -0,0 +1,2 @@ +mode.id=processing.mode.experimental.ExperimentalMode +mode=Java diff --git a/content/handbook_2e/examples/09 Synthesis 1/Ex_01/Ex_01.pde b/content/handbook_2e/examples/09 Synthesis 1/Ex_01/Ex_01.pde new file mode 100644 index 000000000..4f71eadd4 --- /dev/null +++ b/content/handbook_2e/examples/09 Synthesis 1/Ex_01/Ex_01.pde @@ -0,0 +1,19 @@ +void setup() { + size(600, 600); +} + +void draw() { + background(0); + stroke(102); + line(0, height/2, width, height/2); + noStroke(); + fill(255, 204); + int d = mouseY/2+10; // Diameter + ellipse(mouseX, height/2, d, d); + fill(255, 204); + int iX = width-mouseX; // Inverse X + int iY = height-mouseY; // Inverse Y + int iD = (iY/2)+10; // Inverse diameter + ellipse(iX, height/2, iD, iD); +} + diff --git a/content/handbook_2e/examples/09 Synthesis 1/Ex_02/Ex_02.pde b/content/handbook_2e/examples/09 Synthesis 1/Ex_02/Ex_02.pde new file mode 100644 index 000000000..51722bb80 --- /dev/null +++ b/content/handbook_2e/examples/09 Synthesis 1/Ex_02/Ex_02.pde @@ -0,0 +1,29 @@ +void setup() { + size(600, 600); + strokeWeight(2); + noCursor(); +} + +void draw() { + background(102); + + noStroke(); + fill(0); + rect(150, 150, 300, 300); + + stroke(255); + if ((mouseX > 150) && (mouseX < 450) && + (mouseY > 150) && (mouseY < 450)) { + line(0, 0, 150, 150); // Upper-left + line(600, 0, 450, 150); // Upper-right + line(450, 450, 600, 600); // Lower-right + line(0, 600, 150, 450); // Lower-left + } else { + line(150, 150, 450, 450); // Upper-left to lower-right + line(150, 450, 450, 150); // Lower-left to upper-right + } + + noStroke(); + fill(0); + ellipse(mouseX, mouseY, 12, 12); +} diff --git a/content/handbook_2e/examples/09 Synthesis 1/Ex_03/Ex_03.pde b/content/handbook_2e/examples/09 Synthesis 1/Ex_03/Ex_03.pde new file mode 100644 index 000000000..f339dc866 --- /dev/null +++ b/content/handbook_2e/examples/09 Synthesis 1/Ex_03/Ex_03.pde @@ -0,0 +1,18 @@ +int gap = 20; // Distance between arcs +int thickness = 2; // Thickness of each arc + +void setup() { + size(600, 600); + noFill(); + strokeWeight(thickness); + stroke(0); +} + +void draw() { + background(255); + float arcLength = mouseX / 95.0; + for (int i = gap; i < width-gap; i += gap) { + float angle = radians(i); + arc(width/2, height/2, i, i, angle, angle + arcLength); + } +} diff --git a/content/handbook_2e/examples/09 Synthesis 1/Ex_04/Ex_04.pde b/content/handbook_2e/examples/09 Synthesis 1/Ex_04/Ex_04.pde new file mode 100644 index 000000000..226d82e69 --- /dev/null +++ b/content/handbook_2e/examples/09 Synthesis 1/Ex_04/Ex_04.pde @@ -0,0 +1,41 @@ +int mode = 1; +int lastMode = 3; + +void setup() { + size(600, 600); +} + +void draw() { + background(204); + if (mode == 1) { + // Based on code TC + fill(0); + noStroke(); + ellipse(210, 0, 720, 720); + ellipse(228, 377, 36, 36); + ellipse(240, 605, 420, 420); + } else if (mode == 2) { + // Based on code TC + stroke(0); + strokeWeight(2); + fill(255); + rect(60, 60, 300, 300); + noFill(); + rect(120, 120, 360, 360); + rect(180, 180, 360, 360); + } else { + // Based on code TC + stroke(0); + strokeWeight(10); + for (int y = 120; y < 480; y += 30) { + line(120, y, 480, y + 90); + } + } +} + +void mousePressed() { + mode++; + if (mode > lastMode) { + mode = 1; + } +} diff --git a/content/handbook_2e/examples/11 Text/Ex_01/Ex_01.pde b/content/handbook_2e/examples/11 Text/Ex_01/Ex_01.pde new file mode 100644 index 000000000..6d028f7cd --- /dev/null +++ b/content/handbook_2e/examples/11 Text/Ex_01/Ex_01.pde @@ -0,0 +1,4 @@ +char a = 'n'; // Assign 'n' to variable a +char b = n; // ERROR! Without quotes, n is a variable +char c = "n"; // ERROR! The "" defines n as a String, not a char +char d = 'not'; // ERROR! The char type can hold only one character diff --git a/content/handbook_2e/examples/11 Text/Ex_02/Ex_02.pde b/content/handbook_2e/examples/11 Text/Ex_02/Ex_02.pde new file mode 100644 index 000000000..9cf44ff9d --- /dev/null +++ b/content/handbook_2e/examples/11 Text/Ex_02/Ex_02.pde @@ -0,0 +1,4 @@ +char letter = 'A'; // Declare variable letter and assign 'A' +println(letter); // Prints "A" to the console +letter = 'B'; // Assign 'B' to variable letter +println(letter); // Prints "B" to the console diff --git a/content/handbook_2e/examples/11 Text/Ex_03/Ex_03.pde b/content/handbook_2e/examples/11 Text/Ex_03/Ex_03.pde new file mode 100644 index 000000000..b86b5edc4 --- /dev/null +++ b/content/handbook_2e/examples/11 Text/Ex_03/Ex_03.pde @@ -0,0 +1,5 @@ +char letter = 'A'; // Declare variable letter and assign 'A' +println(letter); // Prints "A" to the console +int n = letter; // Assign the numerical value of 'A' to variable n +println(n); // Prints "65" to the console + diff --git a/content/handbook_2e/examples/11 Text/Ex_04/Ex_04.pde b/content/handbook_2e/examples/11 Text/Ex_04/Ex_04.pde new file mode 100644 index 000000000..adc516db6 --- /dev/null +++ b/content/handbook_2e/examples/11 Text/Ex_04/Ex_04.pde @@ -0,0 +1,6 @@ +char letter = 'A'; // Declare variable letter and assign 'A' +for (int i = 0; i < 26; i++) { + print(letter); // Prints a character to the console + letter++; // Add 1 to the value of the character +} +println('.'); // Adds a period to the end of the alphabet diff --git a/content/handbook_2e/examples/11 Text/Ex_05/Ex_05.pde b/content/handbook_2e/examples/11 Text/Ex_05/Ex_05.pde new file mode 100644 index 000000000..b88a3a0d3 --- /dev/null +++ b/content/handbook_2e/examples/11 Text/Ex_05/Ex_05.pde @@ -0,0 +1,5 @@ +String a = "Eponymous"; // Assign "Eponymous" to a +String b = 'E'; // ERROR! The '' define E as a char +String c = "E"; // Assign "E" to c +string d = "E"; // ERROR! String must be capitalized + diff --git a/content/handbook_2e/examples/11 Text/Ex_06/Ex_06.pde b/content/handbook_2e/examples/11 Text/Ex_06/Ex_06.pde new file mode 100644 index 000000000..6d75e7510 --- /dev/null +++ b/content/handbook_2e/examples/11 Text/Ex_06/Ex_06.pde @@ -0,0 +1,12 @@ +// The String data type can contain long and short text elements +String s1 = "Rakete bee bee?"; +String s2 = "Rrrrrrrrrrrrrrrrummmmmpffff tillffff tooooo?"; +println(s1); // Prints "Rakete bee bee?" +println(s2); // Prints "Rrrrrrrrrrrrrrrrummmmmpffff tillffff tooooo?" + +// Strings can be combined with the + operator +String s3 = "Rakete "; +String s4 = "rinnzekete"; +String s5 = s3 + s4; +println(s5); // Prints "Rakete rinnzekete" + diff --git a/content/handbook_2e/examples/11 Text/Ex_07/Ex_07.pde b/content/handbook_2e/examples/11 Text/Ex_07/Ex_07.pde new file mode 100644 index 000000000..82f610364 --- /dev/null +++ b/content/handbook_2e/examples/11 Text/Ex_07/Ex_07.pde @@ -0,0 +1,4 @@ +String s1 = "Azzurro"; +String s2 = "A"; +println(s1.length()); // Prints "7" +println(s2.length()); // Prints "1" diff --git a/content/handbook_2e/examples/11 Text/Ex_08/Ex_08.pde b/content/handbook_2e/examples/11 Text/Ex_08/Ex_08.pde new file mode 100644 index 000000000..27430a6fe --- /dev/null +++ b/content/handbook_2e/examples/11 Text/Ex_08/Ex_08.pde @@ -0,0 +1,4 @@ +String s1 = "Arancione"; +println(s1.startsWith("A")); // Prints "true" +println(s1.startsWith("ione")); // Prints "false" +println(s1.endsWith("ione")); // Prints "true" diff --git a/content/handbook_2e/examples/11 Text/Ex_09/Ex_09.pde b/content/handbook_2e/examples/11 Text/Ex_09/Ex_09.pde new file mode 100644 index 000000000..5644b0a36 --- /dev/null +++ b/content/handbook_2e/examples/11 Text/Ex_09/Ex_09.pde @@ -0,0 +1,5 @@ +String s = "Verde"; +println(s.charAt(0)); // Prints "V" +println(s.charAt(2)); // Prints "r" +println(s.charAt(4)); // Prints "e" + diff --git a/content/handbook_2e/examples/11 Text/Ex_10/Ex_10.pde b/content/handbook_2e/examples/11 Text/Ex_10/Ex_10.pde new file mode 100644 index 000000000..f481ef2d6 --- /dev/null +++ b/content/handbook_2e/examples/11 Text/Ex_10/Ex_10.pde @@ -0,0 +1,5 @@ +String s = "Giallo"; +println(s.substring(2)); // Prints "allo" +println(s.substring(4)); // Prints "lo" +println(s.substring(1, 4)); // Prints "ial" +println(s.substring(0, s.length()-1)); // Prints "Giall" diff --git a/content/handbook_2e/examples/11 Text/Ex_11/Ex_11.pde b/content/handbook_2e/examples/11 Text/Ex_11/Ex_11.pde new file mode 100644 index 000000000..42887027d --- /dev/null +++ b/content/handbook_2e/examples/11 Text/Ex_11/Ex_11.pde @@ -0,0 +1,3 @@ +String s = "Nero"; +println(s.toLowerCase()); // Prints "nero" +println(s.toUpperCase()); // Prints "NERO" diff --git a/content/handbook_2e/examples/11 Text/Ex_12/Ex_12.pde b/content/handbook_2e/examples/11 Text/Ex_12/Ex_12.pde new file mode 100644 index 000000000..3907f5187 --- /dev/null +++ b/content/handbook_2e/examples/11 Text/Ex_12/Ex_12.pde @@ -0,0 +1,6 @@ +String s1 = "Bianco"; +String s2 = "Bianco"; +String s3 = "Nero"; +println(s1.equals(s2)); // Prints "true" +println(s2.equals(s1)); // Prints "true" +println(s1.equals(s3)); // Prints "false" diff --git a/content/handbook_2e/examples/11 Text/Ex_13/Ex_13.pde b/content/handbook_2e/examples/11 Text/Ex_13/Ex_13.pde new file mode 100644 index 000000000..02cfd26c5 --- /dev/null +++ b/content/handbook_2e/examples/11 Text/Ex_13/Ex_13.pde @@ -0,0 +1,7 @@ +for (int y = 1; y < 100; y += 10) { + for (int x = 1; x < y; x += 10) { + line(x, y, x+6, y+6); + line(x+6, y, x, y+6); + } +} + diff --git a/content/handbook_2e/examples/12 Typography/Ex_01/Ex_01.pde b/content/handbook_2e/examples/12 Typography/Ex_01/Ex_01.pde new file mode 100644 index 000000000..c7fbc9d98 --- /dev/null +++ b/content/handbook_2e/examples/12 Typography/Ex_01/Ex_01.pde @@ -0,0 +1,4 @@ +fill(0); +text("LAX", 0, 40); // Write "LAX" at coordinate (0,40) +text("AMS", 0, 70); // Write "AMS" at coordinate (0,70) +text("FRA", 0, 100); // Write "FRA" at coordinate (0,100) diff --git a/content/handbook_2e/examples/12 Typography/Ex_01/sketch.properties b/content/handbook_2e/examples/12 Typography/Ex_01/sketch.properties new file mode 100644 index 000000000..8630fa24a --- /dev/null +++ b/content/handbook_2e/examples/12 Typography/Ex_01/sketch.properties @@ -0,0 +1,2 @@ +mode.id=processing.mode.java.JavaMode +mode=Java diff --git a/content/handbook_2e/examples/12 Typography/Ex_02/Ex_02.pde b/content/handbook_2e/examples/12 Typography/Ex_02/Ex_02.pde new file mode 100644 index 000000000..f56036f5d --- /dev/null +++ b/content/handbook_2e/examples/12 Typography/Ex_02/Ex_02.pde @@ -0,0 +1,5 @@ +textSize(32); // Set text size to 32 +fill(0); +text("LAX", 0, 40); +text("ORD", 0, 70); +text("DAY", 0, 100); diff --git a/content/handbook_2e/examples/12 Typography/Ex_03/Ex_03.pde b/content/handbook_2e/examples/12 Typography/Ex_03/Ex_03.pde new file mode 100644 index 000000000..b33afa59b --- /dev/null +++ b/content/handbook_2e/examples/12 Typography/Ex_03/Ex_03.pde @@ -0,0 +1,7 @@ +textSize(32); +fill(0); // Fill color black +text("LAX", 0, 40); +fill(126); // Fill color gray +text("HKG", 0, 70); +fill(255); // Fill color white +text("PVG", 0, 100); diff --git a/content/handbook_2e/examples/12 Typography/Ex_04/Ex_04.pde b/content/handbook_2e/examples/12 Typography/Ex_04/Ex_04.pde new file mode 100644 index 000000000..979f7d362 --- /dev/null +++ b/content/handbook_2e/examples/12 Typography/Ex_04/Ex_04.pde @@ -0,0 +1,7 @@ +textSize(64); +fill(0, 140); // Fill black with low opacity +text("8", 0, 60); +text("8", 15, 65); +text("8", 30, 70); +text("8", 45, 75); +text("8", 60, 80); diff --git a/content/handbook_2e/examples/12 Typography/Ex_05/Ex_05.pde b/content/handbook_2e/examples/12 Typography/Ex_05/Ex_05.pde new file mode 100644 index 000000000..1ae57fa36 --- /dev/null +++ b/content/handbook_2e/examples/12 Typography/Ex_05/Ex_05.pde @@ -0,0 +1,4 @@ +String s = "Five hexing wizard bots jump quickly."; +fill(0); +text(s, 10, 10, 60, 80); + diff --git a/content/handbook_2e/examples/12 Typography/Ex_06/Ex_06.pde b/content/handbook_2e/examples/12 Typography/Ex_06/Ex_06.pde new file mode 100644 index 000000000..870a48005 --- /dev/null +++ b/content/handbook_2e/examples/12 Typography/Ex_06/Ex_06.pde @@ -0,0 +1,3 @@ +String s = "Five hexing wizard bots jump quickly."; +fill(0); +text(s, 10, 10, 60, 55); // Box too small to fit all letters diff --git a/content/handbook_2e/examples/12 Typography/Ex_07/Ex_07.pde b/content/handbook_2e/examples/12 Typography/Ex_07/Ex_07.pde new file mode 100644 index 000000000..69f9a3b81 --- /dev/null +++ b/content/handbook_2e/examples/12 Typography/Ex_07/Ex_07.pde @@ -0,0 +1,3 @@ +String[] fontList = PFont.list(); +printArray(fontList); + diff --git a/content/handbook_2e/examples/12 Typography/Ex_08/Ex_08.pde b/content/handbook_2e/examples/12 Typography/Ex_08/Ex_08.pde new file mode 100644 index 000000000..48a10b9b8 --- /dev/null +++ b/content/handbook_2e/examples/12 Typography/Ex_08/Ex_08.pde @@ -0,0 +1,16 @@ +PFont zigBlack; + +void setup() { + size(100, 100); + zigBlack = createFont("Ziggurat-Black", 32); + textFont(zigBlack); + fill(0); +} + +void draw() { + background(204); + text("LAX", 0, 40); + text("LHR", 0, 70); + text("TXL", 0, 100); +} + diff --git a/content/handbook_2e/examples/12 Typography/Ex_09/Ex_09.pde b/content/handbook_2e/examples/12 Typography/Ex_09/Ex_09.pde new file mode 100644 index 000000000..60ce359c5 --- /dev/null +++ b/content/handbook_2e/examples/12 Typography/Ex_09/Ex_09.pde @@ -0,0 +1,16 @@ +PFont sourceLight; + +void setup() { + size(100, 100); + sourceLight = createFont("SourceCodePro-Light.otf", 34); + textFont(sourceLight); + fill(0); +} + +void draw() { + background(204); + text("LAX", 0, 40); + text("LHR", 0, 70); + text("TXL", 0, 100); +} + diff --git a/content/handbook_2e/examples/12 Typography/Ex_09/data/SourceCodePro-Light.otf b/content/handbook_2e/examples/12 Typography/Ex_09/data/SourceCodePro-Light.otf new file mode 100644 index 000000000..f624ee1c6 Binary files /dev/null and b/content/handbook_2e/examples/12 Typography/Ex_09/data/SourceCodePro-Light.otf differ diff --git a/content/handbook_2e/examples/12 Typography/Ex_10/Ex_10.pde b/content/handbook_2e/examples/12 Typography/Ex_10/Ex_10.pde new file mode 100644 index 000000000..34419df9c --- /dev/null +++ b/content/handbook_2e/examples/12 Typography/Ex_10/Ex_10.pde @@ -0,0 +1,19 @@ +PFont sourceLight, zigBlack; + +void setup() { + size(100, 100); + zigBlack = createFont("Ziggurat-Black", 24); + sourceLight = createFont("SourceCodePro-Light.otf", 34); + fill(0); +} + +void draw() { + background(204); + textFont(zigBlack); + text("LAX", 0, 40); + textFont(sourceLight); + text("LHR", 0, 70); + textFont(zigBlack); + text("TXL", 0, 100); +} + diff --git a/content/handbook_2e/examples/12 Typography/Ex_10/data/SourceCodePro-Light.otf b/content/handbook_2e/examples/12 Typography/Ex_10/data/SourceCodePro-Light.otf new file mode 100644 index 000000000..f624ee1c6 Binary files /dev/null and b/content/handbook_2e/examples/12 Typography/Ex_10/data/SourceCodePro-Light.otf differ diff --git a/content/handbook_2e/examples/12 Typography/Ex_11/Ex_11.pde b/content/handbook_2e/examples/12 Typography/Ex_11/Ex_11.pde new file mode 100644 index 000000000..ba25fe926 --- /dev/null +++ b/content/handbook_2e/examples/12 Typography/Ex_11/Ex_11.pde @@ -0,0 +1,15 @@ +PFont zigBlack; + +void setup() { + size(100, 100); + zigBlack = loadFont("Ziggurat-Black-32.vlw"); + textFont(zigBlack); + fill(0); +} + +void draw() { + background(204); + text("LAX", 0, 40); + text("LHR", 0, 70); + text("TGL", 0, 100); +} diff --git a/content/handbook_2e/examples/12 Typography/Ex_11/data/Ziggurat-Black-32.vlw b/content/handbook_2e/examples/12 Typography/Ex_11/data/Ziggurat-Black-32.vlw new file mode 100644 index 000000000..d930e777b Binary files /dev/null and b/content/handbook_2e/examples/12 Typography/Ex_11/data/Ziggurat-Black-32.vlw differ diff --git a/content/handbook_2e/examples/12 Typography/Ex_12/Ex_12.pde b/content/handbook_2e/examples/12 Typography/Ex_12/Ex_12.pde new file mode 100644 index 000000000..9b5056f98 --- /dev/null +++ b/content/handbook_2e/examples/12 Typography/Ex_12/Ex_12.pde @@ -0,0 +1,17 @@ +PFont zigBlack; + +void setup() { + size(100, 100); + zigBlack = loadFont("Ziggurat-Black-12.vlw"); + textFont(zigBlack); + fill(0); +} + +void draw() { + background(204); + textSize(12); + text("A", 20, 20); + textSize(96); + text("A", 20, 90); +} + diff --git a/content/handbook_2e/examples/12 Typography/Ex_12/data/Ziggurat-Black-12.vlw b/content/handbook_2e/examples/12 Typography/Ex_12/data/Ziggurat-Black-12.vlw new file mode 100644 index 000000000..ff67dd619 Binary files /dev/null and b/content/handbook_2e/examples/12 Typography/Ex_12/data/Ziggurat-Black-12.vlw differ diff --git a/content/handbook_2e/examples/12 Typography/Ex_13/Ex_13.pde b/content/handbook_2e/examples/12 Typography/Ex_13/Ex_13.pde new file mode 100644 index 000000000..20a75cd39 --- /dev/null +++ b/content/handbook_2e/examples/12 Typography/Ex_13/Ex_13.pde @@ -0,0 +1,9 @@ +String lines = "L1 L2 L3"; +textSize(12); +fill(0); +textLeading(10); +text(lines, 10, 15, 30, 100); +textLeading(20); +text(lines, 40, 15, 30, 100); +textLeading(30); +text(lines, 70, 15, 30, 100); diff --git a/content/handbook_2e/examples/12 Typography/Ex_14/Ex_14.pde b/content/handbook_2e/examples/12 Typography/Ex_14/Ex_14.pde new file mode 100644 index 000000000..e25d9e4b6 --- /dev/null +++ b/content/handbook_2e/examples/12 Typography/Ex_14/Ex_14.pde @@ -0,0 +1,9 @@ +fill(0); +textSize(12); +line(50, 0, 50, 100); +textAlign(LEFT); +text("Left", 50, 20); +textAlign(RIGHT); +text("Right", 50, 40); +textAlign(CENTER); +text("Center", 50, 80); diff --git a/content/handbook_2e/examples/12 Typography/Ex_15/Ex_15.pde b/content/handbook_2e/examples/12 Typography/Ex_15/Ex_15.pde new file mode 100644 index 000000000..da64e15a7 --- /dev/null +++ b/content/handbook_2e/examples/12 Typography/Ex_15/Ex_15.pde @@ -0,0 +1,12 @@ +String s = "AEIOU"; +float tw; // text width +fill(0); +textSize(14); +tw = textWidth(s); +text(s, 4, 40); +rect(4, 42, tw, 5); +textSize(28); +tw = textWidth(s); +text(s, 4, 76); +rect(4, 78, tw, 5); + diff --git a/content/handbook_2e/examples/12 Typography/Ex_16/Ex_16.pde b/content/handbook_2e/examples/12 Typography/Ex_16/Ex_16.pde new file mode 100644 index 000000000..69c935868 --- /dev/null +++ b/content/handbook_2e/examples/12 Typography/Ex_16/Ex_16.pde @@ -0,0 +1,25 @@ +String letters = ""; + +void setup() { + size(100, 100); + stroke(255); + fill(0); + textSize(16); +} + +void draw() { + background(204); + float cursorPosition = textWidth(letters); + line(cursorPosition, 0, cursorPosition, 100); + text(letters, 0, 50); +} + +void keyPressed() { + if (key == BACKSPACE) { // Backspace + if (letters.length() > 0) { + letters = letters.substring(0, letters.length()-1); + } + } else if (textWidth(letters+key) < width) { + letters = letters + key; + } +} diff --git a/content/handbook_2e/examples/12 Typography/Ex_17/Ex_17.pde b/content/handbook_2e/examples/12 Typography/Ex_17/Ex_17.pde new file mode 100644 index 000000000..b2de28d2a --- /dev/null +++ b/content/handbook_2e/examples/12 Typography/Ex_17/Ex_17.pde @@ -0,0 +1,29 @@ +String letters = ""; +int back = 102; + +void setup() { + size(100, 100); + textSize(16); + textAlign(CENTER); +} + +void draw() { + background(back); + text(letters, 50, 50); +} + +void keyPressed() { + if ((key == ENTER) || (key == RETURN)) { + letters = letters.toLowerCase(); + println(letters); // Print to console to see input + if (letters.equals("black")) { + back = 0; + } else if (letters.equals("gray")) { + back = 204; + } + letters = ""; // Clear the variable + } else if ((key > 31) && (key != CODED)) { + // If the key is alphanumeric, add it to the String + letters = letters + key; + } +} diff --git a/content/handbook_2e/examples/12 Typography/Ex_18/Ex_18.pde b/content/handbook_2e/examples/12 Typography/Ex_18/Ex_18.pde new file mode 100644 index 000000000..dc9f6f4ae --- /dev/null +++ b/content/handbook_2e/examples/12 Typography/Ex_18/Ex_18.pde @@ -0,0 +1,11 @@ +void setup() { + size(100, 100); + textSize(24); + textAlign(CENTER); +} + +void draw() { + background(204); + text("avoid", width-mouseX, height-mouseY); +} + diff --git a/content/handbook_2e/examples/12 Typography/Ex_19/Ex_19.pde b/content/handbook_2e/examples/12 Typography/Ex_19/Ex_19.pde new file mode 100644 index 000000000..ffec0947a --- /dev/null +++ b/content/handbook_2e/examples/12 Typography/Ex_19/Ex_19.pde @@ -0,0 +1,21 @@ +float x = 33; +float y = 60; + +void setup() { + size(100, 100); + textSize(24); + noStroke(); +} + +void draw() { + fill(204, 120); + rect(0, 0, width, height); + fill(0); + // If the cursor is over the text, change the position + if ((mouseX >= x) && (mouseX <= x+55) && + (mouseY >= y-24) && (mouseY <= y)) { + x += random(-2, 2); + y += random(-2, 2); + } + text("tickle", x, y); +} diff --git a/content/handbook_2e/examples/13 Images/Ex_01/Ex_01.pde b/content/handbook_2e/examples/13 Images/Ex_01/Ex_01.pde new file mode 100644 index 000000000..bf4cf165b --- /dev/null +++ b/content/handbook_2e/examples/13 Images/Ex_01/Ex_01.pde @@ -0,0 +1,11 @@ +PImage img; + +void setup() { + size(100, 100); + // Image must be in the sketch's "data" folder + img = loadImage("dwp-01.jpg"); +} + +void draw() { + image(img, 0, 0); +} diff --git a/content/handbook_2e/examples/13 Images/Ex_01/data/dwp-01.jpg b/content/handbook_2e/examples/13 Images/Ex_01/data/dwp-01.jpg new file mode 100644 index 000000000..2c3078776 Binary files /dev/null and b/content/handbook_2e/examples/13 Images/Ex_01/data/dwp-01.jpg differ diff --git a/content/handbook_2e/examples/13 Images/Ex_02/Ex_02.pde b/content/handbook_2e/examples/13 Images/Ex_02/Ex_02.pde new file mode 100644 index 000000000..2e1313975 --- /dev/null +++ b/content/handbook_2e/examples/13 Images/Ex_02/Ex_02.pde @@ -0,0 +1,11 @@ +PImage img; + +void setup() { + size(100, 100); + // Image must be in the sketch's "data" folder + img = loadImage("dwp-01.jpg"); +} + +void draw() { + image(img, 20, 20, 60, 60); +} diff --git a/content/handbook_2e/examples/13 Images/Ex_02/data/dwp-01.jpg b/content/handbook_2e/examples/13 Images/Ex_02/data/dwp-01.jpg new file mode 100644 index 000000000..2c3078776 Binary files /dev/null and b/content/handbook_2e/examples/13 Images/Ex_02/data/dwp-01.jpg differ diff --git a/content/handbook_2e/examples/13 Images/Ex_03/Ex_03.pde b/content/handbook_2e/examples/13 Images/Ex_03/Ex_03.pde new file mode 100644 index 000000000..d4eeb8093 --- /dev/null +++ b/content/handbook_2e/examples/13 Images/Ex_03/Ex_03.pde @@ -0,0 +1,13 @@ +PImage img; + +void setup() { + size(100, 100); + img = loadImage("dwp-01.jpg"); +} + +void draw() { + imageMode(CORNER); + image(img, 40, 40, 60, 60); + imageMode(CENTER); + image(img, 40, 40, 60, 60); +} diff --git a/content/handbook_2e/examples/13 Images/Ex_03/data/dwp-01.jpg b/content/handbook_2e/examples/13 Images/Ex_03/data/dwp-01.jpg new file mode 100644 index 000000000..2c3078776 Binary files /dev/null and b/content/handbook_2e/examples/13 Images/Ex_03/data/dwp-01.jpg differ diff --git a/content/handbook_2e/examples/13 Images/Ex_04/Ex_04.pde b/content/handbook_2e/examples/13 Images/Ex_04/Ex_04.pde new file mode 100644 index 000000000..12405a745 --- /dev/null +++ b/content/handbook_2e/examples/13 Images/Ex_04/Ex_04.pde @@ -0,0 +1,13 @@ +PImage img; + +void setup() { + size(640, 360); + img = loadImage("dwp-01.jpg"); + noStroke(); + fill(0); +} + +void draw() { + image(img, 20, 20); + rect(20+img.width, 20, img.width, img.height); +} diff --git a/content/handbook_2e/examples/13 Images/Ex_04/data/dwp-01.jpg b/content/handbook_2e/examples/13 Images/Ex_04/data/dwp-01.jpg new file mode 100644 index 000000000..2c3078776 Binary files /dev/null and b/content/handbook_2e/examples/13 Images/Ex_04/data/dwp-01.jpg differ diff --git a/content/handbook_2e/examples/13 Images/Ex_05/Ex_05.pde b/content/handbook_2e/examples/13 Images/Ex_05/Ex_05.pde new file mode 100644 index 000000000..fd41d2bb5 --- /dev/null +++ b/content/handbook_2e/examples/13 Images/Ex_05/Ex_05.pde @@ -0,0 +1,14 @@ +PImage img; + +void setup() { + size(100, 100); + img = loadImage("dwp-02.jpg"); +} + +void draw() { + tint(102); // Tint gray + image(img, 0, 0); + noTint(); // Disable tint + image(img, 50, 0); +} + diff --git a/content/handbook_2e/examples/13 Images/Ex_05/data/dwp-02.jpg b/content/handbook_2e/examples/13 Images/Ex_05/data/dwp-02.jpg new file mode 100644 index 000000000..31a60065b Binary files /dev/null and b/content/handbook_2e/examples/13 Images/Ex_05/data/dwp-02.jpg differ diff --git a/content/handbook_2e/examples/13 Images/Ex_06/Ex_06.pde b/content/handbook_2e/examples/13 Images/Ex_06/Ex_06.pde new file mode 100644 index 000000000..1c0d6c3e8 --- /dev/null +++ b/content/handbook_2e/examples/13 Images/Ex_06/Ex_06.pde @@ -0,0 +1,13 @@ +PImage img; + +void setup() { + size(100, 100); + img = loadImage("dwp-02.jpg"); +} + +void draw() { + tint(0, 153, 204); // Tint blue + image(img, 0, 0); + noTint(); // Disable tint + image(img, 50, 0); +} diff --git a/content/handbook_2e/examples/13 Images/Ex_06/data/dwp-02.jpg b/content/handbook_2e/examples/13 Images/Ex_06/data/dwp-02.jpg new file mode 100644 index 000000000..31a60065b Binary files /dev/null and b/content/handbook_2e/examples/13 Images/Ex_06/data/dwp-02.jpg differ diff --git a/content/handbook_2e/examples/13 Images/Ex_07/Ex_07.pde b/content/handbook_2e/examples/13 Images/Ex_07/Ex_07.pde new file mode 100644 index 000000000..aaf21592f --- /dev/null +++ b/content/handbook_2e/examples/13 Images/Ex_07/Ex_07.pde @@ -0,0 +1,19 @@ +PImage img; +color yellow, green, tan; + +void setup() { + size(100, 100); + img = loadImage("dwp-02.jpg"); + yellow = color(220, 214, 41); + green = color(110, 164, 32); + tan = color(180, 177, 132); +} + +void draw() { + tint(yellow); + image(img, 0, 0); + tint(green); + image(img, 33, 0); + tint(tan); + image(img, 66, 0); +} diff --git a/content/handbook_2e/examples/13 Images/Ex_07/data/dwp-02.jpg b/content/handbook_2e/examples/13 Images/Ex_07/data/dwp-02.jpg new file mode 100644 index 000000000..31a60065b Binary files /dev/null and b/content/handbook_2e/examples/13 Images/Ex_07/data/dwp-02.jpg differ diff --git a/content/handbook_2e/examples/13 Images/Ex_08/Ex_08.pde b/content/handbook_2e/examples/13 Images/Ex_08/Ex_08.pde new file mode 100644 index 000000000..be9ee6266 --- /dev/null +++ b/content/handbook_2e/examples/13 Images/Ex_08/Ex_08.pde @@ -0,0 +1,14 @@ +PImage img; + +void setup() { + size(100, 100); + img = loadImage("dwp-03.jpg"); +} + +void draw() { + background(255); + tint(255, 102); // Alpha 102 without changing the tint + image(img, 0, 0, 100, 100); + tint(255, 102, 0, 204); // Tint orange, alpha to 204 + image(img, 20, 20, 100, 100); +} diff --git a/content/handbook_2e/examples/13 Images/Ex_08/data/dwp-03.jpg b/content/handbook_2e/examples/13 Images/Ex_08/data/dwp-03.jpg new file mode 100644 index 000000000..bb8ff7737 Binary files /dev/null and b/content/handbook_2e/examples/13 Images/Ex_08/data/dwp-03.jpg differ diff --git a/content/handbook_2e/examples/13 Images/Ex_09/Ex_09.pde b/content/handbook_2e/examples/13 Images/Ex_09/Ex_09.pde new file mode 100644 index 000000000..3bbe86b80 --- /dev/null +++ b/content/handbook_2e/examples/13 Images/Ex_09/Ex_09.pde @@ -0,0 +1,15 @@ +PImage img; + +void setup() { + size(100, 100); + img = loadImage("dwp-03.jpg"); +} + +void draw() { + background(255); + tint(255, 102); + // Draw the image 5 times, moving each to the right + for (int i = 0; i < 5; i++) { + image(img, i*20, 0); + } +} diff --git a/content/handbook_2e/examples/13 Images/Ex_09/data/dwp-03.jpg b/content/handbook_2e/examples/13 Images/Ex_09/data/dwp-03.jpg new file mode 100644 index 000000000..bb8ff7737 Binary files /dev/null and b/content/handbook_2e/examples/13 Images/Ex_09/data/dwp-03.jpg differ diff --git a/content/handbook_2e/examples/13 Images/Ex_10/Ex_10.pde b/content/handbook_2e/examples/13 Images/Ex_10/Ex_10.pde new file mode 100644 index 000000000..a5393fb2e --- /dev/null +++ b/content/handbook_2e/examples/13 Images/Ex_10/Ex_10.pde @@ -0,0 +1,14 @@ +PImage img; + +void setup() { + size(100, 100); + // The GIF has 1-bit transparency + // so the edges are rough + img = loadImage("dwp.gif"); +} + +void draw() { + background(0); + image(img, 5, 0); + image(img, 5, 24); +} diff --git a/content/handbook_2e/examples/13 Images/Ex_10/data/dwp.gif b/content/handbook_2e/examples/13 Images/Ex_10/data/dwp.gif new file mode 100644 index 000000000..93ebd2143 Binary files /dev/null and b/content/handbook_2e/examples/13 Images/Ex_10/data/dwp.gif differ diff --git a/content/handbook_2e/examples/13 Images/Ex_11/Ex_11.pde b/content/handbook_2e/examples/13 Images/Ex_11/Ex_11.pde new file mode 100644 index 000000000..5b7295253 --- /dev/null +++ b/content/handbook_2e/examples/13 Images/Ex_11/Ex_11.pde @@ -0,0 +1,14 @@ +PImage img; + +void setup() { + size(100, 100); + // The PNG has 8-bit transparency + // so the edges are smooth + img = loadImage("dwp.png"); +} + +void draw() { + background(0); + image(img, 5, 0); + image(img, 5, 24); +} diff --git a/content/handbook_2e/examples/13 Images/Ex_11/data/dwp.png b/content/handbook_2e/examples/13 Images/Ex_11/data/dwp.png new file mode 100644 index 000000000..3ee0c99f9 Binary files /dev/null and b/content/handbook_2e/examples/13 Images/Ex_11/data/dwp.png differ diff --git a/content/handbook_2e/examples/13 Images/Ex_12/Ex_12.pde b/content/handbook_2e/examples/13 Images/Ex_12/Ex_12.pde new file mode 100644 index 000000000..8900f0ca6 --- /dev/null +++ b/content/handbook_2e/examples/13 Images/Ex_12/Ex_12.pde @@ -0,0 +1,13 @@ +PImage img, maskImg; + +void setup() { + size(100, 100); + img = loadImage("airport.jpg"); + maskImg = loadImage("airportmask.jpg"); + img.mask(maskImg); +} + +void draw() { + background(255); + image(img, 0, 0); +} diff --git a/content/handbook_2e/examples/13 Images/Ex_12/data/airport.jpg b/content/handbook_2e/examples/13 Images/Ex_12/data/airport.jpg new file mode 100644 index 000000000..366b3a19e Binary files /dev/null and b/content/handbook_2e/examples/13 Images/Ex_12/data/airport.jpg differ diff --git a/content/handbook_2e/examples/13 Images/Ex_12/data/airportmask.jpg b/content/handbook_2e/examples/13 Images/Ex_12/data/airportmask.jpg new file mode 100644 index 000000000..7a0ef8b57 Binary files /dev/null and b/content/handbook_2e/examples/13 Images/Ex_12/data/airportmask.jpg differ diff --git a/content/handbook_2e/examples/13 Images/Ex_13/Ex_13.pde b/content/handbook_2e/examples/13 Images/Ex_13/Ex_13.pde new file mode 100644 index 000000000..953c56324 --- /dev/null +++ b/content/handbook_2e/examples/13 Images/Ex_13/Ex_13.pde @@ -0,0 +1,12 @@ +PImage img; + +void setup() { + size(100, 100); + img = loadImage("topanga.jpg"); +} + +void draw() { + image(img, 0, 0); + float v = mouseX / 100.0; + filter(THRESHOLD, v); +} diff --git a/content/handbook_2e/examples/13 Images/Ex_13/data/topanga.jpg b/content/handbook_2e/examples/13 Images/Ex_13/data/topanga.jpg new file mode 100644 index 000000000..f1d6c26d0 Binary files /dev/null and b/content/handbook_2e/examples/13 Images/Ex_13/data/topanga.jpg differ diff --git a/content/handbook_2e/examples/13 Images/Ex_14/Ex_14.pde b/content/handbook_2e/examples/13 Images/Ex_14/Ex_14.pde new file mode 100644 index 000000000..0e0b65b9c --- /dev/null +++ b/content/handbook_2e/examples/13 Images/Ex_14/Ex_14.pde @@ -0,0 +1,12 @@ +void setup() { + size(100, 100); + strokeWeight(5); + noFill(); +} + +void draw() { + background(204); + line(0, 30, 100, 60); + filter(BLUR, 3); + line(0, 50, 100, 80); +} diff --git a/content/handbook_2e/examples/13 Images/Ex_15/Ex_15.pde b/content/handbook_2e/examples/13 Images/Ex_15/Ex_15.pde new file mode 100644 index 000000000..379c79b4f --- /dev/null +++ b/content/handbook_2e/examples/13 Images/Ex_15/Ex_15.pde @@ -0,0 +1,17 @@ +float fuzzy = 0.0; + +void setup() { + size(100, 100); + strokeWeight(5); + noFill(); +} + +void draw() { + background(204); + if (fuzzy < 16.0) { + fuzzy += 0.05; + } + line(0, 30, 100, 60); + filter(BLUR, fuzzy); + line(0, 50, 100, 80); +} diff --git a/content/handbook_2e/examples/13 Images/Ex_16/Ex_16.pde b/content/handbook_2e/examples/13 Images/Ex_16/Ex_16.pde new file mode 100644 index 000000000..3731853bf --- /dev/null +++ b/content/handbook_2e/examples/13 Images/Ex_16/Ex_16.pde @@ -0,0 +1,13 @@ +PImage img1, img2; + +void setup() { + size(100, 100); + img1 = loadImage("dwp-01.jpg"); + img2 = loadImage("dwp-01.jpg"); + img2.filter(INVERT); +} + +void draw() { + image(img1, 0, 0); + image(img2, 50, 0); +} diff --git a/content/handbook_2e/examples/13 Images/Ex_16/data/dwp-01.jpg b/content/handbook_2e/examples/13 Images/Ex_16/data/dwp-01.jpg new file mode 100644 index 000000000..2c3078776 Binary files /dev/null and b/content/handbook_2e/examples/13 Images/Ex_16/data/dwp-01.jpg differ diff --git a/content/handbook_2e/examples/14 Transform/Ex_01/Ex_01.pde b/content/handbook_2e/examples/14 Transform/Ex_01/Ex_01.pde new file mode 100644 index 000000000..9d7545b53 --- /dev/null +++ b/content/handbook_2e/examples/14 Transform/Ex_01/Ex_01.pde @@ -0,0 +1,4 @@ +rect(0, 5, 70, 30); +translate(10, 30); // Shift 10 pixels right and 30 down +rect(0, 5, 70, 30); + diff --git a/content/handbook_2e/examples/14 Transform/Ex_02/Ex_02.pde b/content/handbook_2e/examples/14 Transform/Ex_02/Ex_02.pde new file mode 100644 index 000000000..7856aacd3 --- /dev/null +++ b/content/handbook_2e/examples/14 Transform/Ex_02/Ex_02.pde @@ -0,0 +1,5 @@ +rect(0, 5, 70, 30); +translate(10, -10); // Shift 10 pixels right and up +rect(0, 5, 70, 30); + + diff --git a/content/handbook_2e/examples/14 Transform/Ex_03/Ex_03.pde b/content/handbook_2e/examples/14 Transform/Ex_03/Ex_03.pde new file mode 100644 index 000000000..ab3536b80 --- /dev/null +++ b/content/handbook_2e/examples/14 Transform/Ex_03/Ex_03.pde @@ -0,0 +1,6 @@ +rect(0, 5, 70, 30); +translate(10, 30); // Shift 10 pixels right and 30 down +rect(0, 5, 70, 30); +translate(10, 30); // Shift everything again for a total +rect(0, 5, 70, 30); // 20 pixels right and 60 down + diff --git a/content/handbook_2e/examples/14 Transform/Ex_04/Ex_04.pde b/content/handbook_2e/examples/14 Transform/Ex_04/Ex_04.pde new file mode 100644 index 000000000..2573d0504 --- /dev/null +++ b/content/handbook_2e/examples/14 Transform/Ex_04/Ex_04.pde @@ -0,0 +1,7 @@ +void draw() { + rect(0, 5, 70, 30); + translate(10, 30); // Shift 10 pixels right and 30 down + rect(0, 5, 70, 30); +} + + diff --git a/content/handbook_2e/examples/14 Transform/Ex_05/Ex_05.pde b/content/handbook_2e/examples/14 Transform/Ex_05/Ex_05.pde new file mode 100644 index 000000000..02b3b0703 --- /dev/null +++ b/content/handbook_2e/examples/14 Transform/Ex_05/Ex_05.pde @@ -0,0 +1,4 @@ +translate(33, 0); // Shift 33 pixels right +rect(0, 20, 66, 30); +rect(0, 50, 66, 30); + diff --git a/content/handbook_2e/examples/14 Transform/Ex_06/Ex_06.pde b/content/handbook_2e/examples/14 Transform/Ex_06/Ex_06.pde new file mode 100644 index 000000000..27d9e4f35 --- /dev/null +++ b/content/handbook_2e/examples/14 Transform/Ex_06/Ex_06.pde @@ -0,0 +1,7 @@ +pushMatrix(); +translate(33, 0); // Shift 33 pixels right +rect(0, 20, 66, 30); +popMatrix(); // Remove the shift +// This shape is not affected by translate() because +// it is isolated between pushMatrix() and popMatrix() +rect(0, 50, 66, 30); diff --git a/content/handbook_2e/examples/14 Transform/Ex_07/Ex_07.pde b/content/handbook_2e/examples/14 Transform/Ex_07/Ex_07.pde new file mode 100644 index 000000000..1cb5b829e --- /dev/null +++ b/content/handbook_2e/examples/14 Transform/Ex_07/Ex_07.pde @@ -0,0 +1,10 @@ +pushMatrix(); +translate(20, 0); +rect(0, 10, 70, 20); // Draw at (20, 10) +pushMatrix(); +translate(30, 0); +rect(0, 30, 70, 20); // Draw at (50, 30) +popMatrix(); +rect(0, 50, 70, 20); // Draw at (20, 50) +popMatrix(); +rect(0, 70, 70, 20); // Draw at (0, 70) diff --git a/content/handbook_2e/examples/14 Transform/Ex_08/Ex_08.pde b/content/handbook_2e/examples/14 Transform/Ex_08/Ex_08.pde new file mode 100644 index 000000000..7ae329392 --- /dev/null +++ b/content/handbook_2e/examples/14 Transform/Ex_08/Ex_08.pde @@ -0,0 +1,3 @@ +rect(55, 0, 30, 45); +rotate(PI/8); +rect(55, 0, 30, 45); diff --git a/content/handbook_2e/examples/14 Transform/Ex_09/Ex_09.pde b/content/handbook_2e/examples/14 Transform/Ex_09/Ex_09.pde new file mode 100644 index 000000000..8a37e7b3d --- /dev/null +++ b/content/handbook_2e/examples/14 Transform/Ex_09/Ex_09.pde @@ -0,0 +1,5 @@ +rect(10, 60, 70, 20); +rotate(-PI/16); +rect(10, 60, 70, 20); +rotate(-PI/8); +rect(10, 60, 70, 20); diff --git a/content/handbook_2e/examples/14 Transform/Ex_10/Ex_10.pde b/content/handbook_2e/examples/14 Transform/Ex_10/Ex_10.pde new file mode 100644 index 000000000..d6c800cd6 --- /dev/null +++ b/content/handbook_2e/examples/14 Transform/Ex_10/Ex_10.pde @@ -0,0 +1,3 @@ +ellipse(32, 32, 30, 30); +scale(1.8); +ellipse(32, 32, 30, 30); diff --git a/content/handbook_2e/examples/14 Transform/Ex_12/Ex_12.pde b/content/handbook_2e/examples/14 Transform/Ex_12/Ex_12.pde new file mode 100644 index 000000000..5100aa7b8 --- /dev/null +++ b/content/handbook_2e/examples/14 Transform/Ex_12/Ex_12.pde @@ -0,0 +1,5 @@ +float s = 1.8; +ellipse(32, 32, 30, 30); +scale(s); +strokeWeight(1.0 / s); +ellipse(32, 32, 30, 30); diff --git a/content/handbook_2e/examples/14 Transform/Ex_13/Ex_13.pde b/content/handbook_2e/examples/14 Transform/Ex_13/Ex_13.pde new file mode 100644 index 000000000..a00418218 --- /dev/null +++ b/content/handbook_2e/examples/14 Transform/Ex_13/Ex_13.pde @@ -0,0 +1,5 @@ +rect(10, 20, 70, 20); +scale(1.7); +rect(10, 20, 70, 20); +scale(1.7); +rect(10, 20, 70, 20); diff --git a/content/handbook_2e/examples/14 Transform/Ex_14/Ex_14.pde b/content/handbook_2e/examples/14 Transform/Ex_14/Ex_14.pde new file mode 100644 index 000000000..6bb723164 --- /dev/null +++ b/content/handbook_2e/examples/14 Transform/Ex_14/Ex_14.pde @@ -0,0 +1,3 @@ +translate(width/2, height/2); +rotate(PI/8); +rect(-25, -25, 50, 50); diff --git a/content/handbook_2e/examples/14 Transform/Ex_15/Ex_15.pde b/content/handbook_2e/examples/14 Transform/Ex_15/Ex_15.pde new file mode 100644 index 000000000..66a97e4c7 --- /dev/null +++ b/content/handbook_2e/examples/14 Transform/Ex_15/Ex_15.pde @@ -0,0 +1,3 @@ +rotate(PI/8); +translate(width/2, height/2); +rect(-25, -25, 50, 50); diff --git a/content/handbook_2e/examples/14 Transform/Ex_16/Ex_16.pde b/content/handbook_2e/examples/14 Transform/Ex_16/Ex_16.pde new file mode 100644 index 000000000..394643e0d --- /dev/null +++ b/content/handbook_2e/examples/14 Transform/Ex_16/Ex_16.pde @@ -0,0 +1,6 @@ +translate(10, 60); +rect(0, 0, 70, 20); +rotate(-PI/12); +rect(0, 0, 70, 20); +rotate(-PI/6); +rect(0, 0, 70, 20); diff --git a/content/handbook_2e/examples/14 Transform/Ex_17/Ex_17.pde b/content/handbook_2e/examples/14 Transform/Ex_17/Ex_17.pde new file mode 100644 index 000000000..127b9fe70 --- /dev/null +++ b/content/handbook_2e/examples/14 Transform/Ex_17/Ex_17.pde @@ -0,0 +1,6 @@ +translate(45, 60); +rect(-35, -5, 70, 10); +rotate(-PI/8); +rect(-35, -5, 70, 10); +rotate(-PI/8); +rect(-35, -5, 70, 10); diff --git a/content/handbook_2e/examples/14 Transform/Ex_18/Ex_18.pde b/content/handbook_2e/examples/14 Transform/Ex_18/Ex_18.pde new file mode 100644 index 000000000..3ba02797e --- /dev/null +++ b/content/handbook_2e/examples/14 Transform/Ex_18/Ex_18.pde @@ -0,0 +1,7 @@ +noFill(); +translate(10, 20); +rect(0, 0, 20, 10); +scale(2.2); +rect(0, 0, 20, 10); +scale(2.2); +rect(0, 0, 20, 10); diff --git a/content/handbook_2e/examples/14 Transform/Ex_19/Ex_19.pde b/content/handbook_2e/examples/14 Transform/Ex_19/Ex_19.pde new file mode 100644 index 000000000..a3682e48b --- /dev/null +++ b/content/handbook_2e/examples/14 Transform/Ex_19/Ex_19.pde @@ -0,0 +1,5 @@ +noFill(); +translate(50, 30); +rect(-10, 5, 20, 10); +scale(2.5); +rect(-10, 5, 20, 10); diff --git a/content/handbook_2e/examples/14 Transform/Ex_20/Ex_20.pde b/content/handbook_2e/examples/14 Transform/Ex_20/Ex_20.pde new file mode 100644 index 000000000..322e2ec9a --- /dev/null +++ b/content/handbook_2e/examples/14 Transform/Ex_20/Ex_20.pde @@ -0,0 +1,8 @@ +background(0); +stroke(255, 120); +translate(66, 33); // Set initial offset +for (int i = 0; i < 18; i++) { // 18 repetitions + strokeWeight(i); // Increase stroke weight + rotate(PI/12); // Accumulate the rotation + line(0, 0, 55, 0); +} diff --git a/content/handbook_2e/examples/14 Transform/Ex_21/Ex_21.pde b/content/handbook_2e/examples/14 Transform/Ex_21/Ex_21.pde new file mode 100644 index 000000000..8c1595c57 --- /dev/null +++ b/content/handbook_2e/examples/14 Transform/Ex_21/Ex_21.pde @@ -0,0 +1,8 @@ +background(0); +noFill(); +stroke(204); +translate(33, 66); // Set initial offset +for (int i = 0; i < 12; i++) { // 12 repetitions + scale(1.2); // Accumulate the scaling + ellipse(4, 2, 20, 20); +} diff --git a/content/handbook_2e/examples/14 Transform/Ex_22/Ex_22.pde b/content/handbook_2e/examples/14 Transform/Ex_22/Ex_22.pde new file mode 100644 index 000000000..57f8d8ac5 --- /dev/null +++ b/content/handbook_2e/examples/14 Transform/Ex_22/Ex_22.pde @@ -0,0 +1,10 @@ +void setup() { + size(100, 100); + noStroke(); +} + +void draw() { + background(126); + translate(mouseX, mouseY); + ellipse(0, 0, 33, 33); +} diff --git a/content/handbook_2e/examples/14 Transform/Ex_23/Ex_23.pde b/content/handbook_2e/examples/14 Transform/Ex_23/Ex_23.pde new file mode 100644 index 000000000..818e1f015 --- /dev/null +++ b/content/handbook_2e/examples/14 Transform/Ex_23/Ex_23.pde @@ -0,0 +1,13 @@ +void setup() { + size(100, 100); + strokeWeight(8); +} + +void draw() { + background(204); + float angle = map(mouseX, 0, width, 0, TWO_PI); + translate(50, 50); + rotate(angle); + line(0, 0, 40, 0); +} + diff --git a/content/handbook_2e/examples/14 Transform/Ex_24/Ex_24.pde b/content/handbook_2e/examples/14 Transform/Ex_24/Ex_24.pde new file mode 100644 index 000000000..47561ac2d --- /dev/null +++ b/content/handbook_2e/examples/14 Transform/Ex_24/Ex_24.pde @@ -0,0 +1,12 @@ +void draw() { + background(204); + // Shift the origin to the center + translate(width/2, height/2); + // Draw the origin + line(-width/2, 0, width/2, 0); // Draw x-axis + line(0, -height/2, 0, height/2); // Draw y-axis + // Draw within the new coordinate system + ellipse(0, 0, 45, 45); // Draw at the origin + ellipse(-width/2, height/2, 45, 45); + ellipse(width/2, -height/2, 45, 45); +} diff --git a/content/handbook_2e/examples/14 Transform/Ex_25/Ex_25.pde b/content/handbook_2e/examples/14 Transform/Ex_25/Ex_25.pde new file mode 100644 index 000000000..adbb7110b --- /dev/null +++ b/content/handbook_2e/examples/14 Transform/Ex_25/Ex_25.pde @@ -0,0 +1,14 @@ +void draw() { + background(204); + // Shift the origin, scale the system + scale(width/2, height/2); + translate(1.0, 1.0); + strokeWeight(1.0/width); + // Draw the origin + line(-1, 0, 1, 0); // Draw x-axis + line(0, -1, 0, 1); // Draw y-axis + // Draw within new coordinate system + ellipse(0, 0, 0.9, 0.9); // Draw at the origin + ellipse(-1, 1, 0.9, 0.9); + ellipse(1, -1, 0.9, 0.9); +} diff --git a/content/handbook_2e/examples/14 Transform/Ex_26/Ex_26.pde b/content/handbook_2e/examples/14 Transform/Ex_26/Ex_26.pde new file mode 100644 index 000000000..6222d1b21 --- /dev/null +++ b/content/handbook_2e/examples/14 Transform/Ex_26/Ex_26.pde @@ -0,0 +1,13 @@ +void draw() { + background(204); + // Shift the origin, scale the system + translate(0, height); + scale(1.0, -1.0); + // Draw the origin + line(0, 1, width, 1); // Draw x-axis + line(0, 1, 0, height); // Draw y-axis + // Draw within new coordinate system + ellipse(0, 0, 45, 45); // Draw at the origin + ellipse(width/2, height/2, 45, 45); + ellipse(width, height, 45, 45); +} diff --git a/content/handbook_2e/examples/15 Vertices/Ex_01/Ex_01.pde b/content/handbook_2e/examples/15 Vertices/Ex_01/Ex_01.pde new file mode 100644 index 000000000..d55cf5059 --- /dev/null +++ b/content/handbook_2e/examples/15 Vertices/Ex_01/Ex_01.pde @@ -0,0 +1,7 @@ +noFill(); +beginShape(); +vertex(30, 20); +vertex(85, 20); +vertex(85, 75); +vertex(30, 75); +endShape(); diff --git a/content/handbook_2e/examples/15 Vertices/Ex_02/Ex_02.pde b/content/handbook_2e/examples/15 Vertices/Ex_02/Ex_02.pde new file mode 100644 index 000000000..4d335e1f6 --- /dev/null +++ b/content/handbook_2e/examples/15 Vertices/Ex_02/Ex_02.pde @@ -0,0 +1,7 @@ +noFill(); +beginShape(); +vertex(30, 20); +vertex(85, 20); +vertex(85, 75); +vertex(30, 75); +endShape(CLOSE); diff --git a/content/handbook_2e/examples/15 Vertices/Ex_03/Ex_03.pde b/content/handbook_2e/examples/15 Vertices/Ex_03/Ex_03.pde new file mode 100644 index 000000000..1ecb30ff1 --- /dev/null +++ b/content/handbook_2e/examples/15 Vertices/Ex_03/Ex_03.pde @@ -0,0 +1,7 @@ +noFill(); +beginShape(); +vertex(30, 20); +vertex(85, 20); +vertex(30, 75); +vertex(85, 75); +endShape(); diff --git a/content/handbook_2e/examples/15 Vertices/Ex_04/Ex_04.pde b/content/handbook_2e/examples/15 Vertices/Ex_04/Ex_04.pde new file mode 100644 index 000000000..9cf966eb2 --- /dev/null +++ b/content/handbook_2e/examples/15 Vertices/Ex_04/Ex_04.pde @@ -0,0 +1,10 @@ +fill(0); +noStroke(); +beginShape(); +vertex(10, 0); +vertex(100, 30); +vertex(90, 70); +vertex(100, 70); +vertex(10, 90); +vertex(50, 40); +endShape(); diff --git a/content/handbook_2e/examples/15 Vertices/Ex_05/Ex_05.pde b/content/handbook_2e/examples/15 Vertices/Ex_05/Ex_05.pde new file mode 100644 index 000000000..269a5a5ad --- /dev/null +++ b/content/handbook_2e/examples/15 Vertices/Ex_05/Ex_05.pde @@ -0,0 +1,10 @@ +noFill(); +strokeWeight(20); +beginShape(); +vertex(52, 29); +vertex(74, 35); +vertex(60, 52); +vertex(61, 75); +vertex(40, 69); +vertex(19, 75); +endShape(); diff --git a/content/handbook_2e/examples/15 Vertices/Ex_06/Ex_06.pde b/content/handbook_2e/examples/15 Vertices/Ex_06/Ex_06.pde new file mode 100644 index 000000000..67f823f3c --- /dev/null +++ b/content/handbook_2e/examples/15 Vertices/Ex_06/Ex_06.pde @@ -0,0 +1,10 @@ +noStroke(); +fill(0); +beginShape(); +vertex(40, 10); +for (int i = 20; i <= 100; i += 5) { + vertex(20, i); + vertex(30, i); +} +vertex(40, 100); +endShape(); diff --git a/content/handbook_2e/examples/15 Vertices/Ex_07/Ex_07.pde b/content/handbook_2e/examples/15 Vertices/Ex_07/Ex_07.pde new file mode 100644 index 000000000..c7e5735f4 --- /dev/null +++ b/content/handbook_2e/examples/15 Vertices/Ex_07/Ex_07.pde @@ -0,0 +1,8 @@ +// Draw a point at each vertex +strokeWeight(4); +beginShape(POINTS); +vertex(30, 20); +vertex(85, 20); +vertex(85, 75); +vertex(30, 75); +endShape(); diff --git a/content/handbook_2e/examples/15 Vertices/Ex_08/Ex_08.pde b/content/handbook_2e/examples/15 Vertices/Ex_08/Ex_08.pde new file mode 100644 index 000000000..363526986 --- /dev/null +++ b/content/handbook_2e/examples/15 Vertices/Ex_08/Ex_08.pde @@ -0,0 +1,8 @@ +// Draw a line between each pair of vertices +beginShape(LINES); +vertex(30, 20); +vertex(85, 20); +vertex(85, 75); +vertex(30, 75); +endShape(); + diff --git a/content/handbook_2e/examples/15 Vertices/Ex_09/Ex_09.pde b/content/handbook_2e/examples/15 Vertices/Ex_09/Ex_09.pde new file mode 100644 index 000000000..6c3c30124 --- /dev/null +++ b/content/handbook_2e/examples/15 Vertices/Ex_09/Ex_09.pde @@ -0,0 +1,9 @@ +// Connect each grouping of three vertices as a triangle +beginShape(TRIANGLES); +vertex(75, 30); +vertex(10, 20); +vertex(75, 50); +vertex(20, 60); +vertex(90, 70); +vertex(35, 85); +endShape(); diff --git a/content/handbook_2e/examples/15 Vertices/Ex_10/Ex_10.pde b/content/handbook_2e/examples/15 Vertices/Ex_10/Ex_10.pde new file mode 100644 index 000000000..3cb3bea9c --- /dev/null +++ b/content/handbook_2e/examples/15 Vertices/Ex_10/Ex_10.pde @@ -0,0 +1,10 @@ +// Starting with the third vertex, connects each +// subsequent vertex to the previous two +beginShape(TRIANGLE_STRIP); +vertex(75, 30); +vertex(10, 20); +vertex(75, 50); +vertex(20, 60); +vertex(90, 70); +vertex(35, 85); +endShape(); diff --git a/content/handbook_2e/examples/15 Vertices/Ex_11/Ex_11.pde b/content/handbook_2e/examples/15 Vertices/Ex_11/Ex_11.pde new file mode 100644 index 000000000..e71824706 --- /dev/null +++ b/content/handbook_2e/examples/15 Vertices/Ex_11/Ex_11.pde @@ -0,0 +1,9 @@ +// Connect the first vertex to each following group of two +beginShape(TRIANGLE_FAN); +vertex(10, 20); +vertex(75, 30); +vertex(75, 50); +vertex(90, 70); +vertex(10, 20); +endShape(); + diff --git a/content/handbook_2e/examples/15 Vertices/Ex_12/Ex_12.pde b/content/handbook_2e/examples/15 Vertices/Ex_12/Ex_12.pde new file mode 100644 index 000000000..02bc1aef6 --- /dev/null +++ b/content/handbook_2e/examples/15 Vertices/Ex_12/Ex_12.pde @@ -0,0 +1,11 @@ +// Connect each grouping of four vertices as a quad +beginShape(QUADS); +vertex(30, 25); +vertex(85, 30); +vertex(85, 50); +vertex(30, 45); +vertex(30, 60); +vertex(85, 65); +vertex(85, 85); +vertex(30, 80); +endShape(); diff --git a/content/handbook_2e/examples/15 Vertices/Ex_13/Ex_13.pde b/content/handbook_2e/examples/15 Vertices/Ex_13/Ex_13.pde new file mode 100644 index 000000000..acb77b67b --- /dev/null +++ b/content/handbook_2e/examples/15 Vertices/Ex_13/Ex_13.pde @@ -0,0 +1,12 @@ +// Notice the different vertex order for +// this example in relation to example 13-12 +beginShape(QUAD_STRIP); +vertex(30, 25); +vertex(85, 30); +vertex(30, 45); +vertex(85, 50); +vertex(30, 60); +vertex(85, 65); +vertex(30, 80); +vertex(85, 85); +endShape(); diff --git a/content/handbook_2e/examples/15 Vertices/Ex_14/Ex_14.pde b/content/handbook_2e/examples/15 Vertices/Ex_14/Ex_14.pde new file mode 100644 index 000000000..f9ba18fb1 --- /dev/null +++ b/content/handbook_2e/examples/15 Vertices/Ex_14/Ex_14.pde @@ -0,0 +1,8 @@ +noFill(); +beginShape(); +curveVertex(20, 80); // C1 (see p.TC) +curveVertex(20, 40); // V1 +curveVertex(30, 30); // V2 +curveVertex(40, 80); // V3 +curveVertex(80, 80); // C2 +endShape(); diff --git a/content/handbook_2e/examples/15 Vertices/Ex_15/Ex_15.pde b/content/handbook_2e/examples/15 Vertices/Ex_15/Ex_15.pde new file mode 100644 index 000000000..e99ff9386 --- /dev/null +++ b/content/handbook_2e/examples/15 Vertices/Ex_15/Ex_15.pde @@ -0,0 +1,5 @@ +noFill(); +beginShape(); +vertex(32, 20); // V1 (see p.TC) +bezierVertex(80, 5, 80, 75, 30, 75); // C1, C2, V2 +endShape(); diff --git a/content/handbook_2e/examples/15 Vertices/Ex_16/Ex_16.pde b/content/handbook_2e/examples/15 Vertices/Ex_16/Ex_16.pde new file mode 100644 index 000000000..3a104f93e --- /dev/null +++ b/content/handbook_2e/examples/15 Vertices/Ex_16/Ex_16.pde @@ -0,0 +1,6 @@ +noFill(); +beginShape(); +vertex(15, 30); // V1 (see p.TC) +bezierVertex(20, -5, 70, 5, 40, 35); // C1, C2, V2 +bezierVertex(5, 70, 45, 105, 70, 70); // C3, C4, V3 +endShape(); diff --git a/content/handbook_2e/examples/15 Vertices/Ex_17/Ex_17.pde b/content/handbook_2e/examples/15 Vertices/Ex_17/Ex_17.pde new file mode 100644 index 000000000..9574df3d5 --- /dev/null +++ b/content/handbook_2e/examples/15 Vertices/Ex_17/Ex_17.pde @@ -0,0 +1,6 @@ +fill(0); +beginShape(); +vertex(90, 39); // V1 (see p.TC) +bezierVertex(90, 39, 54, 17, 26, 83); // C1, C2, V2 +bezierVertex(26, 83, 90, 107, 90, 39); // C3, C4, V3 +endShape(); diff --git a/content/handbook_2e/examples/15 Vertices/Ex_18/Ex_18.pde b/content/handbook_2e/examples/15 Vertices/Ex_18/Ex_18.pde new file mode 100644 index 000000000..5859658d6 --- /dev/null +++ b/content/handbook_2e/examples/15 Vertices/Ex_18/Ex_18.pde @@ -0,0 +1,8 @@ +noFill(); +beginShape(); +vertex(15, 40); // V1 (see p.TC) +bezierVertex(5, 0, 80, 0, 50, 55); // C1, C2, V2 +vertex(30, 45); // V3 +vertex(25, 75); // V4 +bezierVertex(50, 70, 75, 90, 80, 70); // C3, C4, V5 +endShape(); diff --git a/content/handbook_2e/examples/15 Vertices/Ex_19/Ex_19.pde b/content/handbook_2e/examples/15 Vertices/Ex_19/Ex_19.pde new file mode 100644 index 000000000..3d817cc68 --- /dev/null +++ b/content/handbook_2e/examples/15 Vertices/Ex_19/Ex_19.pde @@ -0,0 +1,20 @@ +size(100, 100, P2D); +background(0); +stroke(255); +strokeWeight(2); +line(33, 0, 85, 100); +noStroke(); +fill(102); +// Start inner triangle +beginShape(); +vertex(5, 12); +vertex(95, 12); +vertex(50, 92); +endShape(); +fill(255); +// Start outer triangle +beginShape(); +vertex(50, 20); +vertex(66, 50); +vertex(33, 50); +endShape(); diff --git a/content/handbook_2e/examples/15 Vertices/Ex_20/Ex_20.pde b/content/handbook_2e/examples/15 Vertices/Ex_20/Ex_20.pde new file mode 100644 index 000000000..52ef6c933 --- /dev/null +++ b/content/handbook_2e/examples/15 Vertices/Ex_20/Ex_20.pde @@ -0,0 +1,19 @@ +size(100, 100); +background(0); +stroke(255); +strokeWeight(2); +line(33, 0, 85, 100); +noStroke(); +fill(102); +// Start outer triangle +beginShape(); +vertex(5, 12); +vertex(95, 12); +vertex(50, 92); +// Start inner triangle +beginContour(); +vertex(33, 50); +vertex(66, 50); +vertex(50, 20); +endContour(); +endShape(); diff --git a/content/handbook_2e/examples/15 Vertices/Ex_21/Ex_21.pde b/content/handbook_2e/examples/15 Vertices/Ex_21/Ex_21.pde new file mode 100644 index 000000000..6ebe9a0c3 --- /dev/null +++ b/content/handbook_2e/examples/15 Vertices/Ex_21/Ex_21.pde @@ -0,0 +1,42 @@ +float angle = 0.0; + +void setup() { + size(100, 100); + noStroke(); +} + +void draw() { + background(0); + fill(204); // Light gray + rect(0, 44, 100, 12); + + // Position in middle, scale 80%, and rotate + translate(width/2, height/2); + scale(0.75); + rotate(angle); + + fill(102); + beginShape(); + // Outer shape + vertex(-25,-50); + vertex( 25,-50); + vertex( 25, 50); + vertex(-25, 50); + // Top hole + beginContour(); + vertex(-15,-30); + vertex(-15,-10); + vertex( 15,-10); + vertex( 15,-30); + endContour(); + // Bottom Hole + beginContour(); + vertex(-15, 10); + vertex(-15, 30); + vertex( 15, 30); + vertex( 15, 10); + endContour(); + endShape(); + + angle += 0.01; +} diff --git a/content/handbook_2e/examples/16 3D Drawing/Ex_01/Ex_01.pde b/content/handbook_2e/examples/16 3D Drawing/Ex_01/Ex_01.pde new file mode 100644 index 000000000..cc7faa3fb --- /dev/null +++ b/content/handbook_2e/examples/16 3D Drawing/Ex_01/Ex_01.pde @@ -0,0 +1,6 @@ +size(100, 100, P3D); +background(0); +translate(0, height/2, -height/4); +box(60, 80, 60); +translate(width, 0, -height/2); +box(60, 80, 60); diff --git a/content/handbook_2e/examples/16 3D Drawing/Ex_02/Ex_02.pde b/content/handbook_2e/examples/16 3D Drawing/Ex_02/Ex_02.pde new file mode 100644 index 000000000..fa76e2ca1 --- /dev/null +++ b/content/handbook_2e/examples/16 3D Drawing/Ex_02/Ex_02.pde @@ -0,0 +1,6 @@ +size(100, 100, P3D); +background(0); +translate(0, height/2, -height/4); +sphere(50); +translate(width, 0, -height/2); +sphere(50); diff --git a/content/handbook_2e/examples/16 3D Drawing/Ex_03/Ex_03.pde b/content/handbook_2e/examples/16 3D Drawing/Ex_03/Ex_03.pde new file mode 100644 index 000000000..edb1ce2ea --- /dev/null +++ b/content/handbook_2e/examples/16 3D Drawing/Ex_03/Ex_03.pde @@ -0,0 +1,10 @@ +size(100, 100, P3D); +noStroke(); +background(0); +lights(); +translate(0, height/2, -height/2); +fill(153); +box(50); +translate(width, 0, 0); +fill(255); +sphere(50); diff --git a/content/handbook_2e/examples/16 3D Drawing/Ex_04/Ex_04.pde b/content/handbook_2e/examples/16 3D Drawing/Ex_04/Ex_04.pde new file mode 100644 index 000000000..df1f2194a --- /dev/null +++ b/content/handbook_2e/examples/16 3D Drawing/Ex_04/Ex_04.pde @@ -0,0 +1,18 @@ +void setup() { + size(100, 100, P3D); + fill(153); + strokeWeight(8); +} + +void draw() { + background(0); + translate(width/2, height/2, -width); + float rx = map(mouseY, 0, height, -PI, PI); + float ry = map(mouseX, 0, width, -PI, PI); + rotateX(rx); + rotateY(ry); + noStroke(); + rect(-50, -50, 100, 100); + stroke(255); + line(0, 0, -50, 0, 0, 50); +} diff --git a/content/handbook_2e/examples/16 3D Drawing/Ex_05/Ex_05.pde b/content/handbook_2e/examples/16 3D Drawing/Ex_05/Ex_05.pde new file mode 100644 index 000000000..ab11ebb6c --- /dev/null +++ b/content/handbook_2e/examples/16 3D Drawing/Ex_05/Ex_05.pde @@ -0,0 +1,24 @@ +void setup() { + size(100, 100, P3D); + noStroke(); +} + +void draw() { + lights(); + background(0); + translate(width/2, height/2, -height); + float rz = map(mouseY, 0, height, 0, PI); + float ry = map(mouseX, 0, width, 0, HALF_PI); + rotateZ(rz); + rotateY(ry); + for (int y = -1; y <= 1; y++) { + for (int x = -1; x <= 1; x++) { + for (int z = -1; z <= 1; z++) { + pushMatrix(); + translate(50*x, 50*y, -50*z); + box(15); + popMatrix(); + } + } + } +} diff --git a/content/handbook_2e/examples/16 3D Drawing/Ex_06/Ex_06.pde b/content/handbook_2e/examples/16 3D Drawing/Ex_06/Ex_06.pde new file mode 100644 index 000000000..c3990a16b --- /dev/null +++ b/content/handbook_2e/examples/16 3D Drawing/Ex_06/Ex_06.pde @@ -0,0 +1,34 @@ +int topRadius = 70; +int bottomRadius = 70; +int tall = 120; +int sides = 32; +float angleIncrement = TWO_PI / sides; + +void setup() { + size(100, 100, P3D); +} + +void draw() { + background(0); + if (mousePressed) { + noFill(); + stroke(255); + } else { + lights(); + noStroke(); + fill(255); + } + translate(width/2, height/2, -40); + rotateY(map(mouseX, 0, width, 0, PI)); + rotateZ(map(mouseY, 0, height, 0, -PI)); + float angle = 0; + beginShape(QUAD_STRIP); + for (int i = 0; i <= sides; i++) { + float ca = cos(angle); + float sa = sin(angle); + vertex(topRadius * ca, 0, topRadius * sa); + vertex(bottomRadius * ca, tall, bottomRadius * sa); + angle += angleIncrement; + } + endShape(); +} diff --git a/content/handbook_2e/examples/16 3D Drawing/Ex_07/Ex_07.pde b/content/handbook_2e/examples/16 3D Drawing/Ex_07/Ex_07.pde new file mode 100644 index 000000000..498b4c431 --- /dev/null +++ b/content/handbook_2e/examples/16 3D Drawing/Ex_07/Ex_07.pde @@ -0,0 +1,20 @@ +void setup() { + size(100, 100, P3D); + fill(204); + strokeWeight(2); +} + +void draw() { + lights(); + background(0); + // Change height of the camera with mouseY + camera(0.0, mouseY*2, 120.0, // eyeX, eyeY, eyeZ + 0.0, 0.0, 0.0, // centerX, centerY, centerZ + 0.0, 1.0, 0.0); // upX, upY, upZ + noStroke(); + box(60); + stroke(255); + line(-80, 0, 0, 80, 0, 0); + line(0, -80, 0, 0, 80, 0); + line(0, 0, -80, 0, 0, 80); +} diff --git a/content/handbook_2e/examples/16 3D Drawing/Ex_08/Ex_08.pde b/content/handbook_2e/examples/16 3D Drawing/Ex_08/Ex_08.pde new file mode 100644 index 000000000..bf496de23 --- /dev/null +++ b/content/handbook_2e/examples/16 3D Drawing/Ex_08/Ex_08.pde @@ -0,0 +1,15 @@ +void setup() { + size(100, 100, P3D); + noStroke(); +} + +void draw() { + background(0); + if (mousePressed == true) { + directionalLight(255, 255, 255, 0, 1, 0); + } else { + directionalLight(255, 255, 255, 1, 0, 0); + } + translate(width/2, height/2, 0); + sphere(30); +} diff --git a/content/handbook_2e/examples/16 3D Drawing/Ex_09/Ex_09.pde b/content/handbook_2e/examples/16 3D Drawing/Ex_09/Ex_09.pde new file mode 100644 index 000000000..cf63b727a --- /dev/null +++ b/content/handbook_2e/examples/16 3D Drawing/Ex_09/Ex_09.pde @@ -0,0 +1,14 @@ +void setup() { + size(100, 100, P3D); + noStroke(); +} + +void draw() { + background(0); + // The sphere is white by default so + // the ambient light changes the color + float r = map(mouseX, 0, width, 0, 255); + ambientLight(r, 255, 255); + translate(width/2, height/2, 0); + sphere(30); +} diff --git a/content/handbook_2e/examples/16 3D Drawing/Ex_10/Ex_10.pde b/content/handbook_2e/examples/16 3D Drawing/Ex_10/Ex_10.pde new file mode 100644 index 000000000..edceba4b1 --- /dev/null +++ b/content/handbook_2e/examples/16 3D Drawing/Ex_10/Ex_10.pde @@ -0,0 +1,13 @@ +void setup() { + size(100, 100, P3D); + noStroke(); +} + +void draw() { + background(0); + pointLight(255, 255, 255, width/2, mouseY, 0); + translate(0, height/2, 0); + sphere(30); + translate(width, 0, 0); + sphere(30); +} diff --git a/content/handbook_2e/examples/16 3D Drawing/Ex_11/Ex_11.pde b/content/handbook_2e/examples/16 3D Drawing/Ex_11/Ex_11.pde new file mode 100644 index 000000000..78d9d38ea --- /dev/null +++ b/content/handbook_2e/examples/16 3D Drawing/Ex_11/Ex_11.pde @@ -0,0 +1,14 @@ +void setup() { + size(100, 100, P3D); + noStroke(); +} + +void draw() { + background(0); + float angle = map(mouseY, 0, height, PI/8, PI/2); + float concentration = map(mouseX, 0, width, 1, 20); + spotLight(255, 255, 255, 0, height/2, 0, + 1, 0, 0, angle, concentration); + translate(width, height/2, -10); + sphere(50); +} diff --git a/content/handbook_2e/examples/16 3D Drawing/Ex_12/Ex_12.pde b/content/handbook_2e/examples/16 3D Drawing/Ex_12/Ex_12.pde new file mode 100644 index 000000000..03652a011 --- /dev/null +++ b/content/handbook_2e/examples/16 3D Drawing/Ex_12/Ex_12.pde @@ -0,0 +1,15 @@ +void setup() { + size(100, 100, P3D); + noStroke(); +} + +void draw() { + background(0); + lights(); // Default lights + // The sphere is white by default so + // the ambient light changes the color + float r = map(mouseX, 0, width, 0, 255); + ambient(r, r, 126); + translate(width/2, height/2, 0); + sphere(33); +} diff --git a/content/handbook_2e/examples/16 3D Drawing/Ex_13/Ex_13.pde b/content/handbook_2e/examples/16 3D Drawing/Ex_13/Ex_13.pde new file mode 100644 index 000000000..be7df3d02 --- /dev/null +++ b/content/handbook_2e/examples/16 3D Drawing/Ex_13/Ex_13.pde @@ -0,0 +1,17 @@ +void setup() { + size(100, 100, P3D); + noStroke(); +} + +void draw() { + background(0); + fill(0, 51, 102); + ambientLight(102, 102, 102); + lightSpecular(204, 204, 204); + directionalLight(102, 102, 102, 0, 0, -1); + specular(255, 255, 255); + translate(width/2, height/2, 0); + float s = map(mouseX, 0, width, 1, 10); + shininess(s); + sphere(33); +} diff --git a/content/handbook_2e/examples/16 3D Drawing/Ex_14/Ex_14.pde b/content/handbook_2e/examples/16 3D Drawing/Ex_14/Ex_14.pde new file mode 100644 index 000000000..be92bb218 --- /dev/null +++ b/content/handbook_2e/examples/16 3D Drawing/Ex_14/Ex_14.pde @@ -0,0 +1,21 @@ +PImage tex; + +void setup() { + size(100, 100, P3D); + tex = loadImage("dwp-parallel.png"); + noStroke(); +} + +void draw() { + background(0); + translate(0, 0, -height/4); + float ry = map(mouseX, 0, width, 0, TWO_PI); + rotateY(ry); + beginShape(); + texture(tex); + vertex(0, 0, 0, 0, 0); + vertex(100, 0, 0, 200, 0); + vertex(100, 100, 0, 200, 200); + vertex(0, 100, 0, 0, 200); + endShape(); +} diff --git a/content/handbook_2e/examples/16 3D Drawing/Ex_14/data/DSC_0387.jpg b/content/handbook_2e/examples/16 3D Drawing/Ex_14/data/DSC_0387.jpg new file mode 100644 index 000000000..798e7192c Binary files /dev/null and b/content/handbook_2e/examples/16 3D Drawing/Ex_14/data/DSC_0387.jpg differ diff --git a/content/handbook_2e/examples/16 3D Drawing/Ex_14/data/dwp-parallel.png b/content/handbook_2e/examples/16 3D Drawing/Ex_14/data/dwp-parallel.png new file mode 100644 index 000000000..178fa5f8f Binary files /dev/null and b/content/handbook_2e/examples/16 3D Drawing/Ex_14/data/dwp-parallel.png differ diff --git a/content/handbook_2e/examples/16 3D Drawing/Ex_15/Ex_15.pde b/content/handbook_2e/examples/16 3D Drawing/Ex_15/Ex_15.pde new file mode 100644 index 000000000..3e69fc11b --- /dev/null +++ b/content/handbook_2e/examples/16 3D Drawing/Ex_15/Ex_15.pde @@ -0,0 +1,22 @@ +PImage tex; + +void setup() { + size(100, 100, P3D); + tex = loadImage("dwp-parallel.png"); + noStroke(); + textureMode(NORMAL); +} + +void draw() { + background(0); + translate(0, 0, -height/4); + float ry = map(mouseX, 0, width, 0, TWO_PI); + rotateY(ry); + beginShape(); + texture(tex); + vertex(0, 0, 0, 0, 0); + vertex(100, 0, 0, 1, 0); + vertex(100, 100, 0, 1, 1); + vertex(0, 100, 0, 0, 1); + endShape(); +} diff --git a/content/handbook_2e/examples/16 3D Drawing/Ex_15/data/DSC_0387.jpg b/content/handbook_2e/examples/16 3D Drawing/Ex_15/data/DSC_0387.jpg new file mode 100644 index 000000000..798e7192c Binary files /dev/null and b/content/handbook_2e/examples/16 3D Drawing/Ex_15/data/DSC_0387.jpg differ diff --git a/content/handbook_2e/examples/16 3D Drawing/Ex_15/data/dwp-parallel.png b/content/handbook_2e/examples/16 3D Drawing/Ex_15/data/dwp-parallel.png new file mode 100644 index 000000000..178fa5f8f Binary files /dev/null and b/content/handbook_2e/examples/16 3D Drawing/Ex_15/data/dwp-parallel.png differ diff --git a/content/handbook_2e/examples/16 3D Drawing/Ex_16/Ex_16.pde b/content/handbook_2e/examples/16 3D Drawing/Ex_16/Ex_16.pde new file mode 100644 index 000000000..9cfd0f907 --- /dev/null +++ b/content/handbook_2e/examples/16 3D Drawing/Ex_16/Ex_16.pde @@ -0,0 +1,21 @@ +PImage tex; + +void setup() { + size(100, 100, P3D); + tex = loadImage("dwp-parallel.png"); + noStroke(); +} + +void draw() { + background(0); + translate(0, 0, -height/4); + float ry = map(mouseX, 0, width, 0, TWO_PI); + rotateY(ry); + beginShape(); + texture(tex); + vertex(0, 6, 0, 0, 12); + vertex(100, 45, 0, 200, 90); + vertex(100, 80, 0, 200, 160); + vertex(0, 44, 0, 0, 88); + endShape(); +} diff --git a/content/handbook_2e/examples/16 3D Drawing/Ex_16/data/DSC_0387.jpg b/content/handbook_2e/examples/16 3D Drawing/Ex_16/data/DSC_0387.jpg new file mode 100644 index 000000000..798e7192c Binary files /dev/null and b/content/handbook_2e/examples/16 3D Drawing/Ex_16/data/DSC_0387.jpg differ diff --git a/content/handbook_2e/examples/16 3D Drawing/Ex_16/data/dwp-parallel.png b/content/handbook_2e/examples/16 3D Drawing/Ex_16/data/dwp-parallel.png new file mode 100644 index 000000000..178fa5f8f Binary files /dev/null and b/content/handbook_2e/examples/16 3D Drawing/Ex_16/data/dwp-parallel.png differ diff --git a/content/handbook_2e/examples/17 Shapes/Ex_01/Ex_01.pde b/content/handbook_2e/examples/17 Shapes/Ex_01/Ex_01.pde new file mode 100644 index 000000000..7a4bc4c73 --- /dev/null +++ b/content/handbook_2e/examples/17 Shapes/Ex_01/Ex_01.pde @@ -0,0 +1,12 @@ + +PShape land; + +void setup() { + size(100, 100); + land = loadShape("antarctica.svg"); +} + +void draw() { + background(204); + shape(land, 10, 10); +} diff --git a/content/handbook_2e/examples/17 Shapes/Ex_01/data/antarctica.svg b/content/handbook_2e/examples/17 Shapes/Ex_01/data/antarctica.svg new file mode 100644 index 000000000..b2e13775a --- /dev/null +++ b/content/handbook_2e/examples/17 Shapes/Ex_01/data/antarctica.svg @@ -0,0 +1,917 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/handbook_2e/examples/17 Shapes/Ex_02/Ex_02.pde b/content/handbook_2e/examples/17 Shapes/Ex_02/Ex_02.pde new file mode 100644 index 000000000..9806c947f --- /dev/null +++ b/content/handbook_2e/examples/17 Shapes/Ex_02/Ex_02.pde @@ -0,0 +1,11 @@ +PShape land; + +void setup() { + size(100, 100); + land = loadShape("antarctica.svg"); +} + +void draw() { + background(204); + shape(land, 10, 10, 80, 80); +} diff --git a/content/handbook_2e/examples/17 Shapes/Ex_02/data/antarctica.svg b/content/handbook_2e/examples/17 Shapes/Ex_02/data/antarctica.svg new file mode 100644 index 000000000..b2e13775a --- /dev/null +++ b/content/handbook_2e/examples/17 Shapes/Ex_02/data/antarctica.svg @@ -0,0 +1,917 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/handbook_2e/examples/17 Shapes/Ex_03/Ex_03.pde b/content/handbook_2e/examples/17 Shapes/Ex_03/Ex_03.pde new file mode 100644 index 000000000..0e27b5e49 --- /dev/null +++ b/content/handbook_2e/examples/17 Shapes/Ex_03/Ex_03.pde @@ -0,0 +1,15 @@ +PShape land; + +void setup() { + size(100, 100); + land = loadShape("antarctica.svg"); + shapeMode(CENTER); +} + +void draw() { + background(204); + translate(width/2, height/2); + float scalar = map(mouseX, 0, width, 0.1, 2.5); + scale(scalar); + shape(land, 0, 0); +} diff --git a/content/handbook_2e/examples/17 Shapes/Ex_03/data/antarctica.svg b/content/handbook_2e/examples/17 Shapes/Ex_03/data/antarctica.svg new file mode 100644 index 000000000..b2e13775a --- /dev/null +++ b/content/handbook_2e/examples/17 Shapes/Ex_03/data/antarctica.svg @@ -0,0 +1,917 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/handbook_2e/examples/17 Shapes/Ex_04/Ex_04.pde b/content/handbook_2e/examples/17 Shapes/Ex_04/Ex_04.pde new file mode 100644 index 000000000..26c7af4f2 --- /dev/null +++ b/content/handbook_2e/examples/17 Shapes/Ex_04/Ex_04.pde @@ -0,0 +1,12 @@ +PShape land; + +void setup() { + size(100, 100); + land = loadShape("antarctica.svg"); +} + +void draw() { + background(204); + float scalar = 0.36; + shape(land, 8, 14, land.width*scalar, land.height*scalar); +} diff --git a/content/handbook_2e/examples/17 Shapes/Ex_04/data/antarctica.svg b/content/handbook_2e/examples/17 Shapes/Ex_04/data/antarctica.svg new file mode 100644 index 000000000..b2e13775a --- /dev/null +++ b/content/handbook_2e/examples/17 Shapes/Ex_04/data/antarctica.svg @@ -0,0 +1,917 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/handbook_2e/examples/17 Shapes/Ex_05/Ex_05.pde b/content/handbook_2e/examples/17 Shapes/Ex_05/Ex_05.pde new file mode 100644 index 000000000..ae83d1362 --- /dev/null +++ b/content/handbook_2e/examples/17 Shapes/Ex_05/Ex_05.pde @@ -0,0 +1,18 @@ +PShape land; + +void setup() { + size(100, 100); + land = loadShape("antarctica.svg"); + noStroke(); +} + +void draw() { + background(204); + land.disableStyle(); + fill(255); + shape(land, -20, 0); + fill(102); + shape(land, 15, 0); + land.enableStyle(); + shape(land, 50, 0); +} diff --git a/content/handbook_2e/examples/17 Shapes/Ex_05/data/antarctica.svg b/content/handbook_2e/examples/17 Shapes/Ex_05/data/antarctica.svg new file mode 100644 index 000000000..b2e13775a --- /dev/null +++ b/content/handbook_2e/examples/17 Shapes/Ex_05/data/antarctica.svg @@ -0,0 +1,917 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/handbook_2e/examples/17 Shapes/Ex_06/Ex_06.pde b/content/handbook_2e/examples/17 Shapes/Ex_06/Ex_06.pde new file mode 100644 index 000000000..fb43f8aac --- /dev/null +++ b/content/handbook_2e/examples/17 Shapes/Ex_06/Ex_06.pde @@ -0,0 +1,14 @@ + +PShape pot; + +void setup() { + size(100, 100, P3D); + pot = loadShape("teapot.obj"); +} + +void draw() { + background(0); + float scalar = 12.0; // Scalar + shape(pot, 50, 70, pot.width*scalar, + pot.height*scalar); +} diff --git a/content/handbook_2e/examples/17 Shapes/Ex_06/data/teapot-upsidedown.obj b/content/handbook_2e/examples/17 Shapes/Ex_06/data/teapot-upsidedown.obj new file mode 100644 index 000000000..1fabb3d74 --- /dev/null +++ b/content/handbook_2e/examples/17 Shapes/Ex_06/data/teapot-upsidedown.obj @@ -0,0 +1,9965 @@ +v -3.000000 1.800000 0.000000 +v -2.991600 1.800000 -0.081000 +v -2.991600 1.800000 0.081000 +v -2.989450 1.666162 0.000000 +v -2.985000 1.921950 0.000000 +v -2.985000 1.921950 0.000000 +v -2.981175 1.667844 -0.081000 +v -2.981175 1.667844 0.081000 +v -2.976687 1.920243 -0.081000 +v -2.976687 1.920243 0.081000 +v -2.968800 1.800000 -0.144000 +v -2.968800 1.800000 0.144000 +v -2.958713 1.672406 -0.144000 +v -2.958713 1.672406 0.144000 +v -2.957600 1.534800 0.000000 +v -2.957600 1.534800 0.000000 +v -2.954122 1.915609 -0.144000 +v -2.954122 1.915609 0.144000 +v -2.949693 1.537790 -0.081000 +v -2.949693 1.537790 0.081000 +v -2.940000 2.019600 0.000000 +v -2.935200 1.800000 -0.189000 +v -2.935200 1.800000 0.189000 +v -2.931958 2.016526 0.081000 +v -2.931958 2.016526 -0.081000 +v -2.928230 1.545907 -0.144000 +v -2.928230 1.545907 0.144000 +v -2.925611 1.679131 -0.189000 +v -2.925611 1.679131 0.189000 +v -2.920870 1.908779 -0.189000 +v -2.920870 1.908779 0.189000 +v -2.910131 2.008181 -0.144000 +v -2.910131 2.008181 0.144000 +v -2.904150 1.406137 0.000000 +v -2.904150 1.406137 0.000000 +v -2.896846 1.410135 0.081000 +v -2.896846 1.410135 -0.081000 +v -2.896602 1.557869 -0.189000 +v -2.896602 1.557869 0.189000 +v -2.894400 1.800000 -0.216000 +v -2.894400 1.800000 0.216000 +v -2.885416 1.687296 -0.216000 +v -2.885416 1.687296 0.216000 +v -2.880491 1.900487 -0.216000 +v -2.880491 1.900487 0.216000 +v -2.877965 1.995883 -0.189000 +v -2.877965 1.995883 0.189000 +v -2.877022 1.420985 -0.144000 +v -2.877022 1.420985 0.144000 +v -2.865000 2.095650 0.000000 +v -2.858195 1.572394 0.216000 +v -2.858195 1.572394 -0.216000 +v -2.857432 2.091511 -0.081000 +v -2.857432 2.091511 0.081000 +v -2.850000 1.800000 -0.225000 +v -2.850000 1.800000 0.225000 +v -2.847806 1.436974 0.189000 +v -2.847806 1.436974 -0.189000 +v -2.841675 1.696181 0.225000 +v -2.841675 1.696181 -0.225000 +v -2.838906 1.980950 -0.216000 +v -2.838906 1.980950 0.216000 +v -2.836889 2.080276 -0.144000 +v -2.836889 2.080276 0.144000 +v -2.836550 1.891463 -0.225000 +v -2.836550 1.891463 0.225000 +v -2.828800 1.280400 0.000000 +v -2.822326 1.285171 -0.081000 +v -2.822326 1.285171 0.081000 +v -2.816400 1.588200 -0.225000 +v -2.816400 1.588200 0.225000 +v -2.812331 1.456390 0.216000 +v -2.812331 1.456390 -0.216000 +v -2.806615 2.063720 -0.189000 +v -2.806615 2.063720 0.189000 +v -2.805600 1.800000 -0.216000 +v -2.805600 1.800000 0.216000 +v -2.804755 1.298122 -0.144000 +v -2.804755 1.298122 0.144000 +v -2.797934 1.705067 -0.216000 +v -2.797934 1.705067 0.216000 +v -2.796400 1.964700 0.225000 +v -2.796400 1.964700 -0.225000 +v -2.792609 1.882438 -0.216000 +v -2.792609 1.882438 0.216000 +v -2.778861 1.317206 -0.189000 +v -2.778861 1.317206 0.189000 +v -2.774605 1.604006 0.216000 +v -2.774605 1.604006 -0.216000 +v -2.773725 1.477519 0.225000 +v -2.773725 1.477519 -0.225000 +v -2.769854 2.043616 -0.216000 +v -2.769854 2.043616 0.216000 +v -2.764800 1.800000 -0.189000 +v -2.764800 1.800000 0.189000 +v -2.760000 2.152800 0.000000 +v -2.760000 2.152800 0.000000 +v -2.757739 1.713232 -0.189000 +v -2.757739 1.713232 0.189000 +v -2.753894 1.948450 -0.216000 +v -2.753894 1.948450 0.216000 +v -2.753123 2.147861 -0.081000 +v -2.753123 2.147861 0.081000 +v -2.752230 1.874146 -0.189000 +v -2.752230 1.874146 0.189000 +v -2.747418 1.340381 -0.216000 +v -2.747418 1.340381 0.216000 +v -2.736198 1.618531 -0.189000 +v -2.736198 1.618531 0.189000 +v -2.735119 1.498648 0.216000 +v -2.735119 1.498648 -0.216000 +v -2.734458 2.134454 -0.144000 +v -2.734458 2.134454 0.144000 +v -2.731250 1.157813 0.000000 +v -2.731250 1.157813 0.000000 +v -2.731200 1.800000 -0.144000 +v -2.731200 1.800000 0.144000 +v -2.729850 2.021737 -0.225000 +v -2.729850 2.021737 0.225000 +v -2.725825 1.163194 0.081000 +v -2.725825 1.163194 -0.081000 +v -2.724637 1.719956 -0.144000 +v -2.724637 1.719956 0.144000 +v -2.718978 1.867316 -0.144000 +v -2.718978 1.867316 0.144000 +v -2.714835 1.933517 -0.189000 +v -2.714835 1.933517 0.189000 +v -2.713200 1.365600 -0.225000 +v -2.713200 1.365600 0.225000 +v -2.711100 1.177800 -0.144000 +v -2.711100 1.177800 0.144000 +v -2.708400 1.800000 -0.081000 +v -2.708400 1.800000 0.081000 +v -2.706950 2.114698 -0.189000 +v -2.706950 2.114698 0.189000 +v -2.704570 1.630493 -0.144000 +v -2.704570 1.630493 0.144000 +v -2.702175 1.724519 -0.081000 +v -2.702175 1.724519 0.081000 +v -2.700000 1.800000 0.000000 +v -2.699644 1.518063 0.189000 +v -2.699644 1.518063 -0.189000 +v -2.696413 1.862682 -0.081000 +v -2.696413 1.862682 0.081000 +v -2.693900 1.726200 0.000000 +v -2.689846 1.999859 -0.216000 +v -2.689846 1.999859 0.216000 +v -2.689400 1.199325 -0.189000 +v -2.689400 1.199325 0.189000 +v -2.688100 1.860975 0.000000 +v -2.688100 1.860975 0.000000 +v -2.683107 1.638610 -0.081000 +v -2.683107 1.638610 0.081000 +v -2.682669 1.921219 -0.144000 +v -2.682669 1.921219 0.144000 +v -2.678982 1.390819 -0.216000 +v -2.678982 1.390819 0.216000 +v -2.675200 1.641600 0.000000 +v -2.675200 1.641600 0.000000 +v -2.673549 2.090707 -0.216000 +v -2.673549 2.090707 0.216000 +v -2.670428 1.534053 -0.144000 +v -2.670428 1.534053 0.144000 +v -2.663050 1.225463 -0.216000 +v -2.663050 1.225463 0.216000 +v -2.660842 1.912874 0.081000 +v -2.660842 1.912874 -0.081000 +v -2.653085 1.979755 -0.189000 +v -2.653085 1.979755 0.189000 +v -2.652800 1.909800 0.000000 +v -2.652800 1.909800 0.000000 +v -2.650604 1.544903 0.081000 +v -2.650604 1.544903 -0.081000 +v -2.647539 1.413994 -0.189000 +v -2.647539 1.413994 0.189000 +v -2.643300 1.548900 0.000000 +v -2.637200 2.064600 -0.225000 +v -2.637200 2.064600 0.225000 +v -2.634375 1.253906 0.225000 +v -2.634375 1.253906 -0.225000 +v -2.625000 2.193750 0.000000 +v -2.622811 1.963199 -0.144000 +v -2.622811 1.963199 0.144000 +v -2.621645 1.433078 -0.144000 +v -2.621645 1.433078 0.144000 +v -2.619050 2.188238 -0.081000 +v -2.619050 2.188238 0.081000 +v -2.611200 1.038600 0.000000 +v -2.611200 1.038600 0.000000 +v -2.607034 1.044497 0.081000 +v -2.607034 1.044497 -0.081000 +v -2.605700 1.282350 -0.216000 +v -2.605700 1.282350 0.216000 +v -2.604074 1.446029 -0.081000 +v -2.604074 1.446029 0.081000 +v -2.602900 2.173275 -0.144000 +v -2.602900 2.173275 0.144000 +v -2.602268 1.951964 -0.081000 +v -2.602268 1.951964 0.081000 +v -2.600851 2.038493 -0.216000 +v -2.600851 2.038493 0.216000 +v -2.597600 1.450800 0.000000 +v -2.595725 1.060502 -0.144000 +v -2.595725 1.060502 0.144000 +v -2.594700 1.947825 0.000000 +v -2.579350 1.308488 -0.189000 +v -2.579350 1.308488 0.189000 +v -2.579100 2.151225 -0.189000 +v -2.579100 2.151225 0.189000 +v -2.579059 1.084090 -0.189000 +v -2.579059 1.084090 0.189000 +v -2.567450 2.014502 -0.189000 +v -2.567450 2.014502 0.189000 +v -2.558822 1.112731 0.216000 +v -2.558822 1.112731 -0.216000 +v -2.557650 1.330013 -0.144000 +v -2.557650 1.330013 0.144000 +v -2.550200 2.124450 -0.216000 +v -2.550200 2.124450 0.216000 +v -2.542925 1.344619 0.081000 +v -2.542925 1.344619 -0.081000 +v -2.539942 1.994746 -0.144000 +v -2.539942 1.994746 0.144000 +v -2.537500 1.350000 0.000000 +v -2.537500 1.350000 0.000000 +v -2.536800 1.143900 0.225000 +v -2.536800 1.143900 -0.225000 +v -2.521277 1.981339 -0.081000 +v -2.521277 1.981339 0.081000 +v -2.518750 2.095312 -0.225000 +v -2.518750 2.095312 0.225000 +v -2.514778 1.175069 0.216000 +v -2.514778 1.175069 -0.216000 +v -2.514400 1.976400 0.000000 +v -2.514400 1.976400 0.000000 +v -2.494541 1.203710 -0.189000 +v -2.494541 1.203710 0.189000 +v -2.487300 2.066175 -0.216000 +v -2.487300 2.066175 0.216000 +v -2.477875 1.227298 -0.144000 +v -2.477875 1.227298 0.144000 +v -2.468350 0.922987 0.000000 +v -2.466566 1.243303 0.081000 +v -2.466566 1.243303 -0.081000 +v -2.465644 0.929375 -0.081000 +v -2.465644 0.929375 0.081000 +v -2.462400 1.249200 0.000000 +v -2.462400 1.249200 0.000000 +v -2.460000 2.221200 0.000000 +v -2.460000 2.221200 0.000000 +v -2.458400 2.039400 -0.189000 +v -2.458400 2.039400 0.189000 +v -2.458298 0.946711 -0.144000 +v -2.458298 0.946711 0.144000 +v -2.455229 2.215303 -0.081000 +v -2.455229 2.215303 0.081000 +v -2.447474 0.972260 0.189000 +v -2.447474 0.972260 -0.189000 +v -2.442278 2.199298 -0.144000 +v -2.442278 2.199298 0.144000 +v -2.434600 2.017350 -0.144000 +v -2.434600 2.017350 0.144000 +v -2.434329 1.003283 -0.216000 +v -2.434329 1.003283 0.216000 +v -2.423194 2.175710 -0.189000 +v -2.423194 2.175710 0.189000 +v -2.420025 1.037044 -0.225000 +v -2.420025 1.037044 0.225000 +v -2.418450 2.002387 -0.081000 +v -2.418450 2.002388 0.081000 +v -2.412500 1.996875 0.000000 +v -2.412500 1.996875 0.000000 +v -2.405721 1.070804 -0.216000 +v -2.405721 1.070804 0.216000 +v -2.400019 2.147069 -0.216000 +v -2.400019 2.147069 0.216000 +v -2.392576 1.101828 -0.189000 +v -2.392576 1.101828 0.189000 +v -2.381752 1.127376 -0.144000 +v -2.381752 1.127376 0.144000 +v -2.374800 2.115900 -0.225000 +v -2.374800 2.115900 0.225000 +v -2.374406 1.144713 0.081000 +v -2.374406 1.144713 -0.081000 +v -2.371700 1.151100 0.000000 +v -2.349581 2.084731 -0.216000 +v -2.349581 2.084731 0.216000 +v -2.326406 2.056090 -0.189000 +v -2.326406 2.056090 0.189000 +v -2.307322 2.032502 -0.144000 +v -2.307322 2.032502 0.144000 +v -2.302400 0.811200 0.000000 +v -2.302400 0.811200 0.000000 +v -2.301347 0.818122 0.081000 +v -2.301347 0.818122 -0.081000 +v -2.298490 0.836909 0.144000 +v -2.298490 0.836909 -0.144000 +v -2.294371 2.016497 -0.081000 +v -2.294371 2.016497 0.081000 +v -2.294278 0.864595 0.189000 +v -2.294278 0.864595 -0.189000 +v -2.289600 2.010600 0.000000 +v -2.289600 2.010600 0.000000 +v -2.289165 0.898214 0.216000 +v -2.289165 0.898214 -0.216000 +v -2.283600 0.934800 0.225000 +v -2.283600 0.934800 -0.225000 +v -2.278035 0.971386 0.216000 +v -2.278035 0.971386 -0.216000 +v -2.272922 1.005005 0.189000 +v -2.272922 1.005005 -0.189000 +v -2.268710 1.032691 -0.144000 +v -2.268710 1.032691 0.144000 +v -2.265853 1.051478 0.081000 +v -2.265853 1.051478 -0.081000 +v -2.265000 2.237850 0.000000 +v -2.264800 1.058400 0.000000 +v -2.264800 1.058400 0.000000 +v -2.261676 2.231720 -0.081000 +v -2.261676 2.231720 0.081000 +v -2.252655 2.215082 -0.144000 +v -2.252655 2.215082 0.144000 +v -2.239361 2.190562 -0.189000 +v -2.239361 2.190562 0.189000 +v -2.223218 2.160788 -0.216000 +v -2.223218 2.160788 0.216000 +v -2.205650 2.128387 0.225000 +v -2.205650 2.128388 -0.225000 +v -2.188082 2.095987 -0.216000 +v -2.188082 2.095987 0.216000 +v -2.171939 2.066213 -0.189000 +v -2.171939 2.066213 0.189000 +v -2.158645 2.041693 -0.144000 +v -2.158645 2.041693 0.144000 +v -2.149624 2.025055 -0.081000 +v -2.149624 2.025055 0.081000 +v -2.146300 2.018925 0.000000 +v -2.141100 0.973800 0.000000 +v -2.141100 0.973800 0.000000 +v -2.140315 0.966231 0.081000 +v -2.140315 0.966231 -0.081000 +v -2.138183 0.945685 0.144000 +v -2.138183 0.945685 -0.144000 +v -2.135041 0.915407 0.189000 +v -2.135041 0.915407 -0.189000 +v -2.131226 0.878641 0.216000 +v -2.131226 0.878641 -0.216000 +v -2.127075 0.838631 0.225000 +v -2.127075 0.838631 -0.225000 +v -2.122924 0.798621 0.216000 +v -2.122924 0.798621 -0.216000 +v -2.119109 0.761855 0.189000 +v -2.119109 0.761855 -0.189000 +v -2.115967 0.731578 0.144000 +v -2.115967 0.731578 -0.144000 +v -2.113835 0.711032 0.081000 +v -2.113835 0.711032 -0.081000 +v -2.113050 0.703463 0.000000 +v -2.113050 0.703463 0.000000 +v -2.040000 2.246400 0.000000 +v -2.040000 2.246400 0.000000 +v -2.038410 2.240150 -0.081000 +v -2.038410 2.240150 0.081000 +v -2.034093 2.223187 -0.144000 +v -2.034093 2.223187 0.144000 +v -2.027731 2.198189 -0.189000 +v -2.027731 2.198189 0.189000 +v -2.020006 2.167834 0.216000 +v -2.020006 2.167834 -0.216000 +v -2.011600 2.134800 0.225000 +v -2.011600 2.134800 -0.225000 +v -2.003194 2.101766 0.216000 +v -2.003194 2.101766 -0.216000 +v -2.000000 0.900000 0.000000 +v -2.000000 0.900000 0.000000 +v -2.000000 0.900000 0.000000 +v -1.997200 0.891600 0.081000 +v -1.997200 0.891600 -0.081000 +v -1.995469 2.071411 -0.189000 +v -1.995469 2.071411 0.189000 +v -1.992750 1.037175 -0.000000 +v -1.992750 1.037175 0.000000 +v -1.989600 0.868800 0.144000 +v -1.989600 0.868800 -0.144000 +v -1.989107 2.046413 0.144000 +v -1.989107 2.046413 -0.144000 +v -1.986000 0.771675 0.000000 +v -1.986000 0.771675 0.000000 +v -1.984790 2.029450 -0.081000 +v -1.984790 2.029450 0.081000 +v -1.983200 2.023200 0.000000 +v -1.983200 2.023200 0.000000 +v -1.978400 0.835200 0.189000 +v -1.978400 0.835200 -0.189000 +v -1.974240 0.900000 -0.328160 +v -1.974240 0.900000 -0.328160 +v -1.974240 0.900000 0.328160 +v -1.972000 1.178400 -0.000000 +v -1.972000 1.178400 0.000000 +v -1.967083 1.037175 -0.326970 +v -1.967083 1.037175 0.326970 +v -1.964800 0.794400 0.216000 +v -1.964800 0.794400 -0.216000 +v -1.960420 0.771675 -0.325863 +v -1.960420 0.771675 0.325863 +v -1.950000 0.750000 -0.225000 +v -1.950000 0.750000 0.225000 +v -1.948000 0.656400 0.000000 +v -1.948000 0.656400 0.000000 +v -1.946601 1.178400 -0.323566 +v -1.946601 1.178400 0.323566 +v -1.939250 1.323225 0.000000 +v -1.939250 1.323225 0.000000 +v -1.935200 0.705600 0.216000 +v -1.935200 0.705600 -0.216000 +v -1.922910 0.656400 -0.319628 +v -1.922910 0.656400 0.319628 +v -1.921600 0.664800 0.189000 +v -1.921600 0.664800 -0.189000 +v -1.914272 1.323225 -0.318192 +v -1.914272 1.323225 0.318192 +v -1.910400 0.631200 0.144000 +v -1.910400 0.631200 -0.144000 +v -1.902800 0.608400 0.081000 +v -1.902800 0.608400 -0.081000 +v -1.900000 0.600000 0.000000 +v -1.900000 0.600000 0.000000 +v -1.899520 0.900000 -0.638080 +v -1.899520 0.900000 -0.638080 +v -1.899520 0.900000 0.638080 +v -1.899520 0.900000 0.638080 +v -1.896000 1.471200 0.000000 +v -1.896000 1.471200 0.000000 +v -1.892634 1.037175 -0.635767 +v -1.892634 1.037175 0.635767 +v -1.892000 0.553725 0.000000 +v -1.892000 0.553725 0.000000 +v -1.886223 0.771675 -0.633613 +v -1.886223 0.771675 0.633613 +v -1.872927 1.178400 -0.629147 +v -1.872927 1.178400 0.629147 +v -1.871580 1.471200 -0.311096 +v -1.871580 1.471200 0.311096 +v -1.867631 0.553725 -0.310439 +v -1.867631 0.553725 0.310439 +v -1.850132 0.656400 -0.621490 +v -1.850132 0.656400 0.621490 +v -1.843750 1.621875 0.000000 +v -1.843750 1.621875 0.000000 +v -1.841822 1.323225 -0.618698 +v -1.841822 1.323225 0.618698 +v -1.824000 0.463200 -0.000000 +v -1.824000 0.463200 0.000000 +v -1.820003 1.621875 -0.302522 +v -1.820003 1.621875 0.302523 +v -1.800900 2.024775 0.000000 +v -1.800745 1.471200 -0.604900 +v -1.800745 1.471200 0.604900 +v -1.800507 0.463200 -0.299282 +v -1.800507 0.463200 0.299282 +v -1.800455 2.031069 -0.081000 +v -1.800455 2.031069 0.081000 +v -1.799246 2.048152 -0.144000 +v -1.799246 2.048152 0.144000 +v -1.797466 2.073326 -0.189000 +v -1.797466 2.073326 0.189000 +v -1.796946 0.553725 -0.603624 +v -1.796946 0.553725 0.603624 +v -1.795303 2.103896 -0.216000 +v -1.795303 2.103896 0.216000 +v -1.792950 2.137163 -0.225000 +v -1.792950 2.137163 0.225000 +v -1.790597 2.170429 -0.216000 +v -1.790597 2.170429 0.216000 +v -1.788434 2.200999 -0.189000 +v -1.788434 2.200999 0.189000 +v -1.786654 2.226173 -0.144000 +v -1.786654 2.226173 0.144000 +v -1.785445 2.243256 -0.081000 +v -1.785445 2.243256 0.081000 +v -1.785000 2.249550 0.000000 +v -1.784000 1.774800 -0.000000 +v -1.784000 1.774800 0.000000 +v -1.779680 0.900000 -0.925920 +v -1.779680 0.900000 -0.925920 +v -1.779680 0.900000 0.925920 +v -1.779680 0.900000 0.925920 +v -1.773229 1.037175 -0.922564 +v -1.773229 1.037175 0.922564 +v -1.767222 0.771675 -0.919439 +v -1.767222 0.771675 0.919439 +v -1.761022 1.774800 -0.292719 +v -1.761022 1.774800 0.292719 +v -1.754764 1.178400 -0.912957 +v -1.754764 1.178400 0.912957 +v -1.751120 1.621875 -0.588230 +v -1.751120 1.621875 0.588230 +v -1.750000 0.384375 -0.000000 +v -1.750000 0.384375 0.000000 +v -1.733408 0.656400 -0.901846 +v -1.733408 0.656400 0.901846 +v -1.732362 0.463200 -0.581929 +v -1.732362 0.463200 0.581929 +v -1.727460 0.384375 -0.287140 +v -1.727460 0.384375 0.287140 +v -1.725622 1.323225 -0.897795 +v -1.725622 1.323225 0.897795 +v -1.718250 1.929525 -0.000000 +v -1.718250 1.929525 0.000000 +v -1.696119 1.929525 -0.281930 +v -1.696119 1.929525 0.281930 +v -1.694372 1.774800 -0.569167 +v -1.694372 1.774800 0.569167 +v -1.687137 1.471200 -0.877772 +v -1.687137 1.471200 0.877772 +v -1.683577 0.553725 -0.875920 +v -1.683577 0.553725 0.875920 +v -1.676000 0.316800 0.000000 +v -1.676000 0.316800 0.000000 +v -1.662080 0.384375 -0.558320 +v -1.662080 0.384375 0.558320 +v -1.654413 0.316800 -0.274998 +v -1.654413 0.316800 0.274998 +v -1.648000 2.085600 0.000000 +v -1.648000 2.085600 0.000000 +v -1.640643 1.621875 -0.853583 +v -1.640643 1.621875 0.853583 +v -1.631925 1.929525 -0.548190 +v -1.631925 1.929525 0.548190 +v -1.626774 2.085600 -0.270404 +v -1.626774 2.085600 0.270404 +v -1.623068 0.463200 -0.844439 +v -1.623068 0.463200 0.844439 +v -1.618560 0.900000 -1.187840 +v -1.618560 0.900000 -1.187840 +v -1.618560 0.900000 1.187840 +v -1.618560 0.900000 1.187840 +v -1.612693 1.037175 -1.183534 +v -1.612693 1.037175 1.183534 +v -1.608000 0.260025 -0.000000 +v -1.608000 0.260025 0.000000 +v -1.607230 0.771675 -1.179525 +v -1.607230 0.771675 1.179525 +v -1.600000 2.025000 0.000000 +v -1.597200 2.031300 -0.081000 +v -1.597200 2.031300 0.081000 +v -1.595900 1.178400 -1.171210 +v -1.595900 1.178400 1.171210 +v -1.591798 0.316800 -0.534711 +v -1.591798 0.316800 0.534711 +v -1.589600 2.048400 -0.144000 +v -1.589600 2.048400 0.144000 +v -1.587475 1.774800 -0.825921 +v -1.587475 1.774800 0.825921 +v -1.587289 0.260025 0.263841 +v -1.587289 0.260025 -0.263841 +v -1.578400 2.073600 -0.189000 +v -1.578400 2.073600 0.189000 +v -1.576477 0.656400 -1.156956 +v -1.576477 0.656400 1.156956 +v -1.574750 2.242575 0.000000 +v -1.574750 2.242575 0.000000 +v -1.569396 1.323225 -1.151759 +v -1.569396 1.323225 1.151759 +v -1.565204 2.085600 -0.525778 +v -1.565204 2.085600 0.525778 +v -1.564800 2.104200 -0.216000 +v -1.564800 2.104200 0.216000 +v -1.557220 0.384375 -0.810180 +v -1.557220 0.384375 0.810180 +v -1.554467 2.242575 -0.258385 +v -1.554467 2.242575 0.258385 +v -1.552000 0.213600 0.000000 +v -1.552000 0.213600 0.000000 +v -1.550000 2.137500 -0.225000 +v -1.550000 2.137500 0.225000 +v -1.535200 2.170800 -0.216000 +v -1.535200 2.170800 0.216000 +v -1.534395 1.471200 -1.126072 +v -1.534395 1.471200 1.126072 +v -1.532010 0.213600 0.254652 +v -1.532010 0.213600 -0.254652 +v -1.531158 0.553725 -1.123697 +v -1.531158 0.553725 1.123697 +v -1.528968 1.929525 -0.795481 +v -1.528968 1.929525 0.795481 +v -1.527214 0.260025 -0.513016 +v -1.527214 0.260025 0.513016 +v -1.521600 2.201400 -0.189000 +v -1.521600 2.201400 0.189000 +v -1.514000 0.177075 0.000000 +v -1.514000 0.177075 0.000000 +v -1.510400 2.226600 -0.144000 +v -1.510400 2.226600 0.144000 +v -1.502800 2.243700 -0.081000 +v -1.502800 2.243700 0.081000 +v -1.500000 2.400000 0.000000 +v -1.500000 0.150000 0.000000 +v -1.500000 2.250000 0.000000 +v -1.500000 2.400000 0.000000 +v -1.500000 0.150000 0.000000 +v -1.496475 0.127575 -0.000000 +v -1.496475 0.127575 0.000000 +v -1.495635 2.242575 -0.502408 +v -1.495635 2.242575 0.502408 +v -1.494500 0.177075 0.248417 +v -1.494500 0.177075 -0.248417 +v -1.492110 1.621875 -1.095040 +v -1.492110 1.621875 1.095040 +v -1.491372 0.316800 -0.775921 +v -1.491372 0.316800 0.775921 +v -1.480800 0.105600 0.000000 +v -1.480800 0.105600 -0.000000 +v -1.480680 2.400000 -0.246120 +v -1.480680 0.150000 0.246120 +v -1.480680 2.400000 0.246120 +v -1.480680 0.150000 -0.246120 +v -1.480680 0.150000 -0.246120 +v -1.480680 0.150000 0.246120 +v -1.480325 2.435437 0.000000 +v -1.480325 2.435437 0.000000 +v -1.477200 0.127575 0.245542 +v -1.477200 0.127575 -0.245542 +v -1.476127 0.463200 -1.083310 +v -1.476127 0.463200 1.083310 +v -1.474028 0.213600 0.495150 +v -1.474028 0.213600 -0.495150 +v -1.466456 2.085600 -0.762958 +v -1.466456 2.085600 0.762958 +v -1.461727 0.105600 -0.242970 +v -1.461727 0.105600 0.242970 +v -1.461258 2.435437 -0.242892 +v -1.461258 2.435437 0.242892 +v -1.459600 2.463000 0.000000 +v -1.459600 2.463000 0.000000 +v -1.445325 0.084525 0.000000 +v -1.445325 0.084525 0.000000 +v -1.443756 1.774800 -1.059553 +v -1.443756 1.774800 1.059553 +v -1.440800 2.463000 -0.239491 +v -1.440800 2.463000 0.239491 +v -1.439025 2.482687 0.000000 +v -1.437937 0.177075 0.483027 +v -1.437937 0.177075 -0.483027 +v -1.430863 0.260025 0.744440 +v -1.430863 0.260025 -0.744440 +v -1.426709 0.084525 -0.237149 +v -1.426709 0.084525 0.237149 +v -1.424640 2.400000 -0.478560 +v -1.424640 0.150000 -0.478560 +v -1.424640 0.150000 -0.478560 +v -1.424640 0.150000 0.478560 +v -1.424640 0.150000 0.478560 +v -1.424640 2.400000 0.478560 +v -1.421292 0.127575 0.477435 +v -1.421292 0.127575 -0.477435 +v -1.420490 2.482687 -0.236115 +v -1.420490 2.482687 0.236115 +v -1.420000 0.900000 -1.420000 +v -1.420000 0.900000 -1.420000 +v -1.420000 0.900000 1.420000 +v -1.420000 0.900000 1.420000 +v -1.419800 2.494500 0.000000 +v -1.419800 2.494500 0.000000 +v -1.416240 0.384375 -1.039360 +v -1.416240 0.384375 1.039360 +v -1.414853 1.037175 -1.414853 +v -1.414853 1.037175 1.414853 +v -1.410060 0.771675 -1.410060 +v -1.410060 0.771675 1.410060 +v -1.406405 0.105600 -0.472434 +v -1.406405 0.105600 0.472434 +v -1.405953 2.435437 -0.472283 +v -1.405953 2.435437 0.472283 +v -1.403125 2.498438 0.000000 +v -1.403125 2.498438 0.000000 +v -1.401513 2.494500 -0.232961 +v -1.401513 2.494500 0.232961 +v -1.401276 2.242575 -0.729046 +v -1.401276 2.242575 0.729046 +v -1.400120 1.178400 -1.400120 +v -1.400120 1.178400 1.400120 +v -1.400000 2.400000 0.000000 +v -1.400000 2.400000 0.000000 +v -1.390545 1.929525 -1.020503 +v -1.390545 1.929525 1.020503 +v -1.390200 2.494500 0.000000 +v -1.390200 2.494500 0.000000 +v -1.386270 2.463000 -0.465671 +v -1.386270 2.463000 0.465671 +v -1.385925 2.435437 0.000000 +v -1.385925 2.435437 0.000000 +v -1.385053 2.498438 -0.230225 +v -1.385053 2.498438 0.230225 +v -1.383080 0.656400 -1.383080 +v -1.383080 0.656400 1.383080 +v -1.382400 0.064800 -0.000000 +v -1.382400 0.064800 0.000000 +v -1.382225 2.482687 -0.000000 +v -1.382225 2.482687 0.000000 +v -1.381968 2.400000 -0.229712 +v -1.381968 2.400000 0.229712 +v -1.381032 0.213600 0.718514 +v -1.381032 0.213600 -0.718514 +v -1.380400 2.463000 0.000000 +v -1.380400 2.463000 0.000000 +v -1.376868 1.323225 -1.376867 +v -1.376867 1.323225 1.376868 +v -1.372712 0.084525 -0.461116 +v -1.372712 0.084525 0.461116 +v -1.372294 2.494500 -0.228104 +v -1.372294 2.494500 0.228104 +v -1.368074 2.435437 -0.227403 +v -1.368074 2.435437 0.227403 +v -1.366728 2.482687 -0.459107 +v -1.366728 2.482687 0.459107 +v -1.364595 0.064800 -0.226824 +v -1.364595 0.064800 0.226824 +v -1.364422 2.482687 -0.226795 +v -1.364422 2.482687 0.226795 +v -1.362620 2.463000 -0.226496 +v -1.362620 2.463000 0.226496 +v -1.356353 0.316800 -0.995410 +v -1.356353 0.316800 0.995410 +v -1.348469 2.494500 -0.452973 +v -1.348469 2.494500 0.452973 +v -1.347218 0.177075 0.700921 +v -1.347218 0.177075 -0.700921 +v -1.346160 1.471200 -1.346160 +v -1.346160 1.471200 1.346160 +v -1.343320 0.553725 -1.343320 +v -1.343320 0.553725 1.343320 +v -1.334760 2.400000 -0.694440 +v -1.334760 0.150000 -0.694440 +v -1.334760 0.150000 0.694440 +v -1.334760 0.150000 0.694440 +v -1.334760 2.400000 0.694440 +v -1.334760 0.150000 -0.694440 +v -1.333693 2.085600 -0.978780 +v -1.333693 2.085600 0.978780 +v -1.332632 2.498438 -0.447653 +v -1.332632 2.498438 0.447653 +v -1.331623 0.127575 0.692808 +v -1.331623 0.127575 -0.692808 +v -1.329664 2.400000 -0.446656 +v -1.329664 2.400000 0.446656 +v -1.320356 2.494500 -0.443529 +v -1.320356 2.494500 0.443529 +v -1.317675 0.105600 -0.685551 +v -1.317675 0.105600 0.685551 +v -1.317252 2.435437 -0.685331 +v -1.317252 2.435437 0.685331 +v -1.316296 2.435437 -0.442166 +v -1.316296 2.435437 0.442166 +v -1.312948 0.064800 0.441041 +v -1.312948 0.064800 -0.441041 +v -1.312782 2.482687 -0.440985 +v -1.312782 2.482687 0.440985 +v -1.311049 2.463000 -0.440403 +v -1.311049 2.463000 0.440403 +v -1.309063 1.621875 -1.309063 +v -1.309063 1.621875 1.309063 +v -1.301322 0.260025 0.955023 +v -1.301322 0.260025 -0.955023 +v -1.300000 2.400000 0.000000 +v -1.300000 2.400000 0.000000 +v -1.298810 2.463000 -0.675736 +v -1.298810 2.463000 0.675736 +v -1.295040 0.463200 -1.295040 +v -1.295040 0.463200 1.295040 +v -1.286108 0.084525 -0.669128 +v -1.286108 0.084525 0.669128 +v -1.284375 0.046875 0.000000 +v -1.284375 0.046875 0.000000 +v -1.283256 2.400000 -0.213304 +v -1.283256 2.400000 0.213304 +v -1.280502 2.482687 -0.666211 +v -1.280502 2.482687 0.666211 +v -1.274600 2.440800 0.000000 +v -1.274600 2.440800 0.000000 +v -1.274414 2.242575 -0.935276 +v -1.274414 2.242575 0.935276 +v -1.267832 0.046875 -0.210740 +v -1.267832 0.046875 0.210740 +v -1.266640 1.774800 -1.266640 +v -1.266640 1.774800 1.266640 +v -1.263395 2.494500 -0.657311 +v -1.263395 2.494500 0.657311 +v -1.258183 2.440800 0.209136 +v -1.258183 2.440800 -0.209136 +v -1.256003 0.213600 0.921764 +v -1.256003 0.213600 -0.921764 +v -1.248557 2.498438 -0.649591 +v -1.248557 2.498438 0.649591 +v -1.245776 2.400000 -0.648144 +v -1.245776 2.400000 0.648144 +v -1.242500 0.384375 -1.242500 +v -1.242500 0.384375 1.242500 +v -1.237056 2.494500 -0.643607 +v -1.237056 2.494500 0.643607 +v -1.234688 2.400000 -0.414752 +v -1.234688 2.400000 0.414752 +v -1.233252 2.435437 -0.641628 +v -1.233252 2.435437 0.641628 +v -1.230115 0.064800 -0.639996 +v -1.230115 0.064800 0.639996 +v -1.229959 2.482687 -0.639915 +v -1.229959 2.482687 0.639915 +v -1.228335 2.463000 -0.639070 +v -1.228335 2.463000 0.639070 +v -1.225250 0.177075 0.899195 +v -1.225250 0.177075 -0.899195 +v -1.219958 1.929525 1.219958 +v -1.219958 1.929525 -1.219958 +v -1.219848 0.046875 -0.409767 +v -1.219848 0.046875 0.409767 +v -1.213920 2.400000 -0.890880 +v -1.213920 0.150000 -0.890880 +v -1.213920 0.150000 -0.890880 +v -1.213920 0.150000 0.890880 +v -1.213920 0.150000 0.890880 +v -1.213920 2.400000 0.890880 +v -1.211067 0.127575 0.888786 +v -1.211067 0.127575 -0.888786 +v -1.210564 2.440800 0.406648 +v -1.210564 2.440800 -0.406648 +v -1.204800 2.474400 0.000000 +v -1.204800 2.474400 0.000000 +v -1.198382 0.105600 -0.879477 +v -1.198382 0.105600 0.879477 +v -1.197997 2.435437 -0.879195 +v -1.197997 2.435437 0.879195 +v -1.189960 0.316800 -1.189960 +v -1.189960 0.316800 1.189960 +v -1.189282 2.474400 -0.197684 +v -1.189282 2.474400 0.197684 +v -1.187840 0.900000 -1.618560 +v -1.187840 0.900000 -1.618560 +v -1.187840 0.900000 1.618560 +v -1.187840 0.900000 1.618560 +v -1.183534 1.037175 -1.612693 +v -1.183534 1.037175 1.612693 +v -1.181225 2.463000 -0.866886 +v -1.181225 2.463000 0.866886 +v -1.179525 0.771675 -1.607230 +v -1.179525 0.771675 1.607230 +v -1.171210 1.178400 -1.595900 +v -1.171210 1.178400 1.595900 +v -1.170080 2.085600 -1.170080 +v -1.170080 2.085600 1.170080 +v -1.169673 0.084525 -0.858407 +v -1.169673 0.084525 0.858407 +v -1.164574 2.482687 -0.854666 +v -1.164574 2.482687 0.854666 +v -1.156956 0.656400 -1.576477 +v -1.156956 0.656400 1.576477 +v -1.156792 2.400000 -0.601848 +v -1.156792 2.400000 0.601848 +v -1.151759 1.323225 -1.569396 +v -1.151759 1.323225 1.569396 +v -1.149016 2.494500 -0.843248 +v -1.149016 2.494500 0.843248 +v -1.144271 2.474400 -0.384379 +v -1.144271 2.474400 0.384379 +v -1.143600 0.031200 0.000000 +v -1.143600 0.031200 0.000000 +v -1.142888 0.046875 -0.594614 +v -1.142888 0.046875 0.594614 +v -1.141680 0.260025 1.141680 +v -1.141680 0.260025 -1.141680 +v -1.135521 2.498438 -0.833344 +v -1.135521 2.498438 0.833344 +v -1.134190 2.440800 0.590089 +v -1.134190 2.440800 -0.590089 +v -1.132992 2.400000 -0.831488 +v -1.132992 2.400000 0.831488 +v -1.128870 0.031200 -0.187642 +v -1.128870 0.031200 0.187642 +v -1.126072 1.471200 -1.534395 +v -1.126072 1.471200 1.534395 +v -1.125061 2.494500 -0.825668 +v -1.125061 2.494500 0.825668 +v -1.123697 0.553725 -1.531158 +v -1.123697 0.553725 1.531158 +v -1.121601 2.435437 -0.823129 +v -1.121601 2.435437 0.823129 +v -1.118749 0.064800 -0.821035 +v -1.118749 0.064800 0.821035 +v -1.118607 2.482687 -0.820931 +v -1.118607 2.482687 0.820931 +v -1.118073 2.242575 -1.118073 +v -1.118073 2.242575 1.118073 +v -1.117130 2.463000 -0.819847 +v -1.117130 2.463000 0.819847 +v -1.101920 0.213600 1.101920 +v -1.101920 0.213600 -1.101920 +v -1.100200 2.502600 0.000000 +v -1.100200 2.502600 0.000000 +v -1.095040 1.621875 -1.492110 +v -1.095040 1.621875 1.492110 +v -1.086146 0.031200 0.364854 +v -1.086146 0.031200 -0.364854 +v -1.086029 2.502600 0.180521 +v -1.086029 2.502600 -0.180521 +v -1.083310 0.463200 -1.476127 +v -1.083310 0.463200 1.476127 +v -1.074940 0.177075 -1.074940 +v -1.074940 0.177075 1.074940 +v -1.072079 2.474400 -0.557774 +v -1.072079 2.474400 0.557774 +v -1.065000 2.400000 -1.065000 +v -1.065000 0.150000 -1.065000 +v -1.065000 0.150000 1.065000 +v -1.065000 2.400000 1.065000 +v -1.062497 0.127575 1.062497 +v -1.062497 0.127575 -1.062497 +v -1.059553 1.774800 -1.443756 +v -1.059553 1.774800 1.443756 +v -1.052064 2.400000 -0.772096 +v -1.052064 2.400000 0.772096 +v -1.051368 0.105600 -1.051368 +v -1.051368 0.105600 1.051368 +v -1.051031 2.435437 -1.051031 +v -1.051031 2.435437 1.051031 +v -1.044926 2.502600 -0.351008 +v -1.044926 2.502600 0.351008 +v -1.039419 0.046875 -0.762816 +v -1.039419 0.046875 0.762816 +v -1.039360 0.384375 -1.416240 +v -1.039360 0.384375 1.416240 +v -1.036316 2.463000 -1.036316 +v -1.036316 2.463000 1.036316 +v -1.031508 2.440800 0.757010 +v -1.031508 2.440800 -0.757010 +v -1.026181 0.084525 -1.026181 +v -1.026181 0.084525 1.026181 +v -1.021708 2.482687 -1.021708 +v -1.021708 2.482687 1.021708 +v -1.020503 1.929525 -1.390545 +v -1.020503 1.929525 1.390545 +v -1.017621 0.031200 0.529441 +v -1.017621 0.031200 -0.529441 +v -1.008058 2.494500 -1.008058 +v -1.008058 2.494500 1.008058 +v -0.996219 2.498438 -0.996219 +v -0.996219 2.498438 0.996219 +v -0.995410 0.316800 -1.356353 +v -0.995410 0.316800 1.356353 +v -0.994000 2.400000 -0.994000 +v -0.994000 2.400000 0.994000 +v -0.987042 2.494500 -0.987042 +v -0.987042 2.494500 0.987042 +v -0.984007 2.435437 -0.984007 +v -0.984007 2.435437 0.984007 +v -0.981504 0.064800 0.981504 +v -0.981504 0.064800 -0.981504 +v -0.981380 2.482687 -0.981380 +v -0.981380 2.482687 0.981380 +v -0.980084 2.463000 -0.980084 +v -0.980084 2.463000 0.980084 +v -0.979002 2.502600 0.509349 +v -0.979002 2.502600 -0.509349 +v -0.978780 2.085600 -1.333693 +v -0.978780 2.085600 1.333693 +v -0.975021 2.474400 -0.715555 +v -0.975021 2.474400 0.715555 +v -0.970400 2.527200 0.000000 +v -0.970400 2.527200 0.000000 +v -0.957901 2.527200 -0.159223 +v -0.957901 2.527200 0.159223 +v -0.955023 0.260025 1.301322 +v -0.955023 0.260025 -1.301322 +v -0.952425 0.018225 -0.000000 +v -0.952425 0.018225 0.000000 +v -0.940158 0.018225 0.156274 +v -0.940158 0.018225 -0.156274 +v -0.935276 2.242575 -1.274414 +v -0.935276 2.242575 1.274414 +v -0.925920 0.900000 -1.779680 +v -0.925920 0.900000 1.779680 +v -0.925920 0.900000 1.779680 +v -0.925920 0.900000 -1.779680 +v -0.925493 0.031200 0.679207 +v -0.925493 0.031200 -0.679207 +v -0.923000 2.400000 -0.923000 +v -0.923000 2.400000 0.923000 +v -0.922564 1.037175 1.773229 +v -0.922564 1.037175 -1.773229 +v -0.921764 0.213600 1.256003 +v -0.921764 0.213600 -1.256003 +v -0.921647 2.527200 -0.309596 +v -0.921647 2.527200 0.309596 +v -0.919439 0.771675 -1.767222 +v -0.919439 0.771675 1.767222 +v -0.912957 1.178400 -1.754764 +v -0.912957 1.178400 1.754764 +v -0.911906 0.046875 -0.911906 +v -0.911906 0.046875 0.911906 +v -0.904966 2.440800 0.904966 +v -0.904966 2.440800 -0.904966 +v -0.904575 0.018225 0.303862 +v -0.904575 0.018225 -0.303862 +v -0.901846 0.656400 -1.733408 +v -0.901846 0.656400 1.733408 +v -0.899195 0.177075 1.225250 +v -0.899195 0.177075 -1.225250 +v -0.897795 1.323225 -1.725622 +v -0.897795 1.323225 1.725622 +v -0.890880 0.150000 -1.213920 +v -0.890880 0.150000 1.213920 +v -0.890880 2.400000 -1.213920 +v -0.890880 0.150000 -1.213920 +v -0.890880 0.150000 1.213920 +v -0.890880 2.400000 1.213920 +v -0.890370 2.502600 -0.653431 +v -0.890370 2.502600 0.653431 +v -0.888786 0.127575 1.211067 +v -0.888786 0.127575 -1.211067 +v -0.879477 0.105600 -1.198382 +v -0.879477 0.105600 1.198382 +v -0.879195 2.435437 -1.197997 +v -0.879195 2.435437 1.197997 +v -0.877772 1.471200 -1.687137 +v -0.877772 1.471200 1.687137 +v -0.875920 0.553725 -1.683577 +v -0.875920 0.553725 1.683577 +v -0.866886 2.463000 -1.181225 +v -0.866886 2.463000 1.181225 +v -0.863501 2.527200 -0.449256 +v -0.863501 2.527200 0.449256 +v -0.858407 0.084525 -1.169673 +v -0.858407 0.084525 1.169673 +v -0.855408 2.474400 -0.855408 +v -0.855408 2.474400 0.855408 +v -0.854666 2.482687 -1.164574 +v -0.854666 2.482687 1.164574 +v -0.853583 1.621875 -1.640643 +v -0.853583 1.621875 1.640643 +v -0.847506 0.018225 -0.440935 +v -0.847506 0.018225 0.440935 +v -0.844439 0.463200 1.623068 +v -0.844439 0.463200 -1.623068 +v -0.843248 2.494500 -1.149016 +v -0.843248 2.494500 1.149016 +v -0.833344 2.498438 -1.135521 +v -0.833344 2.498438 1.135521 +v -0.831488 2.400000 -1.132992 +v -0.831488 2.400000 1.132992 +v -0.825921 1.774800 1.587475 +v -0.825921 1.774800 -1.587475 +v -0.825668 2.494500 -1.125061 +v -0.825668 2.494500 1.125061 +v -0.825000 2.550000 0.000000 +v -0.825000 2.550000 0.000000 +v -0.823129 2.435437 -1.121601 +v -0.823129 2.435437 1.121601 +v -0.821035 0.064800 1.118749 +v -0.821035 0.064800 -1.118749 +v -0.820931 2.482687 1.118607 +v -0.820931 2.482687 -1.118607 +v -0.819847 2.463000 -1.117130 +v -0.819847 2.463000 1.117130 +v -0.814374 2.550000 -0.135366 +v -0.814374 2.550000 0.135366 +v -0.811956 0.031200 0.811956 +v -0.811956 0.031200 -0.811956 +v -0.810180 0.384375 1.557220 +v -0.810180 0.384375 -1.557220 +v -0.795481 1.929525 1.528968 +v -0.795481 1.929525 -1.528968 +v -0.785325 2.527200 -0.576340 +v -0.785325 2.527200 0.576340 +v -0.783552 2.550000 -0.263208 +v -0.783552 2.550000 0.263208 +v -0.781142 2.502600 -0.781142 +v -0.781142 2.502600 0.781142 +v -0.775921 0.316800 -1.491372 +v -0.775921 0.316800 1.491372 +v -0.772096 2.400000 -1.052064 +v -0.772096 2.400000 1.052064 +v -0.770779 0.018225 0.565664 +v -0.770779 0.018225 -0.565664 +v -0.762958 2.085600 -1.466456 +v -0.762958 2.085600 1.466456 +v -0.762816 0.046875 -1.039419 +v -0.762816 0.046875 1.039419 +v -0.757010 2.440800 1.031508 +v -0.757010 2.440800 -1.031508 +v -0.744440 0.260025 1.430863 +v -0.744440 0.260025 -1.430863 +v -0.734118 2.550000 -0.381942 +v -0.734118 2.550000 0.381942 +v -0.729046 2.242575 -1.401276 +v -0.729046 2.242575 1.401276 +v -0.718514 0.213600 1.381032 +v -0.718514 0.213600 -1.381032 +v -0.715555 2.474400 -0.975021 +v -0.715555 2.474400 0.975021 +v -0.703200 0.008400 0.000000 +v -0.700921 0.177075 1.347218 +v -0.700921 0.177075 -1.347218 +v -0.694440 0.150000 -1.334760 +v -0.694440 0.150000 1.334760 +v -0.694440 2.400000 1.334760 +v -0.694440 0.150000 1.334760 +v -0.694440 2.400000 -1.334760 +v -0.694440 0.150000 -1.334760 +v -0.694143 0.008400 -0.115381 +v -0.694143 0.008400 0.115381 +v -0.692808 0.127575 1.331623 +v -0.692808 0.127575 -1.331623 +v -0.688984 2.527200 -0.688984 +v -0.688984 2.527200 0.688984 +v -0.685551 0.105600 -1.317675 +v -0.685551 0.105600 1.317675 +v -0.685331 2.435437 -1.317252 +v -0.685331 2.435437 1.317252 +v -0.679207 0.031200 -0.925493 +v -0.679207 0.031200 0.925493 +v -0.676222 0.018225 0.676222 +v -0.676222 0.018225 -0.676222 +v -0.675736 2.463000 -1.298810 +v -0.675736 2.463000 1.298810 +v -0.673600 2.572800 0.000000 +v -0.673600 2.572800 0.000000 +v -0.669128 0.084525 -1.286108 +v -0.669128 0.084525 1.286108 +v -0.667871 0.008400 -0.224349 +v -0.667871 0.008400 0.224349 +v -0.667656 2.550000 -0.489984 +v -0.667656 2.550000 0.489984 +v -0.666211 2.482687 1.280502 +v -0.666211 2.482687 -1.280502 +v -0.664924 2.572800 -0.110524 +v -0.664924 2.572800 0.110524 +v -0.657311 2.494500 -1.263395 +v -0.657311 2.494500 1.263395 +v -0.653431 2.502600 -0.890370 +v -0.653431 2.502600 0.890370 +v -0.649591 2.498438 -1.248557 +v -0.649591 2.498438 1.248557 +v -0.648144 2.400000 -1.245776 +v -0.648144 2.400000 1.245776 +v -0.643607 2.494500 -1.237056 +v -0.643607 2.494500 1.237056 +v -0.641628 2.435437 -1.233252 +v -0.641628 2.435437 1.233252 +v -0.639996 0.064800 -1.230115 +v -0.639996 0.064800 1.230115 +v -0.639915 2.482687 1.229959 +v -0.639915 2.482687 -1.229959 +v -0.639758 2.572800 -0.214905 +v -0.639758 2.572800 0.214905 +v -0.639070 2.463000 -1.228335 +v -0.639070 2.463000 1.228335 +v -0.638080 0.900000 -1.899520 +v -0.638080 0.900000 -1.899520 +v -0.638080 0.900000 1.899520 +v -0.638080 0.900000 1.899520 +v -0.635767 1.037175 -1.892634 +v -0.635767 1.037175 1.892634 +v -0.633613 0.771675 -1.886223 +v -0.633613 0.771675 1.886223 +v -0.629147 1.178400 -1.872927 +v -0.629147 1.178400 1.872927 +v -0.625735 0.008400 0.325553 +v -0.625735 0.008400 -0.325553 +v -0.621490 0.656400 -1.850132 +v -0.621490 0.656400 1.850132 +v -0.618698 1.323225 -1.841822 +v -0.618698 1.323225 1.841822 +v -0.604900 1.471200 -1.800745 +v -0.604900 1.471200 1.800745 +v -0.603624 0.553725 -1.796946 +v -0.603624 0.553725 1.796946 +v -0.601848 2.400000 -1.156792 +v -0.601848 2.400000 1.156792 +v -0.599396 2.572800 -0.311850 +v -0.599396 2.572800 0.311850 +v -0.594614 0.046875 -1.142888 +v -0.594614 0.046875 1.142888 +v -0.590089 2.440800 1.134190 +v -0.590089 2.440800 -1.134190 +v -0.588230 1.621875 -1.751120 +v -0.588230 1.621875 1.751120 +v -0.585750 2.550000 -0.585750 +v -0.585750 2.550000 0.585750 +v -0.581929 0.463200 -1.732362 +v -0.581929 0.463200 1.732362 +v -0.576340 2.527200 -0.785325 +v -0.576340 2.527200 0.785325 +v -0.569167 1.774800 -1.694372 +v -0.569167 1.774800 1.694372 +v -0.569086 0.008400 -0.417645 +v -0.569086 0.008400 0.417645 +v -0.565664 0.018225 0.770779 +v -0.565664 0.018225 -0.770779 +v -0.558320 0.384375 -1.662080 +v -0.558320 0.384375 1.662080 +v -0.557774 2.474400 -1.072079 +v -0.557774 2.474400 1.072079 +v -0.548190 1.929525 -1.631925 +v -0.548190 1.929525 1.631925 +v -0.545131 2.572800 -0.400065 +v -0.545131 2.572800 0.400065 +v -0.534711 0.316800 -1.591798 +v -0.534711 0.316800 1.591798 +v -0.529441 0.031200 -1.017621 +v -0.529441 0.031200 1.017621 +v -0.525800 2.597400 0.000000 +v -0.525800 2.597400 0.000000 +v -0.525778 2.085600 -1.565204 +v -0.525778 2.085600 1.565204 +v -0.519028 2.597400 0.086273 +v -0.519028 2.597400 -0.086273 +v -0.513016 0.260025 -1.527214 +v -0.513016 0.260025 1.527214 +v -0.509349 2.502600 0.979002 +v -0.509349 2.502600 -0.979002 +v -0.502408 2.242575 -1.495635 +v -0.502408 2.242575 1.495635 +v -0.499384 2.597400 -0.167751 +v -0.499384 2.597400 0.167751 +v -0.499272 0.008400 -0.499272 +v -0.499272 0.008400 0.499272 +v -0.495150 0.213600 -1.474028 +v -0.495150 0.213600 1.474028 +v -0.489984 2.550000 -0.667656 +v -0.489984 2.550000 0.667656 +v -0.483027 0.177075 -1.437937 +v -0.483027 0.177075 1.437937 +v -0.478560 0.150000 1.424640 +v -0.478560 2.400000 -1.424640 +v -0.478560 0.150000 -1.424640 +v -0.478560 0.150000 -1.424640 +v -0.478560 0.150000 1.424640 +v -0.478560 2.400000 1.424640 +v -0.478256 2.572800 -0.478256 +v -0.478256 2.572800 0.478256 +v -0.477435 0.127575 1.421292 +v -0.477435 0.127575 -1.421292 +v -0.472434 0.105600 1.406405 +v -0.472434 0.105600 -1.406405 +v -0.472283 2.435437 -1.405953 +v -0.472283 2.435437 1.405953 +v -0.467878 2.597400 -0.243424 +v -0.467878 2.597400 0.243424 +v -0.465671 2.463000 -1.386270 +v -0.465671 2.463000 1.386270 +v -0.461116 0.084525 1.372712 +v -0.461116 0.084525 -1.372712 +v -0.459107 2.482687 -1.366728 +v -0.459107 2.482687 1.366728 +v -0.452973 2.494500 -1.348469 +v -0.452973 2.494500 1.348469 +v -0.449256 2.527200 -0.863501 +v -0.449256 2.527200 0.863501 +v -0.447653 2.498438 -1.332632 +v -0.447653 2.498438 1.332632 +v -0.446656 2.400000 -1.329664 +v -0.446656 2.400000 1.329664 +v -0.443529 2.494500 -1.320356 +v -0.443529 2.494500 1.320356 +v -0.442166 2.435437 -1.316296 +v -0.442166 2.435437 1.316296 +v -0.441041 0.064800 1.312948 +v -0.441041 0.064800 -1.312948 +v -0.440985 2.482687 -1.312782 +v -0.440985 2.482687 1.312782 +v -0.440935 0.018225 0.847506 +v -0.440935 0.018225 -0.847506 +v -0.440403 2.463000 -1.311049 +v -0.440403 2.463000 1.311049 +v -0.425519 2.597400 0.312283 +v -0.425519 2.597400 -0.312283 +v -0.417645 0.008400 -0.569086 +v -0.417645 0.008400 0.569086 +v -0.414752 2.400000 -1.234688 +v -0.414752 2.400000 1.234688 +v -0.409767 0.046875 1.219848 +v -0.409767 0.046875 -1.219848 +v -0.406648 2.440800 -1.210564 +v -0.406648 2.440800 1.210564 +v -0.400065 2.572800 -0.545131 +v -0.400065 2.572800 0.545131 +v -0.391200 2.625600 0.000000 +v -0.391200 2.625600 0.000000 +v -0.388275 0.002175 -0.000000 +v -0.388275 0.002175 0.000000 +v -0.386161 2.625600 -0.064188 +v -0.386161 2.625600 0.064188 +v -0.384379 2.474400 -1.144271 +v -0.384379 2.474400 1.144271 +v -0.383274 0.002175 -0.063708 +v -0.383274 0.002175 0.063708 +v -0.381942 2.550000 -0.734118 +v -0.381942 2.550000 0.734118 +v -0.373318 2.597400 -0.373318 +v -0.373318 2.597400 0.373318 +v -0.371546 2.625600 -0.124808 +v -0.371546 2.625600 0.124808 +v -0.368768 0.002175 -0.123875 +v -0.368768 0.002175 0.123875 +v -0.364854 0.031200 1.086146 +v -0.364854 0.031200 -1.086146 +v -0.358400 3.034800 0.000000 +v -0.358400 3.034800 0.000000 +v -0.358200 3.081150 0.000000 +v -0.358200 3.081150 0.000000 +v -0.353807 3.034800 -0.059016 +v -0.353807 3.034800 0.059016 +v -0.353610 3.081150 -0.058988 +v -0.353610 3.081150 0.058988 +v -0.351008 2.502600 -1.044926 +v -0.351008 2.502600 1.044926 +v -0.348105 2.625600 -0.181110 +v -0.348105 2.625600 0.181110 +v -0.345503 0.002175 -0.179756 +v -0.345503 0.002175 0.179756 +v -0.340477 3.034800 -0.114676 +v -0.340477 3.034800 0.114676 +v -0.340289 3.081150 -0.114619 +v -0.340289 3.081150 0.114619 +v -0.328160 0.900000 -1.974240 +v -0.328160 0.900000 1.974240 +v -0.328160 0.900000 1.974240 +v -0.326970 1.037175 -1.967083 +v -0.326970 1.037175 1.967083 +v -0.325863 0.771675 -1.960420 +v -0.325863 0.771675 1.960420 +v -0.325553 0.008400 -0.625735 +v -0.325553 0.008400 0.625735 +v -0.325000 2.981250 0.000000 +v -0.325000 2.981250 0.000000 +v -0.323566 1.178400 -1.946601 +v -0.323566 1.178400 1.946601 +v -0.320834 2.981250 -0.053508 +v -0.320834 2.981250 0.053508 +v -0.319628 0.656400 -1.922910 +v -0.319628 0.656400 1.922910 +v -0.319082 3.034800 -0.166306 +v -0.319082 3.034800 0.166306 +v -0.318907 3.081150 -0.166221 +v -0.318907 3.081150 0.166221 +v -0.318192 1.323225 -1.914272 +v -0.318192 1.323225 1.914272 +v -0.316590 2.625600 -0.232342 +v -0.316590 2.625600 0.232342 +v -0.314223 0.002175 -0.230604 +v -0.314223 0.002175 0.230604 +v -0.312283 2.597400 -0.425519 +v -0.312283 2.597400 0.425519 +v -0.311850 2.572800 -0.599396 +v -0.311850 2.572800 0.599396 +v -0.311096 1.471200 -1.871580 +v -0.311096 1.471200 1.871580 +v -0.310439 0.553725 -1.867631 +v -0.310439 0.553725 1.867631 +v -0.309596 2.527200 -0.921647 +v -0.309596 2.527200 0.921647 +v -0.308800 3.117600 0.000000 +v -0.308800 3.117600 0.000000 +v -0.308744 2.981250 -0.103976 +v -0.308744 2.981250 0.103976 +v -0.304843 3.117600 -0.050855 +v -0.304843 3.117600 0.050855 +v -0.303862 0.018225 0.904575 +v -0.303862 0.018225 -0.904575 +v -0.302523 1.621875 -1.820003 +v -0.302522 1.621875 1.820003 +v -0.299282 0.463200 -1.800507 +v -0.299282 0.463200 1.800507 +v -0.293360 3.117600 -0.098814 +v -0.293360 3.117600 0.098814 +v -0.292719 1.774800 -1.761022 +v -0.292719 1.774800 1.761022 +v -0.290295 3.034800 -0.213234 +v -0.290295 3.034800 0.213234 +v -0.290138 3.081150 -0.213123 +v -0.290138 3.081150 0.213123 +v -0.289340 2.981250 -0.150793 +v -0.289340 2.981250 0.150793 +v -0.287140 0.384375 -1.727460 +v -0.287140 0.384375 1.727460 +v -0.281930 1.929525 1.696119 +v -0.281930 1.929525 -1.696119 +v -0.279400 2.659200 0.000000 +v -0.277752 2.625600 -0.277752 +v -0.277752 2.625600 0.277752 +v -0.275801 2.659200 -0.045844 +v -0.275801 2.659200 0.045844 +v -0.275675 0.002175 -0.275675 +v -0.275675 0.002175 0.275675 +v -0.274998 0.316800 -1.654413 +v -0.274998 0.316800 1.654413 +v -0.274928 3.117600 -0.143301 +v -0.274928 3.117600 0.143301 +v -0.273600 2.923200 0.000000 +v -0.273600 2.923200 0.000000 +v -0.270404 2.085600 -1.626774 +v -0.270404 2.085600 1.626774 +v -0.270092 2.923200 -0.045032 +v -0.270092 2.923200 0.045032 +v -0.265363 2.659200 -0.089140 +v -0.265363 2.659200 0.089140 +v -0.263841 0.260025 1.587289 +v -0.263841 0.260025 -1.587289 +v -0.263232 2.981250 -0.193348 +v -0.263232 2.981250 0.193348 +v -0.263208 2.550000 -0.783552 +v -0.263208 2.550000 0.783552 +v -0.259910 2.923200 -0.087511 +v -0.259910 2.923200 0.087511 +v -0.258385 2.242575 -1.554467 +v -0.258385 2.242575 1.554467 +v -0.254788 3.034800 -0.254788 +v -0.254788 3.034800 0.254788 +v -0.254653 3.081150 -0.254653 +v -0.254653 3.081150 0.254653 +v -0.254652 0.213600 -1.532010 +v -0.254652 0.213600 1.532010 +v -0.250127 3.117600 -0.183734 +v -0.250127 3.117600 0.183734 +v -0.248621 2.659200 0.129351 +v -0.248621 2.659200 -0.129351 +v -0.248417 0.177075 -1.494500 +v -0.248417 0.177075 1.494500 +v -0.246120 0.150000 1.480680 +v -0.246120 2.400000 -1.480680 +v -0.246120 0.150000 -1.480680 +v -0.246120 0.150000 -1.480680 +v -0.246120 0.150000 1.480680 +v -0.246120 2.400000 1.480680 +v -0.245542 0.127575 1.477200 +v -0.245542 0.127575 -1.477200 +v -0.243569 2.923200 -0.126920 +v -0.243569 2.923200 0.126920 +v -0.243424 2.597400 0.467878 +v -0.243424 2.597400 -0.467878 +v -0.242970 0.105600 1.461727 +v -0.242970 0.105600 -1.461727 +v -0.242892 2.435437 -1.461258 +v -0.242892 2.435437 1.461258 +v -0.239491 2.463000 -1.440800 +v -0.239491 2.463000 1.440800 +v -0.237149 0.084525 1.426709 +v -0.237149 0.084525 -1.426709 +v -0.236115 2.482687 -1.420490 +v -0.236115 2.482687 1.420490 +v -0.232961 2.494500 -1.401513 +v -0.232961 2.494500 1.401513 +v -0.232342 2.625600 -0.316590 +v -0.232342 2.625600 0.316590 +v -0.231031 2.981250 -0.231031 +v -0.231031 2.981250 0.231031 +v -0.230604 0.002175 -0.314223 +v -0.230604 0.002175 0.314223 +v -0.230225 2.498438 -1.385053 +v -0.230225 2.498438 1.385053 +v -0.229712 2.400000 -1.381968 +v -0.229712 2.400000 1.381968 +v -0.228104 2.494500 -1.372294 +v -0.228104 2.494500 1.372294 +v -0.227403 2.435437 -1.368074 +v -0.227403 2.435437 1.368074 +v -0.226824 0.064800 1.364595 +v -0.226824 0.064800 -1.364595 +v -0.226795 2.482687 1.364422 +v -0.226795 2.482687 -1.364422 +v -0.226496 2.463000 -1.362620 +v -0.226496 2.463000 1.362620 +v -0.226113 2.659200 -0.165941 +v -0.226113 2.659200 0.165941 +v -0.224349 0.008400 0.667871 +v -0.224349 0.008400 -0.667871 +v -0.221585 2.923200 -0.162745 +v -0.221585 2.923200 0.162745 +v -0.219800 2.863350 0.000000 +v -0.219800 2.863350 0.000000 +v -0.219536 3.117600 -0.219536 +v -0.219536 3.117600 0.219536 +v -0.216979 2.863350 0.036157 +v -0.216979 2.863350 -0.036157 +v -0.214905 2.572800 -0.639758 +v -0.214905 2.572800 0.639758 +v -0.213304 2.400000 -1.283256 +v -0.213304 2.400000 1.283256 +v -0.213234 3.034800 -0.290295 +v -0.213234 3.034800 0.290295 +v -0.213123 3.081150 -0.290138 +v -0.213123 3.081150 0.290138 +v -0.210740 0.046875 -1.267832 +v -0.210740 0.046875 1.267832 +v -0.209136 2.440800 -1.258183 +v -0.209136 2.440800 1.258183 +v -0.208794 2.863350 0.070270 +v -0.208794 2.863350 -0.070270 +v -0.200000 2.700000 0.000000 +v -0.200000 2.700000 0.000000 +v -0.200000 2.700000 0.000000 +v -0.200000 2.700000 0.000000 +v -0.198374 2.659200 -0.198374 +v -0.198374 2.659200 0.198374 +v -0.197684 2.474400 -1.189282 +v -0.197684 2.474400 1.189282 +v -0.197424 2.700000 -0.032816 +v -0.197424 2.700000 0.032816 +v -0.197424 2.700000 0.032816 +v -0.197424 2.700000 -0.032816 +v -0.195658 2.863350 -0.101925 +v -0.195658 2.863350 0.101925 +v -0.194600 3.141450 0.000000 +v -0.194600 3.141450 0.000000 +v -0.194472 2.923200 -0.194472 +v -0.194472 2.923200 0.194472 +v -0.193348 2.981250 -0.263232 +v -0.193348 2.981250 0.263232 +v -0.192107 3.141450 -0.032048 +v -0.192107 3.141450 0.032048 +v -0.189952 2.700000 -0.063808 +v -0.189952 2.700000 0.063808 +v -0.189952 2.700000 0.063808 +v -0.189952 2.700000 -0.063808 +v -0.187642 0.031200 1.128870 +v -0.187642 0.031200 -1.128870 +v -0.184870 3.141450 -0.062272 +v -0.184870 3.141450 0.062272 +v -0.183734 3.117600 -0.250127 +v -0.183734 3.117600 0.250127 +v -0.181110 2.625600 0.348105 +v -0.181110 2.625600 -0.348105 +v -0.180521 2.502600 -1.086029 +v -0.180521 2.502600 1.086029 +v -0.179756 0.002175 -0.345503 +v -0.179756 0.002175 0.345503 +v -0.179200 2.804400 0.000000 +v -0.179200 2.804400 0.000000 +v -0.177989 2.863350 -0.130707 +v -0.177989 2.863350 0.130707 +v -0.177968 2.700000 -0.092592 +v -0.177968 2.700000 0.092592 +v -0.177968 2.700000 0.092592 +v -0.177968 2.700000 -0.092592 +v -0.176897 2.804400 0.029450 +v -0.176897 2.804400 -0.029450 +v -0.173255 3.141450 -0.090306 +v -0.173255 3.141450 0.090306 +v -0.170215 2.804400 0.057246 +v -0.170215 2.804400 -0.057246 +v -0.167751 2.597400 -0.499384 +v -0.167751 2.597400 0.499384 +v -0.167400 2.749050 0.000000 +v -0.167400 2.749050 0.000000 +v -0.166306 3.034800 -0.319082 +v -0.166306 3.034800 0.319082 +v -0.166221 3.081150 0.318907 +v -0.166221 3.081150 -0.318907 +v -0.165941 2.659200 -0.226113 +v -0.165941 2.659200 0.226113 +v -0.165245 2.749050 0.027480 +v -0.165245 2.749050 -0.027480 +v -0.162745 2.923200 -0.221585 +v -0.162745 2.923200 0.221585 +v -0.161856 2.700000 -0.118784 +v -0.161856 2.700000 0.118784 +v -0.161856 2.700000 0.118784 +v -0.161856 2.700000 -0.118784 +v -0.159496 2.804400 0.083047 +v -0.159496 2.804400 -0.083047 +v -0.159223 2.527200 -0.957901 +v -0.159223 2.527200 0.957901 +v -0.158995 2.749050 0.053428 +v -0.158995 2.749050 -0.053428 +v -0.157626 3.141450 -0.115787 +v -0.157626 3.141450 0.115787 +v -0.156274 0.018225 0.940158 +v -0.156274 0.018225 -0.940158 +v -0.156200 2.863350 -0.156200 +v -0.156200 2.863350 0.156200 +v -0.150793 2.981250 -0.289340 +v -0.150793 2.981250 0.289340 +v -0.148969 2.749050 0.077523 +v -0.148969 2.749050 -0.077523 +v -0.145078 2.804400 0.106513 +v -0.145078 2.804400 -0.106513 +v -0.143301 3.117600 -0.274928 +v -0.143301 3.117600 0.274928 +v -0.142000 2.700000 -0.142000 +v -0.142000 2.700000 0.142000 +v -0.142000 2.700000 0.142000 +v -0.142000 2.700000 -0.142000 +v -0.138348 3.141450 -0.138348 +v -0.138348 3.141450 0.138348 +v -0.135489 2.749050 0.099446 +v -0.135489 2.749050 -0.099446 +v -0.135366 2.550000 -0.814374 +v -0.135366 2.550000 0.814374 +v -0.130707 2.863350 -0.177989 +v -0.130707 2.863350 0.177989 +v -0.129351 2.659200 0.248621 +v -0.129351 2.659200 -0.248621 +v -0.127304 2.804400 0.127304 +v -0.127304 2.804400 -0.127304 +v -0.126920 2.923200 -0.243569 +v -0.126920 2.923200 0.243569 +v -0.124808 2.625600 -0.371546 +v -0.124808 2.625600 0.371546 +v -0.123875 0.002175 0.368768 +v -0.123875 0.002175 -0.368768 +v -0.118874 2.749050 0.118874 +v -0.118874 2.749050 -0.118874 +v -0.118784 2.700000 -0.161856 +v -0.118784 2.700000 0.161856 +v -0.118784 2.700000 0.161856 +v -0.118784 2.700000 -0.161856 +v -0.115787 3.141450 -0.157626 +v -0.115787 3.141450 0.157626 +v -0.115381 0.008400 0.694143 +v -0.115381 0.008400 -0.694143 +v -0.114676 3.034800 -0.340477 +v -0.114676 3.034800 0.340477 +v -0.114619 3.081150 -0.340289 +v -0.114619 3.081150 0.340289 +v -0.110524 2.572800 -0.664924 +v -0.110524 2.572800 0.664924 +v -0.106513 2.804400 -0.145078 +v -0.106513 2.804400 0.145078 +v -0.103976 2.981250 -0.308744 +v -0.103976 2.981250 0.308744 +v -0.101925 2.863350 -0.195658 +v -0.101925 2.863350 0.195658 +v -0.099446 2.749050 0.135489 +v -0.099446 2.749050 -0.135489 +v -0.098814 3.117600 -0.293360 +v -0.098814 3.117600 0.293360 +v -0.092592 2.700000 -0.177968 +v -0.092592 2.700000 0.177968 +v -0.092592 2.700000 -0.177968 +v -0.092592 2.700000 0.177968 +v -0.090306 3.141450 -0.173255 +v -0.090306 3.141450 0.173255 +v -0.089140 2.659200 -0.265363 +v -0.089140 2.659200 0.265363 +v -0.087511 2.923200 -0.259910 +v -0.087511 2.923200 0.259910 +v -0.086273 2.597400 -0.519028 +v -0.086273 2.597400 0.519028 +v -0.083047 2.804400 -0.159496 +v -0.083047 2.804400 0.159496 +v -0.077523 2.749050 -0.148969 +v -0.077523 2.749050 0.148969 +v -0.070270 2.863350 -0.208794 +v -0.070270 2.863350 0.208794 +v -0.064188 2.625600 -0.386161 +v -0.064188 2.625600 0.386161 +v -0.063808 2.700000 -0.189952 +v -0.063808 2.700000 0.189952 +v -0.063808 2.700000 -0.189952 +v -0.063808 2.700000 0.189952 +v -0.063708 0.002175 0.383274 +v -0.063708 0.002175 -0.383274 +v -0.062272 3.141450 -0.184870 +v -0.062272 3.141450 0.184870 +v -0.059016 3.034800 -0.353807 +v -0.059016 3.034800 0.353807 +v -0.058988 3.081150 -0.353610 +v -0.058988 3.081150 0.353610 +v -0.057246 2.804400 -0.170215 +v -0.057246 2.804400 0.170215 +v -0.053508 2.981250 -0.320834 +v -0.053508 2.981250 0.320834 +v -0.053428 2.749050 -0.158995 +v -0.053428 2.749050 0.158995 +v -0.050855 3.117600 -0.304843 +v -0.050855 3.117600 0.304843 +v -0.045844 2.659200 -0.275801 +v -0.045844 2.659200 0.275801 +v -0.045032 2.923200 -0.270092 +v -0.045032 2.923200 0.270092 +v -0.036157 2.863350 -0.216979 +v -0.036157 2.863350 0.216979 +v -0.032816 2.700000 -0.197424 +v -0.032816 2.700000 0.197424 +v -0.032816 2.700000 -0.197424 +v -0.032816 2.700000 0.197424 +v -0.032048 3.141450 -0.192107 +v -0.032048 3.141450 0.192107 +v -0.029450 2.804400 -0.176897 +v -0.029450 2.804400 0.176897 +v -0.027480 2.749050 -0.165245 +v -0.027480 2.749050 0.165245 +v -0.000000 0.260025 1.608000 +v -0.000000 1.929525 1.718250 +v -0.000000 2.085600 -1.648000 +v -0.000000 0.656400 -1.948000 +v -0.000000 0.771675 -1.986000 +v -0.000000 2.482687 1.382225 +v -0.000000 2.700000 -0.200000 +v -0.000000 0.127575 1.496475 +v -0.000000 2.474400 -1.204800 +v -0.000000 2.749050 -0.167400 +v -0.000000 0.018225 0.952425 +v -0.000000 0.046875 -1.284375 +v -0.000000 0.064800 1.382400 +v -0.000000 0.384375 1.750000 +v -0.000000 0.463200 1.824000 +v -0.000000 0.553725 -1.892000 +v -0.000000 1.037175 1.992750 +v -0.000000 1.178400 1.972000 +v -0.000000 1.323225 -1.939250 +v -0.000000 1.621875 -1.843750 +v -0.000000 1.774800 1.784000 +v -0.000000 2.400000 -1.300000 +v -0.000000 2.435437 -1.480325 +v -0.000000 2.435437 -1.385925 +v -0.000000 2.463000 -1.459600 +v -0.000000 2.463000 -1.380400 +v -0.000000 2.494500 -1.390200 +v -0.000000 2.502600 -1.100200 +v -0.000000 2.804400 -0.179200 +v -0.000000 2.863350 -0.219800 +v -0.000000 2.572800 -0.673600 +v -0.000000 0.105600 1.480800 +v -0.000000 0.177075 -1.514000 +v -0.000000 2.494500 -1.419800 +v -0.000000 2.527200 -0.970400 +v -0.000000 2.923200 -0.273600 +v -0.000000 3.117600 -0.308800 +v -0.000000 2.597400 -0.525800 +v -0.000000 2.700000 -0.200000 +v -0.000000 2.981250 -0.325000 +v -0.000000 3.141450 -0.194600 +v -0.000000 0.002175 0.388275 +v -0.000000 3.081150 -0.358200 +v 0.000000 0.000000 0.000000 +v 0.000000 0.002175 -0.388275 +v 0.000000 0.002175 0.388275 +v 0.000000 0.008400 -0.703200 +v 0.000000 0.008400 0.703200 +v 0.000000 0.018225 -0.952425 +v 0.000000 0.018225 0.952425 +v 0.000000 0.031200 -1.143600 +v 0.000000 0.031200 -1.143600 +v 0.000000 0.031200 1.143600 +v 0.000000 0.031200 1.143600 +v 0.000000 0.046875 -1.284375 +v 0.000000 0.046875 1.284375 +v 0.000000 0.064800 -1.382400 +v 0.000000 0.064800 1.382400 +v 0.000000 0.084525 -1.445325 +v 0.000000 0.084525 -1.445325 +v 0.000000 0.084525 1.445325 +v 0.000000 0.084525 1.445325 +v 0.000000 0.105600 -1.480800 +v 0.000000 0.105600 1.480800 +v 0.000000 0.127575 -1.496475 +v 0.000000 0.127575 1.496475 +v 0.000000 0.150000 -1.500000 +v 0.000000 0.150000 -1.500000 +v 0.000000 0.150000 1.500000 +v 0.000000 0.150000 1.500000 +v 0.000000 0.177075 -1.514000 +v 0.000000 0.177075 1.514000 +v 0.000000 0.213600 -1.552000 +v 0.000000 0.213600 -1.552000 +v 0.000000 0.213600 1.552000 +v 0.000000 0.213600 1.552000 +v 0.000000 0.260025 -1.608000 +v 0.000000 0.260025 1.608000 +v 0.000000 0.316800 -1.676000 +v 0.000000 0.316800 -1.676000 +v 0.000000 0.316800 1.676000 +v 0.000000 0.316800 1.676000 +v 0.000000 0.384375 -1.750000 +v 0.000000 0.384375 1.750000 +v 0.000000 0.463200 -1.824000 +v 0.000000 0.463200 1.824000 +v 0.000000 0.553725 -1.892000 +v 0.000000 0.553725 1.892000 +v 0.000000 0.656400 -1.948000 +v 0.000000 0.656400 1.948000 +v 0.000000 0.771675 -1.986000 +v 0.000000 0.771675 1.986000 +v 0.000000 0.900000 -2.000000 +v 0.000000 0.900000 -2.000000 +v 0.000000 0.900000 2.000000 +v 0.000000 0.900000 2.000000 +v 0.000000 1.037175 -1.992750 +v 0.000000 1.037175 1.992750 +v 0.000000 1.178400 -1.972000 +v 0.000000 1.178400 1.972000 +v 0.000000 1.323225 -1.939250 +v 0.000000 1.323225 1.939250 +v 0.000000 1.471200 -1.896000 +v 0.000000 1.471200 -1.896000 +v 0.000000 1.471200 1.896000 +v 0.000000 1.471200 1.896000 +v 0.000000 1.621875 -1.843750 +v 0.000000 1.621875 1.843750 +v 0.000000 1.774800 -1.784000 +v 0.000000 1.774800 1.784000 +v 0.000000 1.929525 -1.718250 +v 0.000000 1.929525 1.718250 +v 0.000000 2.085600 -1.648000 +v 0.000000 2.085600 1.648000 +v 0.000000 2.242575 -1.574750 +v 0.000000 2.242575 -1.574750 +v 0.000000 2.242575 1.574750 +v 0.000000 2.242575 1.574750 +v 0.000000 2.400000 -1.500000 +v 0.000000 2.400000 -1.500000 +v 0.000000 2.400000 -1.400000 +v 0.000000 2.400000 -1.400000 +v 0.000000 2.400000 -1.300000 +v 0.000000 2.400000 1.300000 +v 0.000000 2.400000 1.400000 +v 0.000000 2.400000 1.400000 +v 0.000000 2.400000 1.500000 +v 0.000000 2.400000 1.500000 +v 0.000000 2.435437 -1.480325 +v 0.000000 2.435437 -1.385925 +v 0.000000 2.435437 1.385925 +v 0.000000 2.435437 1.480325 +v 0.000000 2.440800 -1.274600 +v 0.000000 2.440800 -1.274600 +v 0.000000 2.440800 1.274600 +v 0.000000 2.440800 1.274600 +v 0.000000 2.463000 -1.459600 +v 0.000000 2.463000 -1.380400 +v 0.000000 2.463000 1.380400 +v 0.000000 2.463000 1.459600 +v 0.000000 2.474400 -1.204800 +v 0.000000 2.474400 1.204800 +v 0.000000 2.482687 -1.439025 +v 0.000000 2.482687 -1.382225 +v 0.000000 2.482687 1.382225 +v 0.000000 2.482687 1.439025 +v 0.000000 2.494500 -1.419800 +v 0.000000 2.494500 -1.390200 +v 0.000000 2.494500 1.390200 +v 0.000000 2.494500 1.419800 +v 0.000000 2.498438 -1.403125 +v 0.000000 2.498438 -1.403125 +v 0.000000 2.498438 1.403125 +v 0.000000 2.498438 1.403125 +v 0.000000 2.502600 -1.100200 +v 0.000000 2.502600 1.100200 +v 0.000000 2.527200 -0.970400 +v 0.000000 2.527200 0.970400 +v 0.000000 2.550000 -0.825000 +v 0.000000 2.550000 -0.825000 +v 0.000000 2.550000 0.825000 +v 0.000000 2.550000 0.825000 +v 0.000000 2.572800 -0.673600 +v 0.000000 2.572800 0.673600 +v 0.000000 2.597400 -0.525800 +v 0.000000 2.597400 0.525800 +v 0.000000 2.625600 -0.391200 +v 0.000000 2.625600 -0.391200 +v 0.000000 2.625600 0.391200 +v 0.000000 2.625600 0.391200 +v 0.000000 2.659200 -0.279400 +v 0.000000 2.659200 0.279400 +v 0.000000 2.700000 -0.200000 +v 0.000000 2.700000 -0.200000 +v 0.000000 2.700000 0.200000 +v 0.000000 2.700000 0.200000 +v 0.000000 2.749050 -0.167400 +v 0.000000 2.749050 0.167400 +v 0.000000 2.804400 -0.179200 +v 0.000000 2.804400 0.179200 +v 0.000000 2.863350 -0.219800 +v 0.000000 2.863350 0.219800 +v 0.000000 2.923200 -0.273600 +v 0.000000 2.923200 0.273600 +v 0.000000 2.981250 -0.325000 +v 0.000000 2.981250 0.325000 +v 0.000000 3.034800 -0.358400 +v 0.000000 3.034800 -0.358400 +v 0.000000 3.034800 0.358400 +v 0.000000 3.034800 0.358400 +v 0.000000 3.081150 -0.358200 +v 0.000000 3.081150 0.358200 +v 0.000000 3.117600 -0.308800 +v 0.000000 3.117600 0.308800 +v 0.000000 3.141450 -0.194600 +v 0.000000 3.141450 0.194600 +v 0.000000 3.150000 0.000000 +v 0.000000 0.002175 -0.388275 +v 0.000000 3.081150 0.358200 +v 0.000000 2.597400 0.525800 +v 0.000000 2.700000 0.200000 +v 0.000000 2.981250 0.325000 +v 0.000000 3.141450 0.194600 +v 0.000000 3.117600 0.308800 +v 0.000000 0.105600 -1.480800 +v 0.000000 0.177075 1.514000 +v 0.000000 2.494500 1.419800 +v 0.000000 2.527200 0.970400 +v 0.000000 2.923200 0.273600 +v 0.000000 2.572800 0.673600 +v 0.000000 2.863350 0.219800 +v 0.000000 0.018225 -0.952425 +v 0.000000 0.046875 1.284375 +v 0.000000 0.064800 -1.382400 +v 0.000000 0.384375 -1.750000 +v 0.000000 0.463200 -1.824000 +v 0.000000 0.553725 1.892000 +v 0.000000 1.037175 -1.992750 +v 0.000000 1.178400 -1.972000 +v 0.000000 1.323225 1.939250 +v 0.000000 1.621875 1.843750 +v 0.000000 1.774800 -1.784000 +v 0.000000 2.400000 1.300000 +v 0.000000 2.435437 1.385925 +v 0.000000 2.435437 1.480325 +v 0.000000 2.463000 1.380400 +v 0.000000 2.463000 1.459600 +v 0.000000 2.494500 1.390200 +v 0.000000 2.502600 1.100200 +v 0.000000 2.804400 0.179200 +v 0.000000 2.749050 0.167400 +v 0.000000 0.127575 -1.496475 +v 0.000000 2.474400 1.204800 +v 0.000000 0.656400 1.948000 +v 0.000000 0.771675 1.986000 +v 0.000000 2.482687 -1.382225 +v 0.000000 2.700000 0.200000 +v 0.000000 0.260025 -1.608000 +v 0.000000 1.929525 -1.718250 +v 0.000000 2.085600 1.648000 +v 0.027480 2.749050 -0.165245 +v 0.027480 2.749050 0.165245 +v 0.029450 2.804400 -0.176897 +v 0.029450 2.804400 0.176897 +v 0.032048 3.141450 -0.192107 +v 0.032048 3.141450 0.192107 +v 0.032816 2.700000 -0.197424 +v 0.032816 2.700000 0.197424 +v 0.032816 2.700000 -0.197424 +v 0.032816 2.700000 0.197424 +v 0.036157 2.863350 -0.216979 +v 0.036157 2.863350 0.216979 +v 0.045032 2.923200 -0.270092 +v 0.045032 2.923200 0.270092 +v 0.045844 2.659200 -0.275801 +v 0.045844 2.659200 0.275801 +v 0.050855 3.117600 -0.304843 +v 0.050855 3.117600 0.304843 +v 0.053428 2.749050 -0.158995 +v 0.053428 2.749050 0.158995 +v 0.053508 2.981250 -0.320834 +v 0.053508 2.981250 0.320834 +v 0.057246 2.804400 -0.170215 +v 0.057246 2.804400 0.170215 +v 0.058988 3.081150 -0.353610 +v 0.058988 3.081150 0.353610 +v 0.059016 3.034800 -0.353807 +v 0.059016 3.034800 0.353807 +v 0.062272 3.141450 -0.184870 +v 0.062272 3.141450 0.184870 +v 0.063708 0.002175 0.383274 +v 0.063708 0.002175 -0.383274 +v 0.063808 2.700000 -0.189952 +v 0.063808 2.700000 0.189952 +v 0.063808 2.700000 -0.189952 +v 0.063808 2.700000 0.189952 +v 0.064188 2.625600 -0.386161 +v 0.064188 2.625600 0.386161 +v 0.070270 2.863350 -0.208794 +v 0.070270 2.863350 0.208794 +v 0.077523 2.749050 -0.148969 +v 0.077523 2.749050 0.148969 +v 0.083047 2.804400 -0.159496 +v 0.083047 2.804400 0.159496 +v 0.086273 2.597400 -0.519028 +v 0.086273 2.597400 0.519028 +v 0.087511 2.923200 -0.259910 +v 0.087511 2.923200 0.259910 +v 0.089140 2.659200 -0.265363 +v 0.089140 2.659200 0.265363 +v 0.090306 3.141450 -0.173255 +v 0.090306 3.141450 0.173255 +v 0.092592 2.700000 -0.177968 +v 0.092592 2.700000 0.177968 +v 0.092592 2.700000 -0.177968 +v 0.092592 2.700000 0.177968 +v 0.098814 3.117600 -0.293360 +v 0.098814 3.117600 0.293360 +v 0.099446 2.749050 0.135489 +v 0.099446 2.749050 -0.135489 +v 0.101925 2.863350 -0.195658 +v 0.101925 2.863350 0.195658 +v 0.103976 2.981250 -0.308744 +v 0.103976 2.981250 0.308744 +v 0.106513 2.804400 -0.145078 +v 0.106513 2.804400 0.145078 +v 0.110524 2.572800 -0.664924 +v 0.110524 2.572800 0.664924 +v 0.114619 3.081150 -0.340289 +v 0.114619 3.081150 0.340289 +v 0.114676 3.034800 -0.340477 +v 0.114676 3.034800 0.340477 +v 0.115381 0.008400 0.694143 +v 0.115381 0.008400 -0.694143 +v 0.115787 3.141450 -0.157626 +v 0.115787 3.141450 0.157626 +v 0.118784 2.700000 0.161856 +v 0.118784 2.700000 -0.161856 +v 0.118784 2.700000 -0.161856 +v 0.118784 2.700000 0.161856 +v 0.118874 2.749050 0.118874 +v 0.118874 2.749050 -0.118874 +v 0.123875 0.002175 0.368768 +v 0.123875 0.002175 -0.368768 +v 0.124808 2.625600 -0.371546 +v 0.124808 2.625600 0.371546 +v 0.126920 2.923200 -0.243569 +v 0.126920 2.923200 0.243569 +v 0.127304 2.804400 0.127304 +v 0.127304 2.804400 -0.127304 +v 0.129351 2.659200 0.248621 +v 0.129351 2.659200 -0.248621 +v 0.130707 2.863350 -0.177989 +v 0.130707 2.863350 0.177989 +v 0.135366 2.550000 -0.814374 +v 0.135366 2.550000 0.814374 +v 0.135489 2.749050 0.099446 +v 0.135489 2.749050 -0.099446 +v 0.138348 3.141450 -0.138348 +v 0.138348 3.141450 0.138348 +v 0.142000 2.700000 0.142000 +v 0.142000 2.700000 -0.142000 +v 0.142000 2.700000 -0.142000 +v 0.142000 2.700000 0.142000 +v 0.143301 3.117600 -0.274928 +v 0.143301 3.117600 0.274928 +v 0.145078 2.804400 0.106513 +v 0.145078 2.804400 -0.106513 +v 0.148969 2.749050 0.077523 +v 0.148969 2.749050 -0.077523 +v 0.150793 2.981250 -0.289340 +v 0.150793 2.981250 0.289340 +v 0.156200 2.863350 -0.156200 +v 0.156200 2.863350 0.156200 +v 0.156274 0.018225 0.940158 +v 0.156274 0.018225 -0.940158 +v 0.157626 3.141450 -0.115787 +v 0.157626 3.141450 0.115787 +v 0.158995 2.749050 0.053428 +v 0.158995 2.749050 -0.053428 +v 0.159223 2.527200 -0.957901 +v 0.159223 2.527200 0.957901 +v 0.159496 2.804400 0.083047 +v 0.159496 2.804400 -0.083047 +v 0.161856 2.700000 0.118784 +v 0.161856 2.700000 -0.118784 +v 0.161856 2.700000 -0.118784 +v 0.161856 2.700000 0.118784 +v 0.162745 2.923200 -0.221585 +v 0.162745 2.923200 0.221585 +v 0.165245 2.749050 0.027480 +v 0.165245 2.749050 -0.027480 +v 0.165941 2.659200 -0.226113 +v 0.165941 2.659200 0.226113 +v 0.166221 3.081150 0.318907 +v 0.166221 3.081150 -0.318907 +v 0.166306 3.034800 -0.319082 +v 0.166306 3.034800 0.319082 +v 0.167400 2.749050 -0.000000 +v 0.167400 2.749050 0.000000 +v 0.167751 2.597400 -0.499384 +v 0.167751 2.597400 0.499384 +v 0.170215 2.804400 0.057246 +v 0.170215 2.804400 -0.057246 +v 0.173255 3.141450 -0.090306 +v 0.173255 3.141450 0.090306 +v 0.176897 2.804400 0.029450 +v 0.176897 2.804400 -0.029450 +v 0.177968 2.700000 0.092592 +v 0.177968 2.700000 -0.092592 +v 0.177968 2.700000 -0.092592 +v 0.177968 2.700000 0.092592 +v 0.177989 2.863350 -0.130707 +v 0.177989 2.863350 0.130707 +v 0.179200 2.804400 -0.000000 +v 0.179200 2.804400 0.000000 +v 0.179756 0.002175 -0.345503 +v 0.179756 0.002175 0.345503 +v 0.180521 2.502600 -1.086029 +v 0.180521 2.502600 1.086029 +v 0.181110 2.625600 0.348105 +v 0.181110 2.625600 -0.348105 +v 0.183734 3.117600 -0.250127 +v 0.183734 3.117600 0.250127 +v 0.184870 3.141450 -0.062272 +v 0.184870 3.141450 0.062272 +v 0.187642 0.031200 1.128870 +v 0.187642 0.031200 -1.128870 +v 0.189952 2.700000 0.063808 +v 0.189952 2.700000 -0.063808 +v 0.189952 2.700000 -0.063808 +v 0.189952 2.700000 0.063808 +v 0.192107 3.141450 -0.032048 +v 0.192107 3.141450 0.032048 +v 0.193348 2.981250 -0.263232 +v 0.193348 2.981250 0.263232 +v 0.194472 2.923200 -0.194472 +v 0.194472 2.923200 0.194472 +v 0.194600 3.141450 0.000000 +v 0.194600 3.141450 -0.000000 +v 0.195658 2.863350 -0.101925 +v 0.195658 2.863350 0.101925 +v 0.197424 2.700000 0.032816 +v 0.197424 2.700000 -0.032816 +v 0.197424 2.700000 -0.032816 +v 0.197424 2.700000 0.032816 +v 0.197684 2.474400 -1.189282 +v 0.197684 2.474400 1.189282 +v 0.198374 2.659200 -0.198374 +v 0.198374 2.659200 0.198374 +v 0.200000 2.700000 -0.000000 +v 0.200000 2.700000 0.000000 +v 0.200000 2.700000 0.000000 +v 0.200000 2.700000 -0.000000 +v 0.208794 2.863350 0.070270 +v 0.208794 2.863350 -0.070270 +v 0.209136 2.440800 -1.258183 +v 0.209136 2.440800 1.258183 +v 0.210740 0.046875 -1.267832 +v 0.210740 0.046875 1.267832 +v 0.213123 3.081150 -0.290138 +v 0.213123 3.081150 0.290138 +v 0.213234 3.034800 -0.290295 +v 0.213234 3.034800 0.290295 +v 0.213304 2.400000 -1.283256 +v 0.213304 2.400000 1.283256 +v 0.214905 2.572800 -0.639758 +v 0.214905 2.572800 0.639758 +v 0.216979 2.863350 0.036157 +v 0.216979 2.863350 -0.036157 +v 0.219536 3.117600 -0.219536 +v 0.219536 3.117600 0.219536 +v 0.219800 2.863350 -0.000000 +v 0.219800 2.863350 0.000000 +v 0.221585 2.923200 -0.162745 +v 0.221585 2.923200 0.162745 +v 0.224349 0.008400 0.667871 +v 0.224349 0.008400 -0.667871 +v 0.226113 2.659200 -0.165941 +v 0.226113 2.659200 0.165941 +v 0.226496 2.463000 -1.362620 +v 0.226496 2.463000 1.362620 +v 0.226795 2.482687 1.364422 +v 0.226795 2.482687 -1.364422 +v 0.226824 0.064800 1.364595 +v 0.226824 0.064800 -1.364595 +v 0.227403 2.435437 -1.368074 +v 0.227403 2.435437 1.368074 +v 0.228104 2.494500 -1.372294 +v 0.228104 2.494500 1.372294 +v 0.229712 2.400000 -1.381968 +v 0.229712 2.400000 1.381968 +v 0.230225 2.498438 -1.385053 +v 0.230225 2.498438 1.385053 +v 0.230604 0.002175 -0.314223 +v 0.230604 0.002175 0.314223 +v 0.231031 2.981250 -0.231031 +v 0.231031 2.981250 0.231031 +v 0.232342 2.625600 -0.316590 +v 0.232342 2.625600 0.316590 +v 0.232961 2.494500 -1.401513 +v 0.232961 2.494500 1.401513 +v 0.236115 2.482687 -1.420490 +v 0.236115 2.482687 1.420490 +v 0.237149 0.084525 1.426709 +v 0.237149 0.084525 -1.426709 +v 0.239491 2.463000 -1.440800 +v 0.239491 2.463000 1.440800 +v 0.242892 2.435437 -1.461258 +v 0.242892 2.435437 1.461258 +v 0.242970 0.105600 1.461727 +v 0.242970 0.105600 -1.461727 +v 0.243424 2.597400 0.467878 +v 0.243424 2.597400 -0.467878 +v 0.243569 2.923200 -0.126920 +v 0.243569 2.923200 0.126920 +v 0.245542 0.127575 1.477200 +v 0.245542 0.127575 -1.477200 +v 0.246120 0.150000 -1.480680 +v 0.246120 2.400000 -1.480680 +v 0.246120 0.150000 1.480680 +v 0.246120 0.150000 1.480680 +v 0.246120 2.400000 1.480680 +v 0.246120 0.150000 -1.480680 +v 0.248417 0.177075 -1.494500 +v 0.248417 0.177075 1.494500 +v 0.248621 2.659200 0.129351 +v 0.248621 2.659200 -0.129351 +v 0.250127 3.117600 -0.183734 +v 0.250127 3.117600 0.183734 +v 0.254652 0.213600 -1.532010 +v 0.254652 0.213600 1.532010 +v 0.254653 3.081150 -0.254653 +v 0.254653 3.081150 0.254653 +v 0.254788 3.034800 -0.254788 +v 0.254788 3.034800 0.254788 +v 0.258385 2.242575 -1.554467 +v 0.258385 2.242575 1.554467 +v 0.259910 2.923200 -0.087511 +v 0.259910 2.923200 0.087511 +v 0.263208 2.550000 -0.783552 +v 0.263208 2.550000 0.783552 +v 0.263232 2.981250 -0.193348 +v 0.263232 2.981250 0.193348 +v 0.263841 0.260025 1.587289 +v 0.263841 0.260025 -1.587289 +v 0.265363 2.659200 -0.089140 +v 0.265363 2.659200 0.089140 +v 0.270092 2.923200 -0.045032 +v 0.270092 2.923200 0.045032 +v 0.270404 2.085600 -1.626774 +v 0.270404 2.085600 1.626774 +v 0.273600 2.923200 -0.000000 +v 0.273600 2.923200 0.000000 +v 0.274928 3.117600 -0.143301 +v 0.274928 3.117600 0.143301 +v 0.274998 0.316800 -1.654413 +v 0.274998 0.316800 1.654413 +v 0.275675 0.002175 -0.275675 +v 0.275675 0.002175 0.275675 +v 0.275801 2.659200 -0.045844 +v 0.275801 2.659200 0.045844 +v 0.277752 2.625600 -0.277752 +v 0.277752 2.625600 0.277752 +v 0.279400 2.659200 0.000000 +v 0.281930 1.929525 1.696119 +v 0.281930 1.929525 -1.696119 +v 0.287140 0.384375 -1.727460 +v 0.287140 0.384375 1.727460 +v 0.289340 2.981250 -0.150793 +v 0.289340 2.981250 0.150793 +v 0.290138 3.081150 -0.213123 +v 0.290138 3.081150 0.213123 +v 0.290295 3.034800 -0.213234 +v 0.290295 3.034800 0.213234 +v 0.292719 1.774800 -1.761022 +v 0.292719 1.774800 1.761022 +v 0.293360 3.117600 -0.098814 +v 0.293360 3.117600 0.098814 +v 0.299282 0.463200 -1.800507 +v 0.299282 0.463200 1.800507 +v 0.302522 1.621875 -1.820003 +v 0.302523 1.621875 1.820003 +v 0.303862 0.018225 0.904575 +v 0.303862 0.018225 -0.904575 +v 0.304843 3.117600 -0.050855 +v 0.304843 3.117600 0.050855 +v 0.308744 2.981250 -0.103976 +v 0.308744 2.981250 0.103976 +v 0.308800 3.117600 0.000000 +v 0.308800 3.117600 -0.000000 +v 0.309596 2.527200 -0.921647 +v 0.309596 2.527200 0.921647 +v 0.310439 0.553725 -1.867631 +v 0.310439 0.553725 1.867631 +v 0.311096 1.471200 -1.871580 +v 0.311096 1.471200 1.871580 +v 0.311850 2.572800 -0.599396 +v 0.311850 2.572800 0.599396 +v 0.312283 2.597400 -0.425519 +v 0.312283 2.597400 0.425519 +v 0.314223 0.002175 -0.230604 +v 0.314223 0.002175 0.230604 +v 0.316590 2.625600 -0.232342 +v 0.316590 2.625600 0.232342 +v 0.318192 1.323225 -1.914272 +v 0.318192 1.323225 1.914272 +v 0.318907 3.081150 -0.166221 +v 0.318907 3.081150 0.166221 +v 0.319082 3.034800 -0.166306 +v 0.319082 3.034800 0.166306 +v 0.319628 0.656400 -1.922910 +v 0.319628 0.656400 1.922910 +v 0.320834 2.981250 -0.053508 +v 0.320834 2.981250 0.053508 +v 0.323566 1.178400 -1.946601 +v 0.323566 1.178400 1.946601 +v 0.325000 2.981250 0.000000 +v 0.325000 2.981250 -0.000000 +v 0.325553 0.008400 -0.625735 +v 0.325553 0.008400 0.625735 +v 0.325863 0.771675 -1.960420 +v 0.325863 0.771675 1.960420 +v 0.326970 1.037175 -1.967083 +v 0.326970 1.037175 1.967083 +v 0.328160 0.900000 -1.974240 +v 0.328160 0.900000 -1.974240 +v 0.328160 0.900000 1.974240 +v 0.340289 3.081150 -0.114619 +v 0.340289 3.081150 0.114619 +v 0.340477 3.034800 -0.114676 +v 0.340477 3.034800 0.114676 +v 0.345503 0.002175 -0.179756 +v 0.345503 0.002175 0.179756 +v 0.348105 2.625600 -0.181110 +v 0.348105 2.625600 0.181110 +v 0.351008 2.502600 -1.044926 +v 0.351008 2.502600 1.044926 +v 0.353610 3.081150 -0.058988 +v 0.353610 3.081150 0.058988 +v 0.353807 3.034800 -0.059016 +v 0.353807 3.034800 0.059016 +v 0.358200 3.081150 -0.000000 +v 0.358200 3.081150 0.000000 +v 0.358400 3.034800 0.000000 +v 0.358400 3.034800 0.000000 +v 0.364854 0.031200 1.086146 +v 0.364854 0.031200 -1.086146 +v 0.368768 0.002175 -0.123875 +v 0.368768 0.002175 0.123875 +v 0.371546 2.625600 -0.124808 +v 0.371546 2.625600 0.124808 +v 0.373318 2.597400 -0.373318 +v 0.373318 2.597400 0.373318 +v 0.381942 2.550000 -0.734118 +v 0.381942 2.550000 0.734118 +v 0.383274 0.002175 -0.063708 +v 0.383274 0.002175 0.063708 +v 0.384379 2.474400 -1.144271 +v 0.384379 2.474400 1.144271 +v 0.386161 2.625600 -0.064188 +v 0.386161 2.625600 0.064188 +v 0.388275 0.002175 0.000000 +v 0.388275 0.002175 0.000000 +v 0.391200 2.625600 0.000000 +v 0.391200 2.625600 0.000000 +v 0.400065 2.572800 -0.545131 +v 0.400065 2.572800 0.545131 +v 0.406648 2.440800 -1.210564 +v 0.406648 2.440800 1.210564 +v 0.409767 0.046875 1.219848 +v 0.409767 0.046875 -1.219848 +v 0.414752 2.400000 -1.234688 +v 0.414752 2.400000 1.234688 +v 0.417645 0.008400 -0.569086 +v 0.417645 0.008400 0.569086 +v 0.425519 2.597400 0.312283 +v 0.425519 2.597400 -0.312283 +v 0.440403 2.463000 -1.311049 +v 0.440403 2.463000 1.311049 +v 0.440935 0.018225 0.847506 +v 0.440935 0.018225 -0.847506 +v 0.440985 2.482687 -1.312782 +v 0.440985 2.482687 1.312782 +v 0.441041 0.064800 1.312948 +v 0.441041 0.064800 -1.312948 +v 0.442166 2.435437 -1.316296 +v 0.442166 2.435437 1.316296 +v 0.443529 2.494500 -1.320356 +v 0.443529 2.494500 1.320356 +v 0.446656 2.400000 -1.329664 +v 0.446656 2.400000 1.329664 +v 0.447653 2.498438 -1.332632 +v 0.447653 2.498438 1.332632 +v 0.449256 2.527200 -0.863501 +v 0.449256 2.527200 0.863501 +v 0.452973 2.494500 -1.348469 +v 0.452973 2.494500 1.348469 +v 0.459107 2.482687 -1.366728 +v 0.459107 2.482687 1.366728 +v 0.461116 0.084525 1.372712 +v 0.461116 0.084525 -1.372712 +v 0.465671 2.463000 -1.386270 +v 0.465671 2.463000 1.386270 +v 0.467878 2.597400 -0.243424 +v 0.467878 2.597400 0.243424 +v 0.472283 2.435437 -1.405953 +v 0.472283 2.435437 1.405953 +v 0.472434 0.105600 1.406405 +v 0.472434 0.105600 -1.406405 +v 0.477435 0.127575 1.421292 +v 0.477435 0.127575 -1.421292 +v 0.478256 2.572800 -0.478256 +v 0.478256 2.572800 0.478256 +v 0.478560 0.150000 -1.424640 +v 0.478560 2.400000 -1.424640 +v 0.478560 0.150000 1.424640 +v 0.478560 0.150000 1.424640 +v 0.478560 0.150000 -1.424640 +v 0.478560 2.400000 1.424640 +v 0.483027 0.177075 -1.437937 +v 0.483027 0.177075 1.437937 +v 0.489984 2.550000 -0.667656 +v 0.489984 2.550000 0.667656 +v 0.495150 0.213600 -1.474028 +v 0.495150 0.213600 1.474028 +v 0.499272 0.008400 -0.499272 +v 0.499272 0.008400 0.499272 +v 0.499384 2.597400 -0.167751 +v 0.499384 2.597400 0.167751 +v 0.502408 2.242575 -1.495635 +v 0.502408 2.242575 1.495635 +v 0.509349 2.502600 0.979002 +v 0.509349 2.502600 -0.979002 +v 0.513016 0.260025 -1.527214 +v 0.513016 0.260025 1.527214 +v 0.519028 2.597400 0.086273 +v 0.519028 2.597400 -0.086273 +v 0.525778 2.085600 -1.565204 +v 0.525778 2.085600 1.565204 +v 0.525800 2.597400 -0.000000 +v 0.525800 2.597400 0.000000 +v 0.529441 0.031200 -1.017621 +v 0.529441 0.031200 1.017621 +v 0.534711 0.316800 -1.591798 +v 0.534711 0.316800 1.591798 +v 0.545131 2.572800 -0.400065 +v 0.545131 2.572800 0.400065 +v 0.548190 1.929525 -1.631925 +v 0.548190 1.929525 1.631925 +v 0.557774 2.474400 -1.072079 +v 0.557774 2.474400 1.072079 +v 0.558320 0.384375 -1.662080 +v 0.558320 0.384375 1.662080 +v 0.565664 0.018225 0.770779 +v 0.565664 0.018225 -0.770779 +v 0.569086 0.008400 -0.417645 +v 0.569086 0.008400 0.417645 +v 0.569167 1.774800 -1.694372 +v 0.569167 1.774800 1.694372 +v 0.576340 2.527200 -0.785325 +v 0.576340 2.527200 0.785325 +v 0.581929 0.463200 -1.732362 +v 0.581929 0.463200 1.732362 +v 0.585750 2.550000 -0.585750 +v 0.585750 2.550000 0.585750 +v 0.588230 1.621875 -1.751120 +v 0.588230 1.621875 1.751120 +v 0.590089 2.440800 1.134190 +v 0.590089 2.440800 -1.134190 +v 0.594614 0.046875 -1.142888 +v 0.594614 0.046875 1.142888 +v 0.599396 2.572800 -0.311850 +v 0.599396 2.572800 0.311850 +v 0.601848 2.400000 -1.156792 +v 0.601848 2.400000 1.156792 +v 0.603624 0.553725 -1.796946 +v 0.603624 0.553725 1.796946 +v 0.604900 1.471200 -1.800745 +v 0.604900 1.471200 1.800745 +v 0.618698 1.323225 -1.841822 +v 0.618698 1.323225 1.841822 +v 0.621490 0.656400 -1.850132 +v 0.621490 0.656400 1.850132 +v 0.625735 0.008400 0.325553 +v 0.625735 0.008400 -0.325553 +v 0.629147 1.178400 -1.872927 +v 0.629147 1.178400 1.872927 +v 0.633613 0.771675 -1.886223 +v 0.633613 0.771675 1.886223 +v 0.635767 1.037175 -1.892634 +v 0.635767 1.037175 1.892634 +v 0.638080 0.900000 -1.899520 +v 0.638080 0.900000 -1.899520 +v 0.638080 0.900000 1.899520 +v 0.638080 0.900000 1.899520 +v 0.639070 2.463000 -1.228335 +v 0.639070 2.463000 1.228335 +v 0.639758 2.572800 -0.214905 +v 0.639758 2.572800 0.214905 +v 0.639915 2.482687 1.229959 +v 0.639915 2.482687 -1.229959 +v 0.639996 0.064800 -1.230115 +v 0.639996 0.064800 1.230115 +v 0.641628 2.435437 -1.233252 +v 0.641628 2.435437 1.233252 +v 0.643607 2.494500 -1.237056 +v 0.643607 2.494500 1.237056 +v 0.648144 2.400000 -1.245776 +v 0.648144 2.400000 1.245776 +v 0.649591 2.498438 -1.248557 +v 0.649591 2.498438 1.248557 +v 0.653431 2.502600 -0.890370 +v 0.653431 2.502600 0.890370 +v 0.657311 2.494500 -1.263395 +v 0.657311 2.494500 1.263395 +v 0.664924 2.572800 -0.110524 +v 0.664924 2.572800 0.110524 +v 0.666211 2.482687 1.280502 +v 0.666211 2.482687 -1.280502 +v 0.667656 2.550000 -0.489984 +v 0.667656 2.550000 0.489984 +v 0.667871 0.008400 -0.224349 +v 0.667871 0.008400 0.224349 +v 0.669128 0.084525 -1.286108 +v 0.669128 0.084525 1.286108 +v 0.673600 2.572800 0.000000 +v 0.673600 2.572800 -0.000000 +v 0.675736 2.463000 -1.298810 +v 0.675736 2.463000 1.298810 +v 0.676222 0.018225 0.676222 +v 0.676222 0.018225 -0.676222 +v 0.679207 0.031200 -0.925493 +v 0.679207 0.031200 0.925493 +v 0.685331 2.435437 -1.317252 +v 0.685331 2.435437 1.317252 +v 0.685551 0.105600 -1.317675 +v 0.685551 0.105600 1.317675 +v 0.688984 2.527200 -0.688984 +v 0.688984 2.527200 0.688984 +v 0.692808 0.127575 1.331623 +v 0.692808 0.127575 -1.331623 +v 0.694143 0.008400 -0.115381 +v 0.694143 0.008400 0.115381 +v 0.694440 0.150000 1.334760 +v 0.694440 0.150000 -1.334760 +v 0.694440 2.400000 1.334760 +v 0.694440 0.150000 -1.334760 +v 0.694440 0.150000 1.334760 +v 0.694440 2.400000 -1.334760 +v 0.700921 0.177075 1.347218 +v 0.700921 0.177075 -1.347218 +v 0.703200 0.008400 0.000000 +v 0.715555 2.474400 -0.975021 +v 0.715555 2.474400 0.975021 +v 0.718514 0.213600 1.381032 +v 0.718514 0.213600 -1.381032 +v 0.729046 2.242575 -1.401276 +v 0.729046 2.242575 1.401276 +v 0.734118 2.550000 -0.381942 +v 0.734118 2.550000 0.381942 +v 0.744440 0.260025 1.430863 +v 0.744440 0.260025 -1.430863 +v 0.757010 2.440800 1.031508 +v 0.757010 2.440800 -1.031508 +v 0.762816 0.046875 -1.039419 +v 0.762816 0.046875 1.039419 +v 0.762958 2.085600 -1.466456 +v 0.762958 2.085600 1.466456 +v 0.770779 0.018225 0.565664 +v 0.770779 0.018225 -0.565664 +v 0.772096 2.400000 -1.052064 +v 0.772096 2.400000 1.052064 +v 0.775921 0.316800 -1.491372 +v 0.775921 0.316800 1.491372 +v 0.781142 2.502600 -0.781142 +v 0.781142 2.502600 0.781142 +v 0.783552 2.550000 -0.263208 +v 0.783552 2.550000 0.263208 +v 0.785325 2.527200 -0.576340 +v 0.785325 2.527200 0.576340 +v 0.795481 1.929525 1.528968 +v 0.795481 1.929525 -1.528968 +v 0.810180 0.384375 1.557220 +v 0.810180 0.384375 -1.557220 +v 0.811956 0.031200 0.811956 +v 0.811956 0.031200 -0.811956 +v 0.814374 2.550000 -0.135366 +v 0.814374 2.550000 0.135366 +v 0.819847 2.463000 -1.117130 +v 0.819847 2.463000 1.117130 +v 0.820931 2.482687 1.118607 +v 0.820931 2.482687 -1.118607 +v 0.821035 0.064800 1.118749 +v 0.821035 0.064800 -1.118749 +v 0.823129 2.435437 -1.121601 +v 0.823129 2.435437 1.121601 +v 0.825000 2.550000 0.000000 +v 0.825000 2.550000 0.000000 +v 0.825668 2.494500 -1.125061 +v 0.825668 2.494500 1.125061 +v 0.825921 1.774800 1.587475 +v 0.825921 1.774800 -1.587475 +v 0.831488 2.400000 -1.132992 +v 0.831488 2.400000 1.132992 +v 0.833344 2.498438 -1.135521 +v 0.833344 2.498438 1.135521 +v 0.843248 2.494500 -1.149016 +v 0.843248 2.494500 1.149016 +v 0.844439 0.463200 1.623068 +v 0.844439 0.463200 -1.623068 +v 0.847506 0.018225 -0.440935 +v 0.847506 0.018225 0.440935 +v 0.853583 1.621875 -1.640643 +v 0.853583 1.621875 1.640643 +v 0.854666 2.482687 -1.164574 +v 0.854666 2.482687 1.164574 +v 0.855408 2.474400 -0.855408 +v 0.855408 2.474400 0.855408 +v 0.858407 0.084525 -1.169673 +v 0.858407 0.084525 1.169673 +v 0.863501 2.527200 -0.449256 +v 0.863501 2.527200 0.449256 +v 0.866886 2.463000 -1.181225 +v 0.866886 2.463000 1.181225 +v 0.875920 0.553725 -1.683577 +v 0.875920 0.553725 1.683577 +v 0.877772 1.471200 -1.687137 +v 0.877772 1.471200 1.687137 +v 0.879195 2.435437 -1.197997 +v 0.879195 2.435437 1.197997 +v 0.879477 0.105600 -1.198382 +v 0.879477 0.105600 1.198382 +v 0.888786 0.127575 1.211067 +v 0.888786 0.127575 -1.211067 +v 0.890370 2.502600 -0.653431 +v 0.890370 2.502600 0.653431 +v 0.890880 0.150000 -1.213920 +v 0.890880 0.150000 1.213920 +v 0.890880 2.400000 -1.213920 +v 0.890880 0.150000 -1.213920 +v 0.890880 0.150000 1.213920 +v 0.890880 2.400000 1.213920 +v 0.897795 1.323225 -1.725622 +v 0.897795 1.323225 1.725622 +v 0.899195 0.177075 1.225250 +v 0.899195 0.177075 -1.225250 +v 0.901846 0.656400 -1.733408 +v 0.901846 0.656400 1.733408 +v 0.904575 0.018225 0.303862 +v 0.904575 0.018225 -0.303862 +v 0.904966 2.440800 0.904966 +v 0.904966 2.440800 -0.904966 +v 0.911906 0.046875 -0.911906 +v 0.911906 0.046875 0.911906 +v 0.912957 1.178400 -1.754764 +v 0.912957 1.178400 1.754764 +v 0.919439 0.771675 -1.767222 +v 0.919439 0.771675 1.767222 +v 0.921647 2.527200 -0.309596 +v 0.921647 2.527200 0.309596 +v 0.921764 0.213600 1.256003 +v 0.921764 0.213600 -1.256003 +v 0.922564 1.037175 1.773229 +v 0.922564 1.037175 -1.773229 +v 0.923000 2.400000 -0.923000 +v 0.923000 2.400000 0.923000 +v 0.925493 0.031200 0.679207 +v 0.925493 0.031200 -0.679207 +v 0.925920 0.900000 1.779680 +v 0.925920 0.900000 -1.779680 +v 0.925920 0.900000 -1.779680 +v 0.925920 0.900000 1.779680 +v 0.935276 2.242575 -1.274414 +v 0.935276 2.242575 1.274414 +v 0.940158 0.018225 0.156274 +v 0.940158 0.018225 -0.156274 +v 0.952425 0.018225 0.000000 +v 0.952425 0.018225 0.000000 +v 0.955023 0.260025 1.301322 +v 0.955023 0.260025 -1.301322 +v 0.957901 2.527200 -0.159223 +v 0.957901 2.527200 0.159223 +v 0.970400 2.527200 0.000000 +v 0.970400 2.527200 -0.000000 +v 0.975021 2.474400 -0.715555 +v 0.975021 2.474400 0.715555 +v 0.978780 2.085600 -1.333693 +v 0.978780 2.085600 1.333693 +v 0.979002 2.502600 0.509349 +v 0.979002 2.502600 -0.509349 +v 0.980084 2.463000 -0.980084 +v 0.980084 2.463000 0.980084 +v 0.981380 2.482687 -0.981380 +v 0.981380 2.482687 0.981380 +v 0.981504 0.064800 0.981504 +v 0.981504 0.064800 -0.981504 +v 0.984007 2.435437 -0.984007 +v 0.984007 2.435437 0.984007 +v 0.987042 2.494500 -0.987042 +v 0.987042 2.494500 0.987042 +v 0.994000 2.400000 -0.994000 +v 0.994000 2.400000 0.994000 +v 0.995410 0.316800 -1.356353 +v 0.995410 0.316800 1.356353 +v 0.996219 2.498438 -0.996219 +v 0.996219 2.498438 0.996219 +v 1.008058 2.494500 -1.008058 +v 1.008058 2.494500 1.008058 +v 1.017621 0.031200 0.529441 +v 1.017621 0.031200 -0.529441 +v 1.020503 1.929525 -1.390545 +v 1.020503 1.929525 1.390545 +v 1.021708 2.482687 -1.021708 +v 1.021708 2.482687 1.021708 +v 1.026181 0.084525 -1.026181 +v 1.026181 0.084525 1.026181 +v 1.031508 2.440800 0.757010 +v 1.031508 2.440800 -0.757010 +v 1.036316 2.463000 -1.036316 +v 1.036316 2.463000 1.036316 +v 1.039360 0.384375 -1.416240 +v 1.039360 0.384375 1.416240 +v 1.039419 0.046875 -0.762816 +v 1.039419 0.046875 0.762816 +v 1.044926 2.502600 -0.351008 +v 1.044926 2.502600 0.351008 +v 1.051031 2.435437 -1.051031 +v 1.051031 2.435437 1.051031 +v 1.051368 0.105600 -1.051368 +v 1.051368 0.105600 1.051368 +v 1.052064 2.400000 -0.772096 +v 1.052064 2.400000 0.772096 +v 1.059553 1.774800 -1.443756 +v 1.059553 1.774800 1.443756 +v 1.062497 0.127575 1.062497 +v 1.062497 0.127575 -1.062497 +v 1.065000 0.150000 -1.065000 +v 1.065000 0.150000 1.065000 +v 1.065000 2.400000 -1.065000 +v 1.065000 2.400000 1.065000 +v 1.072079 2.474400 -0.557774 +v 1.072079 2.474400 0.557774 +v 1.074940 0.177075 -1.074940 +v 1.074940 0.177075 1.074940 +v 1.083310 0.463200 -1.476127 +v 1.083310 0.463200 1.476127 +v 1.086029 2.502600 0.180521 +v 1.086029 2.502600 -0.180521 +v 1.086146 0.031200 0.364854 +v 1.086146 0.031200 -0.364854 +v 1.095040 1.621875 -1.492110 +v 1.095040 1.621875 1.492110 +v 1.100200 2.502600 -0.000000 +v 1.100200 2.502600 0.000000 +v 1.101920 0.213600 1.101920 +v 1.101920 0.213600 -1.101920 +v 1.117130 2.463000 -0.819847 +v 1.117130 2.463000 0.819847 +v 1.118073 2.242575 -1.118073 +v 1.118073 2.242575 1.118073 +v 1.118607 2.482687 -0.820931 +v 1.118607 2.482687 0.820931 +v 1.118749 0.064800 -0.821035 +v 1.118749 0.064800 0.821035 +v 1.121601 2.435437 -0.823129 +v 1.121601 2.435437 0.823129 +v 1.123697 0.553725 -1.531158 +v 1.123697 0.553725 1.531158 +v 1.125061 2.494500 -0.825668 +v 1.125061 2.494500 0.825668 +v 1.126072 1.471200 -1.534395 +v 1.126072 1.471200 1.534395 +v 1.128870 0.031200 -0.187642 +v 1.128870 0.031200 0.187642 +v 1.132992 2.400000 -0.831488 +v 1.132992 2.400000 0.831488 +v 1.134190 2.440800 0.590089 +v 1.134190 2.440800 -0.590089 +v 1.135521 2.498438 -0.833344 +v 1.135521 2.498438 0.833344 +v 1.141680 0.260025 1.141680 +v 1.141680 0.260025 -1.141680 +v 1.142888 0.046875 -0.594614 +v 1.142888 0.046875 0.594614 +v 1.143600 0.031200 0.000000 +v 1.143600 0.031200 0.000000 +v 1.144271 2.474400 -0.384379 +v 1.144271 2.474400 0.384379 +v 1.149016 2.494500 -0.843248 +v 1.149016 2.494500 0.843248 +v 1.151759 1.323225 -1.569396 +v 1.151759 1.323225 1.569396 +v 1.156792 2.400000 -0.601848 +v 1.156792 2.400000 0.601848 +v 1.156956 0.656400 -1.576477 +v 1.156956 0.656400 1.576477 +v 1.164574 2.482687 -0.854666 +v 1.164574 2.482687 0.854666 +v 1.169673 0.084525 -0.858407 +v 1.169673 0.084525 0.858407 +v 1.170080 2.085600 -1.170080 +v 1.170080 2.085600 1.170080 +v 1.171210 1.178400 -1.595900 +v 1.171210 1.178400 1.595900 +v 1.179525 0.771675 -1.607230 +v 1.179525 0.771675 1.607230 +v 1.181225 2.463000 -0.866886 +v 1.181225 2.463000 0.866886 +v 1.183534 1.037175 -1.612693 +v 1.183534 1.037175 1.612693 +v 1.187840 0.900000 -1.618560 +v 1.187840 0.900000 -1.618560 +v 1.187840 0.900000 1.618560 +v 1.187840 0.900000 1.618560 +v 1.189282 2.474400 -0.197684 +v 1.189282 2.474400 0.197684 +v 1.189960 0.316800 -1.189960 +v 1.189960 0.316800 1.189960 +v 1.197997 2.435437 -0.879195 +v 1.197997 2.435437 0.879195 +v 1.198382 0.105600 -0.879477 +v 1.198382 0.105600 0.879477 +v 1.204800 2.474400 0.000000 +v 1.204800 2.474400 -0.000000 +v 1.210564 2.440800 0.406648 +v 1.210564 2.440800 -0.406648 +v 1.211067 0.127575 0.888786 +v 1.211067 0.127575 -0.888786 +v 1.213920 0.150000 -0.890880 +v 1.213920 0.150000 -0.890880 +v 1.213920 0.150000 0.890880 +v 1.213920 0.150000 0.890880 +v 1.213920 2.400000 -0.890880 +v 1.213920 2.400000 0.890880 +v 1.219848 0.046875 -0.409767 +v 1.219848 0.046875 0.409767 +v 1.219958 1.929525 1.219958 +v 1.219958 1.929525 -1.219958 +v 1.225250 0.177075 0.899195 +v 1.225250 0.177075 -0.899195 +v 1.228335 2.463000 -0.639070 +v 1.228335 2.463000 0.639070 +v 1.229959 2.482687 -0.639915 +v 1.229959 2.482687 0.639915 +v 1.230115 0.064800 -0.639996 +v 1.230115 0.064800 0.639996 +v 1.233252 2.435437 -0.641628 +v 1.233252 2.435437 0.641628 +v 1.234688 2.400000 -0.414752 +v 1.234688 2.400000 0.414752 +v 1.237056 2.494500 -0.643607 +v 1.237056 2.494500 0.643607 +v 1.242500 0.384375 -1.242500 +v 1.242500 0.384375 1.242500 +v 1.245776 2.400000 -0.648144 +v 1.245776 2.400000 0.648144 +v 1.248557 2.498438 -0.649591 +v 1.248557 2.498438 0.649591 +v 1.256003 0.213600 0.921764 +v 1.256003 0.213600 -0.921764 +v 1.258183 2.440800 0.209136 +v 1.258183 2.440800 -0.209136 +v 1.263395 2.494500 -0.657311 +v 1.263395 2.494500 0.657311 +v 1.266640 1.774800 -1.266640 +v 1.266640 1.774800 1.266640 +v 1.267832 0.046875 -0.210740 +v 1.267832 0.046875 0.210740 +v 1.274414 2.242575 -0.935276 +v 1.274414 2.242575 0.935276 +v 1.274600 2.440800 0.000000 +v 1.274600 2.440800 0.000000 +v 1.280502 2.482687 -0.666211 +v 1.280502 2.482687 0.666211 +v 1.283256 2.400000 -0.213304 +v 1.283256 2.400000 0.213304 +v 1.284375 0.046875 0.000000 +v 1.284375 0.046875 -0.000000 +v 1.286108 0.084525 -0.669128 +v 1.286108 0.084525 0.669128 +v 1.295040 0.463200 -1.295040 +v 1.295040 0.463200 1.295040 +v 1.298810 2.463000 -0.675736 +v 1.298810 2.463000 0.675736 +v 1.300000 2.400000 0.000000 +v 1.300000 2.400000 -0.000000 +v 1.301322 0.260025 0.955023 +v 1.301322 0.260025 -0.955023 +v 1.309063 1.621875 -1.309063 +v 1.309063 1.621875 1.309063 +v 1.311049 2.463000 -0.440403 +v 1.311049 2.463000 0.440403 +v 1.312782 2.482687 -0.440985 +v 1.312782 2.482687 0.440985 +v 1.312948 0.064800 0.441041 +v 1.312948 0.064800 -0.441041 +v 1.316296 2.435437 -0.442166 +v 1.316296 2.435437 0.442166 +v 1.317252 2.435437 -0.685331 +v 1.317252 2.435437 0.685331 +v 1.317675 0.105600 -0.685551 +v 1.317675 0.105600 0.685551 +v 1.320356 2.494500 -0.443529 +v 1.320356 2.494500 0.443529 +v 1.329664 2.400000 -0.446656 +v 1.329664 2.400000 0.446656 +v 1.331623 0.127575 0.692808 +v 1.331623 0.127575 -0.692808 +v 1.332632 2.498438 -0.447653 +v 1.332632 2.498438 0.447653 +v 1.333693 2.085600 -0.978780 +v 1.333693 2.085600 0.978780 +v 1.334760 0.150000 0.694440 +v 1.334760 0.150000 -0.694440 +v 1.334760 0.150000 -0.694440 +v 1.334760 0.150000 0.694440 +v 1.334760 2.400000 -0.694440 +v 1.334760 2.400000 0.694440 +v 1.343320 0.553725 -1.343320 +v 1.343320 0.553725 1.343320 +v 1.346160 1.471200 -1.346160 +v 1.346160 1.471200 1.346160 +v 1.347218 0.177075 0.700921 +v 1.347218 0.177075 -0.700921 +v 1.348469 2.494500 -0.452973 +v 1.348469 2.494500 0.452973 +v 1.356353 0.316800 -0.995410 +v 1.356353 0.316800 0.995410 +v 1.362620 2.463000 -0.226496 +v 1.362620 2.463000 0.226496 +v 1.364422 2.482687 -0.226795 +v 1.364422 2.482687 0.226795 +v 1.364595 0.064800 -0.226824 +v 1.364595 0.064800 0.226824 +v 1.366728 2.482687 -0.459107 +v 1.366728 2.482687 0.459107 +v 1.368074 2.435437 -0.227403 +v 1.368074 2.435437 0.227403 +v 1.372294 2.494500 -0.228104 +v 1.372294 2.494500 0.228104 +v 1.372712 0.084525 -0.461116 +v 1.372712 0.084525 0.461116 +v 1.376867 1.323225 -1.376868 +v 1.376868 1.323225 1.376867 +v 1.380400 2.463000 0.000000 +v 1.380400 2.463000 -0.000000 +v 1.381032 0.213600 0.718514 +v 1.381032 0.213600 -0.718514 +v 1.381968 2.400000 -0.229712 +v 1.381968 2.400000 0.229712 +v 1.382225 2.482687 0.000000 +v 1.382225 2.482687 0.000000 +v 1.382400 0.064800 0.000000 +v 1.382400 0.064800 0.000000 +v 1.383080 0.656400 -1.383080 +v 1.383080 0.656400 1.383080 +v 1.385053 2.498438 -0.230225 +v 1.385053 2.498438 0.230225 +v 1.385925 2.435437 0.000000 +v 1.385925 2.435437 -0.000000 +v 1.386270 2.463000 -0.465671 +v 1.386270 2.463000 0.465671 +v 1.390200 2.494500 0.000000 +v 1.390200 2.494500 -0.000000 +v 1.390545 1.929525 -1.020503 +v 1.390545 1.929525 1.020503 +v 1.400000 2.400000 0.000000 +v 1.400000 2.400000 0.000000 +v 1.400120 1.178400 -1.400120 +v 1.400120 1.178400 1.400120 +v 1.401276 2.242575 -0.729046 +v 1.401276 2.242575 0.729046 +v 1.401513 2.494500 -0.232961 +v 1.401513 2.494500 0.232961 +v 1.403125 2.498438 0.000000 +v 1.403125 2.498438 0.000000 +v 1.405953 2.435437 -0.472283 +v 1.405953 2.435437 0.472283 +v 1.406405 0.105600 -0.472434 +v 1.406405 0.105600 0.472434 +v 1.410060 0.771675 -1.410060 +v 1.410060 0.771675 1.410060 +v 1.414853 1.037175 -1.414853 +v 1.414853 1.037175 1.414853 +v 1.416240 0.384375 -1.039360 +v 1.416240 0.384375 1.039360 +v 1.419800 2.494500 0.000000 +v 1.419800 2.494500 -0.000000 +v 1.420000 0.900000 -1.420000 +v 1.420000 0.900000 -1.420000 +v 1.420000 0.900000 1.420000 +v 1.420000 0.900000 1.420000 +v 1.420490 2.482687 -0.236115 +v 1.420490 2.482687 0.236115 +v 1.421292 0.127575 0.477435 +v 1.421292 0.127575 -0.477435 +v 1.424640 0.150000 -0.478560 +v 1.424640 0.150000 -0.478560 +v 1.424640 0.150000 0.478560 +v 1.424640 0.150000 0.478560 +v 1.424640 2.400000 -0.478560 +v 1.424640 2.400000 0.478560 +v 1.426709 0.084525 -0.237149 +v 1.426709 0.084525 0.237149 +v 1.430863 0.260025 0.744440 +v 1.430863 0.260025 -0.744440 +v 1.437937 0.177075 0.483027 +v 1.437937 0.177075 -0.483027 +v 1.439025 2.482687 0.000000 +v 1.440800 2.463000 -0.239491 +v 1.440800 2.463000 0.239491 +v 1.443756 1.774800 -1.059553 +v 1.443756 1.774800 1.059553 +v 1.445325 0.084525 0.000000 +v 1.445325 0.084525 0.000000 +v 1.459600 2.463000 0.000000 +v 1.459600 2.463000 -0.000000 +v 1.461258 2.435437 -0.242892 +v 1.461258 2.435437 0.242892 +v 1.461727 0.105600 -0.242970 +v 1.461727 0.105600 0.242970 +v 1.466456 2.085600 -0.762958 +v 1.466456 2.085600 0.762958 +v 1.474028 0.213600 0.495150 +v 1.474028 0.213600 -0.495150 +v 1.476127 0.463200 -1.083310 +v 1.476127 0.463200 1.083310 +v 1.477200 0.127575 0.245542 +v 1.477200 0.127575 -0.245542 +v 1.480325 2.435437 0.000000 +v 1.480325 2.435437 -0.000000 +v 1.480680 0.150000 -0.246120 +v 1.480680 0.150000 0.246120 +v 1.480680 0.150000 0.246120 +v 1.480680 0.150000 -0.246120 +v 1.480680 2.400000 -0.246120 +v 1.480680 2.400000 0.246120 +v 1.480800 0.105600 0.000000 +v 1.480800 0.105600 0.000000 +v 1.491372 0.316800 -0.775921 +v 1.491372 0.316800 0.775921 +v 1.492110 1.621875 -1.095040 +v 1.492110 1.621875 1.095040 +v 1.494500 0.177075 0.248417 +v 1.494500 0.177075 -0.248417 +v 1.495635 2.242575 -0.502408 +v 1.495635 2.242575 0.502408 +v 1.496475 0.127575 0.000000 +v 1.496475 0.127575 0.000000 +v 1.500000 0.150000 0.000000 +v 1.500000 0.150000 0.000000 +v 1.500000 2.400000 0.000000 +v 1.500000 2.400000 0.000000 +v 1.514000 0.177075 -0.000000 +v 1.514000 0.177075 0.000000 +v 1.527214 0.260025 -0.513016 +v 1.527214 0.260025 0.513016 +v 1.528968 1.929525 -0.795481 +v 1.528968 1.929525 0.795481 +v 1.531158 0.553725 -1.123697 +v 1.531158 0.553725 1.123697 +v 1.532010 0.213600 0.254652 +v 1.532010 0.213600 -0.254652 +v 1.534395 1.471200 -1.126072 +v 1.534395 1.471200 1.126072 +v 1.552000 0.213600 0.000000 +v 1.552000 0.213600 0.000000 +v 1.554467 2.242575 -0.258385 +v 1.554467 2.242575 0.258385 +v 1.557220 0.384375 -0.810180 +v 1.557220 0.384375 0.810180 +v 1.565204 2.085600 -0.525778 +v 1.565204 2.085600 0.525778 +v 1.569396 1.323225 -1.151759 +v 1.569396 1.323225 1.151759 +v 1.574750 2.242575 0.000000 +v 1.574750 2.242575 0.000000 +v 1.576477 0.656400 -1.156956 +v 1.576477 0.656400 1.156956 +v 1.587289 0.260025 0.263841 +v 1.587289 0.260025 -0.263841 +v 1.587475 1.774800 -0.825921 +v 1.587475 1.774800 0.825921 +v 1.591798 0.316800 -0.534711 +v 1.591798 0.316800 0.534711 +v 1.595900 1.178400 -1.171210 +v 1.595900 1.178400 1.171210 +v 1.607230 0.771675 -1.179525 +v 1.607230 0.771675 1.179525 +v 1.608000 0.260025 0.000000 +v 1.608000 0.260025 0.000000 +v 1.612693 1.037175 -1.183534 +v 1.612693 1.037175 1.183534 +v 1.618560 0.900000 -1.187840 +v 1.618560 0.900000 -1.187840 +v 1.618560 0.900000 1.187840 +v 1.618560 0.900000 1.187840 +v 1.623068 0.463200 -0.844439 +v 1.623068 0.463200 0.844439 +v 1.626774 2.085600 -0.270404 +v 1.626774 2.085600 0.270404 +v 1.631925 1.929525 -0.548190 +v 1.631925 1.929525 0.548190 +v 1.640643 1.621875 -0.853583 +v 1.640643 1.621875 0.853583 +v 1.648000 2.085600 0.000000 +v 1.648000 2.085600 -0.000000 +v 1.654413 0.316800 -0.274998 +v 1.654413 0.316800 0.274998 +v 1.662080 0.384375 -0.558320 +v 1.662080 0.384375 0.558320 +v 1.676000 0.316800 0.000000 +v 1.676000 0.316800 0.000000 +v 1.683577 0.553725 -0.875920 +v 1.683577 0.553725 0.875920 +v 1.687137 1.471200 -0.877772 +v 1.687137 1.471200 0.877772 +v 1.694372 1.774800 -0.569167 +v 1.694372 1.774800 0.569167 +v 1.696119 1.929525 -0.281930 +v 1.696119 1.929525 0.281930 +v 1.700000 0.600000 0.000000 +v 1.700000 0.600000 0.000000 +v 1.700000 0.623100 0.178200 +v 1.700000 0.623100 -0.178200 +v 1.700000 0.685800 -0.316800 +v 1.700000 0.685800 0.316800 +v 1.700000 0.778200 0.415800 +v 1.700000 0.778200 -0.415800 +v 1.700000 0.890400 -0.475200 +v 1.700000 0.890400 0.475200 +v 1.700000 1.012500 -0.495000 +v 1.700000 1.012500 0.495000 +v 1.700000 1.134600 -0.475200 +v 1.700000 1.134600 0.475200 +v 1.700000 1.246800 0.415800 +v 1.700000 1.246800 -0.415800 +v 1.700000 1.339200 -0.316800 +v 1.700000 1.339200 0.316800 +v 1.700000 1.401900 0.178200 +v 1.700000 1.401900 -0.178200 +v 1.700000 1.425000 0.000000 +v 1.700000 1.425000 0.000000 +v 1.718250 1.929525 0.000000 +v 1.718250 1.929525 0.000000 +v 1.725622 1.323225 -0.897795 +v 1.725622 1.323225 0.897795 +v 1.727460 0.384375 -0.287140 +v 1.727460 0.384375 0.287140 +v 1.732362 0.463200 -0.581929 +v 1.732362 0.463200 0.581929 +v 1.733408 0.656400 -0.901846 +v 1.733408 0.656400 0.901846 +v 1.750000 0.384375 0.000000 +v 1.750000 0.384375 0.000000 +v 1.751120 1.621875 -0.588230 +v 1.751120 1.621875 0.588230 +v 1.754764 1.178400 -0.912957 +v 1.754764 1.178400 0.912957 +v 1.761022 1.774800 -0.292719 +v 1.761022 1.774800 0.292719 +v 1.767222 0.771675 -0.919439 +v 1.767222 0.771675 0.919439 +v 1.773229 1.037175 -0.922564 +v 1.773229 1.037175 0.922564 +v 1.779680 0.900000 -0.925920 +v 1.779680 0.900000 -0.925920 +v 1.779680 0.900000 0.925920 +v 1.779680 0.900000 0.925920 +v 1.784000 1.774800 0.000000 +v 1.784000 1.774800 0.000000 +v 1.796946 0.553725 -0.603624 +v 1.796946 0.553725 0.603624 +v 1.800507 0.463200 -0.299282 +v 1.800507 0.463200 0.299282 +v 1.800745 1.471200 -0.604900 +v 1.800745 1.471200 0.604900 +v 1.820003 1.621875 -0.302523 +v 1.820003 1.621875 0.302522 +v 1.824000 0.463200 0.000000 +v 1.824000 0.463200 0.000000 +v 1.841822 1.323225 -0.618698 +v 1.841822 1.323225 0.618698 +v 1.843750 1.621875 0.000000 +v 1.843750 1.621875 -0.000000 +v 1.850132 0.656400 -0.621490 +v 1.850132 0.656400 0.621490 +v 1.867631 0.553725 -0.310439 +v 1.867631 0.553725 0.310439 +v 1.871580 1.471200 -0.311096 +v 1.871580 1.471200 0.311096 +v 1.872927 1.178400 -0.629147 +v 1.872927 1.178400 0.629147 +v 1.886223 0.771675 -0.633613 +v 1.886223 0.771675 0.633613 +v 1.892000 0.553725 0.000000 +v 1.892000 0.553725 -0.000000 +v 1.892634 1.037175 -0.635767 +v 1.892634 1.037175 0.635767 +v 1.896000 1.471200 0.000000 +v 1.896000 1.471200 0.000000 +v 1.899520 0.900000 -0.638080 +v 1.899520 0.900000 -0.638080 +v 1.899520 0.900000 0.638080 +v 1.899520 0.900000 0.638080 +v 1.914272 1.323225 -0.318192 +v 1.914272 1.323225 0.318192 +v 1.922910 0.656400 -0.319628 +v 1.922910 0.656400 0.319628 +v 1.935900 1.444200 0.000000 +v 1.935900 1.444200 0.000000 +v 1.939250 1.323225 0.000000 +v 1.939250 1.323225 -0.000000 +v 1.939394 1.423221 -0.175100 +v 1.939394 1.423221 0.175100 +v 1.946601 1.178400 -0.323566 +v 1.946601 1.178400 0.323566 +v 1.948000 0.656400 0.000000 +v 1.948000 0.656400 -0.000000 +v 1.948879 1.366278 -0.311290 +v 1.948879 1.366278 0.311290 +v 1.960420 0.771675 -0.325863 +v 1.960420 0.771675 0.325863 +v 1.962857 1.282362 -0.408568 +v 1.962857 1.282362 0.408568 +v 1.967083 1.037175 -0.326970 +v 1.967083 1.037175 0.326970 +v 1.972000 1.178400 0.000000 +v 1.972000 1.178400 0.000000 +v 1.974240 0.900000 -0.328160 +v 1.974240 0.900000 0.328160 +v 1.974240 0.900000 0.328160 +v 1.979830 1.180464 -0.466934 +v 1.979830 1.180464 0.466934 +v 1.986000 0.771675 0.000000 +v 1.986000 0.771675 -0.000000 +v 1.992750 1.037175 0.000000 +v 1.992750 1.037175 0.000000 +v 1.998300 1.069575 -0.486390 +v 1.998300 1.069575 0.486390 +v 2.000000 0.900000 0.000000 +v 2.000000 0.900000 0.000000 +v 2.016770 0.958686 -0.466934 +v 2.016770 0.958686 0.466934 +v 2.033743 0.856788 -0.408568 +v 2.033743 0.856788 0.408568 +v 2.047721 0.772872 0.311290 +v 2.047721 0.772872 -0.311290 +v 2.057206 0.715929 0.175100 +v 2.057206 0.715929 -0.175100 +v 2.060700 0.694950 0.000000 +v 2.060700 0.694950 0.000000 +v 2.111200 1.497600 0.000000 +v 2.111200 1.497600 0.000000 +v 2.116979 1.479120 -0.166687 +v 2.116979 1.479120 0.166687 +v 2.132666 1.428960 -0.296333 +v 2.132666 1.428960 0.296333 +v 2.155782 1.355040 -0.388937 +v 2.155782 1.355040 0.388937 +v 2.183853 1.265280 -0.444499 +v 2.183853 1.265280 0.444499 +v 2.214400 1.167600 -0.463020 +v 2.214400 1.167600 0.463020 +v 2.237300 1.578900 0.000000 +v 2.237300 1.578900 0.000000 +v 2.244457 1.563171 -0.154289 +v 2.244457 1.563171 0.154289 +v 2.244947 1.069920 -0.444499 +v 2.244947 1.069920 0.444499 +v 2.263882 1.520478 -0.274291 +v 2.263882 1.520478 0.274291 +v 2.273018 0.980160 -0.388937 +v 2.273018 0.980160 0.388937 +v 2.292510 1.457562 -0.360007 +v 2.292510 1.457562 0.360007 +v 2.296134 0.906240 -0.296333 +v 2.296134 0.906240 0.296333 +v 2.311821 0.856080 -0.166687 +v 2.311821 0.856080 0.166687 +v 2.317600 0.837600 0.000000 +v 2.317600 0.837600 0.000000 +v 2.325600 1.681800 0.000000 +v 2.325600 1.681800 0.000000 +v 2.327271 1.381164 -0.411437 +v 2.327271 1.381164 0.411437 +v 2.333530 1.668948 -0.139234 +v 2.333530 1.668948 0.139234 +v 2.355053 1.634064 -0.247526 +v 2.355053 1.634064 0.247526 +v 2.365100 1.298025 -0.428580 +v 2.365100 1.298025 0.428580 +v 2.386771 1.582656 -0.324878 +v 2.386771 1.582656 0.324878 +v 2.387500 1.800000 0.000000 +v 2.387500 1.800000 0.000000 +v 2.395900 1.790025 0.122850 +v 2.395900 1.790025 -0.122850 +v 2.402929 1.214886 -0.411437 +v 2.402929 1.214886 0.411437 +v 2.418700 1.762950 -0.218400 +v 2.418700 1.762950 0.218400 +v 2.425286 1.520232 -0.371290 +v 2.425286 1.520232 0.371290 +v 2.434400 1.927200 0.000000 +v 2.434400 1.927200 0.000000 +v 2.437690 1.138488 -0.360007 +v 2.437690 1.138488 0.360007 +v 2.443270 1.919976 0.106466 +v 2.443270 1.919976 -0.106466 +v 2.452300 1.723050 -0.286650 +v 2.452300 1.723050 0.286650 +v 2.466318 1.075572 -0.274291 +v 2.466318 1.075572 0.274291 +v 2.467200 1.452300 -0.386760 +v 2.467200 1.452300 0.386760 +v 2.467347 1.900368 0.189274 +v 2.467347 1.900368 -0.189274 +v 2.477700 2.057100 0.000000 +v 2.477700 2.057100 0.000000 +v 2.485743 1.032879 -0.154289 +v 2.485743 1.032879 0.154289 +v 2.487343 2.052375 -0.091411 +v 2.487343 2.052375 0.091411 +v 2.492900 1.017150 0.000000 +v 2.492900 1.017150 0.000000 +v 2.493100 1.674600 -0.327600 +v 2.493100 1.674600 0.327600 +v 2.502829 1.871472 0.248422 +v 2.502829 1.871472 -0.248422 +v 2.509114 1.384368 -0.371290 +v 2.509114 1.384368 0.371290 +v 2.513518 2.039550 0.162509 +v 2.513518 2.039550 -0.162509 +v 2.528800 2.183400 0.000000 +v 2.537500 1.621875 -0.341250 +v 2.537500 1.621875 0.341250 +v 2.539821 2.180796 -0.079013 +v 2.539821 2.180796 0.079013 +v 2.545914 1.836384 -0.283910 +v 2.545914 1.836384 0.283910 +v 2.547629 1.321944 -0.324878 +v 2.547629 1.321944 0.324878 +v 2.552090 2.020650 -0.213293 +v 2.552090 2.020650 0.213293 +v 2.569734 2.173728 -0.140467 +v 2.569734 2.173728 0.140467 +v 2.579347 1.270536 -0.247526 +v 2.579347 1.270536 0.247526 +v 2.581900 1.569150 -0.327600 +v 2.581900 1.569150 0.327600 +v 2.592800 1.798200 -0.295740 +v 2.592800 1.798200 0.295740 +v 2.598929 1.997700 -0.243763 +v 2.598929 1.997700 0.243763 +v 2.599100 2.299800 0.000000 +v 2.599100 2.299800 0.000000 +v 2.600870 1.235652 -0.139234 +v 2.600870 1.235652 0.139234 +v 2.608800 1.222800 0.000000 +v 2.608800 1.222800 0.000000 +v 2.612406 2.298813 0.070600 +v 2.612406 2.298813 -0.070600 +v 2.613818 2.163312 -0.184363 +v 2.613818 2.163312 0.184363 +v 2.622700 1.520700 -0.286650 +v 2.622700 1.520700 0.286650 +v 2.639686 1.760016 -0.283910 +v 2.639686 1.760016 0.283910 +v 2.648521 2.296134 0.125510 +v 2.648521 2.296134 -0.125510 +v 2.649900 1.972725 0.253920 +v 2.649900 1.972725 -0.253920 +v 2.656300 1.480800 -0.218400 +v 2.656300 1.480800 0.218400 +v 2.667347 2.150664 -0.210701 +v 2.667347 2.150664 0.210701 +v 2.679100 1.453725 0.122850 +v 2.679100 1.453725 -0.122850 +v 2.682771 1.724928 0.248422 +v 2.682771 1.724928 -0.248422 +v 2.687500 1.443750 0.000000 +v 2.687500 1.443750 0.000000 +v 2.700000 2.400000 0.000000 +v 2.700000 2.400000 0.000000 +v 2.700000 2.400000 0.000000 +v 2.700871 1.947750 -0.243763 +v 2.700871 1.947750 0.243763 +v 2.701743 2.292186 0.164732 +v 2.701743 2.292186 -0.164732 +v 2.716800 2.400000 0.067500 +v 2.716800 2.400000 -0.067500 +v 2.716800 2.400000 -0.067500 +v 2.716800 2.400000 0.067500 +v 2.718253 1.696032 0.189274 +v 2.718253 1.696032 -0.189274 +v 2.725600 2.136900 -0.219480 +v 2.725600 2.136900 0.219480 +v 2.729800 2.420250 0.000000 +v 2.742330 1.676424 0.106466 +v 2.742330 1.676424 -0.106466 +v 2.747407 2.420406 -0.066744 +v 2.747407 2.420406 0.066744 +v 2.747710 1.924800 -0.213293 +v 2.747710 1.924800 0.213293 +v 2.751200 1.669200 0.000000 +v 2.751200 1.669200 0.000000 +v 2.758400 2.436000 0.000000 +v 2.762400 2.400000 0.120000 +v 2.762400 2.400000 -0.120000 +v 2.762400 2.400000 -0.120000 +v 2.762400 2.400000 0.120000 +v 2.766370 2.287392 0.188266 +v 2.766370 2.287392 -0.188266 +v 2.776365 2.436302 -0.064692 +v 2.776365 2.436302 0.064692 +v 2.783853 2.123136 -0.210701 +v 2.783853 2.123136 0.210701 +v 2.784600 2.447250 0.000000 +v 2.784600 2.447250 0.000000 +v 2.786282 1.905900 0.162509 +v 2.786282 1.905900 -0.162509 +v 2.795198 2.420829 -0.118656 +v 2.795198 2.420829 0.118656 +v 2.800000 2.400000 0.000000 +v 2.802528 2.447680 -0.061668 +v 2.802528 2.447680 0.061668 +v 2.807200 2.454000 0.000000 +v 2.811200 2.400000 -0.040500 +v 2.811200 2.400000 0.040500 +v 2.812457 1.893075 0.091411 +v 2.812457 1.893075 -0.091411 +v 2.822100 1.888350 0.000000 +v 2.822100 1.888350 0.000000 +v 2.824200 2.420250 0.000000 +v 2.824200 2.420250 0.000000 +v 2.824750 2.454529 -0.057996 +v 2.824750 2.454529 0.057996 +v 2.825000 2.456250 0.000000 +v 2.825000 2.456250 0.000000 +v 2.825126 2.437123 -0.115008 +v 2.825126 2.437123 0.115008 +v 2.829600 2.400000 0.157500 +v 2.829600 2.400000 -0.157500 +v 2.829600 2.400000 -0.157500 +v 2.829600 2.400000 0.157500 +v 2.836672 2.420519 -0.041256 +v 2.836672 2.420519 0.041256 +v 2.836700 2.282175 0.196110 +v 2.836700 2.282175 -0.196110 +v 2.836800 2.454000 0.000000 +v 2.836800 2.454000 0.000000 +v 2.837382 2.110488 -0.184363 +v 2.837382 2.110488 0.184363 +v 2.837600 2.436000 0.000000 +v 2.837600 2.436000 0.000000 +v 2.841400 2.447250 0.000000 +v 2.841400 2.447250 0.000000 +v 2.841600 2.400000 -0.072000 +v 2.841600 2.400000 0.072000 +v 2.841887 2.456841 -0.054000 +v 2.841887 2.456841 0.054000 +v 2.851189 2.448847 -0.109632 +v 2.851189 2.448847 0.109632 +v 2.851331 2.436454 -0.043308 +v 2.851331 2.436454 0.043308 +v 2.852794 2.454605 -0.050004 +v 2.852794 2.454605 0.050004 +v 2.856323 2.447812 -0.046332 +v 2.856323 2.447812 0.046332 +v 2.865626 2.421453 -0.155736 +v 2.865626 2.421453 0.155736 +v 2.870524 2.421250 -0.073344 +v 2.870524 2.421250 0.073344 +v 2.872387 2.455966 -0.103104 +v 2.872387 2.455966 0.103104 +v 2.881466 2.100072 -0.140467 +v 2.881466 2.100072 0.140467 +v 2.886400 2.400000 -0.094500 +v 2.886400 2.400000 0.094500 +v 2.887725 2.458444 -0.096000 +v 2.887725 2.458444 0.096000 +v 2.888602 2.437685 -0.076992 +v 2.888602 2.437685 0.076992 +v 2.896205 2.456246 0.088896 +v 2.896205 2.456246 -0.088896 +v 2.896829 2.449338 -0.082368 +v 2.896829 2.449338 0.082368 +v 2.896986 2.438333 -0.150948 +v 2.896986 2.438333 0.150948 +v 2.907030 2.276958 0.188266 +v 2.907030 2.276958 -0.188266 +v 2.911200 2.400000 -0.180000 +v 2.911200 2.400000 -0.180000 +v 2.911200 2.400000 0.180000 +v 2.911379 2.093004 -0.079013 +v 2.911379 2.093004 0.079013 +v 2.920412 2.422328 -0.096264 +v 2.920412 2.422328 0.096264 +v 2.922400 2.090400 0.000000 +v 2.922899 2.450567 -0.143892 +v 2.922899 2.450567 0.143892 +v 2.940800 2.400000 -0.108000 +v 2.940800 2.400000 0.108000 +v 2.942589 2.458082 -0.135324 +v 2.942589 2.458082 0.135324 +v 2.943526 2.439499 -0.101052 +v 2.943526 2.439499 0.101052 +v 2.951146 2.422210 -0.177984 +v 2.951146 2.422210 0.177984 +v 2.955275 2.460806 -0.126000 +v 2.955275 2.460806 0.126000 +v 2.956523 2.451588 -0.108108 +v 2.956523 2.451588 0.108108 +v 2.960179 2.458666 -0.116676 +v 2.960179 2.458666 0.116676 +v 2.971657 2.272164 0.164732 +v 2.971657 2.272164 -0.164732 +v 2.980990 2.423636 0.110016 +v 2.980990 2.423636 -0.110016 +v 2.984243 2.439802 -0.172512 +v 2.984243 2.439802 0.172512 +v 3.000000 2.400000 -0.187500 +v 3.000000 2.400000 -0.187500 +v 3.000000 2.400000 -0.112500 +v 3.000000 2.400000 0.112500 +v 3.000000 2.400000 0.187500 +v 3.009977 2.452655 -0.164448 +v 3.009977 2.452655 0.164448 +v 3.010221 2.441702 -0.115488 +v 3.010221 2.441702 0.115488 +v 3.024879 2.268216 0.125510 +v 3.024879 2.268216 -0.125510 +v 3.027834 2.460653 -0.154656 +v 3.027834 2.460653 0.154656 +v 3.029007 2.454319 -0.123552 +v 3.029007 2.454319 0.123552 +v 3.037300 2.463675 -0.144000 +v 3.037300 2.463675 0.144000 +v 3.037862 2.461603 0.133344 +v 3.037862 2.461603 -0.133344 +v 3.044212 2.423034 -0.185400 +v 3.044212 2.423034 0.185400 +v 3.046912 2.425059 0.114600 +v 3.046912 2.425059 -0.114600 +v 3.059200 2.400000 -0.108000 +v 3.059200 2.400000 0.108000 +v 3.060994 2.265537 0.070600 +v 3.060994 2.265537 -0.070600 +v 3.074300 2.264550 0.000000 +v 3.074300 2.264550 0.000000 +v 3.079200 2.441400 -0.179700 +v 3.079200 2.441400 0.179700 +v 3.082800 2.444100 -0.120300 +v 3.082800 2.444100 0.120300 +v 3.088800 2.400000 -0.180000 +v 3.088800 2.400000 -0.180000 +v 3.088800 2.400000 0.180000 +v 3.104737 2.454928 -0.171300 +v 3.104738 2.454928 0.171300 +v 3.107887 2.457291 -0.128700 +v 3.107887 2.457291 0.128700 +v 3.112835 2.426483 0.110016 +v 3.112835 2.426483 -0.110016 +v 3.113600 2.400000 -0.094500 +v 3.113600 2.400000 0.094500 +v 3.120600 2.463450 0.161100 +v 3.120600 2.463450 -0.161100 +v 3.122400 2.464800 0.138900 +v 3.122400 2.464800 -0.138900 +v 3.126562 2.466797 -0.150000 +v 3.126562 2.466797 0.150000 +v 3.137279 2.423859 -0.177984 +v 3.137279 2.423859 0.177984 +v 3.155379 2.446498 -0.115488 +v 3.155379 2.446498 0.115488 +v 3.158400 2.400000 -0.072000 +v 3.158400 2.400000 0.072000 +v 3.170400 2.400000 -0.157500 +v 3.170400 2.400000 0.157500 +v 3.170400 2.400000 -0.157500 +v 3.173413 2.427791 -0.096264 +v 3.173413 2.427791 0.096264 +v 3.174157 2.442998 -0.172512 +v 3.174157 2.442998 0.172512 +v 3.186768 2.460263 -0.123552 +v 3.186768 2.460263 0.123552 +v 3.188800 2.400000 -0.040500 +v 3.188800 2.400000 0.040500 +v 3.199498 2.457201 -0.164448 +v 3.199498 2.457201 0.164448 +v 3.200000 2.400000 0.000000 +v 3.206938 2.467997 0.133344 +v 3.206938 2.467997 -0.133344 +v 3.213366 2.466247 -0.154656 +v 3.213366 2.466247 0.154656 +v 3.215825 2.469919 -0.144000 +v 3.215825 2.469919 0.144000 +v 3.222074 2.448701 -0.101052 +v 3.222074 2.448701 0.101052 +v 3.222799 2.424616 -0.155736 +v 3.222799 2.424616 0.155736 +v 3.223301 2.428868 -0.073344 +v 3.223301 2.428868 0.073344 +v 3.237600 2.400000 -0.120000 +v 3.237600 2.400000 0.120000 +v 3.237600 2.400000 -0.120000 +v 3.257153 2.429599 -0.041256 +v 3.257153 2.429599 0.041256 +v 3.259252 2.462994 -0.108108 +v 3.259252 2.462994 0.108108 +v 3.261414 2.444467 -0.150948 +v 3.261414 2.444467 0.150948 +v 3.269625 2.429869 0.000000 +v 3.269625 2.429869 0.000000 +v 3.276998 2.450515 -0.076992 +v 3.276998 2.450515 0.076992 +v 3.283200 2.400000 -0.067500 +v 3.283200 2.400000 0.067500 +v 3.283200 2.400000 -0.067500 +v 3.284621 2.470934 -0.116676 +v 3.284621 2.470934 0.116676 +v 3.286576 2.459289 -0.143892 +v 3.286576 2.459289 0.143892 +v 3.293227 2.425240 -0.118656 +v 3.293227 2.425240 0.118656 +v 3.297850 2.472787 -0.126000 +v 3.297850 2.472788 0.126000 +v 3.298611 2.468818 -0.135324 +v 3.298611 2.468818 0.135324 +v 3.300000 2.400000 0.000000 +v 3.300000 2.400000 0.000000 +v 3.314269 2.451746 -0.043308 +v 3.314269 2.451746 0.043308 +v 3.318946 2.465243 -0.082368 +v 3.318946 2.465243 0.082368 +v 3.328000 2.452200 0.000000 +v 3.328000 2.452200 0.000000 +v 3.333274 2.445677 -0.115008 +v 3.333274 2.445677 0.115008 +v 3.341018 2.425663 -0.066744 +v 3.341018 2.425663 0.066744 +v 3.348595 2.473354 0.088896 +v 3.348595 2.473354 -0.088896 +v 3.358286 2.461009 -0.109632 +v 3.358286 2.461009 0.109632 +v 3.358625 2.425819 0.000000 +v 3.359452 2.466769 -0.046332 +v 3.359452 2.466769 0.046332 +v 3.365400 2.475150 -0.096000 +v 3.365400 2.475150 0.096000 +v 3.368813 2.470934 -0.103104 +v 3.368813 2.470934 0.103104 +v 3.374375 2.467331 0.000000 +v 3.374375 2.467331 0.000000 +v 3.382035 2.446498 -0.064692 +v 3.382035 2.446498 0.064692 +v 3.392006 2.474995 -0.050004 +v 3.392006 2.474995 0.050004 +v 3.400000 2.446800 0.000000 +v 3.406947 2.462176 -0.061668 +v 3.406947 2.462176 0.061668 +v 3.408000 2.475600 0.000000 +v 3.408000 2.475600 0.000000 +v 3.411237 2.476753 -0.054000 +v 3.411237 2.476753 0.054000 +v 3.416450 2.472371 -0.057996 +v 3.416450 2.472371 0.057996 +v 3.424875 2.462606 0.000000 +v 3.428125 2.477344 0.000000 +v 3.428125 2.477344 0.000000 +v 3.434000 2.472900 0.000000 + +f 2909 2921 2939 +f 2939 2931 2909 +f 2869 2877 2921 +f 2921 2909 2869 +f 2819 2827 2877 +f 2877 2869 2819 +f 2737 2747 2827 +f 2827 2819 2737 +f 2669 2673 2747 +f 2747 2737 2669 +f 2567 2575 2673 +f 2673 2669 2567 +f 2476 2480 2575 +f 2575 2567 2476 +f 2358 2362 2480 +f 2480 2476 2358 +f 2158 2162 2362 +f 2362 2358 2158 +f 1715 1812 2162 +f 2162 2158 1715 +f 2901 2909 2931 +f 2931 2917 2901 +f 2863 2869 2909 +f 2909 2901 2863 +f 2813 2819 2869 +f 2869 2863 2813 +f 2729 2737 2819 +f 2819 2813 2729 +f 2663 2669 2737 +f 2737 2729 2663 +f 2561 2567 2669 +f 2669 2663 2561 +f 2468 2476 2567 +f 2567 2561 2468 +f 2350 2358 2476 +f 2476 2468 2350 +f 2152 2158 2358 +f 2358 2350 2152 +f 1717 1715 2158 +f 2158 2152 1717 +f 2903 2901 2917 +f 2917 2923 2903 +f 2865 2863 2901 +f 2901 2903 2865 +f 2815 2813 2863 +f 2863 2865 2815 +f 2733 2729 2813 +f 2813 2815 2733 +f 2665 2663 2729 +f 2729 2733 2665 +f 2564 2561 2663 +f 2663 2665 2564 +f 2473 2468 2561 +f 2561 2564 2473 +f 2354 2350 2468 +f 2468 2473 2354 +f 2155 2152 2350 +f 2350 2354 2155 +f 1927 1717 2152 +f 2152 2155 1927 +f 2911 2903 2923 +f 2923 2935 2911 +f 2875 2865 2903 +f 2903 2911 2875 +f 2823 2815 2865 +f 2865 2875 2823 +f 2741 2733 2815 +f 2815 2823 2741 +f 2671 2665 2733 +f 2733 2741 2671 +f 2571 2564 2665 +f 2665 2671 2571 +f 2478 2473 2564 +f 2564 2571 2478 +f 2360 2354 2473 +f 2473 2478 2360 +f 2160 2155 2354 +f 2354 2360 2160 +f 1718 1927 2155 +f 2155 2160 1718 +f 2929 2911 2935 +f 2935 2947 2929 +f 2881 2875 2911 +f 2911 2929 2881 +f 2829 2823 2875 +f 2875 2881 2829 +f 2751 2741 2823 +f 2823 2829 2751 +f 2677 2671 2741 +f 2741 2751 2677 +f 2577 2571 2671 +f 2671 2677 2577 +f 2482 2478 2571 +f 2571 2577 2482 +f 2364 2360 2478 +f 2478 2482 2364 +f 2164 2160 2360 +f 2360 2364 2164 +f 1842 1718 2160 +f 2160 2164 1842 +f 2945 2929 2947 +f 2947 2959 2945 +f 2897 2881 2929 +f 2929 2945 2897 +f 2835 2829 2881 +f 2881 2897 2835 +f 2761 2751 2829 +f 2829 2835 2761 +f 2679 2677 2751 +f 2751 2761 2679 +f 2579 2577 2677 +f 2677 2679 2579 +f 2486 2482 2577 +f 2577 2579 2486 +f 2368 2364 2482 +f 2482 2486 2368 +f 2172 2164 2364 +f 2364 2368 2172 +f 1725 1842 2164 +f 2164 2172 1725 +f 2965 2945 2959 +f 2959 2981 2965 +f 2907 2897 2945 +f 2945 2965 2907 +f 2845 2835 2897 +f 2897 2907 2845 +f 2769 2761 2835 +f 2835 2845 2769 +f 2685 2679 2761 +f 2761 2769 2685 +f 2587 2579 2679 +f 2679 2685 2587 +f 2491 2486 2579 +f 2579 2587 2491 +f 2370 2368 2486 +f 2486 2491 2370 +f 2174 2172 2368 +f 2368 2370 2174 +f 1834 1725 2172 +f 2172 2174 1834 +f 2982 2965 2981 +f 2981 2988 2982 +f 2933 2907 2965 +f 2965 2982 2933 +f 2855 2845 2907 +f 2907 2933 2855 +f 2779 2769 2845 +f 2845 2855 2779 +f 2691 2685 2769 +f 2769 2779 2691 +f 2595 2587 2685 +f 2685 2691 2595 +f 2500 2491 2587 +f 2587 2595 2500 +f 2374 2370 2491 +f 2491 2500 2374 +f 2178 2174 2370 +f 2370 2374 2178 +f 1716 1834 2174 +f 2174 2178 1716 +f 2990 2982 2988 +f 2988 3002 2990 +f 2949 2933 2982 +f 2982 2990 2949 +f 2871 2855 2933 +f 2933 2949 2871 +f 2791 2779 2855 +f 2855 2871 2791 +f 2699 2691 2779 +f 2779 2791 2699 +f 2601 2595 2691 +f 2691 2699 2601 +f 2506 2500 2595 +f 2595 2601 2506 +f 2378 2374 2500 +f 2500 2506 2378 +f 2180 2178 2374 +f 2374 2378 2180 +f 1714 1716 2178 +f 2178 2180 1714 +f 3008 2990 3002 +f 3002 3024 3008 +f 2973 2949 2990 +f 2990 3008 2973 +f 2889 2871 2949 +f 2949 2973 2889 +f 2805 2791 2871 +f 2871 2889 2805 +f 2711 2699 2791 +f 2791 2805 2711 +f 2611 2601 2699 +f 2699 2711 2611 +f 2521 2506 2601 +f 2601 2611 2521 +f 2387 2378 2506 +f 2506 2521 2387 +f 2191 2180 2378 +f 2378 2387 2191 +f 1810 1714 2180 +f 2180 2191 1810 +f 1464 1460 1813 +f 1813 1821 1464 +f 1264 1260 1460 +f 1460 1464 1264 +f 1146 1142 1260 +f 1260 1264 1146 +f 1055 1047 1142 +f 1142 1146 1055 +f 953 949 1047 +f 1047 1055 953 +f 885 875 949 +f 949 953 885 +f 803 795 875 +f 875 885 803 +f 753 745 795 +f 795 803 753 +f 713 701 745 +f 745 753 713 +f 691 683 701 +f 701 713 691 +f 1470 1464 1821 +f 1821 1829 1470 +f 1272 1264 1464 +f 1464 1470 1272 +f 1154 1146 1264 +f 1264 1272 1154 +f 1061 1055 1146 +f 1146 1154 1061 +f 959 953 1055 +f 1055 1061 959 +f 893 885 953 +f 953 959 893 +f 809 803 885 +f 885 893 809 +f 759 753 803 +f 803 809 759 +f 721 713 753 +f 753 759 721 +f 705 691 713 +f 713 721 705 +f 1469 1470 1829 +f 1829 1835 1469 +f 1268 1272 1470 +f 1470 1469 1268 +f 1151 1154 1272 +f 1272 1268 1151 +f 1060 1061 1154 +f 1154 1151 1060 +f 957 959 1061 +f 1061 1060 957 +f 889 893 959 +f 959 957 889 +f 807 809 893 +f 893 889 807 +f 757 759 809 +f 809 807 757 +f 719 721 759 +f 759 757 719 +f 699 705 721 +f 721 719 699 +f 1462 1469 1835 +f 1835 1839 1462 +f 1262 1268 1469 +f 1469 1462 1262 +f 1144 1151 1268 +f 1268 1262 1144 +f 1051 1060 1151 +f 1151 1144 1051 +f 951 957 1060 +f 1060 1051 951 +f 881 889 957 +f 957 951 881 +f 799 807 889 +f 889 881 799 +f 747 757 807 +f 807 799 747 +f 711 719 757 +f 757 747 711 +f 687 699 719 +f 719 711 687 +f 1458 1462 1839 +f 1839 1843 1458 +f 1258 1262 1462 +f 1462 1458 1258 +f 1140 1144 1262 +f 1262 1258 1140 +f 1045 1051 1144 +f 1144 1140 1045 +f 945 951 1051 +f 1051 1045 945 +f 871 881 951 +f 951 945 871 +f 793 799 881 +f 881 871 793 +f 741 747 799 +f 799 793 741 +f 693 711 747 +f 747 741 693 +f 675 687 711 +f 711 693 675 +f 1450 1458 1843 +f 1843 1838 1450 +f 1254 1258 1458 +f 1458 1450 1254 +f 1136 1140 1258 +f 1258 1254 1136 +f 1043 1045 1140 +f 1140 1136 1043 +f 943 945 1045 +f 1045 1043 943 +f 861 871 945 +f 945 943 861 +f 787 793 871 +f 871 861 787 +f 725 741 793 +f 793 787 725 +f 677 693 741 +f 741 725 677 +f 663 675 693 +f 693 677 663 +f 1448 1450 1838 +f 1838 1834 1448 +f 1252 1254 1450 +f 1450 1448 1252 +f 1133 1136 1254 +f 1254 1252 1133 +f 1035 1043 1136 +f 1136 1133 1035 +f 937 943 1043 +f 1043 1035 937 +f 853 861 943 +f 943 937 853 +f 777 787 861 +f 861 853 777 +f 715 725 787 +f 787 777 715 +f 657 677 725 +f 725 715 657 +f 642 663 677 +f 677 657 642 +f 1444 1448 1834 +f 1834 1828 1444 +f 1248 1252 1448 +f 1448 1444 1248 +f 1122 1133 1252 +f 1252 1248 1122 +f 1027 1035 1133 +f 1133 1122 1027 +f 931 937 1035 +f 1035 1027 931 +f 843 853 937 +f 937 931 843 +f 767 777 853 +f 853 843 767 +f 689 715 777 +f 777 767 689 +f 640 657 715 +f 715 689 640 +f 634 642 657 +f 657 640 634 +f 1442 1444 1828 +f 1828 1820 1442 +f 1244 1248 1444 +f 1444 1442 1244 +f 1116 1122 1248 +f 1248 1244 1116 +f 1021 1027 1122 +f 1122 1116 1021 +f 923 931 1027 +f 1027 1021 923 +f 831 843 931 +f 931 923 831 +f 751 767 843 +f 843 831 751 +f 673 689 767 +f 767 751 673 +f 632 640 689 +f 689 673 632 +f 620 634 640 +f 640 632 620 +f 1429 1442 1820 +f 1820 1811 1429 +f 1233 1244 1442 +f 1442 1429 1233 +f 1106 1116 1244 +f 1244 1233 1106 +f 1011 1021 1116 +f 1116 1106 1011 +f 911 923 1021 +f 1021 1011 911 +f 817 831 923 +f 923 911 817 +f 733 751 831 +f 831 817 733 +f 649 673 751 +f 751 733 649 +f 614 632 673 +f 673 649 614 +f 597 620 632 +f 632 614 597 +f 714 702 684 +f 684 692 714 +f 754 746 702 +f 702 714 754 +f 804 796 746 +f 746 754 804 +f 886 876 796 +f 796 804 886 +f 954 950 876 +f 876 886 954 +f 1056 1048 950 +f 950 954 1056 +f 1147 1143 1048 +f 1048 1056 1147 +f 1265 1261 1143 +f 1143 1147 1265 +f 1465 1461 1261 +f 1261 1265 1465 +f 1915 1817 1461 +f 1461 1465 1915 +f 722 714 692 +f 692 706 722 +f 760 754 714 +f 714 722 760 +f 810 804 754 +f 754 760 810 +f 894 886 804 +f 804 810 894 +f 960 954 886 +f 886 894 960 +f 1062 1056 954 +f 954 960 1062 +f 1155 1147 1056 +f 1056 1062 1155 +f 1273 1265 1147 +f 1147 1155 1273 +f 1471 1465 1265 +f 1265 1273 1471 +f 1917 1915 1465 +f 1465 1471 1917 +f 720 722 706 +f 706 700 720 +f 758 760 722 +f 722 720 758 +f 808 810 760 +f 760 758 808 +f 890 894 810 +f 810 808 890 +f 958 960 894 +f 894 890 958 +f 1059 1062 960 +f 960 958 1059 +f 1150 1155 1062 +f 1062 1059 1150 +f 1269 1273 1155 +f 1155 1150 1269 +f 1468 1471 1273 +f 1273 1269 1468 +f 1697 1917 1471 +f 1471 1468 1697 +f 712 720 700 +f 700 688 712 +f 748 758 720 +f 720 712 748 +f 800 808 758 +f 758 748 800 +f 882 890 808 +f 808 800 882 +f 952 958 890 +f 890 882 952 +f 1052 1059 958 +f 958 952 1052 +f 1145 1150 1059 +f 1059 1052 1145 +f 1263 1269 1150 +f 1150 1145 1263 +f 1463 1468 1269 +f 1269 1263 1463 +f 1919 1697 1468 +f 1468 1463 1919 +f 694 712 688 +f 688 676 694 +f 742 748 712 +f 712 694 742 +f 794 800 748 +f 748 742 794 +f 872 882 800 +f 800 794 872 +f 946 952 882 +f 882 872 946 +f 1046 1052 952 +f 952 946 1046 +f 1141 1145 1052 +f 1052 1046 1141 +f 1259 1263 1145 +f 1145 1141 1259 +f 1459 1463 1263 +f 1263 1259 1459 +f 1845 1919 1463 +f 1463 1459 1845 +f 678 694 676 +f 676 664 678 +f 726 742 694 +f 694 678 726 +f 788 794 742 +f 742 726 788 +f 862 872 794 +f 794 788 862 +f 944 946 872 +f 872 862 944 +f 1044 1046 946 +f 946 944 1044 +f 1137 1141 1046 +f 1046 1044 1137 +f 1255 1259 1141 +f 1141 1137 1255 +f 1451 1459 1259 +f 1259 1255 1451 +f 1898 1845 1459 +f 1459 1451 1898 +f 658 678 664 +f 664 642 658 +f 716 726 678 +f 678 658 716 +f 778 788 726 +f 726 716 778 +f 854 862 788 +f 788 778 854 +f 938 944 862 +f 862 854 938 +f 1036 1044 944 +f 944 938 1036 +f 1132 1137 1044 +f 1044 1036 1132 +f 1253 1255 1137 +f 1137 1132 1253 +f 1449 1451 1255 +f 1255 1253 1449 +f 1837 1898 1451 +f 1451 1449 1837 +f 641 658 642 +f 642 635 641 +f 690 716 658 +f 658 641 690 +f 768 778 716 +f 716 690 768 +f 844 854 778 +f 778 768 844 +f 932 938 854 +f 854 844 932 +f 1028 1036 938 +f 938 932 1028 +f 1123 1132 1036 +f 1036 1028 1123 +f 1249 1253 1132 +f 1132 1123 1249 +f 1445 1449 1253 +f 1253 1249 1445 +f 1918 1837 1449 +f 1449 1445 1918 +f 633 641 635 +f 635 621 633 +f 674 690 641 +f 641 633 674 +f 752 768 690 +f 690 674 752 +f 832 844 768 +f 768 752 832 +f 924 932 844 +f 844 832 924 +f 1022 1028 932 +f 932 924 1022 +f 1117 1123 1028 +f 1028 1022 1117 +f 1245 1249 1123 +f 1123 1117 1245 +f 1443 1445 1249 +f 1249 1245 1443 +f 1916 1918 1445 +f 1445 1443 1916 +f 616 633 621 +f 621 600 616 +f 654 674 633 +f 633 616 654 +f 737 752 674 +f 674 654 737 +f 822 832 752 +f 752 737 822 +f 914 924 832 +f 832 822 914 +f 1014 1022 924 +f 924 914 1014 +f 1104 1117 1022 +f 1022 1014 1104 +f 1237 1245 1117 +f 1117 1104 1237 +f 1433 1443 1245 +f 1245 1237 1433 +f 1819 1916 1443 +f 1443 1433 1819 +f 2159 2163 1816 +f 1816 1822 2159 +f 2359 2363 2163 +f 2163 2159 2359 +f 2477 2481 2363 +f 2363 2359 2477 +f 2568 2576 2481 +f 2481 2477 2568 +f 2670 2674 2576 +f 2576 2568 2670 +f 2738 2748 2674 +f 2674 2670 2738 +f 2820 2828 2748 +f 2748 2738 2820 +f 2870 2878 2828 +f 2828 2820 2870 +f 2910 2922 2878 +f 2878 2870 2910 +f 2932 2940 2922 +f 2922 2910 2932 +f 2153 2159 1822 +f 1822 1830 2153 +f 2351 2359 2159 +f 2159 2153 2351 +f 2469 2477 2359 +f 2359 2351 2469 +f 2562 2568 2477 +f 2477 2469 2562 +f 2664 2670 2568 +f 2568 2562 2664 +f 2730 2738 2670 +f 2670 2664 2730 +f 2814 2820 2738 +f 2738 2730 2814 +f 2864 2870 2820 +f 2820 2814 2864 +f 2902 2910 2870 +f 2870 2864 2902 +f 2918 2932 2910 +f 2910 2902 2918 +f 2154 2153 1830 +f 1830 1836 2154 +f 2355 2351 2153 +f 2153 2154 2355 +f 2472 2469 2351 +f 2351 2355 2472 +f 2563 2562 2469 +f 2469 2472 2563 +f 2666 2664 2562 +f 2562 2563 2666 +f 2734 2730 2664 +f 2664 2666 2734 +f 2816 2814 2730 +f 2730 2734 2816 +f 2866 2864 2814 +f 2814 2816 2866 +f 2904 2902 2864 +f 2864 2866 2904 +f 2924 2918 2902 +f 2902 2904 2924 +f 2161 2154 1836 +f 1836 1840 2161 +f 2361 2355 2154 +f 2154 2161 2361 +f 2479 2472 2355 +f 2355 2361 2479 +f 2572 2563 2472 +f 2472 2479 2572 +f 2672 2666 2563 +f 2563 2572 2672 +f 2742 2734 2666 +f 2666 2672 2742 +f 2824 2816 2734 +f 2734 2742 2824 +f 2876 2866 2816 +f 2816 2824 2876 +f 2912 2904 2866 +f 2866 2876 2912 +f 2936 2924 2904 +f 2904 2912 2936 +f 2165 2161 1840 +f 1840 1844 2165 +f 2365 2361 2161 +f 2161 2165 2365 +f 2483 2479 2361 +f 2361 2365 2483 +f 2578 2572 2479 +f 2479 2483 2578 +f 2678 2672 2572 +f 2572 2578 2678 +f 2752 2742 2672 +f 2672 2678 2752 +f 2830 2824 2742 +f 2742 2752 2830 +f 2882 2876 2824 +f 2824 2830 2882 +f 2930 2912 2876 +f 2876 2882 2930 +f 2948 2936 2912 +f 2912 2930 2948 +f 2173 2165 1844 +f 1844 1841 2173 +f 2369 2365 2165 +f 2165 2173 2369 +f 2487 2483 2365 +f 2365 2369 2487 +f 2580 2578 2483 +f 2483 2487 2580 +f 2680 2678 2578 +f 2578 2580 2680 +f 2762 2752 2678 +f 2678 2680 2762 +f 2836 2830 2752 +f 2752 2762 2836 +f 2898 2882 2830 +f 2830 2836 2898 +f 2946 2930 2882 +f 2882 2898 2946 +f 2960 2948 2930 +f 2930 2946 2960 +f 2175 2173 1841 +f 1841 1837 2175 +f 2371 2369 2173 +f 2173 2175 2371 +f 2490 2487 2369 +f 2369 2371 2490 +f 2588 2580 2487 +f 2487 2490 2588 +f 2686 2680 2580 +f 2580 2588 2686 +f 2770 2762 2680 +f 2680 2686 2770 +f 2846 2836 2762 +f 2762 2770 2846 +f 2908 2898 2836 +f 2836 2846 2908 +f 2966 2946 2898 +f 2898 2908 2966 +f 2981 2960 2946 +f 2946 2966 2981 +f 2179 2175 1837 +f 1837 1831 2179 +f 2375 2371 2175 +f 2175 2179 2375 +f 2501 2490 2371 +f 2371 2375 2501 +f 2596 2588 2490 +f 2490 2501 2596 +f 2692 2686 2588 +f 2588 2596 2692 +f 2780 2770 2686 +f 2686 2692 2780 +f 2856 2846 2770 +f 2770 2780 2856 +f 2934 2908 2846 +f 2846 2856 2934 +f 2983 2966 2908 +f 2908 2934 2983 +f 2989 2981 2966 +f 2966 2983 2989 +f 2181 2179 1831 +f 1831 1823 2181 +f 2379 2375 2179 +f 2179 2181 2379 +f 2507 2501 2375 +f 2375 2379 2507 +f 2602 2596 2501 +f 2501 2507 2602 +f 2700 2692 2596 +f 2596 2602 2700 +f 2792 2780 2692 +f 2692 2700 2792 +f 2872 2856 2780 +f 2780 2792 2872 +f 2950 2934 2856 +f 2856 2872 2950 +f 2991 2983 2934 +f 2934 2950 2991 +f 3003 2989 2983 +f 2983 2991 3003 +f 2194 2181 1823 +f 1823 1818 2194 +f 2391 2379 2181 +f 2181 2194 2391 +f 2518 2507 2379 +f 2379 2391 2518 +f 2614 2602 2507 +f 2507 2518 2614 +f 2712 2700 2602 +f 2602 2614 2712 +f 2806 2792 2700 +f 2700 2712 2806 +f 2890 2872 2792 +f 2792 2806 2890 +f 2974 2950 2872 +f 2872 2890 2974 +f 3009 2991 2950 +f 2950 2974 3009 +f 3025 3003 2991 +f 2991 3009 3025 +f 3040 3008 3024 +f 3024 3048 3040 +f 3018 2973 3008 +f 3008 3040 3018 +f 2943 2889 2973 +f 2973 3018 2943 +f 2841 2805 2889 +f 2889 2943 2841 +f 2731 2711 2805 +f 2805 2841 2731 +f 2645 2611 2711 +f 2711 2731 2645 +f 2529 2521 2611 +f 2611 2645 2529 +f 2402 2387 2521 +f 2521 2529 2402 +f 2208 2191 2387 +f 2387 2402 2208 +f 1806 1810 2191 +f 2191 2208 1806 +f 3072 3040 3048 +f 3048 3078 3072 +f 3044 3018 3040 +f 3040 3072 3044 +f 2994 2943 3018 +f 3018 3044 2994 +f 2883 2841 2943 +f 2943 2994 2883 +f 2773 2731 2841 +f 2841 2883 2773 +f 2659 2645 2731 +f 2731 2773 2659 +f 2539 2529 2645 +f 2645 2659 2539 +f 2410 2402 2529 +f 2529 2539 2410 +f 2222 2208 2402 +f 2402 2410 2222 +f 1694 1806 2208 +f 2208 2222 1694 +f 3092 3072 3078 +f 3078 3116 3092 +f 3074 3044 3072 +f 3072 3092 3074 +f 3030 2994 3044 +f 3044 3074 3030 +f 2937 2883 2994 +f 2994 3030 2937 +f 2810 2773 2883 +f 2883 2937 2810 +f 2683 2659 2773 +f 2773 2810 2683 +f 2554 2539 2659 +f 2659 2683 2554 +f 2420 2410 2539 +f 2539 2554 2420 +f 2238 2222 2410 +f 2410 2420 2238 +f 1930 1694 2222 +f 2222 2238 1930 +f 3132 3092 3116 +f 3116 3142 3132 +f 3090 3074 3092 +f 3092 3132 3090 +f 3054 3030 3074 +f 3074 3090 3054 +f 2984 2937 3030 +f 3030 3054 2984 +f 2837 2810 2937 +f 2937 2984 2837 +f 2705 2683 2810 +f 2810 2837 2705 +f 2574 2554 2683 +f 2683 2705 2574 +f 2430 2420 2554 +f 2554 2574 2430 +f 2247 2238 2420 +f 2420 2430 2247 +f 1913 1930 2238 +f 2238 2247 1913 +f 3150 3132 3142 +f 3142 3156 3150 +f 3128 3090 3132 +f 3132 3150 3128 +f 3076 3054 3090 +f 3090 3128 3076 +f 3014 2984 3054 +f 3054 3076 3014 +f 2861 2837 2984 +f 2984 3014 2861 +f 2723 2705 2837 +f 2837 2861 2723 +f 2585 2574 2705 +f 2705 2723 2585 +f 2438 2430 2574 +f 2574 2585 2438 +f 2253 2247 2430 +f 2430 2438 2253 +f 1711 1913 2247 +f 2247 2253 1711 +f 3162 3150 3156 +f 3156 3172 3162 +f 3148 3128 3150 +f 3150 3162 3148 +f 3088 3076 3128 +f 3128 3148 3088 +f 3036 3014 3076 +f 3076 3088 3036 +f 2893 2861 3014 +f 3014 3036 2893 +f 2743 2723 2861 +f 2861 2893 2743 +f 2599 2585 2723 +f 2723 2743 2599 +f 2450 2438 2585 +f 2585 2599 2450 +f 2267 2253 2438 +f 2438 2450 2267 +f 1794 1711 2253 +f 2253 2267 1794 +f 3178 3162 3172 +f 3172 3184 3178 +f 3154 3148 3162 +f 3162 3178 3154 +f 3118 3088 3148 +f 3148 3154 3118 +f 3046 3036 3088 +f 3088 3118 3046 +f 2915 2893 3036 +f 3036 3046 2915 +f 2763 2743 2893 +f 2893 2915 2763 +f 2615 2599 2743 +f 2743 2763 2615 +f 2452 2450 2599 +f 2599 2615 2452 +f 2277 2267 2450 +f 2450 2452 2277 +f 1710 1794 2267 +f 2267 2277 1710 +f 3188 3178 3184 +f 3184 3200 3188 +f 3164 3154 3178 +f 3178 3188 3164 +f 3130 3118 3154 +f 3154 3164 3130 +f 3058 3046 3118 +f 3118 3130 3058 +f 2941 2915 3046 +f 3046 3058 2941 +f 2775 2763 2915 +f 2915 2941 2775 +f 2627 2615 2763 +f 2763 2775 2627 +f 2458 2452 2615 +f 2615 2627 2458 +f 2287 2277 2452 +f 2452 2458 2287 +f 1910 1710 2277 +f 2277 2287 1910 +f 3198 3188 3200 +f 3200 3209 3198 +f 3170 3164 3188 +f 3188 3198 3170 +f 3136 3130 3164 +f 3164 3170 3136 +f 3064 3058 3130 +f 3130 3136 3064 +f 2955 2941 3058 +f 3058 3064 2955 +f 2781 2775 2941 +f 2941 2955 2781 +f 2636 2627 2775 +f 2775 2781 2636 +f 2462 2458 2627 +f 2627 2636 2462 +f 2295 2287 2458 +f 2458 2462 2295 +f 1909 1910 2287 +f 2287 2295 1909 +f 3202 3198 3209 +f 3209 3213 3202 +f 3174 3170 3198 +f 3198 3202 3174 +f 3138 3136 3170 +f 3170 3174 3138 +f 3066 3064 3136 +f 3136 3138 3066 +f 2961 2955 3064 +f 3064 3066 2961 +f 2783 2781 2955 +f 2955 2961 2783 +f 2642 2636 2781 +f 2781 2783 2642 +f 2464 2462 2636 +f 2636 2642 2464 +f 2297 2295 2462 +f 2462 2464 2297 +f 1784 1909 2295 +f 2295 2297 1784 +f 1414 1429 1811 +f 1811 1807 1414 +f 1220 1233 1429 +f 1429 1414 1220 +f 1093 1106 1233 +f 1233 1220 1093 +f 977 1011 1106 +f 1106 1093 977 +f 891 911 1011 +f 1011 977 891 +f 781 817 911 +f 911 891 781 +f 679 733 817 +f 817 781 679 +f 604 649 733 +f 733 679 604 +f 571 614 649 +f 649 604 571 +f 561 597 614 +f 614 571 561 +f 1400 1414 1807 +f 1807 1804 1400 +f 1212 1220 1414 +f 1414 1400 1212 +f 1083 1093 1220 +f 1220 1212 1083 +f 963 977 1093 +f 1093 1083 963 +f 849 891 977 +f 977 963 849 +f 739 781 891 +f 891 849 739 +f 628 679 781 +f 781 739 628 +f 565 604 679 +f 679 628 565 +f 530 571 604 +f 604 565 530 +f 524 561 571 +f 571 530 524 +f 1386 1400 1804 +f 1804 1802 1386 +f 1202 1212 1400 +f 1400 1386 1202 +f 1070 1083 1212 +f 1212 1202 1070 +f 939 963 1083 +f 1083 1070 939 +f 814 849 963 +f 963 939 814 +f 685 739 849 +f 849 814 685 +f 585 628 739 +f 739 685 585 +f 528 565 628 +f 628 585 528 +f 510 530 565 +f 565 528 510 +f 508 524 530 +f 530 510 508 +f 1375 1386 1802 +f 1802 1800 1375 +f 1192 1202 1386 +f 1386 1375 1192 +f 1050 1070 1202 +f 1202 1192 1050 +f 917 939 1070 +f 1070 1050 917 +f 785 814 939 +f 939 917 785 +f 638 685 814 +f 814 785 638 +f 553 585 685 +f 685 638 553 +f 512 528 585 +f 585 553 512 +f 492 510 528 +f 528 512 492 +f 482 508 510 +f 510 492 482 +f 1369 1375 1800 +f 1800 1798 1369 +f 1184 1192 1375 +f 1375 1369 1184 +f 1037 1050 1192 +f 1192 1184 1037 +f 899 917 1050 +f 1050 1037 899 +f 761 785 917 +f 917 899 761 +f 608 638 785 +f 785 761 608 +f 526 553 638 +f 638 608 526 +f 496 512 553 +f 553 526 496 +f 454 492 512 +f 512 496 454 +f 448 482 492 +f 492 454 448 +f 1355 1369 1798 +f 1798 1795 1355 +f 1172 1184 1369 +f 1369 1355 1172 +f 1023 1037 1184 +f 1184 1172 1023 +f 879 899 1037 +f 1037 1023 879 +f 729 761 899 +f 899 879 729 +f 579 608 761 +f 761 729 579 +f 514 526 608 +f 608 579 514 +f 457 496 526 +f 526 514 457 +f 442 454 496 +f 496 457 442 +f 432 448 454 +f 454 442 432 +f 1345 1355 1795 +f 1795 1792 1345 +f 1170 1172 1355 +f 1355 1345 1170 +f 1007 1023 1172 +f 1172 1170 1007 +f 859 879 1023 +f 1023 1007 859 +f 707 729 879 +f 879 859 707 +f 563 579 729 +f 729 707 563 +f 506 514 579 +f 579 563 506 +f 450 457 514 +f 514 506 450 +f 420 442 457 +f 457 450 420 +f 412 432 442 +f 442 420 412 +f 1335 1345 1792 +f 1792 1790 1335 +f 1164 1170 1345 +f 1345 1335 1164 +f 995 1007 1170 +f 1170 1164 995 +f 847 859 1007 +f 1007 995 847 +f 681 707 859 +f 859 847 681 +f 547 563 707 +f 707 681 547 +f 494 506 563 +f 563 547 494 +f 440 450 506 +f 506 494 440 +f 410 420 450 +f 450 440 410 +f 398 412 420 +f 420 410 398 +f 1327 1335 1790 +f 1790 1788 1327 +f 1160 1164 1335 +f 1335 1327 1160 +f 988 995 1164 +f 1164 1160 988 +f 841 847 995 +f 995 988 841 +f 667 681 847 +f 847 841 667 +f 538 547 681 +f 681 667 538 +f 488 494 547 +f 547 538 488 +f 434 440 494 +f 494 488 434 +f 400 410 440 +f 440 434 400 +f 381 398 410 +f 410 400 381 +f 1324 1327 1788 +f 1788 1785 1324 +f 1156 1160 1327 +f 1327 1324 1156 +f 979 988 1160 +f 1160 1156 979 +f 837 841 988 +f 988 979 837 +f 659 667 841 +f 841 837 659 +f 534 538 667 +f 667 659 534 +f 484 488 538 +f 538 534 484 +f 428 434 488 +f 488 484 428 +f 395 400 434 +f 434 428 395 +f 374 381 400 +f 400 395 374 +f 572 616 600 +f 600 562 572 +f 605 654 616 +f 616 572 605 +f 680 737 654 +f 654 605 680 +f 782 822 737 +f 737 680 782 +f 892 914 822 +f 822 782 892 +f 978 1014 914 +f 914 892 978 +f 1094 1104 1014 +f 1014 978 1094 +f 1221 1237 1104 +f 1104 1094 1221 +f 1415 1433 1237 +f 1237 1221 1415 +f 1809 1819 1433 +f 1433 1415 1809 +f 531 572 562 +f 562 525 531 +f 566 605 572 +f 572 531 566 +f 629 680 605 +f 605 566 629 +f 740 782 680 +f 680 629 740 +f 850 892 782 +f 782 740 850 +f 964 978 892 +f 892 850 964 +f 1084 1094 978 +f 978 964 1084 +f 1213 1221 1094 +f 1094 1084 1213 +f 1401 1415 1221 +f 1221 1213 1401 +f 1931 1809 1415 +f 1415 1401 1931 +f 511 531 525 +f 525 509 511 +f 529 566 531 +f 531 511 529 +f 586 629 566 +f 566 529 586 +f 686 740 629 +f 629 586 686 +f 813 850 740 +f 740 686 813 +f 940 964 850 +f 850 813 940 +f 1069 1084 964 +f 964 940 1069 +f 1203 1213 1084 +f 1084 1069 1203 +f 1385 1401 1213 +f 1213 1203 1385 +f 1693 1931 1401 +f 1401 1385 1693 +f 493 511 509 +f 509 483 493 +f 513 529 511 +f 511 493 513 +f 554 586 529 +f 529 513 554 +f 639 686 586 +f 586 554 639 +f 786 813 686 +f 686 639 786 +f 918 940 813 +f 813 786 918 +f 1049 1069 940 +f 940 918 1049 +f 1193 1203 1069 +f 1069 1049 1193 +f 1376 1385 1203 +f 1203 1193 1376 +f 1712 1693 1385 +f 1385 1376 1712 +f 455 493 483 +f 483 449 455 +f 497 513 493 +f 493 455 497 +f 527 554 513 +f 513 497 527 +f 609 639 554 +f 554 527 609 +f 762 786 639 +f 639 609 762 +f 900 918 786 +f 786 762 900 +f 1038 1049 918 +f 918 900 1038 +f 1185 1193 1049 +f 1049 1038 1185 +f 1370 1376 1193 +f 1193 1185 1370 +f 1912 1712 1376 +f 1376 1370 1912 +f 443 455 449 +f 449 433 443 +f 458 497 455 +f 455 443 458 +f 515 527 497 +f 497 458 515 +f 580 609 527 +f 527 515 580 +f 730 762 609 +f 609 580 730 +f 880 900 762 +f 762 730 880 +f 1024 1038 900 +f 900 880 1024 +f 1173 1185 1038 +f 1038 1024 1173 +f 1356 1370 1185 +f 1185 1173 1356 +f 1797 1912 1370 +f 1370 1356 1797 +f 421 443 433 +f 433 413 421 +f 451 458 443 +f 443 421 451 +f 507 515 458 +f 458 451 507 +f 564 580 515 +f 515 507 564 +f 708 730 580 +f 580 564 708 +f 860 880 730 +f 730 708 860 +f 1008 1024 880 +f 880 860 1008 +f 1171 1173 1024 +f 1024 1008 1171 +f 1346 1356 1173 +f 1173 1171 1346 +f 1911 1797 1356 +f 1356 1346 1911 +f 411 421 413 +f 413 399 411 +f 441 451 421 +f 421 411 441 +f 495 507 451 +f 451 441 495 +f 548 564 507 +f 507 495 548 +f 682 708 564 +f 564 548 682 +f 848 860 708 +f 708 682 848 +f 996 1008 860 +f 860 848 996 +f 1165 1171 1008 +f 1008 996 1165 +f 1336 1346 1171 +f 1171 1165 1336 +f 1709 1911 1346 +f 1346 1336 1709 +f 401 411 399 +f 399 382 401 +f 435 441 411 +f 411 401 435 +f 489 495 441 +f 441 435 489 +f 539 548 495 +f 495 489 539 +f 668 682 548 +f 548 539 668 +f 842 848 682 +f 682 668 842 +f 987 996 848 +f 848 842 987 +f 1161 1165 996 +f 996 987 1161 +f 1328 1336 1165 +f 1165 1161 1328 +f 1708 1709 1336 +f 1336 1328 1708 +f 397 401 382 +f 382 376 397 +f 431 435 401 +f 401 397 431 +f 487 489 435 +f 435 431 487 +f 537 539 489 +f 489 487 537 +f 662 668 539 +f 539 537 662 +f 840 842 668 +f 668 662 840 +f 981 987 842 +f 842 840 981 +f 1159 1161 987 +f 987 981 1159 +f 1326 1328 1161 +f 1161 1159 1326 +f 1787 1708 1328 +f 1328 1326 1787 +f 2209 2194 1818 +f 1818 1808 2209 +f 2403 2391 2194 +f 2194 2209 2403 +f 2530 2518 2391 +f 2391 2403 2530 +f 2646 2614 2518 +f 2518 2530 2646 +f 2732 2712 2614 +f 2614 2646 2732 +f 2842 2806 2712 +f 2712 2732 2842 +f 2944 2890 2806 +f 2806 2842 2944 +f 3019 2974 2890 +f 2890 2944 3019 +f 3041 3009 2974 +f 2974 3019 3041 +f 3049 3025 3009 +f 3009 3041 3049 +f 2223 2209 1808 +f 1808 1805 2223 +f 2411 2403 2209 +f 2209 2223 2411 +f 2540 2530 2403 +f 2403 2411 2540 +f 2660 2646 2530 +f 2530 2540 2660 +f 2774 2732 2646 +f 2646 2660 2774 +f 2884 2842 2732 +f 2732 2774 2884 +f 2995 2944 2842 +f 2842 2884 2995 +f 3045 3019 2944 +f 2944 2995 3045 +f 3073 3041 3019 +f 3019 3045 3073 +f 3079 3049 3041 +f 3041 3073 3079 +f 2237 2223 1805 +f 1805 1803 2237 +f 2421 2411 2223 +f 2223 2237 2421 +f 2553 2540 2411 +f 2411 2421 2553 +f 2684 2660 2540 +f 2540 2553 2684 +f 2809 2774 2660 +f 2660 2684 2809 +f 2938 2884 2774 +f 2774 2809 2938 +f 3031 2995 2884 +f 2884 2938 3031 +f 3075 3045 2995 +f 2995 3031 3075 +f 3093 3073 3045 +f 3045 3075 3093 +f 3117 3079 3073 +f 3073 3093 3117 +f 2248 2237 1803 +f 1803 1801 2248 +f 2431 2421 2237 +f 2237 2248 2431 +f 2573 2553 2421 +f 2421 2431 2573 +f 2706 2684 2553 +f 2553 2573 2706 +f 2838 2809 2684 +f 2684 2706 2838 +f 2985 2938 2809 +f 2809 2838 2985 +f 3055 3031 2938 +f 2938 2985 3055 +f 3091 3075 3031 +f 3031 3055 3091 +f 3133 3093 3075 +f 3075 3091 3133 +f 3143 3117 3093 +f 3093 3133 3143 +f 2254 2248 1801 +f 1801 1799 2254 +f 2439 2431 2248 +f 2248 2254 2439 +f 2586 2573 2431 +f 2431 2439 2586 +f 2724 2706 2573 +f 2573 2586 2724 +f 2862 2838 2706 +f 2706 2724 2862 +f 3015 2985 2838 +f 2838 2862 3015 +f 3077 3055 2985 +f 2985 3015 3077 +f 3129 3091 3055 +f 3055 3077 3129 +f 3151 3133 3091 +f 3091 3129 3151 +f 3157 3143 3133 +f 3133 3151 3157 +f 2268 2254 1799 +f 1799 1796 2268 +f 2451 2439 2254 +f 2254 2268 2451 +f 2600 2586 2439 +f 2439 2451 2600 +f 2744 2724 2586 +f 2586 2600 2744 +f 2894 2862 2724 +f 2724 2744 2894 +f 3037 3015 2862 +f 2862 2894 3037 +f 3089 3077 3015 +f 3015 3037 3089 +f 3149 3129 3077 +f 3077 3089 3149 +f 3163 3151 3129 +f 3129 3149 3163 +f 3173 3157 3151 +f 3151 3163 3173 +f 2278 2268 1796 +f 1796 1793 2278 +f 2453 2451 2268 +f 2268 2278 2453 +f 2616 2600 2451 +f 2451 2453 2616 +f 2764 2744 2600 +f 2600 2616 2764 +f 2916 2894 2744 +f 2744 2764 2916 +f 3047 3037 2894 +f 2894 2916 3047 +f 3119 3089 3037 +f 3037 3047 3119 +f 3155 3149 3089 +f 3089 3119 3155 +f 3179 3163 3149 +f 3149 3155 3179 +f 3185 3173 3163 +f 3163 3179 3185 +f 2288 2278 1793 +f 1793 1791 2288 +f 2459 2453 2278 +f 2278 2288 2459 +f 2628 2616 2453 +f 2453 2459 2628 +f 2776 2764 2616 +f 2616 2628 2776 +f 2942 2916 2764 +f 2764 2776 2942 +f 3059 3047 2916 +f 2916 2942 3059 +f 3131 3119 3047 +f 3047 3059 3131 +f 3165 3155 3119 +f 3119 3131 3165 +f 3189 3179 3155 +f 3155 3165 3189 +f 3201 3185 3179 +f 3179 3189 3201 +f 2296 2288 1791 +f 1791 1789 2296 +f 2463 2459 2288 +f 2288 2296 2463 +f 2635 2628 2459 +f 2459 2463 2635 +f 2782 2776 2628 +f 2628 2635 2782 +f 2956 2942 2776 +f 2776 2782 2956 +f 3065 3059 2942 +f 2942 2956 3065 +f 3137 3131 3059 +f 3059 3065 3137 +f 3171 3165 3131 +f 3131 3137 3171 +f 3199 3189 3165 +f 3165 3171 3199 +f 3210 3201 3189 +f 3189 3199 3210 +f 2299 2296 1789 +f 1789 1786 2299 +f 2467 2463 2296 +f 2296 2299 2467 +f 2644 2635 2463 +f 2463 2467 2644 +f 2786 2782 2635 +f 2635 2644 2786 +f 2964 2956 2782 +f 2782 2786 2964 +f 3069 3065 2956 +f 2956 2964 3069 +f 3141 3137 3065 +f 3065 3069 3141 +f 3177 3171 3137 +f 3137 3141 3177 +f 3204 3199 3171 +f 3171 3177 3204 +f 3214 3210 3199 +f 3199 3204 3214 +f 3194 3202 3213 +f 3213 3207 3194 +f 3166 3175 3202 +f 3202 3194 3166 +f 3134 3139 3175 +f 3175 3166 3134 +f 3060 3067 3139 +f 3139 3134 3060 +f 2953 2962 3067 +f 3067 3060 2953 +f 2777 2784 2962 +f 2962 2953 2777 +f 2629 2643 2784 +f 2784 2777 2629 +f 2460 2465 2643 +f 2643 2629 2460 +f 2293 2298 2465 +f 2465 2460 2293 +f 1696 1785 2298 +f 2298 2293 1696 +f 3180 3194 3207 +f 3207 3190 3180 +f 3158 3166 3194 +f 3194 3180 3158 +f 3124 3134 3166 +f 3166 3158 3124 +f 3050 3060 3134 +f 3134 3124 3050 +f 2927 2953 3060 +f 3060 3050 2927 +f 2767 2777 2953 +f 2953 2927 2767 +f 2619 2629 2777 +f 2777 2767 2619 +f 2454 2460 2629 +f 2629 2619 2454 +f 2283 2293 2460 +f 2460 2454 2283 +f 1695 1696 2293 +f 2293 2283 1695 +f 3160 3180 3190 +f 3190 3168 3160 +f 3144 3158 3180 +f 3180 3160 3144 +f 3086 3124 3158 +f 3158 3144 3086 +f 3032 3050 3124 +f 3124 3086 3032 +f 2891 2927 3050 +f 3050 3032 2891 +f 2739 2767 2927 +f 2927 2891 2739 +f 2597 2619 2767 +f 2767 2739 2597 +f 2448 2454 2619 +f 2619 2597 2448 +f 2265 2283 2454 +f 2454 2448 2265 +f 1707 1695 2283 +f 2283 2265 1707 +f 3146 3160 3168 +f 3168 3152 3146 +f 3122 3144 3160 +f 3160 3146 3122 +f 3070 3086 3144 +f 3144 3122 3070 +f 2998 3032 3086 +f 3086 3070 2998 +f 2853 2891 3032 +f 3032 2998 2853 +f 2717 2739 2891 +f 2891 2853 2717 +f 2582 2597 2739 +f 2739 2717 2582 +f 2434 2448 2597 +f 2597 2582 2434 +f 2251 2265 2448 +f 2448 2434 2251 +f 1907 1707 2265 +f 2265 2251 1907 +f 3120 3146 3152 +f 3152 3126 3120 +f 3082 3122 3146 +f 3146 3120 3082 +f 3042 3070 3122 +f 3122 3082 3042 +f 2957 2998 3070 +f 3070 3042 2957 +f 2825 2853 2998 +f 2998 2957 2825 +f 2693 2717 2853 +f 2853 2825 2693 +f 2556 2582 2717 +f 2717 2693 2556 +f 2424 2434 2582 +f 2582 2556 2424 +f 2239 2251 2434 +f 2434 2424 2239 +f 1906 1907 2251 +f 2251 2239 1906 +f 3080 3120 3126 +f 3126 3084 3080 +f 3056 3082 3120 +f 3120 3080 3056 +f 3012 3042 3082 +f 3082 3056 3012 +f 2899 2957 3042 +f 3042 3012 2899 +f 2789 2825 2957 +f 2957 2899 2789 +f 2675 2693 2825 +f 2825 2789 2675 +f 2545 2556 2693 +f 2693 2675 2545 +f 2416 2424 2556 +f 2556 2545 2416 +f 2228 2239 2424 +f 2424 2416 2228 +f 1770 1906 2239 +f 2239 2228 1770 +f 3053 3080 3084 +f 3084 3062 3053 +f 3028 3056 3080 +f 3080 3053 3028 +f 2978 3012 3056 +f 3056 3028 2978 +f 2860 2899 3012 +f 3012 2978 2860 +f 2754 2789 2899 +f 2899 2860 2754 +f 2652 2675 2789 +f 2789 2754 2652 +f 2534 2545 2675 +f 2675 2652 2534 +f 2406 2416 2545 +f 2545 2534 2406 +f 2217 2228 2416 +f 2416 2406 2217 +f 1929 1770 2228 +f 2228 2217 1929 +f 3035 3053 3062 +f 3062 3039 3035 +f 2997 3028 3053 +f 3053 3035 2997 +f 2920 2978 3028 +f 3028 2997 2920 +f 2832 2860 2978 +f 2978 2920 2832 +f 2728 2754 2860 +f 2860 2832 2728 +f 2634 2652 2754 +f 2754 2728 2634 +f 2528 2534 2652 +f 2652 2634 2528 +f 2396 2406 2534 +f 2534 2528 2396 +f 2202 2217 2406 +f 2406 2396 2202 +f 1765 1929 2217 +f 2217 2202 1765 +f 3017 3035 3039 +f 3039 3027 3017 +f 2980 2997 3035 +f 3035 3017 2980 +f 2896 2920 2997 +f 2997 2980 2896 +f 2812 2832 2920 +f 2920 2896 2812 +f 2715 2728 2832 +f 2832 2812 2715 +f 2618 2634 2728 +f 2728 2715 2618 +f 2523 2528 2634 +f 2634 2618 2523 +f 2392 2396 2528 +f 2528 2523 2392 +f 2196 2202 2396 +f 2396 2392 2196 +f 1724 1765 2202 +f 2202 2196 1724 +f 3007 3017 3027 +f 3027 3023 3007 +f 2969 2980 3017 +f 3017 3007 2969 +f 2887 2896 2980 +f 2980 2969 2887 +f 2802 2812 2896 +f 2896 2887 2802 +f 2709 2715 2812 +f 2812 2802 2709 +f 2609 2618 2715 +f 2715 2709 2609 +f 2519 2523 2618 +f 2618 2609 2519 +f 2386 2392 2523 +f 2523 2519 2386 +f 2190 2196 2392 +f 2392 2386 2190 +f 1759 1724 2196 +f 2196 2190 1759 +f 1329 1324 1785 +f 1785 1782 1329 +f 1162 1157 1324 +f 1324 1329 1162 +f 993 982 1157 +f 1157 1162 993 +f 845 838 982 +f 982 993 845 +f 669 660 838 +f 838 845 669 +f 542 535 660 +f 660 669 542 +f 490 485 535 +f 535 542 490 +f 438 429 485 +f 485 490 438 +f 404 396 429 +f 429 438 404 +f 387 376 396 +f 396 404 387 +f 1339 1329 1782 +f 1782 1780 1339 +f 1168 1162 1329 +f 1329 1339 1168 +f 1003 993 1162 +f 1162 1168 1003 +f 855 845 993 +f 993 1003 855 +f 695 669 845 +f 845 855 695 +f 559 542 669 +f 669 695 559 +f 500 490 542 +f 542 559 500 +f 446 438 490 +f 490 500 446 +f 416 404 438 +f 438 446 416 +f 408 387 404 +f 404 416 408 +f 1357 1339 1780 +f 1780 1778 1357 +f 1174 1168 1339 +f 1339 1357 1174 +f 1025 1003 1168 +f 1168 1174 1025 +f 883 855 1003 +f 1003 1025 883 +f 731 695 855 +f 855 883 731 +f 583 559 695 +f 695 731 583 +f 516 500 559 +f 559 583 516 +f 467 446 500 +f 500 516 467 +f 444 416 446 +f 446 467 444 +f 436 408 416 +f 416 444 436 +f 1371 1357 1778 +f 1778 1776 1371 +f 1188 1174 1357 +f 1357 1371 1188 +f 1042 1025 1174 +f 1174 1188 1042 +f 905 883 1025 +f 1025 1042 905 +f 769 731 883 +f 883 905 769 +f 624 583 731 +f 731 769 624 +f 532 516 583 +f 583 624 532 +f 502 467 516 +f 516 532 502 +f 459 444 467 +f 467 502 459 +f 452 436 444 +f 444 459 452 +f 1383 1371 1776 +f 1776 1774 1383 +f 1198 1188 1371 +f 1371 1383 1198 +f 1068 1042 1188 +f 1188 1198 1068 +f 929 905 1042 +f 1042 1068 929 +f 797 769 905 +f 905 929 797 +f 665 624 769 +f 769 797 665 +f 569 532 624 +f 624 665 569 +f 520 502 532 +f 532 569 520 +f 504 459 502 +f 502 520 504 +f 498 452 459 +f 459 504 498 +f 1394 1383 1774 +f 1774 1771 1394 +f 1206 1198 1383 +f 1383 1394 1206 +f 1077 1068 1198 +f 1198 1206 1077 +f 947 929 1068 +f 1068 1077 947 +f 833 797 929 +f 929 947 833 +f 723 665 797 +f 797 833 723 +f 610 569 665 +f 665 723 610 +f 549 520 569 +f 569 610 549 +f 522 504 520 +f 520 549 522 +f 518 498 504 +f 504 522 518 +f 1407 1394 1771 +f 1771 1768 1407 +f 1216 1206 1394 +f 1394 1407 1216 +f 1090 1077 1206 +f 1206 1216 1090 +f 972 947 1077 +f 1077 1090 972 +f 870 833 947 +f 947 972 870 +f 764 723 833 +f 833 870 764 +f 646 610 723 +f 723 764 646 +f 587 549 610 +f 610 646 587 +f 556 522 549 +f 549 587 556 +f 540 518 522 +f 522 556 540 +f 1420 1407 1768 +f 1768 1764 1420 +f 1226 1216 1407 +f 1407 1420 1226 +f 1096 1090 1216 +f 1216 1226 1096 +f 990 972 1090 +f 1090 1096 990 +f 896 870 972 +f 972 990 896 +f 792 764 870 +f 870 896 792 +f 704 646 764 +f 764 792 704 +f 627 587 646 +f 646 704 627 +f 582 556 587 +f 587 627 582 +f 574 540 556 +f 556 582 574 +f 1426 1420 1764 +f 1764 1762 1426 +f 1230 1226 1420 +f 1420 1426 1230 +f 1101 1096 1226 +f 1226 1230 1101 +f 1006 990 1096 +f 1096 1101 1006 +f 907 896 990 +f 990 1006 907 +f 812 792 896 +f 896 907 812 +f 728 704 792 +f 792 812 728 +f 644 627 704 +f 704 728 644 +f 607 582 627 +f 627 644 607 +f 592 574 582 +f 582 607 592 +f 1430 1426 1762 +f 1762 1758 1430 +f 1234 1230 1426 +f 1426 1430 1234 +f 1107 1101 1230 +f 1230 1234 1107 +f 1012 1006 1101 +f 1101 1107 1012 +f 912 907 1006 +f 1006 1012 912 +f 819 812 907 +f 907 912 819 +f 738 728 812 +f 812 819 738 +f 651 644 728 +f 728 738 651 +f 618 607 644 +f 644 651 618 +f 601 592 607 +f 607 618 601 +f 405 397 376 +f 376 388 405 +f 439 430 397 +f 397 405 439 +f 491 486 430 +f 430 439 491 +f 543 536 486 +f 486 491 543 +f 670 661 536 +f 536 543 670 +f 846 839 661 +f 661 670 846 +f 994 980 839 +f 839 846 994 +f 1163 1158 980 +f 980 994 1163 +f 1330 1325 1158 +f 1158 1163 1330 +f 1926 1786 1325 +f 1325 1330 1926 +f 417 405 388 +f 388 409 417 +f 447 439 405 +f 405 417 447 +f 501 491 439 +f 439 447 501 +f 560 543 491 +f 491 501 560 +f 696 670 543 +f 543 560 696 +f 856 846 670 +f 670 696 856 +f 1004 994 846 +f 846 856 1004 +f 1169 1163 994 +f 994 1004 1169 +f 1340 1330 1163 +f 1163 1169 1340 +f 1925 1926 1330 +f 1330 1340 1925 +f 445 417 409 +f 409 437 445 +f 468 447 417 +f 417 445 468 +f 517 501 447 +f 447 468 517 +f 584 560 501 +f 501 517 584 +f 732 696 560 +f 560 584 732 +f 884 856 696 +f 696 732 884 +f 1026 1004 856 +f 856 884 1026 +f 1175 1169 1004 +f 1004 1026 1175 +f 1358 1340 1169 +f 1169 1175 1358 +f 1908 1925 1340 +f 1340 1358 1908 +f 460 445 437 +f 437 453 460 +f 503 468 445 +f 445 460 503 +f 533 517 468 +f 468 503 533 +f 625 584 517 +f 517 533 625 +f 770 732 584 +f 584 625 770 +f 906 884 732 +f 732 770 906 +f 1041 1026 884 +f 884 906 1041 +f 1189 1175 1026 +f 1026 1041 1189 +f 1372 1358 1175 +f 1175 1189 1372 +f 1706 1908 1358 +f 1358 1372 1706 +f 505 460 453 +f 453 499 505 +f 521 503 460 +f 460 505 521 +f 570 533 503 +f 503 521 570 +f 666 625 533 +f 533 570 666 +f 798 770 625 +f 625 666 798 +f 930 906 770 +f 770 798 930 +f 1067 1041 906 +f 906 930 1067 +f 1199 1189 1041 +f 1041 1067 1199 +f 1384 1372 1189 +f 1189 1199 1384 +f 1705 1706 1372 +f 1372 1384 1705 +f 523 505 499 +f 499 519 523 +f 550 521 505 +f 505 523 550 +f 611 570 521 +f 521 550 611 +f 724 666 570 +f 570 611 724 +f 834 798 666 +f 666 724 834 +f 948 930 798 +f 798 834 948 +f 1078 1067 930 +f 930 948 1078 +f 1207 1199 1067 +f 1067 1078 1207 +f 1395 1384 1199 +f 1199 1207 1395 +f 1773 1705 1384 +f 1384 1395 1773 +f 555 523 519 +f 519 541 555 +f 588 550 523 +f 523 555 588 +f 645 611 550 +f 550 588 645 +f 763 724 611 +f 611 645 763 +f 869 834 724 +f 724 763 869 +f 971 948 834 +f 834 869 971 +f 1089 1078 948 +f 948 971 1089 +f 1217 1207 1078 +f 1078 1089 1217 +f 1406 1395 1207 +f 1207 1217 1406 +f 1692 1773 1395 +f 1395 1406 1692 +f 581 555 541 +f 541 573 581 +f 626 588 555 +f 555 581 626 +f 703 645 588 +f 588 626 703 +f 791 763 645 +f 645 703 791 +f 895 869 763 +f 763 791 895 +f 989 971 869 +f 869 895 989 +f 1095 1089 971 +f 971 989 1095 +f 1227 1217 1089 +f 1089 1095 1227 +f 1421 1406 1217 +f 1217 1227 1421 +f 1766 1692 1406 +f 1406 1421 1766 +f 606 581 573 +f 573 591 606 +f 643 626 581 +f 581 606 643 +f 727 703 626 +f 626 643 727 +f 811 791 703 +f 703 727 811 +f 908 895 791 +f 791 811 908 +f 1005 989 895 +f 895 908 1005 +f 1100 1095 989 +f 989 1005 1100 +f 1231 1227 1095 +f 1095 1100 1231 +f 1427 1421 1227 +f 1227 1231 1427 +f 1897 1766 1421 +f 1421 1427 1897 +f 615 606 591 +f 591 598 615 +f 653 643 606 +f 606 615 653 +f 735 727 643 +f 643 653 735 +f 820 811 727 +f 727 735 820 +f 913 908 811 +f 811 820 913 +f 1013 1005 908 +f 908 913 1013 +f 1103 1100 1005 +f 1005 1013 1103 +f 1236 1231 1100 +f 1100 1103 1236 +f 1432 1427 1231 +f 1231 1236 1432 +f 1760 1897 1427 +f 1427 1432 1760 +f 2294 2299 1786 +f 1786 1783 2294 +f 2461 2466 2299 +f 2299 2294 2461 +f 2630 2641 2466 +f 2466 2461 2630 +f 2778 2785 2641 +f 2641 2630 2778 +f 2954 2963 2785 +f 2785 2778 2954 +f 3061 3068 2963 +f 2963 2954 3061 +f 3135 3140 3068 +f 3068 3061 3135 +f 3167 3176 3140 +f 3140 3135 3167 +f 3195 3203 3176 +f 3176 3167 3195 +f 3208 3213 3203 +f 3203 3195 3208 +f 2284 2294 1783 +f 1783 1781 2284 +f 2455 2461 2294 +f 2294 2284 2455 +f 2620 2630 2461 +f 2461 2455 2620 +f 2768 2778 2630 +f 2630 2620 2768 +f 2928 2954 2778 +f 2778 2768 2928 +f 3051 3061 2954 +f 2954 2928 3051 +f 3125 3135 3061 +f 3061 3051 3125 +f 3159 3167 3135 +f 3135 3125 3159 +f 3181 3195 3167 +f 3167 3159 3181 +f 3191 3208 3195 +f 3195 3181 3191 +f 2266 2284 1781 +f 1781 1779 2266 +f 2449 2455 2284 +f 2284 2266 2449 +f 2598 2620 2455 +f 2455 2449 2598 +f 2740 2768 2620 +f 2620 2598 2740 +f 2892 2928 2768 +f 2768 2740 2892 +f 3033 3051 2928 +f 2928 2892 3033 +f 3087 3125 3051 +f 3051 3033 3087 +f 3145 3159 3125 +f 3125 3087 3145 +f 3161 3181 3159 +f 3159 3145 3161 +f 3169 3191 3181 +f 3181 3161 3169 +f 2252 2266 1779 +f 1779 1777 2252 +f 2435 2449 2266 +f 2266 2252 2435 +f 2581 2598 2449 +f 2449 2435 2581 +f 2718 2740 2598 +f 2598 2581 2718 +f 2854 2892 2740 +f 2740 2718 2854 +f 2999 3033 2892 +f 2892 2854 2999 +f 3071 3087 3033 +f 3033 2999 3071 +f 3123 3145 3087 +f 3087 3071 3123 +f 3147 3161 3145 +f 3145 3123 3147 +f 3153 3169 3161 +f 3161 3147 3153 +f 2240 2252 1777 +f 1777 1775 2240 +f 2425 2435 2252 +f 2252 2240 2425 +f 2555 2581 2435 +f 2435 2425 2555 +f 2694 2718 2581 +f 2581 2555 2694 +f 2826 2854 2718 +f 2718 2694 2826 +f 2958 2999 2854 +f 2854 2826 2958 +f 3043 3071 2999 +f 2999 2958 3043 +f 3083 3123 3071 +f 3071 3043 3083 +f 3121 3147 3123 +f 3123 3083 3121 +f 3127 3153 3147 +f 3147 3121 3127 +f 2229 2240 1775 +f 1775 1772 2229 +f 2417 2425 2240 +f 2240 2229 2417 +f 2546 2555 2425 +f 2425 2417 2546 +f 2676 2694 2555 +f 2555 2546 2676 +f 2790 2826 2694 +f 2694 2676 2790 +f 2900 2958 2826 +f 2826 2790 2900 +f 3013 3043 2958 +f 2958 2900 3013 +f 3057 3083 3043 +f 3043 3013 3057 +f 3081 3121 3083 +f 3083 3057 3081 +f 3085 3127 3121 +f 3121 3081 3085 +f 2216 2229 1772 +f 1772 1769 2216 +f 2407 2417 2229 +f 2229 2216 2407 +f 2533 2546 2417 +f 2417 2407 2533 +f 2651 2676 2546 +f 2546 2533 2651 +f 2753 2790 2676 +f 2676 2651 2753 +f 2859 2900 2790 +f 2790 2753 2859 +f 2977 3013 2900 +f 2900 2859 2977 +f 3029 3057 3013 +f 3013 2977 3029 +f 3052 3081 3057 +f 3057 3029 3052 +f 3063 3085 3081 +f 3081 3052 3063 +f 2203 2216 1769 +f 1769 1767 2203 +f 2397 2407 2216 +f 2216 2203 2397 +f 2527 2533 2407 +f 2407 2397 2527 +f 2633 2651 2533 +f 2533 2527 2633 +f 2727 2753 2651 +f 2651 2633 2727 +f 2831 2859 2753 +f 2753 2727 2831 +f 2919 2977 2859 +f 2859 2831 2919 +f 2996 3029 2977 +f 2977 2919 2996 +f 3034 3052 3029 +f 3029 2996 3034 +f 3038 3063 3052 +f 3052 3034 3038 +f 2197 2203 1767 +f 1767 1763 2197 +f 2393 2397 2203 +f 2203 2197 2393 +f 2522 2527 2397 +f 2397 2393 2522 +f 2617 2633 2527 +f 2527 2522 2617 +f 2716 2727 2633 +f 2633 2617 2716 +f 2811 2831 2727 +f 2727 2716 2811 +f 2895 2919 2831 +f 2831 2811 2895 +f 2979 2996 2919 +f 2919 2895 2979 +f 3016 3034 2996 +f 2996 2979 3016 +f 3026 3038 3034 +f 3034 3016 3026 +f 2193 2197 1763 +f 1763 1761 2193 +f 2389 2393 2197 +f 2197 2193 2389 +f 2516 2522 2393 +f 2393 2389 2516 +f 2610 2617 2522 +f 2522 2516 2610 +f 2710 2716 2617 +f 2617 2610 2710 +f 2803 2811 2716 +f 2716 2710 2803 +f 2885 2895 2811 +f 2811 2803 2885 +f 2971 2979 2895 +f 2895 2885 2971 +f 3005 3016 2979 +f 2979 2971 3005 +f 3022 3026 3016 +f 3016 3005 3022 +f 461 545 544 +f 544 456 461 +f 463 551 545 +f 545 461 463 +f 465 557 551 +f 551 463 465 +f 469 567 557 +f 557 465 469 +f 471 575 567 +f 567 469 471 +f 473 577 575 +f 575 471 473 +f 475 589 577 +f 577 473 475 +f 477 593 589 +f 589 475 477 +f 479 595 593 +f 593 477 479 +f 481 599 595 +f 595 479 481 +f 389 461 456 +f 456 392 389 +f 386 463 461 +f 461 389 386 +f 379 465 463 +f 463 386 379 +f 373 469 465 +f 465 379 373 +f 371 471 469 +f 469 373 371 +f 369 473 471 +f 471 371 369 +f 366 475 473 +f 473 369 366 +f 364 477 475 +f 475 366 364 +f 362 479 477 +f 477 364 362 +f 361 481 479 +f 479 362 361 +f 335 389 392 +f 392 337 335 +f 333 386 389 +f 389 335 333 +f 331 379 386 +f 386 333 331 +f 329 373 379 +f 379 331 329 +f 328 371 373 +f 373 329 328 +f 325 369 371 +f 371 328 325 +f 323 366 369 +f 369 325 323 +f 321 364 366 +f 366 323 321 +f 319 362 364 +f 364 321 319 +f 316 361 362 +f 362 319 316 +f 298 335 337 +f 337 302 298 +f 290 333 335 +f 335 298 290 +f 288 331 333 +f 333 290 288 +f 286 329 331 +f 331 288 286 +f 281 328 329 +f 329 286 281 +f 275 325 328 +f 328 281 275 +f 265 323 325 +f 325 275 265 +f 259 321 323 +f 323 265 259 +f 255 319 321 +f 321 259 255 +f 249 316 319 +f 319 255 249 +f 269 298 302 +f 302 271 269 +f 261 290 298 +f 298 269 261 +f 251 288 290 +f 290 261 251 +f 238 286 288 +f 288 251 238 +f 230 281 286 +f 286 238 230 +f 218 275 281 +f 281 230 218 +f 208 265 275 +f 275 218 208 +f 196 259 265 +f 265 208 196 +f 186 255 259 +f 259 196 186 +f 181 249 255 +f 255 186 181 +f 228 269 271 +f 271 234 228 +f 222 261 269 +f 269 228 222 +f 212 251 261 +f 261 222 212 +f 200 238 251 +f 251 212 200 +f 177 230 238 +f 238 200 177 +f 160 218 230 +f 230 177 160 +f 134 208 218 +f 218 160 134 +f 112 196 208 +f 208 134 112 +f 102 186 196 +f 196 112 102 +f 96 181 186 +f 186 102 96 +f 198 228 234 +f 234 205 198 +f 182 222 228 +f 228 198 182 +f 168 212 222 +f 222 182 168 +f 146 200 212 +f 212 168 146 +f 118 177 200 +f 200 146 118 +f 92 160 177 +f 177 118 92 +f 74 134 160 +f 160 92 74 +f 63 112 134 +f 134 74 63 +f 53 102 112 +f 112 63 53 +f 50 96 102 +f 102 53 50 +f 167 198 205 +f 205 170 167 +f 154 182 198 +f 198 167 154 +f 126 168 182 +f 182 154 126 +f 100 146 168 +f 168 126 100 +f 83 118 146 +f 146 100 83 +f 61 92 118 +f 118 83 61 +f 46 74 92 +f 92 61 46 +f 32 63 74 +f 74 46 32 +f 25 53 63 +f 63 32 25 +f 21 50 53 +f 53 25 21 +f 143 167 170 +f 170 150 143 +f 124 154 167 +f 167 143 124 +f 104 126 154 +f 154 124 104 +f 84 100 126 +f 126 104 84 +f 65 83 100 +f 100 84 65 +f 44 61 83 +f 83 65 44 +f 30 46 61 +f 61 44 30 +f 17 32 46 +f 46 30 17 +f 9 25 32 +f 32 17 9 +f 5 21 25 +f 25 9 5 +f 132 143 150 +f 150 140 132 +f 116 124 143 +f 143 132 116 +f 94 104 124 +f 124 116 94 +f 76 84 104 +f 104 94 76 +f 55 65 84 +f 84 76 55 +f 40 44 65 +f 65 55 40 +f 22 30 44 +f 44 40 22 +f 11 17 30 +f 30 22 11 +f 2 9 17 +f 17 11 2 +f 1 5 9 +f 9 2 1 +f 480 596 599 +f 599 481 480 +f 478 594 596 +f 596 480 478 +f 476 590 594 +f 594 478 476 +f 474 578 590 +f 590 476 474 +f 472 576 578 +f 578 474 472 +f 470 568 576 +f 576 472 470 +f 466 558 568 +f 568 470 466 +f 464 552 558 +f 558 466 464 +f 462 546 552 +f 552 464 462 +f 456 544 546 +f 546 462 456 +f 363 480 481 +f 481 360 363 +f 365 478 480 +f 480 363 365 +f 367 476 478 +f 478 365 367 +f 368 474 476 +f 476 367 368 +f 370 472 474 +f 474 368 370 +f 372 470 472 +f 472 370 372 +f 380 466 470 +f 470 372 380 +f 385 464 466 +f 466 380 385 +f 390 462 464 +f 464 385 390 +f 391 456 462 +f 462 390 391 +f 320 363 360 +f 360 316 320 +f 322 365 363 +f 363 320 322 +f 324 367 365 +f 365 322 324 +f 326 368 367 +f 367 324 326 +f 327 370 368 +f 368 326 327 +f 330 372 370 +f 370 327 330 +f 332 380 372 +f 372 330 332 +f 334 385 380 +f 380 332 334 +f 336 390 385 +f 385 334 336 +f 337 391 390 +f 390 336 337 +f 256 320 316 +f 316 250 256 +f 260 322 320 +f 320 256 260 +f 266 324 322 +f 322 260 266 +f 276 326 324 +f 324 266 276 +f 282 327 326 +f 326 276 282 +f 287 330 327 +f 327 282 287 +f 289 332 330 +f 330 287 289 +f 291 334 332 +f 332 289 291 +f 299 336 334 +f 334 291 299 +f 303 337 336 +f 336 299 303 +f 187 256 250 +f 250 181 187 +f 197 260 256 +f 256 187 197 +f 209 266 260 +f 260 197 209 +f 219 276 266 +f 266 209 219 +f 231 282 276 +f 276 219 231 +f 239 287 282 +f 282 231 239 +f 252 289 287 +f 287 239 252 +f 262 291 289 +f 289 252 262 +f 270 299 291 +f 291 262 270 +f 272 303 299 +f 299 270 272 +f 103 187 181 +f 181 97 103 +f 113 197 187 +f 187 103 113 +f 135 209 197 +f 197 113 135 +f 161 219 209 +f 209 135 161 +f 178 231 219 +f 219 161 178 +f 201 239 231 +f 231 178 201 +f 213 252 239 +f 239 201 213 +f 223 262 252 +f 252 213 223 +f 229 270 262 +f 262 223 229 +f 235 272 270 +f 270 229 235 +f 54 103 97 +f 97 50 54 +f 64 113 103 +f 103 54 64 +f 75 135 113 +f 113 64 75 +f 93 161 135 +f 135 75 93 +f 119 178 161 +f 161 93 119 +f 147 201 178 +f 178 119 147 +f 169 213 201 +f 201 147 169 +f 183 223 213 +f 213 169 183 +f 199 229 223 +f 223 183 199 +f 205 235 229 +f 229 199 205 +f 24 54 50 +f 50 21 24 +f 33 64 54 +f 54 24 33 +f 47 75 64 +f 64 33 47 +f 62 93 75 +f 75 47 62 +f 82 119 93 +f 93 62 82 +f 101 147 119 +f 119 82 101 +f 127 169 147 +f 147 101 127 +f 155 183 169 +f 169 127 155 +f 166 199 183 +f 183 155 166 +f 171 205 199 +f 199 166 171 +f 10 24 21 +f 21 6 10 +f 18 33 24 +f 24 10 18 +f 31 47 33 +f 33 18 31 +f 45 62 47 +f 47 31 45 +f 66 82 62 +f 62 45 66 +f 85 101 82 +f 82 66 85 +f 105 127 101 +f 101 85 105 +f 125 155 127 +f 127 105 125 +f 144 166 155 +f 155 125 144 +f 151 171 166 +f 166 144 151 +f 3 10 6 +f 6 1 3 +f 12 18 10 +f 10 3 12 +f 23 31 18 +f 18 12 23 +f 41 45 31 +f 31 23 41 +f 56 66 45 +f 45 41 56 +f 77 85 66 +f 66 56 77 +f 95 105 85 +f 85 77 95 +f 117 125 105 +f 105 95 117 +f 133 144 125 +f 125 117 133 +f 140 151 144 +f 144 133 140 +f 138 132 140 +f 140 145 138 +f 122 116 132 +f 132 138 122 +f 98 94 116 +f 116 122 98 +f 80 76 94 +f 94 98 80 +f 60 55 76 +f 76 80 60 +f 42 40 55 +f 55 60 42 +f 28 22 40 +f 40 42 28 +f 13 11 22 +f 22 28 13 +f 7 2 11 +f 11 13 7 +f 4 1 2 +f 2 7 4 +f 152 138 145 +f 145 158 152 +f 136 122 138 +f 138 152 136 +f 108 98 122 +f 122 136 108 +f 89 80 98 +f 98 108 89 +f 70 60 80 +f 80 89 70 +f 52 42 60 +f 60 70 52 +f 38 28 42 +f 42 52 38 +f 26 13 28 +f 28 38 26 +f 19 7 13 +f 13 26 19 +f 15 4 7 +f 7 19 15 +f 173 152 158 +f 158 176 173 +f 162 136 152 +f 152 173 162 +f 142 108 136 +f 136 162 142 +f 111 89 108 +f 108 142 111 +f 91 70 89 +f 89 111 91 +f 73 52 70 +f 70 91 73 +f 58 38 52 +f 52 73 58 +f 48 26 38 +f 38 58 48 +f 37 19 26 +f 26 48 37 +f 35 15 19 +f 19 37 35 +f 194 173 176 +f 176 202 194 +f 184 162 173 +f 173 194 184 +f 174 142 162 +f 162 184 174 +f 156 111 142 +f 142 174 156 +f 128 91 111 +f 111 156 128 +f 106 73 91 +f 91 128 106 +f 86 58 73 +f 73 106 86 +f 78 48 58 +f 58 86 78 +f 68 37 48 +f 48 78 68 +f 67 35 37 +f 37 68 67 +f 221 194 202 +f 202 225 221 +f 216 184 194 +f 194 221 216 +f 206 174 184 +f 184 216 206 +f 192 156 174 +f 174 206 192 +f 180 128 156 +f 156 192 180 +f 164 106 128 +f 128 180 164 +f 148 86 106 +f 106 164 148 +f 130 78 86 +f 86 148 130 +f 121 68 78 +f 78 130 121 +f 115 67 68 +f 68 121 115 +f 244 221 225 +f 225 247 244 +f 240 216 221 +f 221 244 240 +f 236 206 216 +f 216 240 236 +f 233 192 206 +f 206 236 233 +f 227 180 192 +f 192 233 227 +f 215 164 180 +f 180 227 215 +f 210 148 164 +f 164 215 210 +f 203 130 148 +f 148 210 203 +f 191 121 130 +f 130 203 191 +f 188 115 121 +f 121 191 188 +f 284 244 247 +f 247 285 284 +f 279 240 244 +f 244 284 279 +f 277 236 240 +f 240 279 277 +f 273 233 236 +f 236 277 273 +f 267 227 233 +f 233 273 267 +f 263 215 227 +f 227 267 263 +f 258 210 215 +f 215 263 258 +f 253 203 210 +f 210 258 253 +f 245 191 203 +f 203 253 245 +f 242 188 191 +f 191 245 242 +f 315 284 285 +f 285 318 315 +f 312 279 284 +f 284 315 312 +f 311 277 279 +f 279 312 311 +f 309 273 277 +f 277 311 309 +f 307 267 273 +f 273 309 307 +f 305 263 267 +f 267 307 305 +f 301 258 263 +f 263 305 301 +f 297 253 258 +f 258 301 297 +f 295 245 253 +f 253 297 295 +f 293 242 245 +f 245 295 293 +f 341 315 318 +f 318 339 341 +f 343 312 315 +f 315 341 343 +f 345 311 312 +f 312 343 345 +f 347 309 311 +f 311 345 347 +f 349 307 309 +f 309 347 349 +f 351 305 307 +f 307 349 351 +f 353 301 305 +f 305 351 353 +f 355 297 301 +f 301 353 355 +f 357 295 297 +f 297 355 357 +f 359 293 295 +f 295 357 359 +f 378 341 339 +f 339 376 378 +f 384 343 341 +f 341 378 384 +f 394 345 343 +f 343 384 394 +f 403 347 345 +f 345 394 403 +f 406 349 347 +f 347 403 406 +f 415 351 349 +f 349 406 415 +f 419 353 351 +f 351 415 419 +f 423 355 353 +f 353 419 423 +f 425 357 355 +f 355 423 425 +f 427 359 357 +f 357 425 427 +f 8 3 1 +f 1 4 8 +f 14 12 3 +f 3 8 14 +f 29 23 12 +f 12 14 29 +f 43 41 23 +f 23 29 43 +f 59 56 41 +f 41 43 59 +f 81 77 56 +f 56 59 81 +f 99 95 77 +f 77 81 99 +f 123 117 95 +f 95 99 123 +f 139 133 117 +f 117 123 139 +f 145 140 133 +f 133 139 145 +f 20 8 4 +f 4 16 20 +f 27 14 8 +f 8 20 27 +f 39 29 14 +f 14 27 39 +f 51 43 29 +f 29 39 51 +f 71 59 43 +f 43 51 71 +f 88 81 59 +f 59 71 88 +f 109 99 81 +f 81 88 109 +f 137 123 99 +f 99 109 137 +f 153 139 123 +f 123 137 153 +f 159 145 139 +f 139 153 159 +f 36 20 16 +f 16 34 36 +f 49 27 20 +f 20 36 49 +f 57 39 27 +f 27 49 57 +f 72 51 39 +f 39 57 72 +f 90 71 51 +f 51 72 90 +f 110 88 71 +f 71 90 110 +f 141 109 88 +f 88 110 141 +f 163 137 109 +f 109 141 163 +f 172 153 137 +f 137 163 172 +f 176 159 153 +f 153 172 176 +f 69 36 34 +f 34 67 69 +f 79 49 36 +f 36 69 79 +f 87 57 49 +f 49 79 87 +f 107 72 57 +f 57 87 107 +f 129 90 72 +f 72 107 129 +f 157 110 90 +f 90 129 157 +f 175 141 110 +f 110 157 175 +f 185 163 141 +f 141 175 185 +f 195 172 163 +f 163 185 195 +f 202 176 172 +f 172 195 202 +f 120 69 67 +f 67 114 120 +f 131 79 69 +f 69 120 131 +f 149 87 79 +f 79 131 149 +f 165 107 87 +f 87 149 165 +f 179 129 107 +f 107 165 179 +f 193 157 129 +f 129 179 193 +f 207 175 157 +f 157 193 207 +f 217 185 175 +f 175 207 217 +f 220 195 185 +f 185 217 220 +f 224 202 195 +f 195 220 224 +f 190 120 114 +f 114 189 190 +f 204 131 120 +f 120 190 204 +f 211 149 131 +f 131 204 211 +f 214 165 149 +f 149 211 214 +f 226 179 165 +f 165 214 226 +f 232 193 179 +f 179 226 232 +f 237 207 193 +f 193 232 237 +f 241 217 207 +f 207 237 241 +f 243 220 217 +f 217 241 243 +f 248 224 220 +f 220 243 248 +f 246 190 189 +f 189 242 246 +f 254 204 190 +f 190 246 254 +f 257 211 204 +f 204 254 257 +f 264 214 211 +f 211 257 264 +f 268 226 214 +f 214 264 268 +f 274 232 226 +f 226 268 274 +f 278 237 232 +f 232 274 278 +f 280 241 237 +f 237 278 280 +f 283 243 241 +f 241 280 283 +f 285 248 243 +f 243 283 285 +f 294 246 242 +f 242 292 294 +f 296 254 246 +f 246 294 296 +f 300 257 254 +f 254 296 300 +f 304 264 257 +f 257 300 304 +f 306 268 264 +f 264 304 306 +f 308 274 268 +f 268 306 308 +f 310 278 274 +f 274 308 310 +f 313 280 278 +f 278 310 313 +f 314 283 280 +f 280 313 314 +f 317 285 283 +f 283 314 317 +f 356 294 292 +f 292 358 356 +f 354 296 294 +f 294 356 354 +f 352 300 296 +f 296 354 352 +f 350 304 300 +f 300 352 350 +f 348 306 304 +f 304 350 348 +f 346 308 306 +f 306 348 346 +f 344 310 308 +f 308 346 344 +f 342 313 310 +f 310 344 342 +f 340 314 313 +f 313 342 340 +f 338 317 314 +f 314 340 338 +f 424 356 358 +f 358 426 424 +f 422 354 356 +f 356 424 422 +f 418 352 354 +f 354 422 418 +f 414 350 352 +f 352 418 414 +f 407 348 350 +f 350 414 407 +f 402 346 348 +f 348 407 402 +f 393 344 346 +f 346 402 393 +f 383 342 344 +f 344 393 383 +f 377 340 342 +f 342 383 377 +f 375 338 340 +f 340 377 375 +f 3186 3113 3115 +f 3115 3182 3186 +f 3192 3110 3113 +f 3113 3186 3192 +f 3196 3109 3110 +f 3110 3192 3196 +f 3205 3106 3109 +f 3109 3196 3205 +f 3211 3104 3106 +f 3106 3205 3211 +f 3215 3102 3104 +f 3104 3211 3215 +f 3217 3101 3102 +f 3102 3215 3217 +f 3220 3098 3101 +f 3101 3217 3220 +f 3222 3097 3098 +f 3098 3220 3222 +f 3223 3095 3097 +f 3097 3222 3223 +f 3227 3186 3182 +f 3182 3225 3227 +f 3229 3192 3186 +f 3186 3227 3229 +f 3231 3196 3192 +f 3192 3229 3231 +f 3233 3205 3196 +f 3196 3231 3233 +f 3235 3211 3205 +f 3205 3233 3235 +f 3241 3215 3211 +f 3211 3235 3241 +f 3245 3217 3215 +f 3215 3241 3245 +f 3249 3220 3217 +f 3217 3245 3249 +f 3251 3222 3220 +f 3220 3249 3251 +f 3253 3223 3222 +f 3222 3251 3253 +f 3239 3227 3225 +f 3225 3237 3239 +f 3243 3229 3227 +f 3227 3239 3243 +f 3247 3231 3229 +f 3229 3243 3247 +f 3257 3233 3231 +f 3231 3247 3257 +f 3263 3235 3233 +f 3233 3257 3263 +f 3271 3241 3235 +f 3235 3263 3271 +f 3279 3245 3241 +f 3241 3271 3279 +f 3285 3249 3245 +f 3245 3279 3285 +f 3293 3251 3249 +f 3249 3285 3293 +f 3297 3253 3251 +f 3251 3293 3297 +f 3259 3239 3237 +f 3237 3255 3259 +f 3261 3243 3239 +f 3239 3259 3261 +f 3265 3247 3243 +f 3243 3261 3265 +f 3275 3257 3247 +f 3247 3265 3275 +f 3287 3263 3257 +f 3257 3275 3287 +f 3303 3271 3263 +f 3263 3287 3303 +f 3314 3279 3271 +f 3271 3303 3314 +f 3320 3285 3279 +f 3279 3314 3320 +f 3330 3293 3285 +f 3285 3320 3330 +f 3332 3297 3293 +f 3293 3330 3332 +f 3270 3259 3255 +f 3255 3268 3270 +f 3273 3261 3259 +f 3259 3270 3273 +f 3283 3265 3261 +f 3261 3273 3283 +f 3299 3275 3265 +f 3265 3283 3299 +f 3308 3287 3275 +f 3275 3299 3308 +f 3322 3303 3287 +f 3287 3308 3322 +f 3338 3314 3303 +f 3303 3322 3338 +f 3346 3320 3314 +f 3314 3338 3346 +f 3351 3330 3320 +f 3320 3346 3351 +f 3355 3332 3330 +f 3330 3351 3355 +f 3282 3270 3268 +f 3268 3278 3282 +f 3290 3273 3270 +f 3270 3282 3290 +f 3302 3283 3273 +f 3273 3290 3302 +f 3312 3299 3283 +f 3283 3302 3312 +f 3324 3308 3299 +f 3299 3312 3324 +f 3340 3322 3308 +f 3308 3324 3340 +f 3353 3338 3322 +f 3322 3340 3353 +f 3368 3346 3338 +f 3338 3353 3368 +f 3373 3351 3346 +f 3346 3368 3373 +f 3379 3355 3351 +f 3351 3373 3379 +f 3295 3282 3278 +f 3278 3292 3295 +f 3306 3290 3282 +f 3282 3295 3306 +f 3316 3302 3290 +f 3290 3306 3316 +f 3326 3312 3302 +f 3302 3316 3326 +f 3345 3324 3312 +f 3312 3326 3345 +f 3359 3340 3324 +f 3324 3345 3359 +f 3376 3353 3340 +f 3340 3359 3376 +f 3394 3368 3353 +f 3353 3376 3394 +f 3404 3373 3368 +f 3368 3394 3404 +f 3406 3379 3373 +f 3373 3404 3406 +f 3310 3295 3292 +f 3292 3307 3310 +f 3318 3306 3295 +f 3295 3310 3318 +f 3336 3316 3306 +f 3306 3318 3336 +f 3348 3326 3316 +f 3316 3336 3348 +f 3369 3345 3326 +f 3326 3348 3369 +f 3389 3359 3345 +f 3345 3369 3389 +f 3425 3376 3359 +f 3359 3389 3425 +f 3449 3394 3376 +f 3376 3425 3449 +f 3468 3404 3394 +f 3394 3449 3468 +f 3472 3406 3404 +f 3404 3468 3472 +f 3335 3310 3307 +f 3307 3329 3335 +f 3343 3318 3310 +f 3310 3335 3343 +f 3362 3336 3318 +f 3318 3343 3362 +f 3386 3348 3336 +f 3336 3362 3386 +f 3422 3369 3348 +f 3348 3386 3422 +f 3464 3389 3369 +f 3369 3422 3464 +f 3490 3425 3389 +f 3389 3464 3490 +f 3505 3449 3425 +f 3425 3490 3505 +f 3521 3468 3449 +f 3449 3505 3521 +f 3523 3472 3468 +f 3468 3521 3523 +f 3364 3335 3329 +f 3329 3357 3364 +f 3382 3343 3335 +f 3335 3364 3382 +f 3416 3362 3343 +f 3343 3382 3416 +f 3465 3386 3362 +f 3362 3416 3465 +f 3495 3422 3386 +f 3386 3465 3495 +f 3528 3464 3422 +f 3422 3495 3528 +f 3553 3490 3464 +f 3464 3528 3553 +f 3579 3505 3490 +f 3490 3553 3579 +f 3592 3521 3505 +f 3505 3579 3592 +f 3604 3523 3521 +f 3521 3592 3604 +f 3221 3096 3094 +f 3094 3224 3221 +f 3219 3099 3096 +f 3096 3221 3219 +f 3218 3100 3099 +f 3099 3219 3218 +f 3216 3103 3100 +f 3100 3218 3216 +f 3212 3105 3103 +f 3103 3216 3212 +f 3206 3107 3105 +f 3105 3212 3206 +f 3197 3108 3107 +f 3107 3206 3197 +f 3193 3111 3108 +f 3108 3197 3193 +f 3187 3112 3111 +f 3111 3193 3187 +f 3183 3114 3112 +f 3112 3187 3183 +f 3252 3221 3224 +f 3224 3254 3252 +f 3250 3219 3221 +f 3221 3252 3250 +f 3246 3218 3219 +f 3219 3250 3246 +f 3242 3216 3218 +f 3218 3246 3242 +f 3236 3212 3216 +f 3216 3242 3236 +f 3234 3206 3212 +f 3212 3236 3234 +f 3232 3197 3206 +f 3206 3234 3232 +f 3230 3193 3197 +f 3197 3232 3230 +f 3228 3187 3193 +f 3193 3230 3228 +f 3226 3183 3187 +f 3187 3228 3226 +f 3294 3252 3254 +f 3254 3298 3294 +f 3286 3250 3252 +f 3252 3294 3286 +f 3280 3246 3250 +f 3250 3286 3280 +f 3272 3242 3246 +f 3246 3280 3272 +f 3264 3236 3242 +f 3242 3272 3264 +f 3258 3234 3236 +f 3236 3264 3258 +f 3248 3232 3234 +f 3234 3258 3248 +f 3244 3230 3232 +f 3232 3248 3244 +f 3240 3228 3230 +f 3230 3244 3240 +f 3238 3226 3228 +f 3228 3240 3238 +f 3331 3294 3298 +f 3298 3333 3331 +f 3321 3286 3294 +f 3294 3331 3321 +f 3315 3280 3286 +f 3286 3321 3315 +f 3304 3272 3280 +f 3280 3315 3304 +f 3288 3264 3272 +f 3272 3304 3288 +f 3276 3258 3264 +f 3264 3288 3276 +f 3266 3248 3258 +f 3258 3276 3266 +f 3262 3244 3248 +f 3248 3266 3262 +f 3260 3240 3244 +f 3244 3262 3260 +f 3256 3238 3240 +f 3240 3260 3256 +f 3350 3331 3333 +f 3333 3354 3350 +f 3347 3321 3331 +f 3331 3350 3347 +f 3339 3315 3321 +f 3321 3347 3339 +f 3323 3304 3315 +f 3315 3339 3323 +f 3309 3288 3304 +f 3304 3323 3309 +f 3300 3276 3288 +f 3288 3309 3300 +f 3284 3266 3276 +f 3276 3300 3284 +f 3274 3262 3266 +f 3266 3284 3274 +f 3269 3260 3262 +f 3262 3274 3269 +f 3267 3256 3260 +f 3260 3269 3267 +f 3372 3350 3354 +f 3354 3378 3372 +f 3367 3347 3350 +f 3350 3372 3367 +f 3352 3339 3347 +f 3347 3367 3352 +f 3341 3323 3339 +f 3339 3352 3341 +f 3325 3309 3323 +f 3323 3341 3325 +f 3313 3300 3309 +f 3309 3325 3313 +f 3301 3284 3300 +f 3300 3313 3301 +f 3289 3274 3284 +f 3284 3301 3289 +f 3281 3269 3274 +f 3274 3289 3281 +f 3277 3267 3269 +f 3269 3281 3277 +f 3403 3372 3378 +f 3378 3405 3403 +f 3393 3367 3372 +f 3372 3403 3393 +f 3377 3352 3367 +f 3367 3393 3377 +f 3360 3341 3352 +f 3352 3377 3360 +f 3344 3325 3341 +f 3341 3360 3344 +f 3327 3313 3325 +f 3325 3344 3327 +f 3317 3301 3313 +f 3313 3327 3317 +f 3305 3289 3301 +f 3301 3317 3305 +f 3296 3281 3289 +f 3289 3305 3296 +f 3291 3277 3281 +f 3281 3296 3291 +f 3469 3403 3405 +f 3405 3472 3469 +f 3450 3393 3403 +f 3403 3469 3450 +f 3426 3377 3393 +f 3393 3450 3426 +f 3390 3360 3377 +f 3377 3426 3390 +f 3370 3344 3360 +f 3360 3390 3370 +f 3349 3327 3344 +f 3344 3370 3349 +f 3337 3317 3327 +f 3327 3349 3337 +f 3319 3305 3317 +f 3317 3337 3319 +f 3311 3296 3305 +f 3305 3319 3311 +f 3307 3291 3296 +f 3296 3311 3307 +f 3520 3469 3472 +f 3472 3522 3520 +f 3504 3450 3469 +f 3469 3520 3504 +f 3489 3426 3450 +f 3450 3504 3489 +f 3463 3390 3426 +f 3426 3489 3463 +f 3421 3370 3390 +f 3390 3463 3421 +f 3385 3349 3370 +f 3370 3421 3385 +f 3361 3337 3349 +f 3349 3385 3361 +f 3342 3319 3337 +f 3337 3361 3342 +f 3334 3311 3319 +f 3319 3342 3334 +f 3328 3307 3311 +f 3311 3334 3328 +f 3591 3520 3522 +f 3522 3603 3591 +f 3578 3504 3520 +f 3520 3591 3578 +f 3552 3489 3504 +f 3504 3578 3552 +f 3530 3463 3489 +f 3489 3552 3530 +f 3499 3421 3463 +f 3463 3530 3499 +f 3467 3385 3421 +f 3421 3499 3467 +f 3415 3361 3385 +f 3385 3467 3415 +f 3381 3342 3361 +f 3361 3415 3381 +f 3363 3334 3342 +f 3342 3381 3363 +f 3356 3328 3334 +f 3334 3363 3356 +f 3374 3365 3358 +f 3358 3371 3374 +f 3395 3383 3365 +f 3365 3374 3395 +f 3443 3417 3383 +f 3383 3395 3443 +f 3481 3466 3417 +f 3417 3443 3481 +f 3514 3496 3466 +f 3466 3481 3514 +f 3545 3529 3496 +f 3496 3514 3545 +f 3573 3551 3529 +f 3529 3545 3573 +f 3597 3577 3551 +f 3551 3573 3597 +f 3613 3590 3577 +f 3577 3597 3613 +f 3619 3603 3590 +f 3590 3613 3619 +f 3387 3374 3371 +f 3371 3380 3387 +f 3413 3395 3374 +f 3374 3387 3413 +f 3461 3443 3395 +f 3395 3413 3461 +f 3493 3481 3443 +f 3443 3461 3493 +f 3524 3514 3481 +f 3481 3493 3524 +f 3556 3545 3514 +f 3514 3524 3556 +f 3584 3573 3545 +f 3545 3556 3584 +f 3611 3597 3573 +f 3573 3584 3611 +f 3628 3613 3597 +f 3597 3611 3628 +f 3632 3619 3613 +f 3613 3628 3632 +f 3398 3387 3380 +f 3380 3391 3398 +f 3435 3413 3387 +f 3387 3398 3435 +f 3473 3461 3413 +f 3413 3435 3473 +f 3500 3493 3461 +f 3461 3473 3500 +f 3531 3524 3493 +f 3493 3500 3531 +f 3562 3556 3524 +f 3524 3531 3562 +f 3595 3584 3556 +f 3556 3562 3595 +f 3617 3611 3584 +f 3584 3595 3617 +f 3633 3628 3611 +f 3611 3617 3633 +f 3641 3632 3628 +f 3628 3633 3641 +f 3409 3398 3391 +f 3391 3400 3409 +f 3447 3435 3398 +f 3398 3409 3447 +f 3477 3473 3435 +f 3435 3447 3477 +f 3506 3500 3473 +f 3473 3477 3506 +f 3540 3531 3500 +f 3500 3506 3540 +f 3567 3562 3531 +f 3531 3540 3567 +f 3601 3595 3562 +f 3562 3567 3601 +f 3624 3617 3595 +f 3595 3601 3624 +f 3639 3633 3617 +f 3617 3624 3639 +f 3644 3641 3633 +f 3633 3639 3644 +f 3433 3409 3400 +f 3400 3411 3433 +f 3453 3447 3409 +f 3409 3433 3453 +f 3483 3477 3447 +f 3447 3453 3483 +f 3510 3506 3477 +f 3477 3483 3510 +f 3543 3540 3506 +f 3506 3510 3543 +f 3569 3567 3540 +f 3540 3543 3569 +f 3599 3601 3567 +f 3567 3569 3599 +f 3622 3624 3601 +f 3601 3599 3622 +f 3637 3639 3624 +f 3624 3622 3637 +f 3642 3644 3639 +f 3639 3637 3642 +f 3439 3433 3411 +f 3411 3424 3439 +f 3458 3453 3433 +f 3433 3439 3458 +f 3487 3483 3453 +f 3453 3458 3487 +f 3513 3510 3483 +f 3483 3487 3513 +f 3542 3543 3510 +f 3510 3513 3542 +f 3566 3569 3543 +f 3543 3542 3566 +f 3593 3599 3569 +f 3569 3566 3593 +f 3616 3622 3599 +f 3599 3593 3616 +f 3630 3637 3622 +f 3622 3616 3630 +f 3636 3642 3637 +f 3637 3630 3636 +f 3441 3439 3424 +f 3424 3429 3441 +f 3459 3458 3439 +f 3439 3441 3459 +f 3485 3487 3458 +f 3458 3459 3485 +f 3508 3513 3487 +f 3487 3485 3508 +f 3533 3542 3513 +f 3513 3508 3533 +f 3558 3566 3542 +f 3542 3533 3558 +f 3582 3593 3566 +f 3566 3558 3582 +f 3607 3616 3593 +f 3593 3582 3607 +f 3620 3630 3616 +f 3616 3607 3620 +f 3626 3636 3630 +f 3630 3620 3626 +f 3437 3441 3429 +f 3429 3427 3437 +f 3455 3459 3441 +f 3441 3437 3455 +f 3479 3485 3459 +f 3459 3455 3479 +f 3502 3508 3485 +f 3485 3479 3502 +f 3526 3533 3508 +f 3508 3502 3526 +f 3547 3558 3533 +f 3533 3526 3547 +f 3571 3582 3558 +f 3558 3547 3571 +f 3588 3607 3582 +f 3582 3571 3588 +f 3605 3620 3607 +f 3607 3588 3605 +f 3609 3626 3620 +f 3620 3605 3609 +f 3419 3437 3427 +f 3427 3408 3419 +f 3445 3455 3437 +f 3437 3419 3445 +f 3470 3479 3455 +f 3455 3445 3470 +f 3492 3502 3479 +f 3479 3470 3492 +f 3517 3526 3502 +f 3502 3492 3517 +f 3536 3547 3526 +f 3526 3517 3536 +f 3554 3571 3547 +f 3547 3536 3554 +f 3575 3588 3571 +f 3571 3554 3575 +f 3580 3605 3588 +f 3588 3575 3580 +f 3587 3609 3605 +f 3605 3580 3587 +f 3401 3419 3408 +f 3408 3397 3401 +f 3431 3445 3419 +f 3419 3401 3431 +f 3451 3470 3445 +f 3445 3431 3451 +f 3475 3492 3470 +f 3470 3451 3475 +f 3497 3517 3492 +f 3492 3475 3497 +f 3518 3536 3517 +f 3517 3497 3518 +f 3537 3554 3536 +f 3536 3518 3537 +f 3549 3575 3554 +f 3554 3537 3549 +f 3560 3580 3575 +f 3575 3549 3560 +f 3564 3587 3580 +f 3580 3560 3564 +f 3614 3591 3603 +f 3603 3619 3614 +f 3598 3578 3591 +f 3591 3614 3598 +f 3574 3552 3578 +f 3578 3598 3574 +f 3546 3530 3552 +f 3552 3574 3546 +f 3515 3499 3530 +f 3530 3546 3515 +f 3482 3467 3499 +f 3499 3515 3482 +f 3444 3418 3467 +f 3467 3482 3444 +f 3396 3384 3418 +f 3418 3444 3396 +f 3375 3366 3384 +f 3384 3396 3375 +f 3371 3358 3366 +f 3366 3375 3371 +f 3629 3614 3619 +f 3619 3632 3629 +f 3612 3598 3614 +f 3614 3629 3612 +f 3585 3574 3598 +f 3598 3612 3585 +f 3557 3546 3574 +f 3574 3585 3557 +f 3525 3515 3546 +f 3546 3557 3525 +f 3494 3482 3515 +f 3515 3525 3494 +f 3462 3444 3482 +f 3482 3494 3462 +f 3414 3396 3444 +f 3444 3462 3414 +f 3388 3375 3396 +f 3396 3414 3388 +f 3380 3371 3375 +f 3375 3388 3380 +f 3634 3629 3632 +f 3632 3641 3634 +f 3618 3612 3629 +f 3629 3634 3618 +f 3596 3585 3612 +f 3612 3618 3596 +f 3563 3557 3585 +f 3585 3596 3563 +f 3532 3525 3557 +f 3557 3563 3532 +f 3501 3494 3525 +f 3525 3532 3501 +f 3474 3462 3494 +f 3494 3501 3474 +f 3436 3414 3462 +f 3462 3474 3436 +f 3399 3388 3414 +f 3414 3436 3399 +f 3392 3380 3388 +f 3388 3399 3392 +f 3640 3634 3641 +f 3641 3644 3640 +f 3625 3618 3634 +f 3634 3640 3625 +f 3602 3596 3618 +f 3618 3625 3602 +f 3568 3563 3596 +f 3596 3602 3568 +f 3539 3532 3563 +f 3563 3568 3539 +f 3507 3501 3532 +f 3532 3539 3507 +f 3478 3474 3501 +f 3501 3507 3478 +f 3448 3436 3474 +f 3474 3478 3448 +f 3410 3399 3436 +f 3436 3448 3410 +f 3400 3392 3399 +f 3399 3410 3400 +f 3638 3640 3644 +f 3644 3643 3638 +f 3623 3625 3640 +f 3640 3638 3623 +f 3600 3602 3625 +f 3625 3623 3600 +f 3570 3568 3602 +f 3602 3600 3570 +f 3544 3539 3568 +f 3568 3570 3544 +f 3511 3507 3539 +f 3539 3544 3511 +f 3484 3478 3507 +f 3507 3511 3484 +f 3454 3448 3478 +f 3478 3484 3454 +f 3434 3410 3448 +f 3448 3454 3434 +f 3412 3400 3410 +f 3410 3434 3412 +f 3631 3638 3643 +f 3643 3635 3631 +f 3615 3623 3638 +f 3638 3631 3615 +f 3594 3600 3623 +f 3623 3615 3594 +f 3565 3570 3600 +f 3600 3594 3565 +f 3541 3544 3570 +f 3570 3565 3541 +f 3512 3511 3544 +f 3544 3541 3512 +f 3488 3484 3511 +f 3511 3512 3488 +f 3457 3454 3484 +f 3484 3488 3457 +f 3440 3434 3454 +f 3454 3457 3440 +f 3423 3412 3434 +f 3434 3440 3423 +f 3621 3631 3635 +f 3635 3627 3621 +f 3608 3615 3631 +f 3631 3621 3608 +f 3583 3594 3615 +f 3615 3608 3583 +f 3559 3565 3594 +f 3594 3583 3559 +f 3534 3541 3565 +f 3565 3559 3534 +f 3509 3512 3541 +f 3541 3534 3509 +f 3486 3488 3512 +f 3512 3509 3486 +f 3460 3457 3488 +f 3488 3486 3460 +f 3442 3440 3457 +f 3457 3460 3442 +f 3430 3423 3440 +f 3440 3442 3430 +f 3606 3621 3627 +f 3627 3610 3606 +f 3589 3608 3621 +f 3621 3606 3589 +f 3572 3583 3608 +f 3608 3589 3572 +f 3548 3559 3583 +f 3583 3572 3548 +f 3527 3534 3559 +f 3559 3548 3527 +f 3503 3509 3534 +f 3534 3527 3503 +f 3480 3486 3509 +f 3509 3503 3480 +f 3456 3460 3486 +f 3486 3480 3456 +f 3438 3442 3460 +f 3460 3456 3438 +f 3428 3430 3442 +f 3442 3438 3428 +f 3581 3606 3610 +f 3610 3586 3581 +f 3576 3589 3606 +f 3606 3581 3576 +f 3555 3572 3589 +f 3589 3576 3555 +f 3535 3548 3572 +f 3572 3555 3535 +f 3516 3527 3548 +f 3548 3535 3516 +f 3491 3503 3527 +f 3527 3516 3491 +f 3471 3480 3503 +f 3503 3491 3471 +f 3446 3456 3480 +f 3480 3471 3446 +f 3420 3438 3456 +f 3456 3446 3420 +f 3407 3428 3438 +f 3438 3420 3407 +f 3561 3581 3586 +f 3586 3564 3561 +f 3550 3576 3581 +f 3581 3561 3550 +f 3538 3555 3576 +f 3576 3550 3538 +f 3519 3535 3555 +f 3555 3538 3519 +f 3498 3516 3535 +f 3535 3519 3498 +f 3476 3491 3516 +f 3516 3498 3476 +f 3452 3471 3491 +f 3491 3476 3452 +f 3432 3446 3471 +f 3471 3452 3432 +f 3402 3420 3446 +f 3446 3432 3402 +f 3397 3407 3420 +f 3420 3402 3397 +f 1888 2110 2104 +f 1888 2104 2096 +f 1888 2096 2076 +f 1888 2076 2048 +f 1888 2048 2030 +f 1888 2030 2006 +f 1888 2006 1982 +f 1888 1982 1960 +f 1888 1960 1936 +f 1888 1936 1732 +f 2257 2104 2110 +f 2110 2261 2257 +f 2249 2096 2104 +f 2104 2257 2249 +f 2226 2076 2096 +f 2096 2249 2226 +f 2200 2048 2076 +f 2076 2226 2200 +f 2142 2030 2048 +f 2048 2200 2142 +f 2094 2006 2030 +f 2030 2142 2094 +f 2036 1982 2006 +f 2006 2094 2036 +f 1988 1960 1982 +f 1982 2036 1988 +f 1948 1936 1960 +f 1960 1988 1948 +f 1728 1732 1936 +f 1936 1948 1728 +f 2310 2257 2261 +f 2261 2315 2310 +f 2300 2249 2257 +f 2257 2310 2300 +f 2279 2226 2249 +f 2249 2300 2279 +f 2243 2200 2226 +f 2226 2279 2243 +f 2204 2142 2200 +f 2200 2243 2204 +f 2132 2094 2142 +f 2142 2204 2132 +f 2067 2036 2094 +f 2094 2132 2067 +f 2000 1988 2036 +f 2036 2067 2000 +f 1956 1948 1988 +f 1988 2000 1956 +f 1734 1728 1948 +f 1948 1956 1734 +f 2312 2310 2315 +f 2315 2316 2312 +f 2302 2300 2310 +f 2310 2312 2302 +f 2281 2279 2300 +f 2300 2302 2281 +f 2245 2243 2279 +f 2279 2281 2245 +f 2206 2204 2243 +f 2243 2245 2206 +f 2134 2132 2204 +f 2204 2206 2134 +f 2068 2067 2132 +f 2132 2134 2068 +f 2002 2000 2067 +f 2067 2068 2002 +f 1958 1956 2000 +f 2000 2002 1958 +f 1878 1734 1956 +f 1956 1958 1878 +f 2285 2312 2316 +f 2316 2289 2285 +f 2259 2302 2312 +f 2312 2285 2259 +f 2241 2281 2302 +f 2302 2259 2241 +f 2214 2245 2281 +f 2281 2241 2214 +f 2168 2206 2245 +f 2245 2214 2168 +f 2106 2134 2206 +f 2206 2168 2106 +f 2042 2068 2134 +f 2134 2106 2042 +f 1994 2002 2068 +f 2068 2042 1994 +f 1952 1958 2002 +f 2002 1994 1952 +f 1731 1878 1958 +f 1958 1952 1731 +f 2220 2285 2289 +f 2289 2225 2220 +f 2210 2259 2285 +f 2285 2220 2210 +f 2186 2241 2259 +f 2259 2210 2186 +f 2146 2214 2241 +f 2241 2186 2146 +f 2108 2168 2214 +f 2214 2146 2108 +f 2060 2106 2168 +f 2168 2108 2060 +f 2018 2042 2106 +f 2106 2060 2018 +f 1978 1994 2042 +f 2042 2018 1978 +f 1944 1952 1994 +f 1994 1978 1944 +f 1727 1731 1952 +f 1952 1944 1727 +f 2141 2220 2225 +f 2225 2145 2141 +f 2127 2210 2220 +f 2220 2141 2127 +f 2112 2186 2210 +f 2210 2127 2112 +f 2084 2146 2186 +f 2186 2112 2084 +f 2044 2108 2146 +f 2146 2084 2044 +f 2024 2060 2108 +f 2108 2044 2024 +f 1992 2018 2060 +f 2060 2024 1992 +f 1970 1978 2018 +f 2018 1992 1970 +f 1942 1944 1978 +f 1978 1970 1942 +f 1721 1727 1944 +f 1944 1942 1721 +f 2079 2141 2145 +f 2145 2087 2079 +f 2075 2127 2141 +f 2141 2079 2075 +f 2055 2112 2127 +f 2127 2075 2055 +f 2039 2084 2112 +f 2112 2055 2039 +f 2021 2044 2084 +f 2084 2039 2021 +f 1996 2024 2044 +f 2044 2021 1996 +f 1974 1992 2024 +f 2024 1996 1974 +f 1954 1970 1992 +f 1992 1974 1954 +f 1934 1942 1970 +f 1970 1954 1934 +f 1720 1721 1942 +f 1942 1934 1720 +f 2063 2079 2087 +f 2087 2071 2063 +f 2051 2075 2079 +f 2079 2063 2051 +f 2041 2055 2075 +f 2075 2051 2041 +f 2029 2039 2055 +f 2055 2041 2029 +f 2013 2021 2039 +f 2039 2029 2013 +f 1991 1996 2021 +f 2021 2013 1991 +f 1972 1974 1996 +f 1996 1991 1972 +f 1950 1954 1974 +f 1974 1972 1950 +f 1932 1934 1954 +f 1954 1950 1932 +f 1701 1720 1934 +f 1934 1932 1701 +f 2115 2063 2071 +f 2071 2123 2115 +f 2101 2051 2063 +f 2063 2115 2101 +f 2081 2041 2051 +f 2051 2101 2081 +f 2057 2029 2041 +f 2041 2081 2057 +f 2033 2013 2029 +f 2029 2057 2033 +f 2009 1991 2013 +f 2013 2033 2009 +f 1984 1972 1991 +f 1991 2009 1984 +f 1964 1950 1972 +f 1972 1984 1964 +f 1938 1932 1950 +f 1950 1964 1938 +f 1698 1701 1932 +f 1932 1938 1698 +f 1888 1886 1686 +f 1888 1686 1662 +f 1888 1662 1640 +f 1888 1640 1616 +f 1888 1616 1592 +f 1888 1592 1574 +f 1888 1574 1546 +f 1888 1546 1526 +f 1888 1526 1518 +f 1888 1518 1512 +f 1674 1686 1886 +f 1886 1884 1674 +f 1634 1662 1686 +f 1686 1674 1634 +f 1586 1640 1662 +f 1662 1634 1586 +f 1528 1616 1640 +f 1640 1586 1528 +f 1480 1592 1616 +f 1616 1528 1480 +f 1422 1574 1592 +f 1592 1480 1422 +f 1396 1546 1574 +f 1574 1422 1396 +f 1373 1526 1546 +f 1546 1396 1373 +f 1365 1518 1526 +f 1526 1373 1365 +f 1361 1512 1518 +f 1518 1365 1361 +f 1666 1674 1884 +f 1884 1882 1666 +f 1622 1634 1674 +f 1674 1666 1622 +f 1557 1586 1634 +f 1634 1622 1557 +f 1490 1528 1586 +f 1586 1557 1490 +f 1418 1480 1528 +f 1528 1490 1418 +f 1379 1422 1480 +f 1480 1418 1379 +f 1343 1396 1422 +f 1422 1379 1343 +f 1322 1373 1396 +f 1396 1343 1322 +f 1312 1365 1373 +f 1373 1322 1312 +f 1309 1361 1365 +f 1365 1312 1309 +f 1664 1666 1882 +f 1882 1879 1664 +f 1620 1622 1666 +f 1666 1664 1620 +f 1554 1557 1622 +f 1622 1620 1554 +f 1488 1490 1557 +f 1557 1554 1488 +f 1416 1418 1490 +f 1490 1488 1416 +f 1377 1379 1418 +f 1418 1416 1377 +f 1341 1343 1379 +f 1379 1377 1341 +f 1320 1322 1343 +f 1343 1341 1320 +f 1310 1312 1322 +f 1322 1320 1310 +f 1306 1309 1312 +f 1312 1310 1306 +f 1670 1664 1879 +f 1879 1876 1670 +f 1628 1620 1664 +f 1664 1670 1628 +f 1580 1554 1620 +f 1620 1628 1580 +f 1516 1488 1554 +f 1554 1580 1516 +f 1454 1416 1488 +f 1488 1516 1454 +f 1408 1377 1416 +f 1416 1454 1408 +f 1381 1341 1377 +f 1377 1408 1381 +f 1363 1320 1341 +f 1341 1381 1363 +f 1337 1310 1320 +f 1320 1363 1337 +f 1333 1306 1310 +f 1310 1337 1333 +f 1678 1670 1876 +f 1876 1874 1678 +f 1644 1628 1670 +f 1670 1678 1644 +f 1604 1580 1628 +f 1628 1644 1604 +f 1562 1516 1580 +f 1580 1604 1562 +f 1514 1454 1516 +f 1516 1562 1514 +f 1476 1408 1454 +f 1454 1514 1476 +f 1436 1381 1408 +f 1408 1476 1436 +f 1412 1363 1381 +f 1381 1436 1412 +f 1402 1337 1363 +f 1363 1412 1402 +f 1399 1333 1337 +f 1337 1402 1399 +f 1680 1678 1874 +f 1874 1872 1680 +f 1652 1644 1678 +f 1678 1680 1652 +f 1630 1604 1644 +f 1644 1652 1630 +f 1598 1562 1604 +f 1604 1630 1598 +f 1578 1514 1562 +f 1562 1598 1578 +f 1538 1476 1514 +f 1514 1578 1538 +f 1510 1436 1476 +f 1476 1538 1510 +f 1497 1412 1436 +f 1436 1510 1497 +f 1483 1402 1412 +f 1412 1497 1483 +f 1479 1399 1402 +f 1402 1483 1479 +f 1688 1680 1872 +f 1872 1870 1688 +f 1668 1652 1680 +f 1680 1688 1668 +f 1648 1630 1652 +f 1652 1668 1648 +f 1626 1598 1630 +f 1630 1648 1626 +f 1603 1578 1598 +f 1598 1626 1603 +f 1585 1538 1578 +f 1578 1603 1585 +f 1569 1510 1538 +f 1538 1585 1569 +f 1549 1497 1510 +f 1510 1569 1549 +f 1545 1483 1497 +f 1497 1549 1545 +f 1537 1479 1483 +f 1483 1545 1537 +f 1690 1688 1870 +f 1870 1868 1690 +f 1672 1668 1688 +f 1688 1690 1672 +f 1650 1648 1668 +f 1668 1672 1650 +f 1633 1626 1648 +f 1648 1650 1633 +f 1611 1603 1626 +f 1626 1633 1611 +f 1595 1585 1603 +f 1603 1611 1595 +f 1583 1569 1585 +f 1585 1595 1583 +f 1573 1549 1569 +f 1569 1583 1573 +f 1561 1545 1549 +f 1549 1573 1561 +f 1553 1537 1545 +f 1545 1561 1553 +f 1684 1690 1868 +f 1868 1865 1684 +f 1658 1672 1690 +f 1690 1684 1658 +f 1638 1650 1672 +f 1672 1658 1638 +f 1615 1633 1650 +f 1650 1638 1615 +f 1591 1611 1633 +f 1633 1615 1591 +f 1567 1595 1611 +f 1611 1591 1567 +f 1543 1583 1595 +f 1595 1567 1543 +f 1523 1573 1583 +f 1583 1543 1523 +f 1509 1561 1573 +f 1573 1523 1509 +f 1501 1553 1561 +f 1561 1509 1501 +f 1888 1513 1519 +f 1888 1519 1527 +f 1888 1527 1547 +f 1888 1547 1575 +f 1888 1575 1593 +f 1888 1593 1617 +f 1888 1617 1641 +f 1888 1641 1663 +f 1888 1663 1687 +f 1888 1687 1894 +f 1366 1519 1513 +f 1513 1362 1366 +f 1374 1527 1519 +f 1519 1366 1374 +f 1397 1547 1527 +f 1527 1374 1397 +f 1423 1575 1547 +f 1547 1397 1423 +f 1481 1593 1575 +f 1575 1423 1481 +f 1529 1617 1593 +f 1593 1481 1529 +f 1587 1641 1617 +f 1617 1529 1587 +f 1635 1663 1641 +f 1641 1587 1635 +f 1675 1687 1663 +f 1663 1635 1675 +f 1895 1894 1687 +f 1687 1675 1895 +f 1313 1366 1362 +f 1362 1308 1313 +f 1323 1374 1366 +f 1366 1313 1323 +f 1344 1397 1374 +f 1374 1323 1344 +f 1380 1423 1397 +f 1397 1344 1380 +f 1419 1481 1423 +f 1423 1380 1419 +f 1491 1529 1481 +f 1481 1419 1491 +f 1556 1587 1529 +f 1529 1491 1556 +f 1623 1635 1587 +f 1587 1556 1623 +f 1667 1675 1635 +f 1635 1623 1667 +f 1890 1895 1675 +f 1675 1667 1890 +f 1311 1313 1308 +f 1308 1307 1311 +f 1321 1323 1313 +f 1313 1311 1321 +f 1342 1344 1323 +f 1323 1321 1342 +f 1378 1380 1344 +f 1344 1342 1378 +f 1417 1419 1380 +f 1380 1378 1417 +f 1489 1491 1419 +f 1419 1417 1489 +f 1555 1556 1491 +f 1491 1489 1555 +f 1621 1623 1556 +f 1556 1555 1621 +f 1665 1667 1623 +f 1623 1621 1665 +f 1881 1890 1667 +f 1667 1665 1881 +f 1338 1311 1307 +f 1307 1334 1338 +f 1364 1321 1311 +f 1311 1338 1364 +f 1382 1342 1321 +f 1321 1364 1382 +f 1409 1378 1342 +f 1342 1382 1409 +f 1455 1417 1378 +f 1378 1409 1455 +f 1517 1489 1417 +f 1417 1455 1517 +f 1581 1555 1489 +f 1489 1517 1581 +f 1629 1621 1555 +f 1555 1581 1629 +f 1671 1665 1621 +f 1621 1629 1671 +f 1893 1881 1665 +f 1665 1671 1893 +f 1403 1338 1334 +f 1334 1398 1403 +f 1413 1364 1338 +f 1338 1403 1413 +f 1437 1382 1364 +f 1364 1413 1437 +f 1477 1409 1382 +f 1382 1437 1477 +f 1515 1455 1409 +f 1409 1477 1515 +f 1563 1517 1455 +f 1455 1515 1563 +f 1605 1581 1517 +f 1517 1563 1605 +f 1645 1629 1581 +f 1581 1605 1645 +f 1679 1671 1629 +f 1629 1645 1679 +f 1900 1893 1671 +f 1671 1679 1900 +f 1482 1403 1398 +f 1398 1478 1482 +f 1496 1413 1403 +f 1403 1482 1496 +f 1511 1437 1413 +f 1413 1496 1511 +f 1539 1477 1437 +f 1437 1511 1539 +f 1579 1515 1477 +f 1477 1539 1579 +f 1599 1563 1515 +f 1515 1579 1599 +f 1631 1605 1563 +f 1563 1599 1631 +f 1653 1645 1605 +f 1605 1631 1653 +f 1681 1679 1645 +f 1645 1653 1681 +f 1902 1900 1679 +f 1679 1681 1902 +f 1544 1482 1478 +f 1478 1536 1544 +f 1548 1496 1482 +f 1482 1544 1548 +f 1568 1511 1496 +f 1496 1548 1568 +f 1584 1539 1511 +f 1511 1568 1584 +f 1602 1579 1539 +f 1539 1584 1602 +f 1627 1599 1579 +f 1579 1602 1627 +f 1649 1631 1599 +f 1599 1627 1649 +f 1669 1653 1631 +f 1631 1649 1669 +f 1689 1681 1653 +f 1653 1669 1689 +f 1921 1902 1681 +f 1681 1689 1921 +f 1560 1544 1536 +f 1536 1552 1560 +f 1572 1548 1544 +f 1544 1560 1572 +f 1582 1568 1548 +f 1548 1572 1582 +f 1594 1584 1568 +f 1568 1582 1594 +f 1610 1602 1584 +f 1584 1594 1610 +f 1632 1627 1602 +f 1602 1610 1632 +f 1651 1649 1627 +f 1627 1632 1651 +f 1673 1669 1649 +f 1649 1651 1673 +f 1691 1689 1669 +f 1669 1673 1691 +f 1922 1921 1689 +f 1689 1691 1922 +f 1508 1560 1552 +f 1552 1500 1508 +f 1522 1572 1560 +f 1560 1508 1522 +f 1542 1582 1572 +f 1572 1522 1542 +f 1566 1594 1582 +f 1582 1542 1566 +f 1590 1610 1594 +f 1594 1566 1590 +f 1614 1632 1610 +f 1610 1590 1614 +f 1639 1651 1632 +f 1632 1614 1639 +f 1659 1673 1651 +f 1651 1639 1659 +f 1685 1691 1673 +f 1673 1659 1685 +f 1928 1922 1691 +f 1691 1685 1928 +f 1888 1887 1937 +f 1888 1937 1961 +f 1888 1961 1983 +f 1888 1983 2007 +f 1888 2007 2031 +f 1888 2031 2049 +f 1888 2049 2077 +f 1888 2077 2097 +f 1888 2097 2105 +f 1888 2105 2111 +f 1949 1937 1887 +f 1887 1885 1949 +f 1989 1961 1937 +f 1937 1949 1989 +f 2037 1983 1961 +f 1961 1989 2037 +f 2095 2007 1983 +f 1983 2037 2095 +f 2143 2031 2007 +f 2007 2095 2143 +f 2201 2049 2031 +f 2031 2143 2201 +f 2227 2077 2049 +f 2049 2201 2227 +f 2250 2097 2077 +f 2077 2227 2250 +f 2258 2105 2097 +f 2097 2250 2258 +f 2262 2111 2105 +f 2105 2258 2262 +f 1957 1949 1885 +f 1885 1883 1957 +f 2001 1989 1949 +f 1949 1957 2001 +f 2066 2037 1989 +f 1989 2001 2066 +f 2133 2095 2037 +f 2037 2066 2133 +f 2205 2143 2095 +f 2095 2133 2205 +f 2244 2201 2143 +f 2143 2205 2244 +f 2280 2227 2201 +f 2201 2244 2280 +f 2301 2250 2227 +f 2227 2280 2301 +f 2311 2258 2250 +f 2250 2301 2311 +f 2314 2262 2258 +f 2258 2311 2314 +f 1959 1957 1883 +f 1883 1880 1959 +f 2003 2001 1957 +f 1957 1959 2003 +f 2069 2066 2001 +f 2001 2003 2069 +f 2135 2133 2066 +f 2066 2069 2135 +f 2207 2205 2133 +f 2133 2135 2207 +f 2246 2244 2205 +f 2205 2207 2246 +f 2282 2280 2244 +f 2244 2246 2282 +f 2303 2301 2280 +f 2280 2282 2303 +f 2313 2311 2301 +f 2301 2303 2313 +f 2317 2314 2311 +f 2311 2313 2317 +f 1953 1959 1880 +f 1880 1877 1953 +f 1995 2003 1959 +f 1959 1953 1995 +f 2043 2069 2003 +f 2003 1995 2043 +f 2107 2135 2069 +f 2069 2043 2107 +f 2169 2207 2135 +f 2135 2107 2169 +f 2215 2246 2207 +f 2207 2169 2215 +f 2242 2282 2246 +f 2246 2215 2242 +f 2260 2303 2282 +f 2282 2242 2260 +f 2286 2313 2303 +f 2303 2260 2286 +f 2290 2317 2313 +f 2313 2286 2290 +f 1945 1953 1877 +f 1877 1875 1945 +f 1979 1995 1953 +f 1953 1945 1979 +f 2019 2043 1995 +f 1995 1979 2019 +f 2061 2107 2043 +f 2043 2019 2061 +f 2109 2169 2107 +f 2107 2061 2109 +f 2147 2215 2169 +f 2169 2109 2147 +f 2187 2242 2215 +f 2215 2147 2187 +f 2211 2260 2242 +f 2242 2187 2211 +f 2221 2286 2260 +f 2260 2211 2221 +f 2224 2290 2286 +f 2286 2221 2224 +f 1943 1945 1875 +f 1875 1873 1943 +f 1971 1979 1945 +f 1945 1943 1971 +f 1993 2019 1979 +f 1979 1971 1993 +f 2025 2061 2019 +f 2019 1993 2025 +f 2045 2109 2061 +f 2061 2025 2045 +f 2085 2147 2109 +f 2109 2045 2085 +f 2113 2187 2147 +f 2147 2085 2113 +f 2126 2211 2187 +f 2187 2113 2126 +f 2140 2221 2211 +f 2211 2126 2140 +f 2144 2224 2221 +f 2221 2140 2144 +f 1935 1943 1873 +f 1873 1871 1935 +f 1955 1971 1943 +f 1943 1935 1955 +f 1975 1993 1971 +f 1971 1955 1975 +f 1997 2025 1993 +f 1993 1975 1997 +f 2020 2045 2025 +f 2025 1997 2020 +f 2038 2085 2045 +f 2045 2020 2038 +f 2054 2113 2085 +f 2085 2038 2054 +f 2074 2126 2113 +f 2113 2054 2074 +f 2078 2140 2126 +f 2126 2074 2078 +f 2086 2144 2140 +f 2140 2078 2086 +f 1933 1935 1871 +f 1871 1869 1933 +f 1951 1955 1935 +f 1935 1933 1951 +f 1973 1975 1955 +f 1955 1951 1973 +f 1990 1997 1975 +f 1975 1973 1990 +f 2012 2020 1997 +f 1997 1990 2012 +f 2028 2038 2020 +f 2020 2012 2028 +f 2040 2054 2038 +f 2038 2028 2040 +f 2050 2074 2054 +f 2054 2040 2050 +f 2062 2078 2074 +f 2074 2050 2062 +f 2070 2086 2078 +f 2078 2062 2070 +f 1939 1933 1869 +f 1869 1866 1939 +f 1965 1951 1933 +f 1933 1939 1965 +f 1985 1973 1951 +f 1951 1965 1985 +f 2008 1990 1973 +f 1973 1985 2008 +f 2032 2012 1990 +f 1990 2008 2032 +f 2056 2028 2012 +f 2012 2032 2056 +f 2080 2040 2028 +f 2028 2056 2080 +f 2100 2050 2040 +f 2040 2080 2100 +f 2114 2062 2050 +f 2050 2100 2114 +f 2122 2070 2062 +f 2062 2114 2122 +f 2232 2116 2124 +f 2124 2236 2232 +f 2218 2102 2116 +f 2116 2232 2218 +f 2199 2082 2102 +f 2102 2218 2199 +f 2150 2058 2082 +f 2082 2199 2150 +f 2120 2034 2058 +f 2058 2150 2120 +f 2064 2010 2034 +f 2034 2120 2064 +f 2023 1986 2010 +f 2010 2064 2023 +f 1980 1966 1986 +f 1986 2023 1980 +f 1946 1940 1966 +f 1966 1980 1946 +f 1862 1730 1940 +f 1940 1946 1862 +f 2332 2232 2236 +f 2236 2336 2332 +f 2322 2218 2232 +f 2232 2332 2322 +f 2306 2199 2218 +f 2218 2322 2306 +f 2275 2150 2199 +f 2199 2306 2275 +f 2234 2120 2150 +f 2150 2275 2234 +f 2170 2064 2120 +f 2120 2234 2170 +f 2093 2023 2064 +f 2064 2170 2093 +f 2016 1980 2023 +f 2023 2093 2016 +f 1968 1946 1980 +f 1980 2016 1968 +f 1858 1862 1946 +f 1946 1968 1858 +f 2409 2332 2336 +f 2336 2413 2409 +f 2400 2322 2332 +f 2332 2409 2400 +f 2376 2306 2322 +f 2322 2400 2376 +f 2349 2275 2306 +f 2306 2376 2349 +f 2324 2234 2275 +f 2275 2349 2324 +f 2271 2170 2234 +f 2234 2324 2271 +f 2185 2093 2170 +f 2170 2271 2185 +f 2072 2016 2093 +f 2093 2185 2072 +f 1976 1968 2016 +f 2016 2072 1976 +f 1729 1858 1968 +f 1968 1976 1729 +f 2488 2409 2413 +f 2413 2498 2488 +f 2470 2400 2409 +f 2409 2488 2470 +f 2444 2376 2400 +f 2400 2470 2444 +f 2418 2349 2376 +f 2376 2444 2418 +f 2384 2324 2349 +f 2349 2418 2384 +f 2338 2271 2324 +f 2324 2384 2338 +f 2269 2185 2271 +f 2271 2338 2269 +f 2138 2072 2185 +f 2185 2269 2138 +f 1998 1976 2072 +f 2072 2138 1998 +f 1722 1729 1976 +f 1976 1998 1722 +f 2559 2488 2498 +f 2498 2569 2559 +f 2549 2470 2488 +f 2488 2559 2549 +f 2531 2444 2470 +f 2470 2549 2531 +f 2492 2418 2444 +f 2444 2531 2492 +f 2436 2384 2418 +f 2418 2492 2436 +f 2394 2338 2384 +f 2384 2436 2394 +f 2326 2269 2338 +f 2338 2394 2326 +f 2212 2138 2269 +f 2269 2326 2212 +f 2026 1998 2138 +f 2138 2212 2026 +f 1850 1722 1998 +f 1998 2026 1850 +f 2653 2559 2569 +f 2569 2655 2653 +f 2631 2549 2559 +f 2559 2653 2631 +f 2593 2531 2549 +f 2549 2631 2593 +f 2551 2492 2531 +f 2531 2593 2551 +f 2510 2436 2492 +f 2492 2551 2510 +f 2432 2394 2436 +f 2436 2510 2432 +f 2366 2326 2394 +f 2394 2432 2366 +f 2263 2212 2326 +f 2326 2366 2263 +f 2052 2026 2212 +f 2212 2263 2052 +f 1726 1850 2026 +f 2026 2052 1726 +f 2720 2653 2655 +f 2655 2726 2720 +f 2697 2631 2653 +f 2653 2720 2697 +f 2662 2593 2631 +f 2631 2697 2662 +f 2607 2551 2593 +f 2593 2662 2607 +f 2547 2510 2551 +f 2551 2607 2547 +f 2484 2432 2510 +f 2510 2547 2484 +f 2405 2366 2432 +f 2432 2484 2405 +f 2308 2263 2366 +f 2366 2405 2308 +f 2090 2052 2263 +f 2263 2308 2090 +f 1719 1726 2052 +f 2052 2090 1719 +f 2787 2720 2726 +f 2726 2795 2787 +f 2759 2697 2720 +f 2720 2787 2759 +f 2713 2662 2697 +f 2697 2759 2713 +f 2657 2607 2662 +f 2662 2713 2657 +f 2589 2547 2607 +f 2607 2657 2589 +f 2525 2484 2547 +f 2547 2589 2525 +f 2422 2405 2484 +f 2484 2525 2422 +f 2330 2308 2405 +f 2405 2422 2330 +f 2118 2090 2308 +f 2308 2330 2118 +f 1700 1719 2090 +f 2090 2118 1700 +f 2834 2787 2795 +f 2795 2844 2834 +f 2798 2759 2787 +f 2787 2834 2798 +f 2750 2713 2759 +f 2759 2798 2750 +f 2690 2657 2713 +f 2713 2750 2690 +f 2624 2589 2657 +f 2657 2690 2624 +f 2536 2525 2589 +f 2589 2624 2536 +f 2441 2422 2525 +f 2525 2536 2441 +f 2340 2330 2422 +f 2422 2441 2340 +f 2128 2118 2330 +f 2330 2340 2128 +f 1825 1700 2118 +f 2118 2128 1825 +f 2847 2834 2844 +f 2844 2857 2847 +f 2821 2798 2834 +f 2834 2847 2821 +f 2765 2750 2798 +f 2798 2821 2765 +f 2703 2690 2750 +f 2750 2765 2703 +f 2637 2624 2690 +f 2690 2703 2637 +f 2543 2536 2624 +f 2624 2637 2543 +f 2446 2441 2536 +f 2536 2543 2446 +f 2344 2340 2441 +f 2441 2446 2344 +f 2136 2128 2340 +f 2340 2344 2136 +f 1713 1825 2128 +f 2128 2136 1713 +f 1676 1682 1864 +f 1864 1862 1676 +f 1642 1656 1682 +f 1682 1676 1642 +f 1601 1636 1656 +f 1656 1642 1601 +f 1558 1612 1636 +f 1636 1601 1558 +f 1502 1588 1612 +f 1612 1558 1502 +f 1472 1564 1588 +f 1588 1502 1472 +f 1425 1540 1564 +f 1564 1472 1425 +f 1404 1520 1540 +f 1540 1425 1404 +f 1390 1506 1520 +f 1520 1404 1390 +f 1387 1498 1506 +f 1506 1390 1387 +f 1654 1676 1862 +f 1862 1859 1654 +f 1606 1642 1676 +f 1676 1654 1606 +f 1531 1601 1642 +f 1642 1606 1531 +f 1452 1558 1601 +f 1601 1531 1452 +f 1388 1502 1558 +f 1558 1452 1388 +f 1347 1472 1502 +f 1502 1388 1347 +f 1316 1425 1472 +f 1472 1347 1316 +f 1300 1404 1425 +f 1425 1316 1300 +f 1290 1390 1404 +f 1404 1300 1290 +f 1286 1387 1390 +f 1390 1290 1286 +f 1646 1654 1859 +f 1859 1856 1646 +f 1550 1606 1654 +f 1654 1646 1550 +f 1439 1531 1606 +f 1606 1550 1439 +f 1351 1452 1531 +f 1531 1439 1351 +f 1298 1388 1452 +f 1452 1351 1298 +f 1275 1347 1388 +f 1388 1298 1275 +f 1246 1316 1347 +f 1347 1275 1246 +f 1222 1300 1316 +f 1316 1246 1222 +f 1215 1290 1300 +f 1300 1222 1215 +f 1211 1286 1290 +f 1290 1215 1211 +f 1624 1646 1856 +f 1856 1854 1624 +f 1484 1550 1646 +f 1646 1624 1484 +f 1353 1439 1550 +f 1550 1484 1353 +f 1284 1351 1439 +f 1439 1353 1284 +f 1238 1298 1351 +f 1351 1284 1238 +f 1204 1275 1298 +f 1298 1238 1204 +f 1178 1246 1275 +f 1275 1204 1178 +f 1152 1222 1246 +f 1246 1178 1152 +f 1134 1215 1222 +f 1222 1152 1134 +f 1124 1211 1215 +f 1215 1134 1124 +f 1596 1624 1854 +f 1854 1851 1596 +f 1410 1484 1624 +f 1624 1596 1410 +f 1296 1353 1484 +f 1484 1410 1296 +f 1228 1284 1353 +f 1353 1296 1228 +f 1186 1238 1284 +f 1284 1228 1186 +f 1130 1204 1238 +f 1238 1186 1130 +f 1091 1178 1204 +f 1204 1130 1091 +f 1073 1152 1178 +f 1178 1091 1073 +f 1063 1134 1152 +f 1152 1073 1063 +f 1053 1124 1134 +f 1134 1063 1053 +f 1570 1596 1851 +f 1851 1848 1570 +f 1359 1410 1596 +f 1596 1570 1359 +f 1256 1296 1410 +f 1410 1359 1256 +f 1190 1228 1296 +f 1296 1256 1190 +f 1112 1186 1228 +f 1228 1190 1112 +f 1071 1130 1186 +f 1186 1112 1071 +f 1029 1091 1130 +f 1130 1071 1029 +f 991 1073 1091 +f 1091 1029 991 +f 969 1063 1073 +f 1073 991 969 +f 967 1053 1063 +f 1063 969 967 +f 1532 1570 1848 +f 1848 1846 1532 +f 1314 1359 1570 +f 1570 1532 1314 +f 1219 1256 1359 +f 1359 1314 1219 +f 1138 1190 1256 +f 1256 1219 1138 +f 1075 1112 1190 +f 1190 1138 1075 +f 1015 1071 1112 +f 1112 1075 1015 +f 962 1029 1071 +f 1071 1015 962 +f 925 991 1029 +f 1029 962 925 +f 904 969 991 +f 991 925 904 +f 898 967 969 +f 969 904 898 +f 1504 1532 1846 +f 1846 1832 1504 +f 1292 1314 1532 +f 1532 1504 1292 +f 1200 1219 1314 +f 1314 1292 1200 +f 1097 1138 1219 +f 1219 1200 1097 +f 1033 1075 1138 +f 1138 1097 1033 +f 965 1015 1075 +f 1075 1033 965 +f 909 962 1015 +f 1015 965 909 +f 863 925 962 +f 962 909 863 +f 835 904 925 +f 925 863 835 +f 827 898 904 +f 904 835 827 +f 1494 1504 1832 +f 1832 1824 1494 +f 1282 1292 1504 +f 1504 1494 1282 +f 1183 1200 1292 +f 1292 1282 1183 +f 1088 1097 1200 +f 1200 1183 1088 +f 1000 1033 1097 +f 1097 1088 1000 +f 934 965 1033 +f 1033 1000 934 +f 874 909 965 +f 965 934 874 +f 826 863 909 +f 909 874 826 +f 790 835 863 +f 863 826 790 +f 780 827 835 +f 835 790 780 +f 1486 1494 1824 +f 1824 1814 1486 +f 1278 1282 1494 +f 1494 1486 1278 +f 1176 1183 1282 +f 1282 1278 1176 +f 1079 1088 1183 +f 1183 1176 1079 +f 985 1000 1088 +f 1088 1079 985 +f 919 934 1000 +f 1000 985 919 +f 857 874 934 +f 934 919 857 +f 801 826 874 +f 874 857 801 +f 775 790 826 +f 826 801 775 +f 765 780 790 +f 790 775 765 +f 1391 1507 1499 +f 1499 1387 1391 +f 1405 1521 1507 +f 1507 1391 1405 +f 1424 1541 1521 +f 1521 1405 1424 +f 1473 1565 1541 +f 1541 1424 1473 +f 1503 1589 1565 +f 1565 1473 1503 +f 1559 1613 1589 +f 1589 1503 1559 +f 1600 1637 1613 +f 1613 1559 1600 +f 1643 1657 1637 +f 1637 1600 1643 +f 1677 1683 1657 +f 1657 1643 1677 +f 1863 1892 1683 +f 1683 1677 1863 +f 1291 1391 1387 +f 1387 1287 1291 +f 1301 1405 1391 +f 1391 1291 1301 +f 1317 1424 1405 +f 1405 1301 1317 +f 1348 1473 1424 +f 1424 1317 1348 +f 1389 1503 1473 +f 1473 1348 1389 +f 1453 1559 1503 +f 1503 1389 1453 +f 1530 1600 1559 +f 1559 1453 1530 +f 1607 1643 1600 +f 1600 1530 1607 +f 1655 1677 1643 +f 1643 1607 1655 +f 1861 1863 1677 +f 1677 1655 1861 +f 1214 1291 1287 +f 1287 1210 1214 +f 1223 1301 1291 +f 1291 1214 1223 +f 1247 1317 1301 +f 1301 1223 1247 +f 1274 1348 1317 +f 1317 1247 1274 +f 1299 1389 1348 +f 1348 1274 1299 +f 1352 1453 1389 +f 1389 1299 1352 +f 1438 1530 1453 +f 1453 1352 1438 +f 1551 1607 1530 +f 1530 1438 1551 +f 1647 1655 1607 +f 1607 1551 1647 +f 1891 1861 1655 +f 1655 1647 1891 +f 1135 1214 1210 +f 1210 1125 1135 +f 1153 1223 1214 +f 1214 1135 1153 +f 1179 1247 1223 +f 1223 1153 1179 +f 1205 1274 1247 +f 1247 1179 1205 +f 1239 1299 1274 +f 1274 1205 1239 +f 1285 1352 1299 +f 1299 1239 1285 +f 1354 1438 1352 +f 1352 1285 1354 +f 1485 1551 1438 +f 1438 1354 1485 +f 1625 1647 1551 +f 1551 1485 1625 +f 1901 1891 1647 +f 1647 1625 1901 +f 1064 1135 1125 +f 1125 1054 1064 +f 1074 1153 1135 +f 1135 1064 1074 +f 1092 1179 1153 +f 1153 1074 1092 +f 1131 1205 1179 +f 1179 1092 1131 +f 1187 1239 1205 +f 1205 1131 1187 +f 1229 1285 1239 +f 1239 1187 1229 +f 1297 1354 1285 +f 1285 1229 1297 +f 1411 1485 1354 +f 1354 1297 1411 +f 1597 1625 1485 +f 1485 1411 1597 +f 1853 1901 1625 +f 1625 1597 1853 +f 970 1064 1054 +f 1054 968 970 +f 992 1074 1064 +f 1064 970 992 +f 1030 1092 1074 +f 1074 992 1030 +f 1072 1131 1092 +f 1092 1030 1072 +f 1113 1187 1131 +f 1131 1072 1113 +f 1191 1229 1187 +f 1187 1113 1191 +f 1257 1297 1229 +f 1229 1191 1257 +f 1360 1411 1297 +f 1297 1257 1360 +f 1571 1597 1411 +f 1411 1360 1571 +f 1899 1853 1597 +f 1597 1571 1899 +f 903 970 968 +f 968 897 903 +f 926 992 970 +f 970 903 926 +f 961 1030 992 +f 992 926 961 +f 1016 1072 1030 +f 1030 961 1016 +f 1076 1113 1072 +f 1072 1016 1076 +f 1139 1191 1113 +f 1113 1076 1139 +f 1218 1257 1191 +f 1191 1139 1218 +f 1315 1360 1257 +f 1257 1218 1315 +f 1533 1571 1360 +f 1360 1315 1533 +f 1920 1899 1571 +f 1571 1533 1920 +f 836 903 897 +f 897 828 836 +f 864 926 903 +f 903 836 864 +f 910 961 926 +f 926 864 910 +f 966 1016 961 +f 961 910 966 +f 1034 1076 1016 +f 1016 966 1034 +f 1098 1139 1076 +f 1076 1034 1098 +f 1201 1218 1139 +f 1139 1098 1201 +f 1293 1315 1218 +f 1218 1201 1293 +f 1505 1533 1315 +f 1315 1293 1505 +f 1924 1920 1533 +f 1533 1505 1924 +f 789 836 828 +f 828 779 789 +f 825 864 836 +f 836 789 825 +f 873 910 864 +f 864 825 873 +f 933 966 910 +f 910 873 933 +f 999 1034 966 +f 966 933 999 +f 1087 1098 1034 +f 1034 999 1087 +f 1182 1201 1098 +f 1098 1087 1182 +f 1283 1293 1201 +f 1201 1182 1283 +f 1495 1505 1293 +f 1293 1283 1495 +f 1826 1924 1505 +f 1505 1495 1826 +f 776 789 779 +f 779 766 776 +f 802 825 789 +f 789 776 802 +f 858 873 825 +f 825 802 858 +f 920 933 873 +f 873 858 920 +f 986 999 933 +f 933 920 986 +f 1080 1087 999 +f 999 986 1080 +f 1177 1182 1087 +f 1087 1080 1177 +f 1279 1283 1182 +f 1182 1177 1279 +f 1487 1495 1283 +f 1283 1279 1487 +f 1914 1826 1495 +f 1495 1487 1914 +f 1947 1941 1867 +f 1867 1863 1947 +f 1981 1967 1941 +f 1941 1947 1981 +f 2022 1987 1967 +f 1967 1981 2022 +f 2065 2011 1987 +f 1987 2022 2065 +f 2121 2035 2011 +f 2011 2065 2121 +f 2151 2059 2035 +f 2035 2121 2151 +f 2198 2083 2059 +f 2059 2151 2198 +f 2219 2103 2083 +f 2083 2198 2219 +f 2233 2117 2103 +f 2103 2219 2233 +f 2236 2125 2117 +f 2117 2233 2236 +f 1969 1947 1863 +f 1863 1860 1969 +f 2017 1981 1947 +f 1947 1969 2017 +f 2092 2022 1981 +f 1981 2017 2092 +f 2171 2065 2022 +f 2022 2092 2171 +f 2235 2121 2065 +f 2065 2171 2235 +f 2276 2151 2121 +f 2121 2235 2276 +f 2307 2198 2151 +f 2151 2276 2307 +f 2323 2219 2198 +f 2198 2307 2323 +f 2333 2233 2219 +f 2219 2323 2333 +f 2337 2236 2233 +f 2233 2333 2337 +f 1977 1969 1860 +f 1860 1857 1977 +f 2073 2017 1969 +f 1969 1977 2073 +f 2184 2092 2017 +f 2017 2073 2184 +f 2272 2171 2092 +f 2092 2184 2272 +f 2325 2235 2171 +f 2171 2272 2325 +f 2348 2276 2235 +f 2235 2325 2348 +f 2377 2307 2276 +f 2276 2348 2377 +f 2401 2323 2307 +f 2307 2377 2401 +f 2408 2333 2323 +f 2323 2401 2408 +f 2412 2337 2333 +f 2333 2408 2412 +f 1999 1977 1857 +f 1857 1855 1999 +f 2139 2073 1977 +f 1977 1999 2139 +f 2270 2184 2073 +f 2073 2139 2270 +f 2339 2272 2184 +f 2184 2270 2339 +f 2385 2325 2272 +f 2272 2339 2385 +f 2419 2348 2325 +f 2325 2385 2419 +f 2445 2377 2348 +f 2348 2419 2445 +f 2471 2401 2377 +f 2377 2445 2471 +f 2489 2408 2401 +f 2401 2471 2489 +f 2499 2412 2408 +f 2408 2489 2499 +f 2027 1999 1855 +f 1855 1852 2027 +f 2213 2139 1999 +f 1999 2027 2213 +f 2327 2270 2139 +f 2139 2213 2327 +f 2395 2339 2270 +f 2270 2327 2395 +f 2437 2385 2339 +f 2339 2395 2437 +f 2493 2419 2385 +f 2385 2437 2493 +f 2532 2445 2419 +f 2419 2493 2532 +f 2550 2471 2445 +f 2445 2532 2550 +f 2560 2489 2471 +f 2471 2550 2560 +f 2570 2499 2489 +f 2489 2560 2570 +f 2053 2027 1852 +f 1852 1849 2053 +f 2264 2213 2027 +f 2027 2053 2264 +f 2367 2327 2213 +f 2213 2264 2367 +f 2433 2395 2327 +f 2327 2367 2433 +f 2511 2437 2395 +f 2395 2433 2511 +f 2552 2493 2437 +f 2437 2511 2552 +f 2594 2532 2493 +f 2493 2552 2594 +f 2632 2550 2532 +f 2532 2594 2632 +f 2654 2560 2550 +f 2550 2632 2654 +f 2656 2570 2560 +f 2560 2654 2656 +f 2091 2053 1849 +f 1849 1847 2091 +f 2309 2264 2053 +f 2053 2091 2309 +f 2404 2367 2264 +f 2264 2309 2404 +f 2485 2433 2367 +f 2367 2404 2485 +f 2548 2511 2433 +f 2433 2485 2548 +f 2608 2552 2511 +f 2511 2548 2608 +f 2661 2594 2552 +f 2552 2608 2661 +f 2698 2632 2594 +f 2594 2661 2698 +f 2719 2654 2632 +f 2632 2698 2719 +f 2725 2656 2654 +f 2654 2719 2725 +f 2119 2091 1847 +f 1847 1833 2119 +f 2331 2309 2091 +f 2091 2119 2331 +f 2423 2404 2309 +f 2309 2331 2423 +f 2526 2485 2404 +f 2404 2423 2526 +f 2590 2548 2485 +f 2485 2526 2590 +f 2658 2608 2548 +f 2548 2590 2658 +f 2714 2661 2608 +f 2608 2658 2714 +f 2760 2698 2661 +f 2661 2714 2760 +f 2788 2719 2698 +f 2698 2760 2788 +f 2796 2725 2719 +f 2719 2788 2796 +f 2129 2119 1833 +f 1833 1827 2129 +f 2341 2331 2119 +f 2119 2129 2341 +f 2440 2423 2331 +f 2331 2341 2440 +f 2535 2526 2423 +f 2423 2440 2535 +f 2623 2590 2526 +f 2526 2535 2623 +f 2689 2658 2590 +f 2590 2623 2689 +f 2749 2714 2658 +f 2658 2689 2749 +f 2797 2760 2714 +f 2714 2749 2797 +f 2833 2788 2760 +f 2760 2797 2833 +f 2843 2796 2788 +f 2788 2833 2843 +f 2137 2129 1827 +f 1827 1815 2137 +f 2345 2341 2129 +f 2129 2137 2345 +f 2447 2440 2341 +f 2341 2345 2447 +f 2544 2535 2440 +f 2440 2447 2544 +f 2638 2623 2535 +f 2535 2544 2638 +f 2704 2689 2623 +f 2623 2638 2704 +f 2766 2749 2689 +f 2689 2704 2766 +f 2822 2797 2749 +f 2749 2766 2822 +f 2848 2833 2797 +f 2797 2822 2848 +f 2858 2843 2833 +f 2833 2848 2858 +f 1735 2334 2329 +f 1735 2329 2321 +f 1735 2321 2305 +f 1735 2305 2274 +f 1735 2274 2231 +f 1735 2231 2167 +f 1735 2167 2089 +f 1735 2089 2014 +f 1735 2014 1962 +f 1735 1962 1733 +f 2515 2329 2334 +f 2334 2524 2515 +f 2495 2321 2329 +f 2329 2515 2495 +f 2456 2305 2321 +f 2321 2495 2456 +f 2429 2274 2305 +f 2305 2456 2429 +f 2399 2231 2274 +f 2274 2429 2399 +f 2347 2167 2231 +f 2231 2399 2347 +f 2292 2089 2167 +f 2167 2347 2292 +f 2148 2014 2089 +f 2089 2292 2148 +f 2004 1962 2014 +f 2014 2148 2004 +f 1739 1733 1962 +f 1962 2004 1739 +f 2647 2515 2524 +f 2524 2649 2647 +f 2621 2495 2515 +f 2515 2647 2621 +f 2584 2456 2495 +f 2495 2621 2584 +f 2541 2429 2456 +f 2456 2584 2541 +f 2502 2399 2429 +f 2429 2541 2502 +f 2426 2347 2399 +f 2399 2502 2426 +f 2352 2292 2347 +f 2347 2426 2352 +f 2255 2148 2292 +f 2292 2352 2255 +f 2046 2004 2148 +f 2148 2255 2046 +f 1702 1739 2004 +f 2004 2046 1702 +f 2746 2647 2649 +f 2649 2757 2746 +f 2721 2621 2647 +f 2647 2746 2721 +f 2681 2584 2621 +f 2621 2721 2681 +f 2639 2541 2584 +f 2584 2681 2639 +f 2557 2502 2541 +f 2541 2639 2557 +f 2505 2426 2502 +f 2502 2557 2505 +f 2415 2352 2426 +f 2426 2505 2415 +f 2318 2255 2352 +f 2352 2415 2318 +f 2098 2046 2255 +f 2255 2318 2098 +f 1745 1702 2046 +f 2046 2098 1745 +f 2840 2746 2757 +f 2757 2849 2840 +f 2808 2721 2746 +f 2746 2840 2808 +f 2756 2681 2721 +f 2721 2808 2756 +f 2696 2639 2681 +f 2681 2756 2696 +f 2626 2557 2639 +f 2639 2696 2626 +f 2538 2505 2557 +f 2557 2626 2538 +f 2443 2415 2505 +f 2505 2538 2443 +f 2342 2318 2415 +f 2415 2443 2342 +f 2131 2098 2318 +f 2318 2342 2131 +f 1904 1745 2098 +f 2098 2131 1904 +f 2906 2840 2849 +f 2849 2925 2906 +f 2867 2808 2840 +f 2840 2906 2867 +f 2818 2756 2808 +f 2808 2867 2818 +f 2736 2696 2756 +f 2756 2818 2736 +f 2667 2626 2696 +f 2696 2736 2667 +f 2565 2538 2626 +f 2626 2667 2565 +f 2475 2443 2538 +f 2538 2565 2475 +f 2356 2342 2443 +f 2443 2475 2356 +f 2156 2131 2342 +f 2342 2356 2156 +f 1704 1904 2131 +f 2131 2156 1704 +f 2976 2906 2925 +f 2925 2987 2976 +f 2914 2867 2906 +f 2906 2976 2914 +f 2852 2818 2867 +f 2867 2914 2852 +f 2772 2736 2818 +f 2818 2852 2772 +f 2688 2667 2736 +f 2736 2772 2688 +f 2592 2565 2667 +f 2667 2688 2592 +f 2497 2475 2565 +f 2565 2592 2497 +f 2372 2356 2475 +f 2475 2497 2372 +f 2176 2156 2356 +f 2356 2372 2176 +f 1752 1704 2156 +f 2156 2176 1752 +f 2993 2976 2987 +f 2987 3011 2993 +f 2952 2914 2976 +f 2976 2993 2952 +f 2874 2852 2914 +f 2914 2952 2874 +f 2794 2772 2852 +f 2852 2874 2794 +f 2702 2688 2772 +f 2772 2794 2702 +f 2604 2592 2688 +f 2688 2702 2604 +f 2509 2497 2592 +f 2592 2604 2509 +f 2380 2372 2497 +f 2497 2509 2380 +f 2182 2176 2372 +f 2372 2380 2182 +f 1723 1752 2176 +f 2176 2182 1723 +f 3000 2993 3011 +f 3011 3020 3000 +f 2967 2952 2993 +f 2993 3000 2967 +f 2879 2874 2952 +f 2952 2967 2879 +f 2799 2794 2874 +f 2874 2879 2799 +f 2707 2702 2794 +f 2794 2799 2707 +f 2605 2604 2702 +f 2702 2707 2605 +f 2512 2509 2604 +f 2604 2605 2512 +f 2382 2380 2509 +f 2509 2512 2382 +f 2188 2182 2380 +f 2380 2382 2188 +f 1699 1723 2182 +f 2182 2188 1699 +f 3006 3000 3020 +f 3020 3022 3006 +f 2972 2967 3000 +f 3000 3006 2972 +f 2888 2879 2967 +f 2967 2972 2888 +f 2804 2799 2879 +f 2879 2888 2804 +f 2710 2707 2799 +f 2799 2804 2710 +f 2613 2605 2707 +f 2707 2710 2613 +f 2520 2512 2605 +f 2605 2613 2520 +f 2388 2382 2512 +f 2512 2520 2388 +f 2192 2188 2382 +f 2382 2388 2192 +f 1760 1699 2188 +f 2188 2192 1760 +f 1735 1737 1660 +f 1735 1660 1608 +f 1735 1608 1535 +f 1735 1535 1457 +f 1735 1457 1393 +f 1735 1393 1350 +f 1735 1350 1319 +f 1735 1319 1303 +f 1735 1303 1295 +f 1735 1295 1288 +f 1618 1660 1737 +f 1737 1739 1618 +f 1474 1608 1660 +f 1660 1618 1474 +f 1332 1535 1608 +f 1608 1474 1332 +f 1277 1457 1535 +f 1535 1332 1277 +f 1225 1393 1457 +f 1457 1277 1225 +f 1195 1350 1393 +f 1393 1225 1195 +f 1166 1319 1350 +f 1350 1195 1166 +f 1129 1303 1319 +f 1319 1166 1129 +f 1109 1295 1303 +f 1303 1129 1109 +f 1099 1288 1295 +f 1295 1109 1099 +f 1576 1618 1739 +f 1739 1741 1576 +f 1367 1474 1618 +f 1618 1576 1367 +f 1270 1332 1474 +f 1474 1367 1270 +f 1196 1277 1332 +f 1332 1270 1196 +f 1120 1225 1277 +f 1277 1196 1120 +f 1081 1195 1225 +f 1225 1120 1081 +f 1040 1166 1195 +f 1195 1081 1040 +f 1001 1129 1166 +f 1166 1040 1001 +f 975 1109 1129 +f 1129 1001 975 +f 973 1099 1109 +f 1109 975 973 +f 1524 1576 1741 +f 1741 1744 1524 +f 1304 1367 1576 +f 1576 1524 1304 +f 1209 1270 1367 +f 1367 1304 1209 +f 1119 1196 1270 +f 1270 1209 1119 +f 1065 1120 1196 +f 1196 1119 1065 +f 983 1081 1120 +f 1120 1065 983 +f 941 1040 1081 +f 1081 983 941 +f 901 1001 1040 +f 1040 941 901 +f 878 975 1001 +f 1001 901 878 +f 865 973 975 +f 975 878 865 +f 1493 1524 1744 +f 1744 1747 1493 +f 1280 1304 1524 +f 1524 1493 1280 +f 1181 1209 1304 +f 1304 1280 1181 +f 1086 1119 1209 +f 1209 1181 1086 +f 998 1065 1119 +f 1119 1086 998 +f 928 983 1065 +f 1065 998 928 +f 868 941 983 +f 983 928 868 +f 816 901 941 +f 941 868 816 +f 784 878 901 +f 901 816 784 +f 773 865 878 +f 878 784 773 +f 1466 1493 1747 +f 1747 1749 1466 +f 1266 1280 1493 +f 1493 1466 1266 +f 1149 1181 1280 +f 1280 1266 1149 +f 1057 1086 1181 +f 1181 1149 1057 +f 955 998 1086 +f 1086 1057 955 +f 888 928 998 +f 998 955 888 +f 806 868 928 +f 928 888 806 +f 755 816 868 +f 868 806 755 +f 718 784 816 +f 816 755 718 +f 697 773 784 +f 784 718 697 +f 1446 1466 1749 +f 1749 1753 1446 +f 1250 1266 1466 +f 1466 1446 1250 +f 1127 1149 1266 +f 1266 1250 1127 +f 1032 1057 1149 +f 1149 1127 1032 +f 936 955 1057 +f 1057 1032 936 +f 852 888 955 +f 955 936 852 +f 772 806 888 +f 888 852 772 +f 710 755 806 +f 806 772 710 +f 648 718 755 +f 755 710 648 +f 637 697 718 +f 718 648 637 +f 1440 1446 1753 +f 1753 1755 1440 +f 1242 1250 1446 +f 1446 1440 1242 +f 1115 1127 1250 +f 1250 1242 1115 +f 1020 1032 1127 +f 1127 1115 1020 +f 922 936 1032 +f 1032 1020 922 +f 830 852 936 +f 936 922 830 +f 750 772 852 +f 852 830 750 +f 672 710 772 +f 772 750 672 +f 631 648 710 +f 710 672 631 +f 613 637 648 +f 648 631 613 +f 1434 1440 1755 +f 1755 1757 1434 +f 1240 1242 1440 +f 1440 1434 1240 +f 1110 1115 1242 +f 1242 1240 1110 +f 1017 1020 1115 +f 1115 1110 1017 +f 915 922 1020 +f 1020 1017 915 +f 823 830 922 +f 922 915 823 +f 743 750 830 +f 830 823 743 +f 655 672 750 +f 750 743 655 +f 622 631 672 +f 672 655 622 +f 602 613 631 +f 631 622 602 +f 1428 1434 1757 +f 1757 1760 1428 +f 1232 1240 1434 +f 1434 1428 1232 +f 1105 1110 1240 +f 1240 1232 1105 +f 1010 1017 1110 +f 1110 1105 1010 +f 913 915 1017 +f 1017 1010 913 +f 821 823 915 +f 915 913 821 +f 736 743 823 +f 823 821 736 +f 652 655 743 +f 743 736 652 +f 619 622 655 +f 655 652 619 +f 601 602 622 +f 622 619 601 +f 1735 1289 1294 +f 1735 1294 1302 +f 1735 1302 1318 +f 1735 1318 1349 +f 1735 1349 1392 +f 1735 1392 1456 +f 1735 1456 1534 +f 1735 1534 1609 +f 1735 1609 1661 +f 1735 1661 1889 +f 1108 1294 1289 +f 1289 1099 1108 +f 1128 1302 1294 +f 1294 1108 1128 +f 1167 1318 1302 +f 1302 1128 1167 +f 1194 1349 1318 +f 1318 1167 1194 +f 1224 1392 1349 +f 1349 1194 1224 +f 1276 1456 1392 +f 1392 1224 1276 +f 1331 1534 1456 +f 1456 1276 1331 +f 1475 1609 1534 +f 1534 1331 1475 +f 1619 1661 1609 +f 1609 1475 1619 +f 1738 1889 1661 +f 1661 1619 1738 +f 976 1108 1099 +f 1099 974 976 +f 1002 1128 1108 +f 1108 976 1002 +f 1039 1167 1128 +f 1128 1002 1039 +f 1082 1194 1167 +f 1167 1039 1082 +f 1121 1224 1194 +f 1194 1082 1121 +f 1197 1276 1224 +f 1224 1121 1197 +f 1271 1331 1276 +f 1276 1197 1271 +f 1368 1475 1331 +f 1331 1271 1368 +f 1577 1619 1475 +f 1475 1368 1577 +f 1903 1738 1619 +f 1619 1577 1903 +f 877 976 974 +f 974 866 877 +f 902 1002 976 +f 976 877 902 +f 942 1039 1002 +f 1002 902 942 +f 984 1082 1039 +f 1039 942 984 +f 1066 1121 1082 +f 1082 984 1066 +f 1118 1197 1121 +f 1121 1066 1118 +f 1208 1271 1197 +f 1197 1118 1208 +f 1305 1368 1271 +f 1271 1208 1305 +f 1525 1577 1368 +f 1368 1305 1525 +f 1742 1903 1577 +f 1577 1525 1742 +f 783 877 866 +f 866 774 783 +f 815 902 877 +f 877 783 815 +f 867 942 902 +f 902 815 867 +f 927 984 942 +f 942 867 927 +f 997 1066 984 +f 984 927 997 +f 1085 1118 1066 +f 1066 997 1085 +f 1180 1208 1118 +f 1118 1085 1180 +f 1281 1305 1208 +f 1208 1180 1281 +f 1492 1525 1305 +f 1305 1281 1492 +f 1703 1742 1525 +f 1525 1492 1703 +f 717 783 774 +f 774 698 717 +f 756 815 783 +f 783 717 756 +f 805 867 815 +f 815 756 805 +f 887 927 867 +f 867 805 887 +f 956 997 927 +f 927 887 956 +f 1058 1085 997 +f 997 956 1058 +f 1148 1180 1085 +f 1085 1058 1148 +f 1267 1281 1180 +f 1180 1148 1267 +f 1467 1492 1281 +f 1281 1267 1467 +f 1905 1703 1492 +f 1492 1467 1905 +f 647 717 698 +f 698 636 647 +f 709 756 717 +f 717 647 709 +f 771 805 756 +f 756 709 771 +f 851 887 805 +f 805 771 851 +f 935 956 887 +f 887 851 935 +f 1031 1058 956 +f 956 935 1031 +f 1126 1148 1058 +f 1058 1031 1126 +f 1251 1267 1148 +f 1148 1126 1251 +f 1447 1467 1267 +f 1267 1251 1447 +f 1751 1905 1467 +f 1467 1447 1751 +f 630 647 636 +f 636 612 630 +f 671 709 647 +f 647 630 671 +f 749 771 709 +f 709 671 749 +f 829 851 771 +f 771 749 829 +f 921 935 851 +f 851 829 921 +f 1019 1031 935 +f 935 921 1019 +f 1114 1126 1031 +f 1031 1019 1114 +f 1243 1251 1126 +f 1126 1114 1243 +f 1441 1447 1251 +f 1251 1243 1441 +f 1896 1751 1447 +f 1447 1441 1896 +f 623 630 612 +f 612 603 623 +f 656 671 630 +f 630 623 656 +f 744 749 671 +f 671 656 744 +f 824 829 749 +f 749 744 824 +f 916 921 829 +f 829 824 916 +f 1018 1019 921 +f 921 916 1018 +f 1111 1114 1019 +f 1019 1018 1111 +f 1241 1243 1114 +f 1114 1111 1241 +f 1435 1441 1243 +f 1243 1241 1435 +f 1923 1896 1441 +f 1441 1435 1923 +f 617 623 603 +f 603 601 617 +f 650 656 623 +f 623 617 650 +f 734 744 656 +f 656 650 734 +f 818 824 744 +f 744 734 818 +f 912 916 824 +f 824 818 912 +f 1009 1018 916 +f 916 912 1009 +f 1102 1111 1018 +f 1018 1009 1102 +f 1235 1241 1111 +f 1111 1102 1235 +f 1431 1435 1241 +f 1241 1235 1431 +f 1759 1923 1435 +f 1435 1431 1759 +f 1735 1736 1963 +f 1735 1963 2015 +f 1735 2015 2088 +f 1735 2088 2166 +f 1735 2166 2230 +f 1735 2230 2273 +f 1735 2273 2304 +f 1735 2304 2320 +f 1735 2320 2328 +f 1735 2328 2335 +f 2005 1963 1736 +f 1736 1738 2005 +f 2149 2015 1963 +f 1963 2005 2149 +f 2291 2088 2015 +f 2015 2149 2291 +f 2346 2166 2088 +f 2088 2291 2346 +f 2398 2230 2166 +f 2166 2346 2398 +f 2428 2273 2230 +f 2230 2398 2428 +f 2457 2304 2273 +f 2273 2428 2457 +f 2494 2320 2304 +f 2304 2457 2494 +f 2514 2328 2320 +f 2320 2494 2514 +f 2524 2335 2328 +f 2328 2514 2524 +f 2047 2005 1738 +f 1738 1740 2047 +f 2256 2149 2005 +f 2005 2047 2256 +f 2353 2291 2149 +f 2149 2256 2353 +f 2427 2346 2291 +f 2291 2353 2427 +f 2503 2398 2346 +f 2346 2427 2503 +f 2542 2428 2398 +f 2398 2503 2542 +f 2583 2457 2428 +f 2428 2542 2583 +f 2622 2494 2457 +f 2457 2583 2622 +f 2648 2514 2494 +f 2494 2622 2648 +f 2650 2524 2514 +f 2514 2648 2650 +f 2099 2047 1740 +f 1740 1743 2099 +f 2319 2256 2047 +f 2047 2099 2319 +f 2414 2353 2256 +f 2256 2319 2414 +f 2504 2427 2353 +f 2353 2414 2504 +f 2558 2503 2427 +f 2427 2504 2558 +f 2640 2542 2503 +f 2503 2558 2640 +f 2682 2583 2542 +f 2542 2640 2682 +f 2722 2622 2583 +f 2583 2682 2722 +f 2745 2648 2622 +f 2622 2722 2745 +f 2758 2650 2648 +f 2648 2745 2758 +f 2130 2099 1743 +f 1743 1746 2130 +f 2343 2319 2099 +f 2099 2130 2343 +f 2442 2414 2319 +f 2319 2343 2442 +f 2537 2504 2414 +f 2414 2442 2537 +f 2625 2558 2504 +f 2504 2537 2625 +f 2695 2640 2558 +f 2558 2625 2695 +f 2755 2682 2640 +f 2640 2695 2755 +f 2807 2722 2682 +f 2682 2755 2807 +f 2839 2745 2722 +f 2722 2807 2839 +f 2850 2758 2745 +f 2745 2839 2850 +f 2157 2130 1746 +f 1746 1748 2157 +f 2357 2343 2130 +f 2130 2157 2357 +f 2474 2442 2343 +f 2343 2357 2474 +f 2566 2537 2442 +f 2442 2474 2566 +f 2668 2625 2537 +f 2537 2566 2668 +f 2735 2695 2625 +f 2625 2668 2735 +f 2817 2755 2695 +f 2695 2735 2817 +f 2868 2807 2755 +f 2755 2817 2868 +f 2905 2839 2807 +f 2807 2868 2905 +f 2926 2850 2839 +f 2839 2905 2926 +f 2177 2157 1748 +f 1748 1750 2177 +f 2373 2357 2157 +f 2157 2177 2373 +f 2496 2474 2357 +f 2357 2373 2496 +f 2591 2566 2474 +f 2474 2496 2591 +f 2687 2668 2566 +f 2566 2591 2687 +f 2771 2735 2668 +f 2668 2687 2771 +f 2851 2817 2735 +f 2735 2771 2851 +f 2913 2868 2817 +f 2817 2851 2913 +f 2975 2905 2868 +f 2868 2913 2975 +f 2986 2926 2905 +f 2905 2975 2986 +f 2183 2177 1750 +f 1750 1754 2183 +f 2381 2373 2177 +f 2177 2183 2381 +f 2508 2496 2373 +f 2373 2381 2508 +f 2603 2591 2496 +f 2496 2508 2603 +f 2701 2687 2591 +f 2591 2603 2701 +f 2793 2771 2687 +f 2687 2701 2793 +f 2873 2851 2771 +f 2771 2793 2873 +f 2951 2913 2851 +f 2851 2873 2951 +f 2992 2975 2913 +f 2913 2951 2992 +f 3010 2986 2975 +f 2975 2992 3010 +f 2189 2183 1754 +f 1754 1756 2189 +f 2383 2381 2183 +f 2183 2189 2383 +f 2513 2508 2381 +f 2381 2383 2513 +f 2606 2603 2508 +f 2508 2513 2606 +f 2708 2701 2603 +f 2603 2606 2708 +f 2800 2793 2701 +f 2701 2708 2800 +f 2880 2873 2793 +f 2793 2800 2880 +f 2968 2951 2873 +f 2873 2880 2968 +f 3001 2992 2951 +f 2951 2968 3001 +f 3021 3010 2992 +f 2992 3001 3021 +f 2195 2189 1756 +f 1756 1759 2195 +f 2390 2383 2189 +f 2189 2195 2390 +f 2517 2513 2383 +f 2383 2390 2517 +f 2612 2606 2513 +f 2513 2517 2612 +f 2709 2708 2606 +f 2606 2612 2709 +f 2801 2800 2708 +f 2708 2709 2801 +f 2886 2880 2800 +f 2800 2801 2886 +f 2970 2968 2880 +f 2880 2886 2970 +f 3004 3001 2968 +f 2968 2970 3004 +f 3022 3021 3001 +f 3001 3004 3022 \ No newline at end of file diff --git a/content/handbook_2e/examples/17 Shapes/Ex_06/data/teapot.obj b/content/handbook_2e/examples/17 Shapes/Ex_06/data/teapot.obj new file mode 100644 index 000000000..f1ac38adc --- /dev/null +++ b/content/handbook_2e/examples/17 Shapes/Ex_06/data/teapot.obj @@ -0,0 +1,9965 @@ +v -3.000000 -1.8 0.000000 +v -2.991600 -1.8 -0.081000 +v -2.991600 -1.8 0.081000 +v -2.989450 -1.666162 0.000000 +v -2.985000 -1.92195 0.000000 +v -2.985000 -1.92195 0.000000 +v -2.981175 -1.667844 -0.081000 +v -2.981175 -1.667844 0.081000 +v -2.976687 -1.920243 -0.081000 +v -2.976687 -1.920243 0.081000 +v -2.968800 -1.8 -0.144000 +v -2.968800 -1.8 0.144000 +v -2.958713 -1.672406 -0.144000 +v -2.958713 -1.672406 0.144000 +v -2.957600 -1.5348 0.000000 +v -2.957600 -1.5348 0.000000 +v -2.954122 -1.915609 -0.144000 +v -2.954122 -1.915609 0.144000 +v -2.949693 -1.53779 -0.081000 +v -2.949693 -1.53779 0.081000 +v -2.940000 -2.0196 0.000000 +v -2.935200 -1.8 -0.189000 +v -2.935200 -1.8 0.189000 +v -2.931958 -2.016526 0.081000 +v -2.931958 -2.016526 -0.081000 +v -2.928230 -1.545907 -0.144000 +v -2.928230 -1.545907 0.144000 +v -2.925611 -1.679131 -0.189000 +v -2.925611 -1.679131 0.189000 +v -2.920870 -1.908779 -0.189000 +v -2.920870 -1.908779 0.189000 +v -2.910131 -2.008181 -0.144000 +v -2.910131 -2.008181 0.144000 +v -2.904150 -1.406137 0.000000 +v -2.904150 -1.406137 0.000000 +v -2.896846 -1.410135 0.081000 +v -2.896846 -1.410135 -0.081000 +v -2.896602 -1.557869 -0.189000 +v -2.896602 -1.557869 0.189000 +v -2.894400 -1.8 -0.216000 +v -2.894400 -1.8 0.216000 +v -2.885416 -1.687296 -0.216000 +v -2.885416 -1.687296 0.216000 +v -2.880491 -1.900487 -0.216000 +v -2.880491 -1.900487 0.216000 +v -2.877965 -1.995883 -0.189000 +v -2.877965 -1.995883 0.189000 +v -2.877022 -1.420985 -0.144000 +v -2.877022 -1.420985 0.144000 +v -2.865000 -2.09565 0.000000 +v -2.858195 -1.572394 0.216000 +v -2.858195 -1.572394 -0.216000 +v -2.857432 -2.091511 -0.081000 +v -2.857432 -2.091511 0.081000 +v -2.850000 -1.8 -0.225000 +v -2.850000 -1.8 0.225000 +v -2.847806 -1.436974 0.189000 +v -2.847806 -1.436974 -0.189000 +v -2.841675 -1.696181 0.225000 +v -2.841675 -1.696181 -0.225000 +v -2.838906 -1.98095 -0.216000 +v -2.838906 -1.98095 0.216000 +v -2.836889 -2.080276 -0.144000 +v -2.836889 -2.080276 0.144000 +v -2.836550 -1.891463 -0.225000 +v -2.836550 -1.891463 0.225000 +v -2.828800 -1.2804 0.000000 +v -2.822326 -1.285171 -0.081000 +v -2.822326 -1.285171 0.081000 +v -2.816400 -1.5882 -0.225000 +v -2.816400 -1.5882 0.225000 +v -2.812331 -1.45639 0.216000 +v -2.812331 -1.45639 -0.216000 +v -2.806615 -2.06372 -0.189000 +v -2.806615 -2.06372 0.189000 +v -2.805600 -1.8 -0.216000 +v -2.805600 -1.8 0.216000 +v -2.804755 -1.298122 -0.144000 +v -2.804755 -1.298122 0.144000 +v -2.797934 -1.705067 -0.216000 +v -2.797934 -1.705067 0.216000 +v -2.796400 -1.9647 0.225000 +v -2.796400 -1.9647 -0.225000 +v -2.792609 -1.882438 -0.216000 +v -2.792609 -1.882438 0.216000 +v -2.778861 -1.317206 -0.189000 +v -2.778861 -1.317206 0.189000 +v -2.774605 -1.604006 0.216000 +v -2.774605 -1.604006 -0.216000 +v -2.773725 -1.477519 0.225000 +v -2.773725 -1.477519 -0.225000 +v -2.769854 -2.043616 -0.216000 +v -2.769854 -2.043616 0.216000 +v -2.764800 -1.8 -0.189000 +v -2.764800 -1.8 0.189000 +v -2.760000 -2.1528 0.000000 +v -2.760000 -2.1528 0.000000 +v -2.757739 -1.713232 -0.189000 +v -2.757739 -1.713232 0.189000 +v -2.753894 -1.94845 -0.216000 +v -2.753894 -1.94845 0.216000 +v -2.753123 -2.147861 -0.081000 +v -2.753123 -2.147861 0.081000 +v -2.752230 -1.874146 -0.189000 +v -2.752230 -1.874146 0.189000 +v -2.747418 -1.340381 -0.216000 +v -2.747418 -1.340381 0.216000 +v -2.736198 -1.618531 -0.189000 +v -2.736198 -1.618531 0.189000 +v -2.735119 -1.498648 0.216000 +v -2.735119 -1.498648 -0.216000 +v -2.734458 -2.134454 -0.144000 +v -2.734458 -2.134454 0.144000 +v -2.731250 -1.157813 0.000000 +v -2.731250 -1.157813 0.000000 +v -2.731200 -1.8 -0.144000 +v -2.731200 -1.8 0.144000 +v -2.729850 -2.021737 -0.225000 +v -2.729850 -2.021737 0.225000 +v -2.725825 -1.163194 0.081000 +v -2.725825 -1.163194 -0.081000 +v -2.724637 -1.719956 -0.144000 +v -2.724637 -1.719956 0.144000 +v -2.718978 -1.867316 -0.144000 +v -2.718978 -1.867316 0.144000 +v -2.714835 -1.933517 -0.189000 +v -2.714835 -1.933517 0.189000 +v -2.713200 -1.3656 -0.225000 +v -2.713200 -1.3656 0.225000 +v -2.711100 -1.1778 -0.144000 +v -2.711100 -1.1778 0.144000 +v -2.708400 -1.8 -0.081000 +v -2.708400 -1.8 0.081000 +v -2.706950 -2.114698 -0.189000 +v -2.706950 -2.114698 0.189000 +v -2.704570 -1.630493 -0.144000 +v -2.704570 -1.630493 0.144000 +v -2.702175 -1.724519 -0.081000 +v -2.702175 -1.724519 0.081000 +v -2.700000 -1.8 0.000000 +v -2.699644 -1.518063 0.189000 +v -2.699644 -1.518063 -0.189000 +v -2.696413 -1.862682 -0.081000 +v -2.696413 -1.862682 0.081000 +v -2.693900 -1.7262 0.000000 +v -2.689846 -1.999859 -0.216000 +v -2.689846 -1.999859 0.216000 +v -2.689400 -1.199325 -0.189000 +v -2.689400 -1.199325 0.189000 +v -2.688100 -1.860975 0.000000 +v -2.688100 -1.860975 0.000000 +v -2.683107 -1.63861 -0.081000 +v -2.683107 -1.63861 0.081000 +v -2.682669 -1.921219 -0.144000 +v -2.682669 -1.921219 0.144000 +v -2.678982 -1.390819 -0.216000 +v -2.678982 -1.390819 0.216000 +v -2.675200 -1.6416 0.000000 +v -2.675200 -1.6416 0.000000 +v -2.673549 -2.090707 -0.216000 +v -2.673549 -2.090707 0.216000 +v -2.670428 -1.534053 -0.144000 +v -2.670428 -1.534053 0.144000 +v -2.663050 -1.225463 -0.216000 +v -2.663050 -1.225463 0.216000 +v -2.660842 -1.912874 0.081000 +v -2.660842 -1.912874 -0.081000 +v -2.653085 -1.979755 -0.189000 +v -2.653085 -1.979755 0.189000 +v -2.652800 -1.9098 0.000000 +v -2.652800 -1.9098 0.000000 +v -2.650604 -1.544903 0.081000 +v -2.650604 -1.544903 -0.081000 +v -2.647539 -1.413994 -0.189000 +v -2.647539 -1.413994 0.189000 +v -2.643300 -1.5489 0.000000 +v -2.637200 -2.0646 -0.225000 +v -2.637200 -2.0646 0.225000 +v -2.634375 -1.253906 0.225000 +v -2.634375 -1.253906 -0.225000 +v -2.625000 -2.19375 0.000000 +v -2.622811 -1.963199 -0.144000 +v -2.622811 -1.963199 0.144000 +v -2.621645 -1.433078 -0.144000 +v -2.621645 -1.433078 0.144000 +v -2.619050 -2.188238 -0.081000 +v -2.619050 -2.188238 0.081000 +v -2.611200 -1.0386 0.000000 +v -2.611200 -1.0386 0.000000 +v -2.607034 -1.044497 0.081000 +v -2.607034 -1.044497 -0.081000 +v -2.605700 -1.28235 -0.216000 +v -2.605700 -1.28235 0.216000 +v -2.604074 -1.446029 -0.081000 +v -2.604074 -1.446029 0.081000 +v -2.602900 -2.173275 -0.144000 +v -2.602900 -2.173275 0.144000 +v -2.602268 -1.951964 -0.081000 +v -2.602268 -1.951964 0.081000 +v -2.600851 -2.038493 -0.216000 +v -2.600851 -2.038493 0.216000 +v -2.597600 -1.4508 0.000000 +v -2.595725 -1.060502 -0.144000 +v -2.595725 -1.060502 0.144000 +v -2.594700 -1.947825 0.000000 +v -2.579350 -1.308488 -0.189000 +v -2.579350 -1.308488 0.189000 +v -2.579100 -2.151225 -0.189000 +v -2.579100 -2.151225 0.189000 +v -2.579059 -1.08409 -0.189000 +v -2.579059 -1.08409 0.189000 +v -2.567450 -2.014502 -0.189000 +v -2.567450 -2.014502 0.189000 +v -2.558822 -1.112731 0.216000 +v -2.558822 -1.112731 -0.216000 +v -2.557650 -1.330013 -0.144000 +v -2.557650 -1.330013 0.144000 +v -2.550200 -2.12445 -0.216000 +v -2.550200 -2.12445 0.216000 +v -2.542925 -1.344619 0.081000 +v -2.542925 -1.344619 -0.081000 +v -2.539942 -1.994746 -0.144000 +v -2.539942 -1.994746 0.144000 +v -2.537500 -1.35 0.000000 +v -2.537500 -1.35 0.000000 +v -2.536800 -1.1439 0.225000 +v -2.536800 -1.1439 -0.225000 +v -2.521277 -1.981339 -0.081000 +v -2.521277 -1.981339 0.081000 +v -2.518750 -2.095312 -0.225000 +v -2.518750 -2.095312 0.225000 +v -2.514778 -1.175069 0.216000 +v -2.514778 -1.175069 -0.216000 +v -2.514400 -1.9764 0.000000 +v -2.514400 -1.9764 0.000000 +v -2.494541 -1.20371 -0.189000 +v -2.494541 -1.20371 0.189000 +v -2.487300 -2.066175 -0.216000 +v -2.487300 -2.066175 0.216000 +v -2.477875 -1.227298 -0.144000 +v -2.477875 -1.227298 0.144000 +v -2.468350 -0.922987 0.000000 +v -2.466566 -1.243303 0.081000 +v -2.466566 -1.243303 -0.081000 +v -2.465644 -0.929375 -0.081000 +v -2.465644 -0.929375 0.081000 +v -2.462400 -1.2492 0.000000 +v -2.462400 -1.2492 0.000000 +v -2.460000 -2.2212 0.000000 +v -2.460000 -2.2212 0.000000 +v -2.458400 -2.0394 -0.189000 +v -2.458400 -2.0394 0.189000 +v -2.458298 -0.946711 -0.144000 +v -2.458298 -0.946711 0.144000 +v -2.455229 -2.215303 -0.081000 +v -2.455229 -2.215303 0.081000 +v -2.447474 -0.97226 0.189000 +v -2.447474 -0.97226 -0.189000 +v -2.442278 -2.199298 -0.144000 +v -2.442278 -2.199298 0.144000 +v -2.434600 -2.01735 -0.144000 +v -2.434600 -2.01735 0.144000 +v -2.434329 -1.003283 -0.216000 +v -2.434329 -1.003283 0.216000 +v -2.423194 -2.17571 -0.189000 +v -2.423194 -2.17571 0.189000 +v -2.420025 -1.037044 -0.225000 +v -2.420025 -1.037044 0.225000 +v -2.418450 -2.002387 -0.081000 +v -2.418450 -2.002388 0.081000 +v -2.412500 -1.996875 0.000000 +v -2.412500 -1.996875 0.000000 +v -2.405721 -1.070804 -0.216000 +v -2.405721 -1.070804 0.216000 +v -2.400019 -2.147069 -0.216000 +v -2.400019 -2.147069 0.216000 +v -2.392576 -1.101828 -0.189000 +v -2.392576 -1.101828 0.189000 +v -2.381752 -1.127376 -0.144000 +v -2.381752 -1.127376 0.144000 +v -2.374800 -2.1159 -0.225000 +v -2.374800 -2.1159 0.225000 +v -2.374406 -1.144713 0.081000 +v -2.374406 -1.144713 -0.081000 +v -2.371700 -1.1511 0.000000 +v -2.349581 -2.084731 -0.216000 +v -2.349581 -2.084731 0.216000 +v -2.326406 -2.05609 -0.189000 +v -2.326406 -2.05609 0.189000 +v -2.307322 -2.032502 -0.144000 +v -2.307322 -2.032502 0.144000 +v -2.302400 -0.8112 0.000000 +v -2.302400 -0.8112 0.000000 +v -2.301347 -0.818122 0.081000 +v -2.301347 -0.818122 -0.081000 +v -2.298490 -0.836909 0.144000 +v -2.298490 -0.836909 -0.144000 +v -2.294371 -2.016497 -0.081000 +v -2.294371 -2.016497 0.081000 +v -2.294278 -0.864595 0.189000 +v -2.294278 -0.864595 -0.189000 +v -2.289600 -2.0106 0.000000 +v -2.289600 -2.0106 0.000000 +v -2.289165 -0.898214 0.216000 +v -2.289165 -0.898214 -0.216000 +v -2.283600 -0.9348 0.225000 +v -2.283600 -0.9348 -0.225000 +v -2.278035 -0.971386 0.216000 +v -2.278035 -0.971386 -0.216000 +v -2.272922 -1.005005 0.189000 +v -2.272922 -1.005005 -0.189000 +v -2.268710 -1.032691 -0.144000 +v -2.268710 -1.032691 0.144000 +v -2.265853 -1.051478 0.081000 +v -2.265853 -1.051478 -0.081000 +v -2.265000 -2.23785 0.000000 +v -2.264800 -1.0584 0.000000 +v -2.264800 -1.0584 0.000000 +v -2.261676 -2.23172 -0.081000 +v -2.261676 -2.23172 0.081000 +v -2.252655 -2.215082 -0.144000 +v -2.252655 -2.215082 0.144000 +v -2.239361 -2.190562 -0.189000 +v -2.239361 -2.190562 0.189000 +v -2.223218 -2.160788 -0.216000 +v -2.223218 -2.160788 0.216000 +v -2.205650 -2.128387 0.225000 +v -2.205650 -2.128388 -0.225000 +v -2.188082 -2.095987 -0.216000 +v -2.188082 -2.095987 0.216000 +v -2.171939 -2.066213 -0.189000 +v -2.171939 -2.066213 0.189000 +v -2.158645 -2.041693 -0.144000 +v -2.158645 -2.041693 0.144000 +v -2.149624 -2.025055 -0.081000 +v -2.149624 -2.025055 0.081000 +v -2.146300 -2.018925 0.000000 +v -2.141100 -0.9738 0.000000 +v -2.141100 -0.9738 0.000000 +v -2.140315 -0.966231 0.081000 +v -2.140315 -0.966231 -0.081000 +v -2.138183 -0.945685 0.144000 +v -2.138183 -0.945685 -0.144000 +v -2.135041 -0.915407 0.189000 +v -2.135041 -0.915407 -0.189000 +v -2.131226 -0.878641 0.216000 +v -2.131226 -0.878641 -0.216000 +v -2.127075 -0.838631 0.225000 +v -2.127075 -0.838631 -0.225000 +v -2.122924 -0.798621 0.216000 +v -2.122924 -0.798621 -0.216000 +v -2.119109 -0.761855 0.189000 +v -2.119109 -0.761855 -0.189000 +v -2.115967 -0.731578 0.144000 +v -2.115967 -0.731578 -0.144000 +v -2.113835 -0.711032 0.081000 +v -2.113835 -0.711032 -0.081000 +v -2.113050 -0.703463 0.000000 +v -2.113050 -0.703463 0.000000 +v -2.040000 -2.2464 0.000000 +v -2.040000 -2.2464 0.000000 +v -2.038410 -2.24015 -0.081000 +v -2.038410 -2.24015 0.081000 +v -2.034093 -2.223187 -0.144000 +v -2.034093 -2.223187 0.144000 +v -2.027731 -2.198189 -0.189000 +v -2.027731 -2.198189 0.189000 +v -2.020006 -2.167834 0.216000 +v -2.020006 -2.167834 -0.216000 +v -2.011600 -2.1348 0.225000 +v -2.011600 -2.1348 -0.225000 +v -2.003194 -2.101766 0.216000 +v -2.003194 -2.101766 -0.216000 +v -2.000000 -0.9 0.000000 +v -2.000000 -0.9 0.000000 +v -2.000000 -0.9 0.000000 +v -1.997200 -0.8916 0.081000 +v -1.997200 -0.8916 -0.081000 +v -1.995469 -2.071411 -0.189000 +v -1.995469 -2.071411 0.189000 +v -1.992750 -1.037175 -0.000000 +v -1.992750 -1.037175 0.000000 +v -1.989600 -0.8688 0.144000 +v -1.989600 -0.8688 -0.144000 +v -1.989107 -2.046413 0.144000 +v -1.989107 -2.046413 -0.144000 +v -1.986000 -0.771675 0.000000 +v -1.986000 -0.771675 0.000000 +v -1.984790 -2.02945 -0.081000 +v -1.984790 -2.02945 0.081000 +v -1.983200 -2.0232 0.000000 +v -1.983200 -2.0232 0.000000 +v -1.978400 -0.8352 0.189000 +v -1.978400 -0.8352 -0.189000 +v -1.974240 -0.9 -0.328160 +v -1.974240 -0.9 -0.328160 +v -1.974240 -0.9 0.328160 +v -1.972000 -1.1784 -0.000000 +v -1.972000 -1.1784 0.000000 +v -1.967083 -1.037175 -0.326970 +v -1.967083 -1.037175 0.326970 +v -1.964800 -0.7944 0.216000 +v -1.964800 -0.7944 -0.216000 +v -1.960420 -0.771675 -0.325863 +v -1.960420 -0.771675 0.325863 +v -1.950000 -0.75 -0.225000 +v -1.950000 -0.75 0.225000 +v -1.948000 -0.6564 0.000000 +v -1.948000 -0.6564 0.000000 +v -1.946601 -1.1784 -0.323566 +v -1.946601 -1.1784 0.323566 +v -1.939250 -1.323225 0.000000 +v -1.939250 -1.323225 0.000000 +v -1.935200 -0.7056 0.216000 +v -1.935200 -0.7056 -0.216000 +v -1.922910 -0.6564 -0.319628 +v -1.922910 -0.6564 0.319628 +v -1.921600 -0.6648 0.189000 +v -1.921600 -0.6648 -0.189000 +v -1.914272 -1.323225 -0.318192 +v -1.914272 -1.323225 0.318192 +v -1.910400 -0.6312 0.144000 +v -1.910400 -0.6312 -0.144000 +v -1.902800 -0.6084 0.081000 +v -1.902800 -0.6084 -0.081000 +v -1.900000 -0.6 0.000000 +v -1.900000 -0.6 0.000000 +v -1.899520 -0.9 -0.638080 +v -1.899520 -0.9 -0.638080 +v -1.899520 -0.9 0.638080 +v -1.899520 -0.9 0.638080 +v -1.896000 -1.4712 0.000000 +v -1.896000 -1.4712 0.000000 +v -1.892634 -1.037175 -0.635767 +v -1.892634 -1.037175 0.635767 +v -1.892000 -0.553725 0.000000 +v -1.892000 -0.553725 0.000000 +v -1.886223 -0.771675 -0.633613 +v -1.886223 -0.771675 0.633613 +v -1.872927 -1.1784 -0.629147 +v -1.872927 -1.1784 0.629147 +v -1.871580 -1.4712 -0.311096 +v -1.871580 -1.4712 0.311096 +v -1.867631 -0.553725 -0.310439 +v -1.867631 -0.553725 0.310439 +v -1.850132 -0.6564 -0.621490 +v -1.850132 -0.6564 0.621490 +v -1.843750 -1.621875 0.000000 +v -1.843750 -1.621875 0.000000 +v -1.841822 -1.323225 -0.618698 +v -1.841822 -1.323225 0.618698 +v -1.824000 -0.4632 -0.000000 +v -1.824000 -0.4632 0.000000 +v -1.820003 -1.621875 -0.302522 +v -1.820003 -1.621875 0.302523 +v -1.800900 -2.024775 0.000000 +v -1.800745 -1.4712 -0.604900 +v -1.800745 -1.4712 0.604900 +v -1.800507 -0.4632 -0.299282 +v -1.800507 -0.4632 0.299282 +v -1.800455 -2.031069 -0.081000 +v -1.800455 -2.031069 0.081000 +v -1.799246 -2.048152 -0.144000 +v -1.799246 -2.048152 0.144000 +v -1.797466 -2.073326 -0.189000 +v -1.797466 -2.073326 0.189000 +v -1.796946 -0.553725 -0.603624 +v -1.796946 -0.553725 0.603624 +v -1.795303 -2.103896 -0.216000 +v -1.795303 -2.103896 0.216000 +v -1.792950 -2.137163 -0.225000 +v -1.792950 -2.137163 0.225000 +v -1.790597 -2.170429 -0.216000 +v -1.790597 -2.170429 0.216000 +v -1.788434 -2.200999 -0.189000 +v -1.788434 -2.200999 0.189000 +v -1.786654 -2.226173 -0.144000 +v -1.786654 -2.226173 0.144000 +v -1.785445 -2.243256 -0.081000 +v -1.785445 -2.243256 0.081000 +v -1.785000 -2.24955 0.000000 +v -1.784000 -1.7748 -0.000000 +v -1.784000 -1.7748 0.000000 +v -1.779680 -0.9 -0.925920 +v -1.779680 -0.9 -0.925920 +v -1.779680 -0.9 0.925920 +v -1.779680 -0.9 0.925920 +v -1.773229 -1.037175 -0.922564 +v -1.773229 -1.037175 0.922564 +v -1.767222 -0.771675 -0.919439 +v -1.767222 -0.771675 0.919439 +v -1.761022 -1.7748 -0.292719 +v -1.761022 -1.7748 0.292719 +v -1.754764 -1.1784 -0.912957 +v -1.754764 -1.1784 0.912957 +v -1.751120 -1.621875 -0.588230 +v -1.751120 -1.621875 0.588230 +v -1.750000 -0.384375 -0.000000 +v -1.750000 -0.384375 0.000000 +v -1.733408 -0.6564 -0.901846 +v -1.733408 -0.6564 0.901846 +v -1.732362 -0.4632 -0.581929 +v -1.732362 -0.4632 0.581929 +v -1.727460 -0.384375 -0.287140 +v -1.727460 -0.384375 0.287140 +v -1.725622 -1.323225 -0.897795 +v -1.725622 -1.323225 0.897795 +v -1.718250 -1.929525 -0.000000 +v -1.718250 -1.929525 0.000000 +v -1.696119 -1.929525 -0.281930 +v -1.696119 -1.929525 0.281930 +v -1.694372 -1.7748 -0.569167 +v -1.694372 -1.7748 0.569167 +v -1.687137 -1.4712 -0.877772 +v -1.687137 -1.4712 0.877772 +v -1.683577 -0.553725 -0.875920 +v -1.683577 -0.553725 0.875920 +v -1.676000 -0.3168 0.000000 +v -1.676000 -0.3168 0.000000 +v -1.662080 -0.384375 -0.558320 +v -1.662080 -0.384375 0.558320 +v -1.654413 -0.3168 -0.274998 +v -1.654413 -0.3168 0.274998 +v -1.648000 -2.0856 0.000000 +v -1.648000 -2.0856 0.000000 +v -1.640643 -1.621875 -0.853583 +v -1.640643 -1.621875 0.853583 +v -1.631925 -1.929525 -0.548190 +v -1.631925 -1.929525 0.548190 +v -1.626774 -2.0856 -0.270404 +v -1.626774 -2.0856 0.270404 +v -1.623068 -0.4632 -0.844439 +v -1.623068 -0.4632 0.844439 +v -1.618560 -0.9 -1.187840 +v -1.618560 -0.9 -1.187840 +v -1.618560 -0.9 1.187840 +v -1.618560 -0.9 1.187840 +v -1.612693 -1.037175 -1.183534 +v -1.612693 -1.037175 1.183534 +v -1.608000 -0.260025 -0.000000 +v -1.608000 -0.260025 0.000000 +v -1.607230 -0.771675 -1.179525 +v -1.607230 -0.771675 1.179525 +v -1.600000 -2.025 0.000000 +v -1.597200 -2.0313 -0.081000 +v -1.597200 -2.0313 0.081000 +v -1.595900 -1.1784 -1.171210 +v -1.595900 -1.1784 1.171210 +v -1.591798 -0.3168 -0.534711 +v -1.591798 -0.3168 0.534711 +v -1.589600 -2.0484 -0.144000 +v -1.589600 -2.0484 0.144000 +v -1.587475 -1.7748 -0.825921 +v -1.587475 -1.7748 0.825921 +v -1.587289 -0.260025 0.263841 +v -1.587289 -0.260025 -0.263841 +v -1.578400 -2.0736 -0.189000 +v -1.578400 -2.0736 0.189000 +v -1.576477 -0.6564 -1.156956 +v -1.576477 -0.6564 1.156956 +v -1.574750 -2.242575 0.000000 +v -1.574750 -2.242575 0.000000 +v -1.569396 -1.323225 -1.151759 +v -1.569396 -1.323225 1.151759 +v -1.565204 -2.0856 -0.525778 +v -1.565204 -2.0856 0.525778 +v -1.564800 -2.1042 -0.216000 +v -1.564800 -2.1042 0.216000 +v -1.557220 -0.384375 -0.810180 +v -1.557220 -0.384375 0.810180 +v -1.554467 -2.242575 -0.258385 +v -1.554467 -2.242575 0.258385 +v -1.552000 -0.2136 0.000000 +v -1.552000 -0.2136 0.000000 +v -1.550000 -2.1375 -0.225000 +v -1.550000 -2.1375 0.225000 +v -1.535200 -2.1708 -0.216000 +v -1.535200 -2.1708 0.216000 +v -1.534395 -1.4712 -1.126072 +v -1.534395 -1.4712 1.126072 +v -1.532010 -0.2136 0.254652 +v -1.532010 -0.2136 -0.254652 +v -1.531158 -0.553725 -1.123697 +v -1.531158 -0.553725 1.123697 +v -1.528968 -1.929525 -0.795481 +v -1.528968 -1.929525 0.795481 +v -1.527214 -0.260025 -0.513016 +v -1.527214 -0.260025 0.513016 +v -1.521600 -2.2014 -0.189000 +v -1.521600 -2.2014 0.189000 +v -1.514000 -0.177075 0.000000 +v -1.514000 -0.177075 0.000000 +v -1.510400 -2.2266 -0.144000 +v -1.510400 -2.2266 0.144000 +v -1.502800 -2.2437 -0.081000 +v -1.502800 -2.2437 0.081000 +v -1.500000 -2.4 0.000000 +v -1.500000 -0.15 0.000000 +v -1.500000 -2.25 0.000000 +v -1.500000 -2.4 0.000000 +v -1.500000 -0.15 0.000000 +v -1.496475 -0.127575 -0.000000 +v -1.496475 -0.127575 0.000000 +v -1.495635 -2.242575 -0.502408 +v -1.495635 -2.242575 0.502408 +v -1.494500 -0.177075 0.248417 +v -1.494500 -0.177075 -0.248417 +v -1.492110 -1.621875 -1.095040 +v -1.492110 -1.621875 1.095040 +v -1.491372 -0.3168 -0.775921 +v -1.491372 -0.3168 0.775921 +v -1.480800 -0.1056 0.000000 +v -1.480800 -0.1056 -0.000000 +v -1.480680 -2.4 -0.246120 +v -1.480680 -0.15 0.246120 +v -1.480680 -2.4 0.246120 +v -1.480680 -0.15 -0.246120 +v -1.480680 -0.15 -0.246120 +v -1.480680 -0.15 0.246120 +v -1.480325 -2.435437 0.000000 +v -1.480325 -2.435437 0.000000 +v -1.477200 -0.127575 0.245542 +v -1.477200 -0.127575 -0.245542 +v -1.476127 -0.4632 -1.083310 +v -1.476127 -0.4632 1.083310 +v -1.474028 -0.2136 0.495150 +v -1.474028 -0.2136 -0.495150 +v -1.466456 -2.0856 -0.762958 +v -1.466456 -2.0856 0.762958 +v -1.461727 -0.1056 -0.242970 +v -1.461727 -0.1056 0.242970 +v -1.461258 -2.435437 -0.242892 +v -1.461258 -2.435437 0.242892 +v -1.459600 -2.463 0.000000 +v -1.459600 -2.463 0.000000 +v -1.445325 -0.084525 0.000000 +v -1.445325 -0.084525 0.000000 +v -1.443756 -1.7748 -1.059553 +v -1.443756 -1.7748 1.059553 +v -1.440800 -2.463 -0.239491 +v -1.440800 -2.463 0.239491 +v -1.439025 -2.482687 0.000000 +v -1.437937 -0.177075 0.483027 +v -1.437937 -0.177075 -0.483027 +v -1.430863 -0.260025 0.744440 +v -1.430863 -0.260025 -0.744440 +v -1.426709 -0.084525 -0.237149 +v -1.426709 -0.084525 0.237149 +v -1.424640 -2.4 -0.478560 +v -1.424640 -0.15 -0.478560 +v -1.424640 -0.15 -0.478560 +v -1.424640 -0.15 0.478560 +v -1.424640 -0.15 0.478560 +v -1.424640 -2.4 0.478560 +v -1.421292 -0.127575 0.477435 +v -1.421292 -0.127575 -0.477435 +v -1.420490 -2.482687 -0.236115 +v -1.420490 -2.482687 0.236115 +v -1.420000 -0.9 -1.420000 +v -1.420000 -0.9 -1.420000 +v -1.420000 -0.9 1.420000 +v -1.420000 -0.9 1.420000 +v -1.419800 -2.4945 0.000000 +v -1.419800 -2.4945 0.000000 +v -1.416240 -0.384375 -1.039360 +v -1.416240 -0.384375 1.039360 +v -1.414853 -1.037175 -1.414853 +v -1.414853 -1.037175 1.414853 +v -1.410060 -0.771675 -1.410060 +v -1.410060 -0.771675 1.410060 +v -1.406405 -0.1056 -0.472434 +v -1.406405 -0.1056 0.472434 +v -1.405953 -2.435437 -0.472283 +v -1.405953 -2.435437 0.472283 +v -1.403125 -2.498438 0.000000 +v -1.403125 -2.498438 0.000000 +v -1.401513 -2.4945 -0.232961 +v -1.401513 -2.4945 0.232961 +v -1.401276 -2.242575 -0.729046 +v -1.401276 -2.242575 0.729046 +v -1.400120 -1.1784 -1.400120 +v -1.400120 -1.1784 1.400120 +v -1.400000 -2.4 0.000000 +v -1.400000 -2.4 0.000000 +v -1.390545 -1.929525 -1.020503 +v -1.390545 -1.929525 1.020503 +v -1.390200 -2.4945 0.000000 +v -1.390200 -2.4945 0.000000 +v -1.386270 -2.463 -0.465671 +v -1.386270 -2.463 0.465671 +v -1.385925 -2.435437 0.000000 +v -1.385925 -2.435437 0.000000 +v -1.385053 -2.498438 -0.230225 +v -1.385053 -2.498438 0.230225 +v -1.383080 -0.6564 -1.383080 +v -1.383080 -0.6564 1.383080 +v -1.382400 -0.0648 -0.000000 +v -1.382400 -0.0648 0.000000 +v -1.382225 -2.482687 -0.000000 +v -1.382225 -2.482687 0.000000 +v -1.381968 -2.4 -0.229712 +v -1.381968 -2.4 0.229712 +v -1.381032 -0.2136 0.718514 +v -1.381032 -0.2136 -0.718514 +v -1.380400 -2.463 0.000000 +v -1.380400 -2.463 0.000000 +v -1.376868 -1.323225 -1.376867 +v -1.376867 -1.323225 1.376868 +v -1.372712 -0.084525 -0.461116 +v -1.372712 -0.084525 0.461116 +v -1.372294 -2.4945 -0.228104 +v -1.372294 -2.4945 0.228104 +v -1.368074 -2.435437 -0.227403 +v -1.368074 -2.435437 0.227403 +v -1.366728 -2.482687 -0.459107 +v -1.366728 -2.482687 0.459107 +v -1.364595 -0.0648 -0.226824 +v -1.364595 -0.0648 0.226824 +v -1.364422 -2.482687 -0.226795 +v -1.364422 -2.482687 0.226795 +v -1.362620 -2.463 -0.226496 +v -1.362620 -2.463 0.226496 +v -1.356353 -0.3168 -0.995410 +v -1.356353 -0.3168 0.995410 +v -1.348469 -2.4945 -0.452973 +v -1.348469 -2.4945 0.452973 +v -1.347218 -0.177075 0.700921 +v -1.347218 -0.177075 -0.700921 +v -1.346160 -1.4712 -1.346160 +v -1.346160 -1.4712 1.346160 +v -1.343320 -0.553725 -1.343320 +v -1.343320 -0.553725 1.343320 +v -1.334760 -2.4 -0.694440 +v -1.334760 -0.15 -0.694440 +v -1.334760 -0.15 0.694440 +v -1.334760 -0.15 0.694440 +v -1.334760 -2.4 0.694440 +v -1.334760 -0.15 -0.694440 +v -1.333693 -2.0856 -0.978780 +v -1.333693 -2.0856 0.978780 +v -1.332632 -2.498438 -0.447653 +v -1.332632 -2.498438 0.447653 +v -1.331623 -0.127575 0.692808 +v -1.331623 -0.127575 -0.692808 +v -1.329664 -2.4 -0.446656 +v -1.329664 -2.4 0.446656 +v -1.320356 -2.4945 -0.443529 +v -1.320356 -2.4945 0.443529 +v -1.317675 -0.1056 -0.685551 +v -1.317675 -0.1056 0.685551 +v -1.317252 -2.435437 -0.685331 +v -1.317252 -2.435437 0.685331 +v -1.316296 -2.435437 -0.442166 +v -1.316296 -2.435437 0.442166 +v -1.312948 -0.0648 0.441041 +v -1.312948 -0.0648 -0.441041 +v -1.312782 -2.482687 -0.440985 +v -1.312782 -2.482687 0.440985 +v -1.311049 -2.463 -0.440403 +v -1.311049 -2.463 0.440403 +v -1.309063 -1.621875 -1.309063 +v -1.309063 -1.621875 1.309063 +v -1.301322 -0.260025 0.955023 +v -1.301322 -0.260025 -0.955023 +v -1.300000 -2.4 0.000000 +v -1.300000 -2.4 0.000000 +v -1.298810 -2.463 -0.675736 +v -1.298810 -2.463 0.675736 +v -1.295040 -0.4632 -1.295040 +v -1.295040 -0.4632 1.295040 +v -1.286108 -0.084525 -0.669128 +v -1.286108 -0.084525 0.669128 +v -1.284375 -0.046875 0.000000 +v -1.284375 -0.046875 0.000000 +v -1.283256 -2.4 -0.213304 +v -1.283256 -2.4 0.213304 +v -1.280502 -2.482687 -0.666211 +v -1.280502 -2.482687 0.666211 +v -1.274600 -2.4408 0.000000 +v -1.274600 -2.4408 0.000000 +v -1.274414 -2.242575 -0.935276 +v -1.274414 -2.242575 0.935276 +v -1.267832 -0.046875 -0.210740 +v -1.267832 -0.046875 0.210740 +v -1.266640 -1.7748 -1.266640 +v -1.266640 -1.7748 1.266640 +v -1.263395 -2.4945 -0.657311 +v -1.263395 -2.4945 0.657311 +v -1.258183 -2.4408 0.209136 +v -1.258183 -2.4408 -0.209136 +v -1.256003 -0.2136 0.921764 +v -1.256003 -0.2136 -0.921764 +v -1.248557 -2.498438 -0.649591 +v -1.248557 -2.498438 0.649591 +v -1.245776 -2.4 -0.648144 +v -1.245776 -2.4 0.648144 +v -1.242500 -0.384375 -1.242500 +v -1.242500 -0.384375 1.242500 +v -1.237056 -2.4945 -0.643607 +v -1.237056 -2.4945 0.643607 +v -1.234688 -2.4 -0.414752 +v -1.234688 -2.4 0.414752 +v -1.233252 -2.435437 -0.641628 +v -1.233252 -2.435437 0.641628 +v -1.230115 -0.0648 -0.639996 +v -1.230115 -0.0648 0.639996 +v -1.229959 -2.482687 -0.639915 +v -1.229959 -2.482687 0.639915 +v -1.228335 -2.463 -0.639070 +v -1.228335 -2.463 0.639070 +v -1.225250 -0.177075 0.899195 +v -1.225250 -0.177075 -0.899195 +v -1.219958 -1.929525 1.219958 +v -1.219958 -1.929525 -1.219958 +v -1.219848 -0.046875 -0.409767 +v -1.219848 -0.046875 0.409767 +v -1.213920 -2.4 -0.890880 +v -1.213920 -0.15 -0.890880 +v -1.213920 -0.15 -0.890880 +v -1.213920 -0.15 0.890880 +v -1.213920 -0.15 0.890880 +v -1.213920 -2.4 0.890880 +v -1.211067 -0.127575 0.888786 +v -1.211067 -0.127575 -0.888786 +v -1.210564 -2.4408 0.406648 +v -1.210564 -2.4408 -0.406648 +v -1.204800 -2.4744 0.000000 +v -1.204800 -2.4744 0.000000 +v -1.198382 -0.1056 -0.879477 +v -1.198382 -0.1056 0.879477 +v -1.197997 -2.435437 -0.879195 +v -1.197997 -2.435437 0.879195 +v -1.189960 -0.3168 -1.189960 +v -1.189960 -0.3168 1.189960 +v -1.189282 -2.4744 -0.197684 +v -1.189282 -2.4744 0.197684 +v -1.187840 -0.9 -1.618560 +v -1.187840 -0.9 -1.618560 +v -1.187840 -0.9 1.618560 +v -1.187840 -0.9 1.618560 +v -1.183534 -1.037175 -1.612693 +v -1.183534 -1.037175 1.612693 +v -1.181225 -2.463 -0.866886 +v -1.181225 -2.463 0.866886 +v -1.179525 -0.771675 -1.607230 +v -1.179525 -0.771675 1.607230 +v -1.171210 -1.1784 -1.595900 +v -1.171210 -1.1784 1.595900 +v -1.170080 -2.0856 -1.170080 +v -1.170080 -2.0856 1.170080 +v -1.169673 -0.084525 -0.858407 +v -1.169673 -0.084525 0.858407 +v -1.164574 -2.482687 -0.854666 +v -1.164574 -2.482687 0.854666 +v -1.156956 -0.6564 -1.576477 +v -1.156956 -0.6564 1.576477 +v -1.156792 -2.4 -0.601848 +v -1.156792 -2.4 0.601848 +v -1.151759 -1.323225 -1.569396 +v -1.151759 -1.323225 1.569396 +v -1.149016 -2.4945 -0.843248 +v -1.149016 -2.4945 0.843248 +v -1.144271 -2.4744 -0.384379 +v -1.144271 -2.4744 0.384379 +v -1.143600 -0.0312 0.000000 +v -1.143600 -0.0312 0.000000 +v -1.142888 -0.046875 -0.594614 +v -1.142888 -0.046875 0.594614 +v -1.141680 -0.260025 1.141680 +v -1.141680 -0.260025 -1.141680 +v -1.135521 -2.498438 -0.833344 +v -1.135521 -2.498438 0.833344 +v -1.134190 -2.4408 0.590089 +v -1.134190 -2.4408 -0.590089 +v -1.132992 -2.4 -0.831488 +v -1.132992 -2.4 0.831488 +v -1.128870 -0.0312 -0.187642 +v -1.128870 -0.0312 0.187642 +v -1.126072 -1.4712 -1.534395 +v -1.126072 -1.4712 1.534395 +v -1.125061 -2.4945 -0.825668 +v -1.125061 -2.4945 0.825668 +v -1.123697 -0.553725 -1.531158 +v -1.123697 -0.553725 1.531158 +v -1.121601 -2.435437 -0.823129 +v -1.121601 -2.435437 0.823129 +v -1.118749 -0.0648 -0.821035 +v -1.118749 -0.0648 0.821035 +v -1.118607 -2.482687 -0.820931 +v -1.118607 -2.482687 0.820931 +v -1.118073 -2.242575 -1.118073 +v -1.118073 -2.242575 1.118073 +v -1.117130 -2.463 -0.819847 +v -1.117130 -2.463 0.819847 +v -1.101920 -0.2136 1.101920 +v -1.101920 -0.2136 -1.101920 +v -1.100200 -2.5026 0.000000 +v -1.100200 -2.5026 0.000000 +v -1.095040 -1.621875 -1.492110 +v -1.095040 -1.621875 1.492110 +v -1.086146 -0.0312 0.364854 +v -1.086146 -0.0312 -0.364854 +v -1.086029 -2.5026 0.180521 +v -1.086029 -2.5026 -0.180521 +v -1.083310 -0.4632 -1.476127 +v -1.083310 -0.4632 1.476127 +v -1.074940 -0.177075 -1.074940 +v -1.074940 -0.177075 1.074940 +v -1.072079 -2.4744 -0.557774 +v -1.072079 -2.4744 0.557774 +v -1.065000 -2.4 -1.065000 +v -1.065000 -0.15 -1.065000 +v -1.065000 -0.15 1.065000 +v -1.065000 -2.4 1.065000 +v -1.062497 -0.127575 1.062497 +v -1.062497 -0.127575 -1.062497 +v -1.059553 -1.7748 -1.443756 +v -1.059553 -1.7748 1.443756 +v -1.052064 -2.4 -0.772096 +v -1.052064 -2.4 0.772096 +v -1.051368 -0.1056 -1.051368 +v -1.051368 -0.1056 1.051368 +v -1.051031 -2.435437 -1.051031 +v -1.051031 -2.435437 1.051031 +v -1.044926 -2.5026 -0.351008 +v -1.044926 -2.5026 0.351008 +v -1.039419 -0.046875 -0.762816 +v -1.039419 -0.046875 0.762816 +v -1.039360 -0.384375 -1.416240 +v -1.039360 -0.384375 1.416240 +v -1.036316 -2.463 -1.036316 +v -1.036316 -2.463 1.036316 +v -1.031508 -2.4408 0.757010 +v -1.031508 -2.4408 -0.757010 +v -1.026181 -0.084525 -1.026181 +v -1.026181 -0.084525 1.026181 +v -1.021708 -2.482687 -1.021708 +v -1.021708 -2.482687 1.021708 +v -1.020503 -1.929525 -1.390545 +v -1.020503 -1.929525 1.390545 +v -1.017621 -0.0312 0.529441 +v -1.017621 -0.0312 -0.529441 +v -1.008058 -2.4945 -1.008058 +v -1.008058 -2.4945 1.008058 +v -0.996219 -2.498438 -0.996219 +v -0.996219 -2.498438 0.996219 +v -0.995410 -0.3168 -1.356353 +v -0.995410 -0.3168 1.356353 +v -0.994000 -2.4 -0.994000 +v -0.994000 -2.4 0.994000 +v -0.987042 -2.4945 -0.987042 +v -0.987042 -2.4945 0.987042 +v -0.984007 -2.435437 -0.984007 +v -0.984007 -2.435437 0.984007 +v -0.981504 -0.0648 0.981504 +v -0.981504 -0.0648 -0.981504 +v -0.981380 -2.482687 -0.981380 +v -0.981380 -2.482687 0.981380 +v -0.980084 -2.463 -0.980084 +v -0.980084 -2.463 0.980084 +v -0.979002 -2.5026 0.509349 +v -0.979002 -2.5026 -0.509349 +v -0.978780 -2.0856 -1.333693 +v -0.978780 -2.0856 1.333693 +v -0.975021 -2.4744 -0.715555 +v -0.975021 -2.4744 0.715555 +v -0.970400 -2.5272 0.000000 +v -0.970400 -2.5272 0.000000 +v -0.957901 -2.5272 -0.159223 +v -0.957901 -2.5272 0.159223 +v -0.955023 -0.260025 1.301322 +v -0.955023 -0.260025 -1.301322 +v -0.952425 -0.018225 -0.000000 +v -0.952425 -0.018225 0.000000 +v -0.940158 -0.018225 0.156274 +v -0.940158 -0.018225 -0.156274 +v -0.935276 -2.242575 -1.274414 +v -0.935276 -2.242575 1.274414 +v -0.925920 -0.9 -1.779680 +v -0.925920 -0.9 1.779680 +v -0.925920 -0.9 1.779680 +v -0.925920 -0.9 -1.779680 +v -0.925493 -0.0312 0.679207 +v -0.925493 -0.0312 -0.679207 +v -0.923000 -2.4 -0.923000 +v -0.923000 -2.4 0.923000 +v -0.922564 -1.037175 1.773229 +v -0.922564 -1.037175 -1.773229 +v -0.921764 -0.2136 1.256003 +v -0.921764 -0.2136 -1.256003 +v -0.921647 -2.5272 -0.309596 +v -0.921647 -2.5272 0.309596 +v -0.919439 -0.771675 -1.767222 +v -0.919439 -0.771675 1.767222 +v -0.912957 -1.1784 -1.754764 +v -0.912957 -1.1784 1.754764 +v -0.911906 -0.046875 -0.911906 +v -0.911906 -0.046875 0.911906 +v -0.904966 -2.4408 0.904966 +v -0.904966 -2.4408 -0.904966 +v -0.904575 -0.018225 0.303862 +v -0.904575 -0.018225 -0.303862 +v -0.901846 -0.6564 -1.733408 +v -0.901846 -0.6564 1.733408 +v -0.899195 -0.177075 1.225250 +v -0.899195 -0.177075 -1.225250 +v -0.897795 -1.323225 -1.725622 +v -0.897795 -1.323225 1.725622 +v -0.890880 -0.15 -1.213920 +v -0.890880 -0.15 1.213920 +v -0.890880 -2.4 -1.213920 +v -0.890880 -0.15 -1.213920 +v -0.890880 -0.15 1.213920 +v -0.890880 -2.4 1.213920 +v -0.890370 -2.5026 -0.653431 +v -0.890370 -2.5026 0.653431 +v -0.888786 -0.127575 1.211067 +v -0.888786 -0.127575 -1.211067 +v -0.879477 -0.1056 -1.198382 +v -0.879477 -0.1056 1.198382 +v -0.879195 -2.435437 -1.197997 +v -0.879195 -2.435437 1.197997 +v -0.877772 -1.4712 -1.687137 +v -0.877772 -1.4712 1.687137 +v -0.875920 -0.553725 -1.683577 +v -0.875920 -0.553725 1.683577 +v -0.866886 -2.463 -1.181225 +v -0.866886 -2.463 1.181225 +v -0.863501 -2.5272 -0.449256 +v -0.863501 -2.5272 0.449256 +v -0.858407 -0.084525 -1.169673 +v -0.858407 -0.084525 1.169673 +v -0.855408 -2.4744 -0.855408 +v -0.855408 -2.4744 0.855408 +v -0.854666 -2.482687 -1.164574 +v -0.854666 -2.482687 1.164574 +v -0.853583 -1.621875 -1.640643 +v -0.853583 -1.621875 1.640643 +v -0.847506 -0.018225 -0.440935 +v -0.847506 -0.018225 0.440935 +v -0.844439 -0.4632 1.623068 +v -0.844439 -0.4632 -1.623068 +v -0.843248 -2.4945 -1.149016 +v -0.843248 -2.4945 1.149016 +v -0.833344 -2.498438 -1.135521 +v -0.833344 -2.498438 1.135521 +v -0.831488 -2.4 -1.132992 +v -0.831488 -2.4 1.132992 +v -0.825921 -1.7748 1.587475 +v -0.825921 -1.7748 -1.587475 +v -0.825668 -2.4945 -1.125061 +v -0.825668 -2.4945 1.125061 +v -0.825000 -2.55 0.000000 +v -0.825000 -2.55 0.000000 +v -0.823129 -2.435437 -1.121601 +v -0.823129 -2.435437 1.121601 +v -0.821035 -0.0648 1.118749 +v -0.821035 -0.0648 -1.118749 +v -0.820931 -2.482687 1.118607 +v -0.820931 -2.482687 -1.118607 +v -0.819847 -2.463 -1.117130 +v -0.819847 -2.463 1.117130 +v -0.814374 -2.55 -0.135366 +v -0.814374 -2.55 0.135366 +v -0.811956 -0.0312 0.811956 +v -0.811956 -0.0312 -0.811956 +v -0.810180 -0.384375 1.557220 +v -0.810180 -0.384375 -1.557220 +v -0.795481 -1.929525 1.528968 +v -0.795481 -1.929525 -1.528968 +v -0.785325 -2.5272 -0.576340 +v -0.785325 -2.5272 0.576340 +v -0.783552 -2.55 -0.263208 +v -0.783552 -2.55 0.263208 +v -0.781142 -2.5026 -0.781142 +v -0.781142 -2.5026 0.781142 +v -0.775921 -0.3168 -1.491372 +v -0.775921 -0.3168 1.491372 +v -0.772096 -2.4 -1.052064 +v -0.772096 -2.4 1.052064 +v -0.770779 -0.018225 0.565664 +v -0.770779 -0.018225 -0.565664 +v -0.762958 -2.0856 -1.466456 +v -0.762958 -2.0856 1.466456 +v -0.762816 -0.046875 -1.039419 +v -0.762816 -0.046875 1.039419 +v -0.757010 -2.4408 1.031508 +v -0.757010 -2.4408 -1.031508 +v -0.744440 -0.260025 1.430863 +v -0.744440 -0.260025 -1.430863 +v -0.734118 -2.55 -0.381942 +v -0.734118 -2.55 0.381942 +v -0.729046 -2.242575 -1.401276 +v -0.729046 -2.242575 1.401276 +v -0.718514 -0.2136 1.381032 +v -0.718514 -0.2136 -1.381032 +v -0.715555 -2.4744 -0.975021 +v -0.715555 -2.4744 0.975021 +v -0.703200 -0.0084 0.000000 +v -0.700921 -0.177075 1.347218 +v -0.700921 -0.177075 -1.347218 +v -0.694440 -0.15 -1.334760 +v -0.694440 -0.15 1.334760 +v -0.694440 -2.4 1.334760 +v -0.694440 -0.15 1.334760 +v -0.694440 -2.4 -1.334760 +v -0.694440 -0.15 -1.334760 +v -0.694143 -0.0084 -0.115381 +v -0.694143 -0.0084 0.115381 +v -0.692808 -0.127575 1.331623 +v -0.692808 -0.127575 -1.331623 +v -0.688984 -2.5272 -0.688984 +v -0.688984 -2.5272 0.688984 +v -0.685551 -0.1056 -1.317675 +v -0.685551 -0.1056 1.317675 +v -0.685331 -2.435437 -1.317252 +v -0.685331 -2.435437 1.317252 +v -0.679207 -0.0312 -0.925493 +v -0.679207 -0.0312 0.925493 +v -0.676222 -0.018225 0.676222 +v -0.676222 -0.018225 -0.676222 +v -0.675736 -2.463 -1.298810 +v -0.675736 -2.463 1.298810 +v -0.673600 -2.5728 0.000000 +v -0.673600 -2.5728 0.000000 +v -0.669128 -0.084525 -1.286108 +v -0.669128 -0.084525 1.286108 +v -0.667871 -0.0084 -0.224349 +v -0.667871 -0.0084 0.224349 +v -0.667656 -2.55 -0.489984 +v -0.667656 -2.55 0.489984 +v -0.666211 -2.482687 1.280502 +v -0.666211 -2.482687 -1.280502 +v -0.664924 -2.5728 -0.110524 +v -0.664924 -2.5728 0.110524 +v -0.657311 -2.4945 -1.263395 +v -0.657311 -2.4945 1.263395 +v -0.653431 -2.5026 -0.890370 +v -0.653431 -2.5026 0.890370 +v -0.649591 -2.498438 -1.248557 +v -0.649591 -2.498438 1.248557 +v -0.648144 -2.4 -1.245776 +v -0.648144 -2.4 1.245776 +v -0.643607 -2.4945 -1.237056 +v -0.643607 -2.4945 1.237056 +v -0.641628 -2.435437 -1.233252 +v -0.641628 -2.435437 1.233252 +v -0.639996 -0.0648 -1.230115 +v -0.639996 -0.0648 1.230115 +v -0.639915 -2.482687 1.229959 +v -0.639915 -2.482687 -1.229959 +v -0.639758 -2.5728 -0.214905 +v -0.639758 -2.5728 0.214905 +v -0.639070 -2.463 -1.228335 +v -0.639070 -2.463 1.228335 +v -0.638080 -0.9 -1.899520 +v -0.638080 -0.9 -1.899520 +v -0.638080 -0.9 1.899520 +v -0.638080 -0.9 1.899520 +v -0.635767 -1.037175 -1.892634 +v -0.635767 -1.037175 1.892634 +v -0.633613 -0.771675 -1.886223 +v -0.633613 -0.771675 1.886223 +v -0.629147 -1.1784 -1.872927 +v -0.629147 -1.1784 1.872927 +v -0.625735 -0.0084 0.325553 +v -0.625735 -0.0084 -0.325553 +v -0.621490 -0.6564 -1.850132 +v -0.621490 -0.6564 1.850132 +v -0.618698 -1.323225 -1.841822 +v -0.618698 -1.323225 1.841822 +v -0.604900 -1.4712 -1.800745 +v -0.604900 -1.4712 1.800745 +v -0.603624 -0.553725 -1.796946 +v -0.603624 -0.553725 1.796946 +v -0.601848 -2.4 -1.156792 +v -0.601848 -2.4 1.156792 +v -0.599396 -2.5728 -0.311850 +v -0.599396 -2.5728 0.311850 +v -0.594614 -0.046875 -1.142888 +v -0.594614 -0.046875 1.142888 +v -0.590089 -2.4408 1.134190 +v -0.590089 -2.4408 -1.134190 +v -0.588230 -1.621875 -1.751120 +v -0.588230 -1.621875 1.751120 +v -0.585750 -2.55 -0.585750 +v -0.585750 -2.55 0.585750 +v -0.581929 -0.4632 -1.732362 +v -0.581929 -0.4632 1.732362 +v -0.576340 -2.5272 -0.785325 +v -0.576340 -2.5272 0.785325 +v -0.569167 -1.7748 -1.694372 +v -0.569167 -1.7748 1.694372 +v -0.569086 -0.0084 -0.417645 +v -0.569086 -0.0084 0.417645 +v -0.565664 -0.018225 0.770779 +v -0.565664 -0.018225 -0.770779 +v -0.558320 -0.384375 -1.662080 +v -0.558320 -0.384375 1.662080 +v -0.557774 -2.4744 -1.072079 +v -0.557774 -2.4744 1.072079 +v -0.548190 -1.929525 -1.631925 +v -0.548190 -1.929525 1.631925 +v -0.545131 -2.5728 -0.400065 +v -0.545131 -2.5728 0.400065 +v -0.534711 -0.3168 -1.591798 +v -0.534711 -0.3168 1.591798 +v -0.529441 -0.0312 -1.017621 +v -0.529441 -0.0312 1.017621 +v -0.525800 -2.5974 0.000000 +v -0.525800 -2.5974 0.000000 +v -0.525778 -2.0856 -1.565204 +v -0.525778 -2.0856 1.565204 +v -0.519028 -2.5974 0.086273 +v -0.519028 -2.5974 -0.086273 +v -0.513016 -0.260025 -1.527214 +v -0.513016 -0.260025 1.527214 +v -0.509349 -2.5026 0.979002 +v -0.509349 -2.5026 -0.979002 +v -0.502408 -2.242575 -1.495635 +v -0.502408 -2.242575 1.495635 +v -0.499384 -2.5974 -0.167751 +v -0.499384 -2.5974 0.167751 +v -0.499272 -0.0084 -0.499272 +v -0.499272 -0.0084 0.499272 +v -0.495150 -0.2136 -1.474028 +v -0.495150 -0.2136 1.474028 +v -0.489984 -2.55 -0.667656 +v -0.489984 -2.55 0.667656 +v -0.483027 -0.177075 -1.437937 +v -0.483027 -0.177075 1.437937 +v -0.478560 -0.15 1.424640 +v -0.478560 -2.4 -1.424640 +v -0.478560 -0.15 -1.424640 +v -0.478560 -0.15 -1.424640 +v -0.478560 -0.15 1.424640 +v -0.478560 -2.4 1.424640 +v -0.478256 -2.5728 -0.478256 +v -0.478256 -2.5728 0.478256 +v -0.477435 -0.127575 1.421292 +v -0.477435 -0.127575 -1.421292 +v -0.472434 -0.1056 1.406405 +v -0.472434 -0.1056 -1.406405 +v -0.472283 -2.435437 -1.405953 +v -0.472283 -2.435437 1.405953 +v -0.467878 -2.5974 -0.243424 +v -0.467878 -2.5974 0.243424 +v -0.465671 -2.463 -1.386270 +v -0.465671 -2.463 1.386270 +v -0.461116 -0.084525 1.372712 +v -0.461116 -0.084525 -1.372712 +v -0.459107 -2.482687 -1.366728 +v -0.459107 -2.482687 1.366728 +v -0.452973 -2.4945 -1.348469 +v -0.452973 -2.4945 1.348469 +v -0.449256 -2.5272 -0.863501 +v -0.449256 -2.5272 0.863501 +v -0.447653 -2.498438 -1.332632 +v -0.447653 -2.498438 1.332632 +v -0.446656 -2.4 -1.329664 +v -0.446656 -2.4 1.329664 +v -0.443529 -2.4945 -1.320356 +v -0.443529 -2.4945 1.320356 +v -0.442166 -2.435437 -1.316296 +v -0.442166 -2.435437 1.316296 +v -0.441041 -0.0648 1.312948 +v -0.441041 -0.0648 -1.312948 +v -0.440985 -2.482687 -1.312782 +v -0.440985 -2.482687 1.312782 +v -0.440935 -0.018225 0.847506 +v -0.440935 -0.018225 -0.847506 +v -0.440403 -2.463 -1.311049 +v -0.440403 -2.463 1.311049 +v -0.425519 -2.5974 0.312283 +v -0.425519 -2.5974 -0.312283 +v -0.417645 -0.0084 -0.569086 +v -0.417645 -0.0084 0.569086 +v -0.414752 -2.4 -1.234688 +v -0.414752 -2.4 1.234688 +v -0.409767 -0.046875 1.219848 +v -0.409767 -0.046875 -1.219848 +v -0.406648 -2.4408 -1.210564 +v -0.406648 -2.4408 1.210564 +v -0.400065 -2.5728 -0.545131 +v -0.400065 -2.5728 0.545131 +v -0.391200 -2.6256 0.000000 +v -0.391200 -2.6256 0.000000 +v -0.388275 -0.002175 -0.000000 +v -0.388275 -0.002175 0.000000 +v -0.386161 -2.6256 -0.064188 +v -0.386161 -2.6256 0.064188 +v -0.384379 -2.4744 -1.144271 +v -0.384379 -2.4744 1.144271 +v -0.383274 -0.002175 -0.063708 +v -0.383274 -0.002175 0.063708 +v -0.381942 -2.55 -0.734118 +v -0.381942 -2.55 0.734118 +v -0.373318 -2.5974 -0.373318 +v -0.373318 -2.5974 0.373318 +v -0.371546 -2.6256 -0.124808 +v -0.371546 -2.6256 0.124808 +v -0.368768 -0.002175 -0.123875 +v -0.368768 -0.002175 0.123875 +v -0.364854 -0.0312 1.086146 +v -0.364854 -0.0312 -1.086146 +v -0.358400 -3.0348 0.000000 +v -0.358400 -3.0348 0.000000 +v -0.358200 -3.08115 0.000000 +v -0.358200 -3.08115 0.000000 +v -0.353807 -3.0348 -0.059016 +v -0.353807 -3.0348 0.059016 +v -0.353610 -3.08115 -0.058988 +v -0.353610 -3.08115 0.058988 +v -0.351008 -2.5026 -1.044926 +v -0.351008 -2.5026 1.044926 +v -0.348105 -2.6256 -0.181110 +v -0.348105 -2.6256 0.181110 +v -0.345503 -0.002175 -0.179756 +v -0.345503 -0.002175 0.179756 +v -0.340477 -3.0348 -0.114676 +v -0.340477 -3.0348 0.114676 +v -0.340289 -3.08115 -0.114619 +v -0.340289 -3.08115 0.114619 +v -0.328160 -0.9 -1.974240 +v -0.328160 -0.9 1.974240 +v -0.328160 -0.9 1.974240 +v -0.326970 -1.037175 -1.967083 +v -0.326970 -1.037175 1.967083 +v -0.325863 -0.771675 -1.960420 +v -0.325863 -0.771675 1.960420 +v -0.325553 -0.0084 -0.625735 +v -0.325553 -0.0084 0.625735 +v -0.325000 -2.98125 0.000000 +v -0.325000 -2.98125 0.000000 +v -0.323566 -1.1784 -1.946601 +v -0.323566 -1.1784 1.946601 +v -0.320834 -2.98125 -0.053508 +v -0.320834 -2.98125 0.053508 +v -0.319628 -0.6564 -1.922910 +v -0.319628 -0.6564 1.922910 +v -0.319082 -3.0348 -0.166306 +v -0.319082 -3.0348 0.166306 +v -0.318907 -3.08115 -0.166221 +v -0.318907 -3.08115 0.166221 +v -0.318192 -1.323225 -1.914272 +v -0.318192 -1.323225 1.914272 +v -0.316590 -2.6256 -0.232342 +v -0.316590 -2.6256 0.232342 +v -0.314223 -0.002175 -0.230604 +v -0.314223 -0.002175 0.230604 +v -0.312283 -2.5974 -0.425519 +v -0.312283 -2.5974 0.425519 +v -0.311850 -2.5728 -0.599396 +v -0.311850 -2.5728 0.599396 +v -0.311096 -1.4712 -1.871580 +v -0.311096 -1.4712 1.871580 +v -0.310439 -0.553725 -1.867631 +v -0.310439 -0.553725 1.867631 +v -0.309596 -2.5272 -0.921647 +v -0.309596 -2.5272 0.921647 +v -0.308800 -3.1176 0.000000 +v -0.308800 -3.1176 0.000000 +v -0.308744 -2.98125 -0.103976 +v -0.308744 -2.98125 0.103976 +v -0.304843 -3.1176 -0.050855 +v -0.304843 -3.1176 0.050855 +v -0.303862 -0.018225 0.904575 +v -0.303862 -0.018225 -0.904575 +v -0.302523 -1.621875 -1.820003 +v -0.302522 -1.621875 1.820003 +v -0.299282 -0.4632 -1.800507 +v -0.299282 -0.4632 1.800507 +v -0.293360 -3.1176 -0.098814 +v -0.293360 -3.1176 0.098814 +v -0.292719 -1.7748 -1.761022 +v -0.292719 -1.7748 1.761022 +v -0.290295 -3.0348 -0.213234 +v -0.290295 -3.0348 0.213234 +v -0.290138 -3.08115 -0.213123 +v -0.290138 -3.08115 0.213123 +v -0.289340 -2.98125 -0.150793 +v -0.289340 -2.98125 0.150793 +v -0.287140 -0.384375 -1.727460 +v -0.287140 -0.384375 1.727460 +v -0.281930 -1.929525 1.696119 +v -0.281930 -1.929525 -1.696119 +v -0.279400 -2.6592 0.000000 +v -0.277752 -2.6256 -0.277752 +v -0.277752 -2.6256 0.277752 +v -0.275801 -2.6592 -0.045844 +v -0.275801 -2.6592 0.045844 +v -0.275675 -0.002175 -0.275675 +v -0.275675 -0.002175 0.275675 +v -0.274998 -0.3168 -1.654413 +v -0.274998 -0.3168 1.654413 +v -0.274928 -3.1176 -0.143301 +v -0.274928 -3.1176 0.143301 +v -0.273600 -2.9232 0.000000 +v -0.273600 -2.9232 0.000000 +v -0.270404 -2.0856 -1.626774 +v -0.270404 -2.0856 1.626774 +v -0.270092 -2.9232 -0.045032 +v -0.270092 -2.9232 0.045032 +v -0.265363 -2.6592 -0.089140 +v -0.265363 -2.6592 0.089140 +v -0.263841 -0.260025 1.587289 +v -0.263841 -0.260025 -1.587289 +v -0.263232 -2.98125 -0.193348 +v -0.263232 -2.98125 0.193348 +v -0.263208 -2.55 -0.783552 +v -0.263208 -2.55 0.783552 +v -0.259910 -2.9232 -0.087511 +v -0.259910 -2.9232 0.087511 +v -0.258385 -2.242575 -1.554467 +v -0.258385 -2.242575 1.554467 +v -0.254788 -3.0348 -0.254788 +v -0.254788 -3.0348 0.254788 +v -0.254653 -3.08115 -0.254653 +v -0.254653 -3.08115 0.254653 +v -0.254652 -0.2136 -1.532010 +v -0.254652 -0.2136 1.532010 +v -0.250127 -3.1176 -0.183734 +v -0.250127 -3.1176 0.183734 +v -0.248621 -2.6592 0.129351 +v -0.248621 -2.6592 -0.129351 +v -0.248417 -0.177075 -1.494500 +v -0.248417 -0.177075 1.494500 +v -0.246120 -0.15 1.480680 +v -0.246120 -2.4 -1.480680 +v -0.246120 -0.15 -1.480680 +v -0.246120 -0.15 -1.480680 +v -0.246120 -0.15 1.480680 +v -0.246120 -2.4 1.480680 +v -0.245542 -0.127575 1.477200 +v -0.245542 -0.127575 -1.477200 +v -0.243569 -2.9232 -0.126920 +v -0.243569 -2.9232 0.126920 +v -0.243424 -2.5974 0.467878 +v -0.243424 -2.5974 -0.467878 +v -0.242970 -0.1056 1.461727 +v -0.242970 -0.1056 -1.461727 +v -0.242892 -2.435437 -1.461258 +v -0.242892 -2.435437 1.461258 +v -0.239491 -2.463 -1.440800 +v -0.239491 -2.463 1.440800 +v -0.237149 -0.084525 1.426709 +v -0.237149 -0.084525 -1.426709 +v -0.236115 -2.482687 -1.420490 +v -0.236115 -2.482687 1.420490 +v -0.232961 -2.4945 -1.401513 +v -0.232961 -2.4945 1.401513 +v -0.232342 -2.6256 -0.316590 +v -0.232342 -2.6256 0.316590 +v -0.231031 -2.98125 -0.231031 +v -0.231031 -2.98125 0.231031 +v -0.230604 -0.002175 -0.314223 +v -0.230604 -0.002175 0.314223 +v -0.230225 -2.498438 -1.385053 +v -0.230225 -2.498438 1.385053 +v -0.229712 -2.4 -1.381968 +v -0.229712 -2.4 1.381968 +v -0.228104 -2.4945 -1.372294 +v -0.228104 -2.4945 1.372294 +v -0.227403 -2.435437 -1.368074 +v -0.227403 -2.435437 1.368074 +v -0.226824 -0.0648 1.364595 +v -0.226824 -0.0648 -1.364595 +v -0.226795 -2.482687 1.364422 +v -0.226795 -2.482687 -1.364422 +v -0.226496 -2.463 -1.362620 +v -0.226496 -2.463 1.362620 +v -0.226113 -2.6592 -0.165941 +v -0.226113 -2.6592 0.165941 +v -0.224349 -0.0084 0.667871 +v -0.224349 -0.0084 -0.667871 +v -0.221585 -2.9232 -0.162745 +v -0.221585 -2.9232 0.162745 +v -0.219800 -2.86335 0.000000 +v -0.219800 -2.86335 0.000000 +v -0.219536 -3.1176 -0.219536 +v -0.219536 -3.1176 0.219536 +v -0.216979 -2.86335 0.036157 +v -0.216979 -2.86335 -0.036157 +v -0.214905 -2.5728 -0.639758 +v -0.214905 -2.5728 0.639758 +v -0.213304 -2.4 -1.283256 +v -0.213304 -2.4 1.283256 +v -0.213234 -3.0348 -0.290295 +v -0.213234 -3.0348 0.290295 +v -0.213123 -3.08115 -0.290138 +v -0.213123 -3.08115 0.290138 +v -0.210740 -0.046875 -1.267832 +v -0.210740 -0.046875 1.267832 +v -0.209136 -2.4408 -1.258183 +v -0.209136 -2.4408 1.258183 +v -0.208794 -2.86335 0.070270 +v -0.208794 -2.86335 -0.070270 +v -0.200000 -2.7 0.000000 +v -0.200000 -2.7 0.000000 +v -0.200000 -2.7 0.000000 +v -0.200000 -2.7 0.000000 +v -0.198374 -2.6592 -0.198374 +v -0.198374 -2.6592 0.198374 +v -0.197684 -2.4744 -1.189282 +v -0.197684 -2.4744 1.189282 +v -0.197424 -2.7 -0.032816 +v -0.197424 -2.7 0.032816 +v -0.197424 -2.7 0.032816 +v -0.197424 -2.7 -0.032816 +v -0.195658 -2.86335 -0.101925 +v -0.195658 -2.86335 0.101925 +v -0.194600 -3.14145 0.000000 +v -0.194600 -3.14145 0.000000 +v -0.194472 -2.9232 -0.194472 +v -0.194472 -2.9232 0.194472 +v -0.193348 -2.98125 -0.263232 +v -0.193348 -2.98125 0.263232 +v -0.192107 -3.14145 -0.032048 +v -0.192107 -3.14145 0.032048 +v -0.189952 -2.7 -0.063808 +v -0.189952 -2.7 0.063808 +v -0.189952 -2.7 0.063808 +v -0.189952 -2.7 -0.063808 +v -0.187642 -0.0312 1.128870 +v -0.187642 -0.0312 -1.128870 +v -0.184870 -3.14145 -0.062272 +v -0.184870 -3.14145 0.062272 +v -0.183734 -3.1176 -0.250127 +v -0.183734 -3.1176 0.250127 +v -0.181110 -2.6256 0.348105 +v -0.181110 -2.6256 -0.348105 +v -0.180521 -2.5026 -1.086029 +v -0.180521 -2.5026 1.086029 +v -0.179756 -0.002175 -0.345503 +v -0.179756 -0.002175 0.345503 +v -0.179200 -2.8044 0.000000 +v -0.179200 -2.8044 0.000000 +v -0.177989 -2.86335 -0.130707 +v -0.177989 -2.86335 0.130707 +v -0.177968 -2.7 -0.092592 +v -0.177968 -2.7 0.092592 +v -0.177968 -2.7 0.092592 +v -0.177968 -2.7 -0.092592 +v -0.176897 -2.8044 0.029450 +v -0.176897 -2.8044 -0.029450 +v -0.173255 -3.14145 -0.090306 +v -0.173255 -3.14145 0.090306 +v -0.170215 -2.8044 0.057246 +v -0.170215 -2.8044 -0.057246 +v -0.167751 -2.5974 -0.499384 +v -0.167751 -2.5974 0.499384 +v -0.167400 -2.74905 0.000000 +v -0.167400 -2.74905 0.000000 +v -0.166306 -3.0348 -0.319082 +v -0.166306 -3.0348 0.319082 +v -0.166221 -3.08115 0.318907 +v -0.166221 -3.08115 -0.318907 +v -0.165941 -2.6592 -0.226113 +v -0.165941 -2.6592 0.226113 +v -0.165245 -2.74905 0.027480 +v -0.165245 -2.74905 -0.027480 +v -0.162745 -2.9232 -0.221585 +v -0.162745 -2.9232 0.221585 +v -0.161856 -2.7 -0.118784 +v -0.161856 -2.7 0.118784 +v -0.161856 -2.7 0.118784 +v -0.161856 -2.7 -0.118784 +v -0.159496 -2.8044 0.083047 +v -0.159496 -2.8044 -0.083047 +v -0.159223 -2.5272 -0.957901 +v -0.159223 -2.5272 0.957901 +v -0.158995 -2.74905 0.053428 +v -0.158995 -2.74905 -0.053428 +v -0.157626 -3.14145 -0.115787 +v -0.157626 -3.14145 0.115787 +v -0.156274 -0.018225 0.940158 +v -0.156274 -0.018225 -0.940158 +v -0.156200 -2.86335 -0.156200 +v -0.156200 -2.86335 0.156200 +v -0.150793 -2.98125 -0.289340 +v -0.150793 -2.98125 0.289340 +v -0.148969 -2.74905 0.077523 +v -0.148969 -2.74905 -0.077523 +v -0.145078 -2.8044 0.106513 +v -0.145078 -2.8044 -0.106513 +v -0.143301 -3.1176 -0.274928 +v -0.143301 -3.1176 0.274928 +v -0.142000 -2.7 -0.142000 +v -0.142000 -2.7 0.142000 +v -0.142000 -2.7 0.142000 +v -0.142000 -2.7 -0.142000 +v -0.138348 -3.14145 -0.138348 +v -0.138348 -3.14145 0.138348 +v -0.135489 -2.74905 0.099446 +v -0.135489 -2.74905 -0.099446 +v -0.135366 -2.55 -0.814374 +v -0.135366 -2.55 0.814374 +v -0.130707 -2.86335 -0.177989 +v -0.130707 -2.86335 0.177989 +v -0.129351 -2.6592 0.248621 +v -0.129351 -2.6592 -0.248621 +v -0.127304 -2.8044 0.127304 +v -0.127304 -2.8044 -0.127304 +v -0.126920 -2.9232 -0.243569 +v -0.126920 -2.9232 0.243569 +v -0.124808 -2.6256 -0.371546 +v -0.124808 -2.6256 0.371546 +v -0.123875 -0.002175 0.368768 +v -0.123875 -0.002175 -0.368768 +v -0.118874 -2.74905 0.118874 +v -0.118874 -2.74905 -0.118874 +v -0.118784 -2.7 -0.161856 +v -0.118784 -2.7 0.161856 +v -0.118784 -2.7 0.161856 +v -0.118784 -2.7 -0.161856 +v -0.115787 -3.14145 -0.157626 +v -0.115787 -3.14145 0.157626 +v -0.115381 -0.0084 0.694143 +v -0.115381 -0.0084 -0.694143 +v -0.114676 -3.0348 -0.340477 +v -0.114676 -3.0348 0.340477 +v -0.114619 -3.08115 -0.340289 +v -0.114619 -3.08115 0.340289 +v -0.110524 -2.5728 -0.664924 +v -0.110524 -2.5728 0.664924 +v -0.106513 -2.8044 -0.145078 +v -0.106513 -2.8044 0.145078 +v -0.103976 -2.98125 -0.308744 +v -0.103976 -2.98125 0.308744 +v -0.101925 -2.86335 -0.195658 +v -0.101925 -2.86335 0.195658 +v -0.099446 -2.74905 0.135489 +v -0.099446 -2.74905 -0.135489 +v -0.098814 -3.1176 -0.293360 +v -0.098814 -3.1176 0.293360 +v -0.092592 -2.7 -0.177968 +v -0.092592 -2.7 0.177968 +v -0.092592 -2.7 -0.177968 +v -0.092592 -2.7 0.177968 +v -0.090306 -3.14145 -0.173255 +v -0.090306 -3.14145 0.173255 +v -0.089140 -2.6592 -0.265363 +v -0.089140 -2.6592 0.265363 +v -0.087511 -2.9232 -0.259910 +v -0.087511 -2.9232 0.259910 +v -0.086273 -2.5974 -0.519028 +v -0.086273 -2.5974 0.519028 +v -0.083047 -2.8044 -0.159496 +v -0.083047 -2.8044 0.159496 +v -0.077523 -2.74905 -0.148969 +v -0.077523 -2.74905 0.148969 +v -0.070270 -2.86335 -0.208794 +v -0.070270 -2.86335 0.208794 +v -0.064188 -2.6256 -0.386161 +v -0.064188 -2.6256 0.386161 +v -0.063808 -2.7 -0.189952 +v -0.063808 -2.7 0.189952 +v -0.063808 -2.7 -0.189952 +v -0.063808 -2.7 0.189952 +v -0.063708 -0.002175 0.383274 +v -0.063708 -0.002175 -0.383274 +v -0.062272 -3.14145 -0.184870 +v -0.062272 -3.14145 0.184870 +v -0.059016 -3.0348 -0.353807 +v -0.059016 -3.0348 0.353807 +v -0.058988 -3.08115 -0.353610 +v -0.058988 -3.08115 0.353610 +v -0.057246 -2.8044 -0.170215 +v -0.057246 -2.8044 0.170215 +v -0.053508 -2.98125 -0.320834 +v -0.053508 -2.98125 0.320834 +v -0.053428 -2.74905 -0.158995 +v -0.053428 -2.74905 0.158995 +v -0.050855 -3.1176 -0.304843 +v -0.050855 -3.1176 0.304843 +v -0.045844 -2.6592 -0.275801 +v -0.045844 -2.6592 0.275801 +v -0.045032 -2.9232 -0.270092 +v -0.045032 -2.9232 0.270092 +v -0.036157 -2.86335 -0.216979 +v -0.036157 -2.86335 0.216979 +v -0.032816 -2.7 -0.197424 +v -0.032816 -2.7 0.197424 +v -0.032816 -2.7 -0.197424 +v -0.032816 -2.7 0.197424 +v -0.032048 -3.14145 -0.192107 +v -0.032048 -3.14145 0.192107 +v -0.029450 -2.8044 -0.176897 +v -0.029450 -2.8044 0.176897 +v -0.027480 -2.74905 -0.165245 +v -0.027480 -2.74905 0.165245 +v -0.000000 -0.260025 1.608000 +v -0.000000 -1.929525 1.718250 +v -0.000000 -2.0856 -1.648000 +v -0.000000 -0.6564 -1.948000 +v -0.000000 -0.771675 -1.986000 +v -0.000000 -2.482687 1.382225 +v -0.000000 -2.7 -0.200000 +v -0.000000 -0.127575 1.496475 +v -0.000000 -2.4744 -1.204800 +v -0.000000 -2.74905 -0.167400 +v -0.000000 -0.018225 0.952425 +v -0.000000 -0.046875 -1.284375 +v -0.000000 -0.0648 1.382400 +v -0.000000 -0.384375 1.750000 +v -0.000000 -0.4632 1.824000 +v -0.000000 -0.553725 -1.892000 +v -0.000000 -1.037175 1.992750 +v -0.000000 -1.1784 1.972000 +v -0.000000 -1.323225 -1.939250 +v -0.000000 -1.621875 -1.843750 +v -0.000000 -1.7748 1.784000 +v -0.000000 -2.4 -1.300000 +v -0.000000 -2.435437 -1.480325 +v -0.000000 -2.435437 -1.385925 +v -0.000000 -2.463 -1.459600 +v -0.000000 -2.463 -1.380400 +v -0.000000 -2.4945 -1.390200 +v -0.000000 -2.5026 -1.100200 +v -0.000000 -2.8044 -0.179200 +v -0.000000 -2.86335 -0.219800 +v -0.000000 -2.5728 -0.673600 +v -0.000000 -0.1056 1.480800 +v -0.000000 -0.177075 -1.514000 +v -0.000000 -2.4945 -1.419800 +v -0.000000 -2.5272 -0.970400 +v -0.000000 -2.9232 -0.273600 +v -0.000000 -3.1176 -0.308800 +v -0.000000 -2.5974 -0.525800 +v -0.000000 -2.7 -0.200000 +v -0.000000 -2.98125 -0.325000 +v -0.000000 -3.14145 -0.194600 +v -0.000000 -0.002175 0.388275 +v -0.000000 -3.08115 -0.358200 +v 0.000000 -0.0 0.000000 +v 0.000000 -0.002175 -0.388275 +v 0.000000 -0.002175 0.388275 +v 0.000000 -0.0084 -0.703200 +v 0.000000 -0.0084 0.703200 +v 0.000000 -0.018225 -0.952425 +v 0.000000 -0.018225 0.952425 +v 0.000000 -0.0312 -1.143600 +v 0.000000 -0.0312 -1.143600 +v 0.000000 -0.0312 1.143600 +v 0.000000 -0.0312 1.143600 +v 0.000000 -0.046875 -1.284375 +v 0.000000 -0.046875 1.284375 +v 0.000000 -0.0648 -1.382400 +v 0.000000 -0.0648 1.382400 +v 0.000000 -0.084525 -1.445325 +v 0.000000 -0.084525 -1.445325 +v 0.000000 -0.084525 1.445325 +v 0.000000 -0.084525 1.445325 +v 0.000000 -0.1056 -1.480800 +v 0.000000 -0.1056 1.480800 +v 0.000000 -0.127575 -1.496475 +v 0.000000 -0.127575 1.496475 +v 0.000000 -0.15 -1.500000 +v 0.000000 -0.15 -1.500000 +v 0.000000 -0.15 1.500000 +v 0.000000 -0.15 1.500000 +v 0.000000 -0.177075 -1.514000 +v 0.000000 -0.177075 1.514000 +v 0.000000 -0.2136 -1.552000 +v 0.000000 -0.2136 -1.552000 +v 0.000000 -0.2136 1.552000 +v 0.000000 -0.2136 1.552000 +v 0.000000 -0.260025 -1.608000 +v 0.000000 -0.260025 1.608000 +v 0.000000 -0.3168 -1.676000 +v 0.000000 -0.3168 -1.676000 +v 0.000000 -0.3168 1.676000 +v 0.000000 -0.3168 1.676000 +v 0.000000 -0.384375 -1.750000 +v 0.000000 -0.384375 1.750000 +v 0.000000 -0.4632 -1.824000 +v 0.000000 -0.4632 1.824000 +v 0.000000 -0.553725 -1.892000 +v 0.000000 -0.553725 1.892000 +v 0.000000 -0.6564 -1.948000 +v 0.000000 -0.6564 1.948000 +v 0.000000 -0.771675 -1.986000 +v 0.000000 -0.771675 1.986000 +v 0.000000 -0.9 -2.000000 +v 0.000000 -0.9 -2.000000 +v 0.000000 -0.9 2.000000 +v 0.000000 -0.9 2.000000 +v 0.000000 -1.037175 -1.992750 +v 0.000000 -1.037175 1.992750 +v 0.000000 -1.1784 -1.972000 +v 0.000000 -1.1784 1.972000 +v 0.000000 -1.323225 -1.939250 +v 0.000000 -1.323225 1.939250 +v 0.000000 -1.4712 -1.896000 +v 0.000000 -1.4712 -1.896000 +v 0.000000 -1.4712 1.896000 +v 0.000000 -1.4712 1.896000 +v 0.000000 -1.621875 -1.843750 +v 0.000000 -1.621875 1.843750 +v 0.000000 -1.7748 -1.784000 +v 0.000000 -1.7748 1.784000 +v 0.000000 -1.929525 -1.718250 +v 0.000000 -1.929525 1.718250 +v 0.000000 -2.0856 -1.648000 +v 0.000000 -2.0856 1.648000 +v 0.000000 -2.242575 -1.574750 +v 0.000000 -2.242575 -1.574750 +v 0.000000 -2.242575 1.574750 +v 0.000000 -2.242575 1.574750 +v 0.000000 -2.4 -1.500000 +v 0.000000 -2.4 -1.500000 +v 0.000000 -2.4 -1.400000 +v 0.000000 -2.4 -1.400000 +v 0.000000 -2.4 -1.300000 +v 0.000000 -2.4 1.300000 +v 0.000000 -2.4 1.400000 +v 0.000000 -2.4 1.400000 +v 0.000000 -2.4 1.500000 +v 0.000000 -2.4 1.500000 +v 0.000000 -2.435437 -1.480325 +v 0.000000 -2.435437 -1.385925 +v 0.000000 -2.435437 1.385925 +v 0.000000 -2.435437 1.480325 +v 0.000000 -2.4408 -1.274600 +v 0.000000 -2.4408 -1.274600 +v 0.000000 -2.4408 1.274600 +v 0.000000 -2.4408 1.274600 +v 0.000000 -2.463 -1.459600 +v 0.000000 -2.463 -1.380400 +v 0.000000 -2.463 1.380400 +v 0.000000 -2.463 1.459600 +v 0.000000 -2.4744 -1.204800 +v 0.000000 -2.4744 1.204800 +v 0.000000 -2.482687 -1.439025 +v 0.000000 -2.482687 -1.382225 +v 0.000000 -2.482687 1.382225 +v 0.000000 -2.482687 1.439025 +v 0.000000 -2.4945 -1.419800 +v 0.000000 -2.4945 -1.390200 +v 0.000000 -2.4945 1.390200 +v 0.000000 -2.4945 1.419800 +v 0.000000 -2.498438 -1.403125 +v 0.000000 -2.498438 -1.403125 +v 0.000000 -2.498438 1.403125 +v 0.000000 -2.498438 1.403125 +v 0.000000 -2.5026 -1.100200 +v 0.000000 -2.5026 1.100200 +v 0.000000 -2.5272 -0.970400 +v 0.000000 -2.5272 0.970400 +v 0.000000 -2.55 -0.825000 +v 0.000000 -2.55 -0.825000 +v 0.000000 -2.55 0.825000 +v 0.000000 -2.55 0.825000 +v 0.000000 -2.5728 -0.673600 +v 0.000000 -2.5728 0.673600 +v 0.000000 -2.5974 -0.525800 +v 0.000000 -2.5974 0.525800 +v 0.000000 -2.6256 -0.391200 +v 0.000000 -2.6256 -0.391200 +v 0.000000 -2.6256 0.391200 +v 0.000000 -2.6256 0.391200 +v 0.000000 -2.6592 -0.279400 +v 0.000000 -2.6592 0.279400 +v 0.000000 -2.7 -0.200000 +v 0.000000 -2.7 -0.200000 +v 0.000000 -2.7 0.200000 +v 0.000000 -2.7 0.200000 +v 0.000000 -2.74905 -0.167400 +v 0.000000 -2.74905 0.167400 +v 0.000000 -2.8044 -0.179200 +v 0.000000 -2.8044 0.179200 +v 0.000000 -2.86335 -0.219800 +v 0.000000 -2.86335 0.219800 +v 0.000000 -2.9232 -0.273600 +v 0.000000 -2.9232 0.273600 +v 0.000000 -2.98125 -0.325000 +v 0.000000 -2.98125 0.325000 +v 0.000000 -3.0348 -0.358400 +v 0.000000 -3.0348 -0.358400 +v 0.000000 -3.0348 0.358400 +v 0.000000 -3.0348 0.358400 +v 0.000000 -3.08115 -0.358200 +v 0.000000 -3.08115 0.358200 +v 0.000000 -3.1176 -0.308800 +v 0.000000 -3.1176 0.308800 +v 0.000000 -3.14145 -0.194600 +v 0.000000 -3.14145 0.194600 +v 0.000000 -3.15 0.000000 +v 0.000000 -0.002175 -0.388275 +v 0.000000 -3.08115 0.358200 +v 0.000000 -2.5974 0.525800 +v 0.000000 -2.7 0.200000 +v 0.000000 -2.98125 0.325000 +v 0.000000 -3.14145 0.194600 +v 0.000000 -3.1176 0.308800 +v 0.000000 -0.1056 -1.480800 +v 0.000000 -0.177075 1.514000 +v 0.000000 -2.4945 1.419800 +v 0.000000 -2.5272 0.970400 +v 0.000000 -2.9232 0.273600 +v 0.000000 -2.5728 0.673600 +v 0.000000 -2.86335 0.219800 +v 0.000000 -0.018225 -0.952425 +v 0.000000 -0.046875 1.284375 +v 0.000000 -0.0648 -1.382400 +v 0.000000 -0.384375 -1.750000 +v 0.000000 -0.4632 -1.824000 +v 0.000000 -0.553725 1.892000 +v 0.000000 -1.037175 -1.992750 +v 0.000000 -1.1784 -1.972000 +v 0.000000 -1.323225 1.939250 +v 0.000000 -1.621875 1.843750 +v 0.000000 -1.7748 -1.784000 +v 0.000000 -2.4 1.300000 +v 0.000000 -2.435437 1.385925 +v 0.000000 -2.435437 1.480325 +v 0.000000 -2.463 1.380400 +v 0.000000 -2.463 1.459600 +v 0.000000 -2.4945 1.390200 +v 0.000000 -2.5026 1.100200 +v 0.000000 -2.8044 0.179200 +v 0.000000 -2.74905 0.167400 +v 0.000000 -0.127575 -1.496475 +v 0.000000 -2.4744 1.204800 +v 0.000000 -0.6564 1.948000 +v 0.000000 -0.771675 1.986000 +v 0.000000 -2.482687 -1.382225 +v 0.000000 -2.7 0.200000 +v 0.000000 -0.260025 -1.608000 +v 0.000000 -1.929525 -1.718250 +v 0.000000 -2.0856 1.648000 +v 0.027480 -2.74905 -0.165245 +v 0.027480 -2.74905 0.165245 +v 0.029450 -2.8044 -0.176897 +v 0.029450 -2.8044 0.176897 +v 0.032048 -3.14145 -0.192107 +v 0.032048 -3.14145 0.192107 +v 0.032816 -2.7 -0.197424 +v 0.032816 -2.7 0.197424 +v 0.032816 -2.7 -0.197424 +v 0.032816 -2.7 0.197424 +v 0.036157 -2.86335 -0.216979 +v 0.036157 -2.86335 0.216979 +v 0.045032 -2.9232 -0.270092 +v 0.045032 -2.9232 0.270092 +v 0.045844 -2.6592 -0.275801 +v 0.045844 -2.6592 0.275801 +v 0.050855 -3.1176 -0.304843 +v 0.050855 -3.1176 0.304843 +v 0.053428 -2.74905 -0.158995 +v 0.053428 -2.74905 0.158995 +v 0.053508 -2.98125 -0.320834 +v 0.053508 -2.98125 0.320834 +v 0.057246 -2.8044 -0.170215 +v 0.057246 -2.8044 0.170215 +v 0.058988 -3.08115 -0.353610 +v 0.058988 -3.08115 0.353610 +v 0.059016 -3.0348 -0.353807 +v 0.059016 -3.0348 0.353807 +v 0.062272 -3.14145 -0.184870 +v 0.062272 -3.14145 0.184870 +v 0.063708 -0.002175 0.383274 +v 0.063708 -0.002175 -0.383274 +v 0.063808 -2.7 -0.189952 +v 0.063808 -2.7 0.189952 +v 0.063808 -2.7 -0.189952 +v 0.063808 -2.7 0.189952 +v 0.064188 -2.6256 -0.386161 +v 0.064188 -2.6256 0.386161 +v 0.070270 -2.86335 -0.208794 +v 0.070270 -2.86335 0.208794 +v 0.077523 -2.74905 -0.148969 +v 0.077523 -2.74905 0.148969 +v 0.083047 -2.8044 -0.159496 +v 0.083047 -2.8044 0.159496 +v 0.086273 -2.5974 -0.519028 +v 0.086273 -2.5974 0.519028 +v 0.087511 -2.9232 -0.259910 +v 0.087511 -2.9232 0.259910 +v 0.089140 -2.6592 -0.265363 +v 0.089140 -2.6592 0.265363 +v 0.090306 -3.14145 -0.173255 +v 0.090306 -3.14145 0.173255 +v 0.092592 -2.7 -0.177968 +v 0.092592 -2.7 0.177968 +v 0.092592 -2.7 -0.177968 +v 0.092592 -2.7 0.177968 +v 0.098814 -3.1176 -0.293360 +v 0.098814 -3.1176 0.293360 +v 0.099446 -2.74905 0.135489 +v 0.099446 -2.74905 -0.135489 +v 0.101925 -2.86335 -0.195658 +v 0.101925 -2.86335 0.195658 +v 0.103976 -2.98125 -0.308744 +v 0.103976 -2.98125 0.308744 +v 0.106513 -2.8044 -0.145078 +v 0.106513 -2.8044 0.145078 +v 0.110524 -2.5728 -0.664924 +v 0.110524 -2.5728 0.664924 +v 0.114619 -3.08115 -0.340289 +v 0.114619 -3.08115 0.340289 +v 0.114676 -3.0348 -0.340477 +v 0.114676 -3.0348 0.340477 +v 0.115381 -0.0084 0.694143 +v 0.115381 -0.0084 -0.694143 +v 0.115787 -3.14145 -0.157626 +v 0.115787 -3.14145 0.157626 +v 0.118784 -2.7 0.161856 +v 0.118784 -2.7 -0.161856 +v 0.118784 -2.7 -0.161856 +v 0.118784 -2.7 0.161856 +v 0.118874 -2.74905 0.118874 +v 0.118874 -2.74905 -0.118874 +v 0.123875 -0.002175 0.368768 +v 0.123875 -0.002175 -0.368768 +v 0.124808 -2.6256 -0.371546 +v 0.124808 -2.6256 0.371546 +v 0.126920 -2.9232 -0.243569 +v 0.126920 -2.9232 0.243569 +v 0.127304 -2.8044 0.127304 +v 0.127304 -2.8044 -0.127304 +v 0.129351 -2.6592 0.248621 +v 0.129351 -2.6592 -0.248621 +v 0.130707 -2.86335 -0.177989 +v 0.130707 -2.86335 0.177989 +v 0.135366 -2.55 -0.814374 +v 0.135366 -2.55 0.814374 +v 0.135489 -2.74905 0.099446 +v 0.135489 -2.74905 -0.099446 +v 0.138348 -3.14145 -0.138348 +v 0.138348 -3.14145 0.138348 +v 0.142000 -2.7 0.142000 +v 0.142000 -2.7 -0.142000 +v 0.142000 -2.7 -0.142000 +v 0.142000 -2.7 0.142000 +v 0.143301 -3.1176 -0.274928 +v 0.143301 -3.1176 0.274928 +v 0.145078 -2.8044 0.106513 +v 0.145078 -2.8044 -0.106513 +v 0.148969 -2.74905 0.077523 +v 0.148969 -2.74905 -0.077523 +v 0.150793 -2.98125 -0.289340 +v 0.150793 -2.98125 0.289340 +v 0.156200 -2.86335 -0.156200 +v 0.156200 -2.86335 0.156200 +v 0.156274 -0.018225 0.940158 +v 0.156274 -0.018225 -0.940158 +v 0.157626 -3.14145 -0.115787 +v 0.157626 -3.14145 0.115787 +v 0.158995 -2.74905 0.053428 +v 0.158995 -2.74905 -0.053428 +v 0.159223 -2.5272 -0.957901 +v 0.159223 -2.5272 0.957901 +v 0.159496 -2.8044 0.083047 +v 0.159496 -2.8044 -0.083047 +v 0.161856 -2.7 0.118784 +v 0.161856 -2.7 -0.118784 +v 0.161856 -2.7 -0.118784 +v 0.161856 -2.7 0.118784 +v 0.162745 -2.9232 -0.221585 +v 0.162745 -2.9232 0.221585 +v 0.165245 -2.74905 0.027480 +v 0.165245 -2.74905 -0.027480 +v 0.165941 -2.6592 -0.226113 +v 0.165941 -2.6592 0.226113 +v 0.166221 -3.08115 0.318907 +v 0.166221 -3.08115 -0.318907 +v 0.166306 -3.0348 -0.319082 +v 0.166306 -3.0348 0.319082 +v 0.167400 -2.74905 -0.000000 +v 0.167400 -2.74905 0.000000 +v 0.167751 -2.5974 -0.499384 +v 0.167751 -2.5974 0.499384 +v 0.170215 -2.8044 0.057246 +v 0.170215 -2.8044 -0.057246 +v 0.173255 -3.14145 -0.090306 +v 0.173255 -3.14145 0.090306 +v 0.176897 -2.8044 0.029450 +v 0.176897 -2.8044 -0.029450 +v 0.177968 -2.7 0.092592 +v 0.177968 -2.7 -0.092592 +v 0.177968 -2.7 -0.092592 +v 0.177968 -2.7 0.092592 +v 0.177989 -2.86335 -0.130707 +v 0.177989 -2.86335 0.130707 +v 0.179200 -2.8044 -0.000000 +v 0.179200 -2.8044 0.000000 +v 0.179756 -0.002175 -0.345503 +v 0.179756 -0.002175 0.345503 +v 0.180521 -2.5026 -1.086029 +v 0.180521 -2.5026 1.086029 +v 0.181110 -2.6256 0.348105 +v 0.181110 -2.6256 -0.348105 +v 0.183734 -3.1176 -0.250127 +v 0.183734 -3.1176 0.250127 +v 0.184870 -3.14145 -0.062272 +v 0.184870 -3.14145 0.062272 +v 0.187642 -0.0312 1.128870 +v 0.187642 -0.0312 -1.128870 +v 0.189952 -2.7 0.063808 +v 0.189952 -2.7 -0.063808 +v 0.189952 -2.7 -0.063808 +v 0.189952 -2.7 0.063808 +v 0.192107 -3.14145 -0.032048 +v 0.192107 -3.14145 0.032048 +v 0.193348 -2.98125 -0.263232 +v 0.193348 -2.98125 0.263232 +v 0.194472 -2.9232 -0.194472 +v 0.194472 -2.9232 0.194472 +v 0.194600 -3.14145 0.000000 +v 0.194600 -3.14145 -0.000000 +v 0.195658 -2.86335 -0.101925 +v 0.195658 -2.86335 0.101925 +v 0.197424 -2.7 0.032816 +v 0.197424 -2.7 -0.032816 +v 0.197424 -2.7 -0.032816 +v 0.197424 -2.7 0.032816 +v 0.197684 -2.4744 -1.189282 +v 0.197684 -2.4744 1.189282 +v 0.198374 -2.6592 -0.198374 +v 0.198374 -2.6592 0.198374 +v 0.200000 -2.7 -0.000000 +v 0.200000 -2.7 0.000000 +v 0.200000 -2.7 0.000000 +v 0.200000 -2.7 -0.000000 +v 0.208794 -2.86335 0.070270 +v 0.208794 -2.86335 -0.070270 +v 0.209136 -2.4408 -1.258183 +v 0.209136 -2.4408 1.258183 +v 0.210740 -0.046875 -1.267832 +v 0.210740 -0.046875 1.267832 +v 0.213123 -3.08115 -0.290138 +v 0.213123 -3.08115 0.290138 +v 0.213234 -3.0348 -0.290295 +v 0.213234 -3.0348 0.290295 +v 0.213304 -2.4 -1.283256 +v 0.213304 -2.4 1.283256 +v 0.214905 -2.5728 -0.639758 +v 0.214905 -2.5728 0.639758 +v 0.216979 -2.86335 0.036157 +v 0.216979 -2.86335 -0.036157 +v 0.219536 -3.1176 -0.219536 +v 0.219536 -3.1176 0.219536 +v 0.219800 -2.86335 -0.000000 +v 0.219800 -2.86335 0.000000 +v 0.221585 -2.9232 -0.162745 +v 0.221585 -2.9232 0.162745 +v 0.224349 -0.0084 0.667871 +v 0.224349 -0.0084 -0.667871 +v 0.226113 -2.6592 -0.165941 +v 0.226113 -2.6592 0.165941 +v 0.226496 -2.463 -1.362620 +v 0.226496 -2.463 1.362620 +v 0.226795 -2.482687 1.364422 +v 0.226795 -2.482687 -1.364422 +v 0.226824 -0.0648 1.364595 +v 0.226824 -0.0648 -1.364595 +v 0.227403 -2.435437 -1.368074 +v 0.227403 -2.435437 1.368074 +v 0.228104 -2.4945 -1.372294 +v 0.228104 -2.4945 1.372294 +v 0.229712 -2.4 -1.381968 +v 0.229712 -2.4 1.381968 +v 0.230225 -2.498438 -1.385053 +v 0.230225 -2.498438 1.385053 +v 0.230604 -0.002175 -0.314223 +v 0.230604 -0.002175 0.314223 +v 0.231031 -2.98125 -0.231031 +v 0.231031 -2.98125 0.231031 +v 0.232342 -2.6256 -0.316590 +v 0.232342 -2.6256 0.316590 +v 0.232961 -2.4945 -1.401513 +v 0.232961 -2.4945 1.401513 +v 0.236115 -2.482687 -1.420490 +v 0.236115 -2.482687 1.420490 +v 0.237149 -0.084525 1.426709 +v 0.237149 -0.084525 -1.426709 +v 0.239491 -2.463 -1.440800 +v 0.239491 -2.463 1.440800 +v 0.242892 -2.435437 -1.461258 +v 0.242892 -2.435437 1.461258 +v 0.242970 -0.1056 1.461727 +v 0.242970 -0.1056 -1.461727 +v 0.243424 -2.5974 0.467878 +v 0.243424 -2.5974 -0.467878 +v 0.243569 -2.9232 -0.126920 +v 0.243569 -2.9232 0.126920 +v 0.245542 -0.127575 1.477200 +v 0.245542 -0.127575 -1.477200 +v 0.246120 -0.15 -1.480680 +v 0.246120 -2.4 -1.480680 +v 0.246120 -0.15 1.480680 +v 0.246120 -0.15 1.480680 +v 0.246120 -2.4 1.480680 +v 0.246120 -0.15 -1.480680 +v 0.248417 -0.177075 -1.494500 +v 0.248417 -0.177075 1.494500 +v 0.248621 -2.6592 0.129351 +v 0.248621 -2.6592 -0.129351 +v 0.250127 -3.1176 -0.183734 +v 0.250127 -3.1176 0.183734 +v 0.254652 -0.2136 -1.532010 +v 0.254652 -0.2136 1.532010 +v 0.254653 -3.08115 -0.254653 +v 0.254653 -3.08115 0.254653 +v 0.254788 -3.0348 -0.254788 +v 0.254788 -3.0348 0.254788 +v 0.258385 -2.242575 -1.554467 +v 0.258385 -2.242575 1.554467 +v 0.259910 -2.9232 -0.087511 +v 0.259910 -2.9232 0.087511 +v 0.263208 -2.55 -0.783552 +v 0.263208 -2.55 0.783552 +v 0.263232 -2.98125 -0.193348 +v 0.263232 -2.98125 0.193348 +v 0.263841 -0.260025 1.587289 +v 0.263841 -0.260025 -1.587289 +v 0.265363 -2.6592 -0.089140 +v 0.265363 -2.6592 0.089140 +v 0.270092 -2.9232 -0.045032 +v 0.270092 -2.9232 0.045032 +v 0.270404 -2.0856 -1.626774 +v 0.270404 -2.0856 1.626774 +v 0.273600 -2.9232 -0.000000 +v 0.273600 -2.9232 0.000000 +v 0.274928 -3.1176 -0.143301 +v 0.274928 -3.1176 0.143301 +v 0.274998 -0.3168 -1.654413 +v 0.274998 -0.3168 1.654413 +v 0.275675 -0.002175 -0.275675 +v 0.275675 -0.002175 0.275675 +v 0.275801 -2.6592 -0.045844 +v 0.275801 -2.6592 0.045844 +v 0.277752 -2.6256 -0.277752 +v 0.277752 -2.6256 0.277752 +v 0.279400 -2.6592 0.000000 +v 0.281930 -1.929525 1.696119 +v 0.281930 -1.929525 -1.696119 +v 0.287140 -0.384375 -1.727460 +v 0.287140 -0.384375 1.727460 +v 0.289340 -2.98125 -0.150793 +v 0.289340 -2.98125 0.150793 +v 0.290138 -3.08115 -0.213123 +v 0.290138 -3.08115 0.213123 +v 0.290295 -3.0348 -0.213234 +v 0.290295 -3.0348 0.213234 +v 0.292719 -1.7748 -1.761022 +v 0.292719 -1.7748 1.761022 +v 0.293360 -3.1176 -0.098814 +v 0.293360 -3.1176 0.098814 +v 0.299282 -0.4632 -1.800507 +v 0.299282 -0.4632 1.800507 +v 0.302522 -1.621875 -1.820003 +v 0.302523 -1.621875 1.820003 +v 0.303862 -0.018225 0.904575 +v 0.303862 -0.018225 -0.904575 +v 0.304843 -3.1176 -0.050855 +v 0.304843 -3.1176 0.050855 +v 0.308744 -2.98125 -0.103976 +v 0.308744 -2.98125 0.103976 +v 0.308800 -3.1176 0.000000 +v 0.308800 -3.1176 -0.000000 +v 0.309596 -2.5272 -0.921647 +v 0.309596 -2.5272 0.921647 +v 0.310439 -0.553725 -1.867631 +v 0.310439 -0.553725 1.867631 +v 0.311096 -1.4712 -1.871580 +v 0.311096 -1.4712 1.871580 +v 0.311850 -2.5728 -0.599396 +v 0.311850 -2.5728 0.599396 +v 0.312283 -2.5974 -0.425519 +v 0.312283 -2.5974 0.425519 +v 0.314223 -0.002175 -0.230604 +v 0.314223 -0.002175 0.230604 +v 0.316590 -2.6256 -0.232342 +v 0.316590 -2.6256 0.232342 +v 0.318192 -1.323225 -1.914272 +v 0.318192 -1.323225 1.914272 +v 0.318907 -3.08115 -0.166221 +v 0.318907 -3.08115 0.166221 +v 0.319082 -3.0348 -0.166306 +v 0.319082 -3.0348 0.166306 +v 0.319628 -0.6564 -1.922910 +v 0.319628 -0.6564 1.922910 +v 0.320834 -2.98125 -0.053508 +v 0.320834 -2.98125 0.053508 +v 0.323566 -1.1784 -1.946601 +v 0.323566 -1.1784 1.946601 +v 0.325000 -2.98125 0.000000 +v 0.325000 -2.98125 -0.000000 +v 0.325553 -0.0084 -0.625735 +v 0.325553 -0.0084 0.625735 +v 0.325863 -0.771675 -1.960420 +v 0.325863 -0.771675 1.960420 +v 0.326970 -1.037175 -1.967083 +v 0.326970 -1.037175 1.967083 +v 0.328160 -0.9 -1.974240 +v 0.328160 -0.9 -1.974240 +v 0.328160 -0.9 1.974240 +v 0.340289 -3.08115 -0.114619 +v 0.340289 -3.08115 0.114619 +v 0.340477 -3.0348 -0.114676 +v 0.340477 -3.0348 0.114676 +v 0.345503 -0.002175 -0.179756 +v 0.345503 -0.002175 0.179756 +v 0.348105 -2.6256 -0.181110 +v 0.348105 -2.6256 0.181110 +v 0.351008 -2.5026 -1.044926 +v 0.351008 -2.5026 1.044926 +v 0.353610 -3.08115 -0.058988 +v 0.353610 -3.08115 0.058988 +v 0.353807 -3.0348 -0.059016 +v 0.353807 -3.0348 0.059016 +v 0.358200 -3.08115 -0.000000 +v 0.358200 -3.08115 0.000000 +v 0.358400 -3.0348 0.000000 +v 0.358400 -3.0348 0.000000 +v 0.364854 -0.0312 1.086146 +v 0.364854 -0.0312 -1.086146 +v 0.368768 -0.002175 -0.123875 +v 0.368768 -0.002175 0.123875 +v 0.371546 -2.6256 -0.124808 +v 0.371546 -2.6256 0.124808 +v 0.373318 -2.5974 -0.373318 +v 0.373318 -2.5974 0.373318 +v 0.381942 -2.55 -0.734118 +v 0.381942 -2.55 0.734118 +v 0.383274 -0.002175 -0.063708 +v 0.383274 -0.002175 0.063708 +v 0.384379 -2.4744 -1.144271 +v 0.384379 -2.4744 1.144271 +v 0.386161 -2.6256 -0.064188 +v 0.386161 -2.6256 0.064188 +v 0.388275 -0.002175 0.000000 +v 0.388275 -0.002175 0.000000 +v 0.391200 -2.6256 0.000000 +v 0.391200 -2.6256 0.000000 +v 0.400065 -2.5728 -0.545131 +v 0.400065 -2.5728 0.545131 +v 0.406648 -2.4408 -1.210564 +v 0.406648 -2.4408 1.210564 +v 0.409767 -0.046875 1.219848 +v 0.409767 -0.046875 -1.219848 +v 0.414752 -2.4 -1.234688 +v 0.414752 -2.4 1.234688 +v 0.417645 -0.0084 -0.569086 +v 0.417645 -0.0084 0.569086 +v 0.425519 -2.5974 0.312283 +v 0.425519 -2.5974 -0.312283 +v 0.440403 -2.463 -1.311049 +v 0.440403 -2.463 1.311049 +v 0.440935 -0.018225 0.847506 +v 0.440935 -0.018225 -0.847506 +v 0.440985 -2.482687 -1.312782 +v 0.440985 -2.482687 1.312782 +v 0.441041 -0.0648 1.312948 +v 0.441041 -0.0648 -1.312948 +v 0.442166 -2.435437 -1.316296 +v 0.442166 -2.435437 1.316296 +v 0.443529 -2.4945 -1.320356 +v 0.443529 -2.4945 1.320356 +v 0.446656 -2.4 -1.329664 +v 0.446656 -2.4 1.329664 +v 0.447653 -2.498438 -1.332632 +v 0.447653 -2.498438 1.332632 +v 0.449256 -2.5272 -0.863501 +v 0.449256 -2.5272 0.863501 +v 0.452973 -2.4945 -1.348469 +v 0.452973 -2.4945 1.348469 +v 0.459107 -2.482687 -1.366728 +v 0.459107 -2.482687 1.366728 +v 0.461116 -0.084525 1.372712 +v 0.461116 -0.084525 -1.372712 +v 0.465671 -2.463 -1.386270 +v 0.465671 -2.463 1.386270 +v 0.467878 -2.5974 -0.243424 +v 0.467878 -2.5974 0.243424 +v 0.472283 -2.435437 -1.405953 +v 0.472283 -2.435437 1.405953 +v 0.472434 -0.1056 1.406405 +v 0.472434 -0.1056 -1.406405 +v 0.477435 -0.127575 1.421292 +v 0.477435 -0.127575 -1.421292 +v 0.478256 -2.5728 -0.478256 +v 0.478256 -2.5728 0.478256 +v 0.478560 -0.15 -1.424640 +v 0.478560 -2.4 -1.424640 +v 0.478560 -0.15 1.424640 +v 0.478560 -0.15 1.424640 +v 0.478560 -0.15 -1.424640 +v 0.478560 -2.4 1.424640 +v 0.483027 -0.177075 -1.437937 +v 0.483027 -0.177075 1.437937 +v 0.489984 -2.55 -0.667656 +v 0.489984 -2.55 0.667656 +v 0.495150 -0.2136 -1.474028 +v 0.495150 -0.2136 1.474028 +v 0.499272 -0.0084 -0.499272 +v 0.499272 -0.0084 0.499272 +v 0.499384 -2.5974 -0.167751 +v 0.499384 -2.5974 0.167751 +v 0.502408 -2.242575 -1.495635 +v 0.502408 -2.242575 1.495635 +v 0.509349 -2.5026 0.979002 +v 0.509349 -2.5026 -0.979002 +v 0.513016 -0.260025 -1.527214 +v 0.513016 -0.260025 1.527214 +v 0.519028 -2.5974 0.086273 +v 0.519028 -2.5974 -0.086273 +v 0.525778 -2.0856 -1.565204 +v 0.525778 -2.0856 1.565204 +v 0.525800 -2.5974 -0.000000 +v 0.525800 -2.5974 0.000000 +v 0.529441 -0.0312 -1.017621 +v 0.529441 -0.0312 1.017621 +v 0.534711 -0.3168 -1.591798 +v 0.534711 -0.3168 1.591798 +v 0.545131 -2.5728 -0.400065 +v 0.545131 -2.5728 0.400065 +v 0.548190 -1.929525 -1.631925 +v 0.548190 -1.929525 1.631925 +v 0.557774 -2.4744 -1.072079 +v 0.557774 -2.4744 1.072079 +v 0.558320 -0.384375 -1.662080 +v 0.558320 -0.384375 1.662080 +v 0.565664 -0.018225 0.770779 +v 0.565664 -0.018225 -0.770779 +v 0.569086 -0.0084 -0.417645 +v 0.569086 -0.0084 0.417645 +v 0.569167 -1.7748 -1.694372 +v 0.569167 -1.7748 1.694372 +v 0.576340 -2.5272 -0.785325 +v 0.576340 -2.5272 0.785325 +v 0.581929 -0.4632 -1.732362 +v 0.581929 -0.4632 1.732362 +v 0.585750 -2.55 -0.585750 +v 0.585750 -2.55 0.585750 +v 0.588230 -1.621875 -1.751120 +v 0.588230 -1.621875 1.751120 +v 0.590089 -2.4408 1.134190 +v 0.590089 -2.4408 -1.134190 +v 0.594614 -0.046875 -1.142888 +v 0.594614 -0.046875 1.142888 +v 0.599396 -2.5728 -0.311850 +v 0.599396 -2.5728 0.311850 +v 0.601848 -2.4 -1.156792 +v 0.601848 -2.4 1.156792 +v 0.603624 -0.553725 -1.796946 +v 0.603624 -0.553725 1.796946 +v 0.604900 -1.4712 -1.800745 +v 0.604900 -1.4712 1.800745 +v 0.618698 -1.323225 -1.841822 +v 0.618698 -1.323225 1.841822 +v 0.621490 -0.6564 -1.850132 +v 0.621490 -0.6564 1.850132 +v 0.625735 -0.0084 0.325553 +v 0.625735 -0.0084 -0.325553 +v 0.629147 -1.1784 -1.872927 +v 0.629147 -1.1784 1.872927 +v 0.633613 -0.771675 -1.886223 +v 0.633613 -0.771675 1.886223 +v 0.635767 -1.037175 -1.892634 +v 0.635767 -1.037175 1.892634 +v 0.638080 -0.9 -1.899520 +v 0.638080 -0.9 -1.899520 +v 0.638080 -0.9 1.899520 +v 0.638080 -0.9 1.899520 +v 0.639070 -2.463 -1.228335 +v 0.639070 -2.463 1.228335 +v 0.639758 -2.5728 -0.214905 +v 0.639758 -2.5728 0.214905 +v 0.639915 -2.482687 1.229959 +v 0.639915 -2.482687 -1.229959 +v 0.639996 -0.0648 -1.230115 +v 0.639996 -0.0648 1.230115 +v 0.641628 -2.435437 -1.233252 +v 0.641628 -2.435437 1.233252 +v 0.643607 -2.4945 -1.237056 +v 0.643607 -2.4945 1.237056 +v 0.648144 -2.4 -1.245776 +v 0.648144 -2.4 1.245776 +v 0.649591 -2.498438 -1.248557 +v 0.649591 -2.498438 1.248557 +v 0.653431 -2.5026 -0.890370 +v 0.653431 -2.5026 0.890370 +v 0.657311 -2.4945 -1.263395 +v 0.657311 -2.4945 1.263395 +v 0.664924 -2.5728 -0.110524 +v 0.664924 -2.5728 0.110524 +v 0.666211 -2.482687 1.280502 +v 0.666211 -2.482687 -1.280502 +v 0.667656 -2.55 -0.489984 +v 0.667656 -2.55 0.489984 +v 0.667871 -0.0084 -0.224349 +v 0.667871 -0.0084 0.224349 +v 0.669128 -0.084525 -1.286108 +v 0.669128 -0.084525 1.286108 +v 0.673600 -2.5728 0.000000 +v 0.673600 -2.5728 -0.000000 +v 0.675736 -2.463 -1.298810 +v 0.675736 -2.463 1.298810 +v 0.676222 -0.018225 0.676222 +v 0.676222 -0.018225 -0.676222 +v 0.679207 -0.0312 -0.925493 +v 0.679207 -0.0312 0.925493 +v 0.685331 -2.435437 -1.317252 +v 0.685331 -2.435437 1.317252 +v 0.685551 -0.1056 -1.317675 +v 0.685551 -0.1056 1.317675 +v 0.688984 -2.5272 -0.688984 +v 0.688984 -2.5272 0.688984 +v 0.692808 -0.127575 1.331623 +v 0.692808 -0.127575 -1.331623 +v 0.694143 -0.0084 -0.115381 +v 0.694143 -0.0084 0.115381 +v 0.694440 -0.15 1.334760 +v 0.694440 -0.15 -1.334760 +v 0.694440 -2.4 1.334760 +v 0.694440 -0.15 -1.334760 +v 0.694440 -0.15 1.334760 +v 0.694440 -2.4 -1.334760 +v 0.700921 -0.177075 1.347218 +v 0.700921 -0.177075 -1.347218 +v 0.703200 -0.0084 0.000000 +v 0.715555 -2.4744 -0.975021 +v 0.715555 -2.4744 0.975021 +v 0.718514 -0.2136 1.381032 +v 0.718514 -0.2136 -1.381032 +v 0.729046 -2.242575 -1.401276 +v 0.729046 -2.242575 1.401276 +v 0.734118 -2.55 -0.381942 +v 0.734118 -2.55 0.381942 +v 0.744440 -0.260025 1.430863 +v 0.744440 -0.260025 -1.430863 +v 0.757010 -2.4408 1.031508 +v 0.757010 -2.4408 -1.031508 +v 0.762816 -0.046875 -1.039419 +v 0.762816 -0.046875 1.039419 +v 0.762958 -2.0856 -1.466456 +v 0.762958 -2.0856 1.466456 +v 0.770779 -0.018225 0.565664 +v 0.770779 -0.018225 -0.565664 +v 0.772096 -2.4 -1.052064 +v 0.772096 -2.4 1.052064 +v 0.775921 -0.3168 -1.491372 +v 0.775921 -0.3168 1.491372 +v 0.781142 -2.5026 -0.781142 +v 0.781142 -2.5026 0.781142 +v 0.783552 -2.55 -0.263208 +v 0.783552 -2.55 0.263208 +v 0.785325 -2.5272 -0.576340 +v 0.785325 -2.5272 0.576340 +v 0.795481 -1.929525 1.528968 +v 0.795481 -1.929525 -1.528968 +v 0.810180 -0.384375 1.557220 +v 0.810180 -0.384375 -1.557220 +v 0.811956 -0.0312 0.811956 +v 0.811956 -0.0312 -0.811956 +v 0.814374 -2.55 -0.135366 +v 0.814374 -2.55 0.135366 +v 0.819847 -2.463 -1.117130 +v 0.819847 -2.463 1.117130 +v 0.820931 -2.482687 1.118607 +v 0.820931 -2.482687 -1.118607 +v 0.821035 -0.0648 1.118749 +v 0.821035 -0.0648 -1.118749 +v 0.823129 -2.435437 -1.121601 +v 0.823129 -2.435437 1.121601 +v 0.825000 -2.55 0.000000 +v 0.825000 -2.55 0.000000 +v 0.825668 -2.4945 -1.125061 +v 0.825668 -2.4945 1.125061 +v 0.825921 -1.7748 1.587475 +v 0.825921 -1.7748 -1.587475 +v 0.831488 -2.4 -1.132992 +v 0.831488 -2.4 1.132992 +v 0.833344 -2.498438 -1.135521 +v 0.833344 -2.498438 1.135521 +v 0.843248 -2.4945 -1.149016 +v 0.843248 -2.4945 1.149016 +v 0.844439 -0.4632 1.623068 +v 0.844439 -0.4632 -1.623068 +v 0.847506 -0.018225 -0.440935 +v 0.847506 -0.018225 0.440935 +v 0.853583 -1.621875 -1.640643 +v 0.853583 -1.621875 1.640643 +v 0.854666 -2.482687 -1.164574 +v 0.854666 -2.482687 1.164574 +v 0.855408 -2.4744 -0.855408 +v 0.855408 -2.4744 0.855408 +v 0.858407 -0.084525 -1.169673 +v 0.858407 -0.084525 1.169673 +v 0.863501 -2.5272 -0.449256 +v 0.863501 -2.5272 0.449256 +v 0.866886 -2.463 -1.181225 +v 0.866886 -2.463 1.181225 +v 0.875920 -0.553725 -1.683577 +v 0.875920 -0.553725 1.683577 +v 0.877772 -1.4712 -1.687137 +v 0.877772 -1.4712 1.687137 +v 0.879195 -2.435437 -1.197997 +v 0.879195 -2.435437 1.197997 +v 0.879477 -0.1056 -1.198382 +v 0.879477 -0.1056 1.198382 +v 0.888786 -0.127575 1.211067 +v 0.888786 -0.127575 -1.211067 +v 0.890370 -2.5026 -0.653431 +v 0.890370 -2.5026 0.653431 +v 0.890880 -0.15 -1.213920 +v 0.890880 -0.15 1.213920 +v 0.890880 -2.4 -1.213920 +v 0.890880 -0.15 -1.213920 +v 0.890880 -0.15 1.213920 +v 0.890880 -2.4 1.213920 +v 0.897795 -1.323225 -1.725622 +v 0.897795 -1.323225 1.725622 +v 0.899195 -0.177075 1.225250 +v 0.899195 -0.177075 -1.225250 +v 0.901846 -0.6564 -1.733408 +v 0.901846 -0.6564 1.733408 +v 0.904575 -0.018225 0.303862 +v 0.904575 -0.018225 -0.303862 +v 0.904966 -2.4408 0.904966 +v 0.904966 -2.4408 -0.904966 +v 0.911906 -0.046875 -0.911906 +v 0.911906 -0.046875 0.911906 +v 0.912957 -1.1784 -1.754764 +v 0.912957 -1.1784 1.754764 +v 0.919439 -0.771675 -1.767222 +v 0.919439 -0.771675 1.767222 +v 0.921647 -2.5272 -0.309596 +v 0.921647 -2.5272 0.309596 +v 0.921764 -0.2136 1.256003 +v 0.921764 -0.2136 -1.256003 +v 0.922564 -1.037175 1.773229 +v 0.922564 -1.037175 -1.773229 +v 0.923000 -2.4 -0.923000 +v 0.923000 -2.4 0.923000 +v 0.925493 -0.0312 0.679207 +v 0.925493 -0.0312 -0.679207 +v 0.925920 -0.9 1.779680 +v 0.925920 -0.9 -1.779680 +v 0.925920 -0.9 -1.779680 +v 0.925920 -0.9 1.779680 +v 0.935276 -2.242575 -1.274414 +v 0.935276 -2.242575 1.274414 +v 0.940158 -0.018225 0.156274 +v 0.940158 -0.018225 -0.156274 +v 0.952425 -0.018225 0.000000 +v 0.952425 -0.018225 0.000000 +v 0.955023 -0.260025 1.301322 +v 0.955023 -0.260025 -1.301322 +v 0.957901 -2.5272 -0.159223 +v 0.957901 -2.5272 0.159223 +v 0.970400 -2.5272 0.000000 +v 0.970400 -2.5272 -0.000000 +v 0.975021 -2.4744 -0.715555 +v 0.975021 -2.4744 0.715555 +v 0.978780 -2.0856 -1.333693 +v 0.978780 -2.0856 1.333693 +v 0.979002 -2.5026 0.509349 +v 0.979002 -2.5026 -0.509349 +v 0.980084 -2.463 -0.980084 +v 0.980084 -2.463 0.980084 +v 0.981380 -2.482687 -0.981380 +v 0.981380 -2.482687 0.981380 +v 0.981504 -0.0648 0.981504 +v 0.981504 -0.0648 -0.981504 +v 0.984007 -2.435437 -0.984007 +v 0.984007 -2.435437 0.984007 +v 0.987042 -2.4945 -0.987042 +v 0.987042 -2.4945 0.987042 +v 0.994000 -2.4 -0.994000 +v 0.994000 -2.4 0.994000 +v 0.995410 -0.3168 -1.356353 +v 0.995410 -0.3168 1.356353 +v 0.996219 -2.498438 -0.996219 +v 0.996219 -2.498438 0.996219 +v 1.008058 -2.4945 -1.008058 +v 1.008058 -2.4945 1.008058 +v 1.017621 -0.0312 0.529441 +v 1.017621 -0.0312 -0.529441 +v 1.020503 -1.929525 -1.390545 +v 1.020503 -1.929525 1.390545 +v 1.021708 -2.482687 -1.021708 +v 1.021708 -2.482687 1.021708 +v 1.026181 -0.084525 -1.026181 +v 1.026181 -0.084525 1.026181 +v 1.031508 -2.4408 0.757010 +v 1.031508 -2.4408 -0.757010 +v 1.036316 -2.463 -1.036316 +v 1.036316 -2.463 1.036316 +v 1.039360 -0.384375 -1.416240 +v 1.039360 -0.384375 1.416240 +v 1.039419 -0.046875 -0.762816 +v 1.039419 -0.046875 0.762816 +v 1.044926 -2.5026 -0.351008 +v 1.044926 -2.5026 0.351008 +v 1.051031 -2.435437 -1.051031 +v 1.051031 -2.435437 1.051031 +v 1.051368 -0.1056 -1.051368 +v 1.051368 -0.1056 1.051368 +v 1.052064 -2.4 -0.772096 +v 1.052064 -2.4 0.772096 +v 1.059553 -1.7748 -1.443756 +v 1.059553 -1.7748 1.443756 +v 1.062497 -0.127575 1.062497 +v 1.062497 -0.127575 -1.062497 +v 1.065000 -0.15 -1.065000 +v 1.065000 -0.15 1.065000 +v 1.065000 -2.4 -1.065000 +v 1.065000 -2.4 1.065000 +v 1.072079 -2.4744 -0.557774 +v 1.072079 -2.4744 0.557774 +v 1.074940 -0.177075 -1.074940 +v 1.074940 -0.177075 1.074940 +v 1.083310 -0.4632 -1.476127 +v 1.083310 -0.4632 1.476127 +v 1.086029 -2.5026 0.180521 +v 1.086029 -2.5026 -0.180521 +v 1.086146 -0.0312 0.364854 +v 1.086146 -0.0312 -0.364854 +v 1.095040 -1.621875 -1.492110 +v 1.095040 -1.621875 1.492110 +v 1.100200 -2.5026 -0.000000 +v 1.100200 -2.5026 0.000000 +v 1.101920 -0.2136 1.101920 +v 1.101920 -0.2136 -1.101920 +v 1.117130 -2.463 -0.819847 +v 1.117130 -2.463 0.819847 +v 1.118073 -2.242575 -1.118073 +v 1.118073 -2.242575 1.118073 +v 1.118607 -2.482687 -0.820931 +v 1.118607 -2.482687 0.820931 +v 1.118749 -0.0648 -0.821035 +v 1.118749 -0.0648 0.821035 +v 1.121601 -2.435437 -0.823129 +v 1.121601 -2.435437 0.823129 +v 1.123697 -0.553725 -1.531158 +v 1.123697 -0.553725 1.531158 +v 1.125061 -2.4945 -0.825668 +v 1.125061 -2.4945 0.825668 +v 1.126072 -1.4712 -1.534395 +v 1.126072 -1.4712 1.534395 +v 1.128870 -0.0312 -0.187642 +v 1.128870 -0.0312 0.187642 +v 1.132992 -2.4 -0.831488 +v 1.132992 -2.4 0.831488 +v 1.134190 -2.4408 0.590089 +v 1.134190 -2.4408 -0.590089 +v 1.135521 -2.498438 -0.833344 +v 1.135521 -2.498438 0.833344 +v 1.141680 -0.260025 1.141680 +v 1.141680 -0.260025 -1.141680 +v 1.142888 -0.046875 -0.594614 +v 1.142888 -0.046875 0.594614 +v 1.143600 -0.0312 0.000000 +v 1.143600 -0.0312 0.000000 +v 1.144271 -2.4744 -0.384379 +v 1.144271 -2.4744 0.384379 +v 1.149016 -2.4945 -0.843248 +v 1.149016 -2.4945 0.843248 +v 1.151759 -1.323225 -1.569396 +v 1.151759 -1.323225 1.569396 +v 1.156792 -2.4 -0.601848 +v 1.156792 -2.4 0.601848 +v 1.156956 -0.6564 -1.576477 +v 1.156956 -0.6564 1.576477 +v 1.164574 -2.482687 -0.854666 +v 1.164574 -2.482687 0.854666 +v 1.169673 -0.084525 -0.858407 +v 1.169673 -0.084525 0.858407 +v 1.170080 -2.0856 -1.170080 +v 1.170080 -2.0856 1.170080 +v 1.171210 -1.1784 -1.595900 +v 1.171210 -1.1784 1.595900 +v 1.179525 -0.771675 -1.607230 +v 1.179525 -0.771675 1.607230 +v 1.181225 -2.463 -0.866886 +v 1.181225 -2.463 0.866886 +v 1.183534 -1.037175 -1.612693 +v 1.183534 -1.037175 1.612693 +v 1.187840 -0.9 -1.618560 +v 1.187840 -0.9 -1.618560 +v 1.187840 -0.9 1.618560 +v 1.187840 -0.9 1.618560 +v 1.189282 -2.4744 -0.197684 +v 1.189282 -2.4744 0.197684 +v 1.189960 -0.3168 -1.189960 +v 1.189960 -0.3168 1.189960 +v 1.197997 -2.435437 -0.879195 +v 1.197997 -2.435437 0.879195 +v 1.198382 -0.1056 -0.879477 +v 1.198382 -0.1056 0.879477 +v 1.204800 -2.4744 0.000000 +v 1.204800 -2.4744 -0.000000 +v 1.210564 -2.4408 0.406648 +v 1.210564 -2.4408 -0.406648 +v 1.211067 -0.127575 0.888786 +v 1.211067 -0.127575 -0.888786 +v 1.213920 -0.15 -0.890880 +v 1.213920 -0.15 -0.890880 +v 1.213920 -0.15 0.890880 +v 1.213920 -0.15 0.890880 +v 1.213920 -2.4 -0.890880 +v 1.213920 -2.4 0.890880 +v 1.219848 -0.046875 -0.409767 +v 1.219848 -0.046875 0.409767 +v 1.219958 -1.929525 1.219958 +v 1.219958 -1.929525 -1.219958 +v 1.225250 -0.177075 0.899195 +v 1.225250 -0.177075 -0.899195 +v 1.228335 -2.463 -0.639070 +v 1.228335 -2.463 0.639070 +v 1.229959 -2.482687 -0.639915 +v 1.229959 -2.482687 0.639915 +v 1.230115 -0.0648 -0.639996 +v 1.230115 -0.0648 0.639996 +v 1.233252 -2.435437 -0.641628 +v 1.233252 -2.435437 0.641628 +v 1.234688 -2.4 -0.414752 +v 1.234688 -2.4 0.414752 +v 1.237056 -2.4945 -0.643607 +v 1.237056 -2.4945 0.643607 +v 1.242500 -0.384375 -1.242500 +v 1.242500 -0.384375 1.242500 +v 1.245776 -2.4 -0.648144 +v 1.245776 -2.4 0.648144 +v 1.248557 -2.498438 -0.649591 +v 1.248557 -2.498438 0.649591 +v 1.256003 -0.2136 0.921764 +v 1.256003 -0.2136 -0.921764 +v 1.258183 -2.4408 0.209136 +v 1.258183 -2.4408 -0.209136 +v 1.263395 -2.4945 -0.657311 +v 1.263395 -2.4945 0.657311 +v 1.266640 -1.7748 -1.266640 +v 1.266640 -1.7748 1.266640 +v 1.267832 -0.046875 -0.210740 +v 1.267832 -0.046875 0.210740 +v 1.274414 -2.242575 -0.935276 +v 1.274414 -2.242575 0.935276 +v 1.274600 -2.4408 0.000000 +v 1.274600 -2.4408 0.000000 +v 1.280502 -2.482687 -0.666211 +v 1.280502 -2.482687 0.666211 +v 1.283256 -2.4 -0.213304 +v 1.283256 -2.4 0.213304 +v 1.284375 -0.046875 0.000000 +v 1.284375 -0.046875 -0.000000 +v 1.286108 -0.084525 -0.669128 +v 1.286108 -0.084525 0.669128 +v 1.295040 -0.4632 -1.295040 +v 1.295040 -0.4632 1.295040 +v 1.298810 -2.463 -0.675736 +v 1.298810 -2.463 0.675736 +v 1.300000 -2.4 0.000000 +v 1.300000 -2.4 -0.000000 +v 1.301322 -0.260025 0.955023 +v 1.301322 -0.260025 -0.955023 +v 1.309063 -1.621875 -1.309063 +v 1.309063 -1.621875 1.309063 +v 1.311049 -2.463 -0.440403 +v 1.311049 -2.463 0.440403 +v 1.312782 -2.482687 -0.440985 +v 1.312782 -2.482687 0.440985 +v 1.312948 -0.0648 0.441041 +v 1.312948 -0.0648 -0.441041 +v 1.316296 -2.435437 -0.442166 +v 1.316296 -2.435437 0.442166 +v 1.317252 -2.435437 -0.685331 +v 1.317252 -2.435437 0.685331 +v 1.317675 -0.1056 -0.685551 +v 1.317675 -0.1056 0.685551 +v 1.320356 -2.4945 -0.443529 +v 1.320356 -2.4945 0.443529 +v 1.329664 -2.4 -0.446656 +v 1.329664 -2.4 0.446656 +v 1.331623 -0.127575 0.692808 +v 1.331623 -0.127575 -0.692808 +v 1.332632 -2.498438 -0.447653 +v 1.332632 -2.498438 0.447653 +v 1.333693 -2.0856 -0.978780 +v 1.333693 -2.0856 0.978780 +v 1.334760 -0.15 0.694440 +v 1.334760 -0.15 -0.694440 +v 1.334760 -0.15 -0.694440 +v 1.334760 -0.15 0.694440 +v 1.334760 -2.4 -0.694440 +v 1.334760 -2.4 0.694440 +v 1.343320 -0.553725 -1.343320 +v 1.343320 -0.553725 1.343320 +v 1.346160 -1.4712 -1.346160 +v 1.346160 -1.4712 1.346160 +v 1.347218 -0.177075 0.700921 +v 1.347218 -0.177075 -0.700921 +v 1.348469 -2.4945 -0.452973 +v 1.348469 -2.4945 0.452973 +v 1.356353 -0.3168 -0.995410 +v 1.356353 -0.3168 0.995410 +v 1.362620 -2.463 -0.226496 +v 1.362620 -2.463 0.226496 +v 1.364422 -2.482687 -0.226795 +v 1.364422 -2.482687 0.226795 +v 1.364595 -0.0648 -0.226824 +v 1.364595 -0.0648 0.226824 +v 1.366728 -2.482687 -0.459107 +v 1.366728 -2.482687 0.459107 +v 1.368074 -2.435437 -0.227403 +v 1.368074 -2.435437 0.227403 +v 1.372294 -2.4945 -0.228104 +v 1.372294 -2.4945 0.228104 +v 1.372712 -0.084525 -0.461116 +v 1.372712 -0.084525 0.461116 +v 1.376867 -1.323225 -1.376868 +v 1.376868 -1.323225 1.376867 +v 1.380400 -2.463 0.000000 +v 1.380400 -2.463 -0.000000 +v 1.381032 -0.2136 0.718514 +v 1.381032 -0.2136 -0.718514 +v 1.381968 -2.4 -0.229712 +v 1.381968 -2.4 0.229712 +v 1.382225 -2.482687 0.000000 +v 1.382225 -2.482687 0.000000 +v 1.382400 -0.0648 0.000000 +v 1.382400 -0.0648 0.000000 +v 1.383080 -0.6564 -1.383080 +v 1.383080 -0.6564 1.383080 +v 1.385053 -2.498438 -0.230225 +v 1.385053 -2.498438 0.230225 +v 1.385925 -2.435437 0.000000 +v 1.385925 -2.435437 -0.000000 +v 1.386270 -2.463 -0.465671 +v 1.386270 -2.463 0.465671 +v 1.390200 -2.4945 0.000000 +v 1.390200 -2.4945 -0.000000 +v 1.390545 -1.929525 -1.020503 +v 1.390545 -1.929525 1.020503 +v 1.400000 -2.4 0.000000 +v 1.400000 -2.4 0.000000 +v 1.400120 -1.1784 -1.400120 +v 1.400120 -1.1784 1.400120 +v 1.401276 -2.242575 -0.729046 +v 1.401276 -2.242575 0.729046 +v 1.401513 -2.4945 -0.232961 +v 1.401513 -2.4945 0.232961 +v 1.403125 -2.498438 0.000000 +v 1.403125 -2.498438 0.000000 +v 1.405953 -2.435437 -0.472283 +v 1.405953 -2.435437 0.472283 +v 1.406405 -0.1056 -0.472434 +v 1.406405 -0.1056 0.472434 +v 1.410060 -0.771675 -1.410060 +v 1.410060 -0.771675 1.410060 +v 1.414853 -1.037175 -1.414853 +v 1.414853 -1.037175 1.414853 +v 1.416240 -0.384375 -1.039360 +v 1.416240 -0.384375 1.039360 +v 1.419800 -2.4945 0.000000 +v 1.419800 -2.4945 -0.000000 +v 1.420000 -0.9 -1.420000 +v 1.420000 -0.9 -1.420000 +v 1.420000 -0.9 1.420000 +v 1.420000 -0.9 1.420000 +v 1.420490 -2.482687 -0.236115 +v 1.420490 -2.482687 0.236115 +v 1.421292 -0.127575 0.477435 +v 1.421292 -0.127575 -0.477435 +v 1.424640 -0.15 -0.478560 +v 1.424640 -0.15 -0.478560 +v 1.424640 -0.15 0.478560 +v 1.424640 -0.15 0.478560 +v 1.424640 -2.4 -0.478560 +v 1.424640 -2.4 0.478560 +v 1.426709 -0.084525 -0.237149 +v 1.426709 -0.084525 0.237149 +v 1.430863 -0.260025 0.744440 +v 1.430863 -0.260025 -0.744440 +v 1.437937 -0.177075 0.483027 +v 1.437937 -0.177075 -0.483027 +v 1.439025 -2.482687 0.000000 +v 1.440800 -2.463 -0.239491 +v 1.440800 -2.463 0.239491 +v 1.443756 -1.7748 -1.059553 +v 1.443756 -1.7748 1.059553 +v 1.445325 -0.084525 0.000000 +v 1.445325 -0.084525 0.000000 +v 1.459600 -2.463 0.000000 +v 1.459600 -2.463 -0.000000 +v 1.461258 -2.435437 -0.242892 +v 1.461258 -2.435437 0.242892 +v 1.461727 -0.1056 -0.242970 +v 1.461727 -0.1056 0.242970 +v 1.466456 -2.0856 -0.762958 +v 1.466456 -2.0856 0.762958 +v 1.474028 -0.2136 0.495150 +v 1.474028 -0.2136 -0.495150 +v 1.476127 -0.4632 -1.083310 +v 1.476127 -0.4632 1.083310 +v 1.477200 -0.127575 0.245542 +v 1.477200 -0.127575 -0.245542 +v 1.480325 -2.435437 0.000000 +v 1.480325 -2.435437 -0.000000 +v 1.480680 -0.15 -0.246120 +v 1.480680 -0.15 0.246120 +v 1.480680 -0.15 0.246120 +v 1.480680 -0.15 -0.246120 +v 1.480680 -2.4 -0.246120 +v 1.480680 -2.4 0.246120 +v 1.480800 -0.1056 0.000000 +v 1.480800 -0.1056 0.000000 +v 1.491372 -0.3168 -0.775921 +v 1.491372 -0.3168 0.775921 +v 1.492110 -1.621875 -1.095040 +v 1.492110 -1.621875 1.095040 +v 1.494500 -0.177075 0.248417 +v 1.494500 -0.177075 -0.248417 +v 1.495635 -2.242575 -0.502408 +v 1.495635 -2.242575 0.502408 +v 1.496475 -0.127575 0.000000 +v 1.496475 -0.127575 0.000000 +v 1.500000 -0.15 0.000000 +v 1.500000 -0.15 0.000000 +v 1.500000 -2.4 0.000000 +v 1.500000 -2.4 0.000000 +v 1.514000 -0.177075 -0.000000 +v 1.514000 -0.177075 0.000000 +v 1.527214 -0.260025 -0.513016 +v 1.527214 -0.260025 0.513016 +v 1.528968 -1.929525 -0.795481 +v 1.528968 -1.929525 0.795481 +v 1.531158 -0.553725 -1.123697 +v 1.531158 -0.553725 1.123697 +v 1.532010 -0.2136 0.254652 +v 1.532010 -0.2136 -0.254652 +v 1.534395 -1.4712 -1.126072 +v 1.534395 -1.4712 1.126072 +v 1.552000 -0.2136 0.000000 +v 1.552000 -0.2136 0.000000 +v 1.554467 -2.242575 -0.258385 +v 1.554467 -2.242575 0.258385 +v 1.557220 -0.384375 -0.810180 +v 1.557220 -0.384375 0.810180 +v 1.565204 -2.0856 -0.525778 +v 1.565204 -2.0856 0.525778 +v 1.569396 -1.323225 -1.151759 +v 1.569396 -1.323225 1.151759 +v 1.574750 -2.242575 0.000000 +v 1.574750 -2.242575 0.000000 +v 1.576477 -0.6564 -1.156956 +v 1.576477 -0.6564 1.156956 +v 1.587289 -0.260025 0.263841 +v 1.587289 -0.260025 -0.263841 +v 1.587475 -1.7748 -0.825921 +v 1.587475 -1.7748 0.825921 +v 1.591798 -0.3168 -0.534711 +v 1.591798 -0.3168 0.534711 +v 1.595900 -1.1784 -1.171210 +v 1.595900 -1.1784 1.171210 +v 1.607230 -0.771675 -1.179525 +v 1.607230 -0.771675 1.179525 +v 1.608000 -0.260025 0.000000 +v 1.608000 -0.260025 0.000000 +v 1.612693 -1.037175 -1.183534 +v 1.612693 -1.037175 1.183534 +v 1.618560 -0.9 -1.187840 +v 1.618560 -0.9 -1.187840 +v 1.618560 -0.9 1.187840 +v 1.618560 -0.9 1.187840 +v 1.623068 -0.4632 -0.844439 +v 1.623068 -0.4632 0.844439 +v 1.626774 -2.0856 -0.270404 +v 1.626774 -2.0856 0.270404 +v 1.631925 -1.929525 -0.548190 +v 1.631925 -1.929525 0.548190 +v 1.640643 -1.621875 -0.853583 +v 1.640643 -1.621875 0.853583 +v 1.648000 -2.0856 0.000000 +v 1.648000 -2.0856 -0.000000 +v 1.654413 -0.3168 -0.274998 +v 1.654413 -0.3168 0.274998 +v 1.662080 -0.384375 -0.558320 +v 1.662080 -0.384375 0.558320 +v 1.676000 -0.3168 0.000000 +v 1.676000 -0.3168 0.000000 +v 1.683577 -0.553725 -0.875920 +v 1.683577 -0.553725 0.875920 +v 1.687137 -1.4712 -0.877772 +v 1.687137 -1.4712 0.877772 +v 1.694372 -1.7748 -0.569167 +v 1.694372 -1.7748 0.569167 +v 1.696119 -1.929525 -0.281930 +v 1.696119 -1.929525 0.281930 +v 1.700000 -0.6 0.000000 +v 1.700000 -0.6 0.000000 +v 1.700000 -0.6231 0.178200 +v 1.700000 -0.6231 -0.178200 +v 1.700000 -0.6858 -0.316800 +v 1.700000 -0.6858 0.316800 +v 1.700000 -0.7782 0.415800 +v 1.700000 -0.7782 -0.415800 +v 1.700000 -0.8904 -0.475200 +v 1.700000 -0.8904 0.475200 +v 1.700000 -1.0125 -0.495000 +v 1.700000 -1.0125 0.495000 +v 1.700000 -1.1346 -0.475200 +v 1.700000 -1.1346 0.475200 +v 1.700000 -1.2468 0.415800 +v 1.700000 -1.2468 -0.415800 +v 1.700000 -1.3392 -0.316800 +v 1.700000 -1.3392 0.316800 +v 1.700000 -1.4019 0.178200 +v 1.700000 -1.4019 -0.178200 +v 1.700000 -1.425 0.000000 +v 1.700000 -1.425 0.000000 +v 1.718250 -1.929525 0.000000 +v 1.718250 -1.929525 0.000000 +v 1.725622 -1.323225 -0.897795 +v 1.725622 -1.323225 0.897795 +v 1.727460 -0.384375 -0.287140 +v 1.727460 -0.384375 0.287140 +v 1.732362 -0.4632 -0.581929 +v 1.732362 -0.4632 0.581929 +v 1.733408 -0.6564 -0.901846 +v 1.733408 -0.6564 0.901846 +v 1.750000 -0.384375 0.000000 +v 1.750000 -0.384375 0.000000 +v 1.751120 -1.621875 -0.588230 +v 1.751120 -1.621875 0.588230 +v 1.754764 -1.1784 -0.912957 +v 1.754764 -1.1784 0.912957 +v 1.761022 -1.7748 -0.292719 +v 1.761022 -1.7748 0.292719 +v 1.767222 -0.771675 -0.919439 +v 1.767222 -0.771675 0.919439 +v 1.773229 -1.037175 -0.922564 +v 1.773229 -1.037175 0.922564 +v 1.779680 -0.9 -0.925920 +v 1.779680 -0.9 -0.925920 +v 1.779680 -0.9 0.925920 +v 1.779680 -0.9 0.925920 +v 1.784000 -1.7748 0.000000 +v 1.784000 -1.7748 0.000000 +v 1.796946 -0.553725 -0.603624 +v 1.796946 -0.553725 0.603624 +v 1.800507 -0.4632 -0.299282 +v 1.800507 -0.4632 0.299282 +v 1.800745 -1.4712 -0.604900 +v 1.800745 -1.4712 0.604900 +v 1.820003 -1.621875 -0.302523 +v 1.820003 -1.621875 0.302522 +v 1.824000 -0.4632 0.000000 +v 1.824000 -0.4632 0.000000 +v 1.841822 -1.323225 -0.618698 +v 1.841822 -1.323225 0.618698 +v 1.843750 -1.621875 0.000000 +v 1.843750 -1.621875 -0.000000 +v 1.850132 -0.6564 -0.621490 +v 1.850132 -0.6564 0.621490 +v 1.867631 -0.553725 -0.310439 +v 1.867631 -0.553725 0.310439 +v 1.871580 -1.4712 -0.311096 +v 1.871580 -1.4712 0.311096 +v 1.872927 -1.1784 -0.629147 +v 1.872927 -1.1784 0.629147 +v 1.886223 -0.771675 -0.633613 +v 1.886223 -0.771675 0.633613 +v 1.892000 -0.553725 0.000000 +v 1.892000 -0.553725 -0.000000 +v 1.892634 -1.037175 -0.635767 +v 1.892634 -1.037175 0.635767 +v 1.896000 -1.4712 0.000000 +v 1.896000 -1.4712 0.000000 +v 1.899520 -0.9 -0.638080 +v 1.899520 -0.9 -0.638080 +v 1.899520 -0.9 0.638080 +v 1.899520 -0.9 0.638080 +v 1.914272 -1.323225 -0.318192 +v 1.914272 -1.323225 0.318192 +v 1.922910 -0.6564 -0.319628 +v 1.922910 -0.6564 0.319628 +v 1.935900 -1.4442 0.000000 +v 1.935900 -1.4442 0.000000 +v 1.939250 -1.323225 0.000000 +v 1.939250 -1.323225 -0.000000 +v 1.939394 -1.423221 -0.175100 +v 1.939394 -1.423221 0.175100 +v 1.946601 -1.1784 -0.323566 +v 1.946601 -1.1784 0.323566 +v 1.948000 -0.6564 0.000000 +v 1.948000 -0.6564 -0.000000 +v 1.948879 -1.366278 -0.311290 +v 1.948879 -1.366278 0.311290 +v 1.960420 -0.771675 -0.325863 +v 1.960420 -0.771675 0.325863 +v 1.962857 -1.282362 -0.408568 +v 1.962857 -1.282362 0.408568 +v 1.967083 -1.037175 -0.326970 +v 1.967083 -1.037175 0.326970 +v 1.972000 -1.1784 0.000000 +v 1.972000 -1.1784 0.000000 +v 1.974240 -0.9 -0.328160 +v 1.974240 -0.9 0.328160 +v 1.974240 -0.9 0.328160 +v 1.979830 -1.180464 -0.466934 +v 1.979830 -1.180464 0.466934 +v 1.986000 -0.771675 0.000000 +v 1.986000 -0.771675 -0.000000 +v 1.992750 -1.037175 0.000000 +v 1.992750 -1.037175 0.000000 +v 1.998300 -1.069575 -0.486390 +v 1.998300 -1.069575 0.486390 +v 2.000000 -0.9 0.000000 +v 2.000000 -0.9 0.000000 +v 2.016770 -0.958686 -0.466934 +v 2.016770 -0.958686 0.466934 +v 2.033743 -0.856788 -0.408568 +v 2.033743 -0.856788 0.408568 +v 2.047721 -0.772872 0.311290 +v 2.047721 -0.772872 -0.311290 +v 2.057206 -0.715929 0.175100 +v 2.057206 -0.715929 -0.175100 +v 2.060700 -0.69495 0.000000 +v 2.060700 -0.69495 0.000000 +v 2.111200 -1.4976 0.000000 +v 2.111200 -1.4976 0.000000 +v 2.116979 -1.47912 -0.166687 +v 2.116979 -1.47912 0.166687 +v 2.132666 -1.42896 -0.296333 +v 2.132666 -1.42896 0.296333 +v 2.155782 -1.35504 -0.388937 +v 2.155782 -1.35504 0.388937 +v 2.183853 -1.26528 -0.444499 +v 2.183853 -1.26528 0.444499 +v 2.214400 -1.1676 -0.463020 +v 2.214400 -1.1676 0.463020 +v 2.237300 -1.5789 0.000000 +v 2.237300 -1.5789 0.000000 +v 2.244457 -1.563171 -0.154289 +v 2.244457 -1.563171 0.154289 +v 2.244947 -1.06992 -0.444499 +v 2.244947 -1.06992 0.444499 +v 2.263882 -1.520478 -0.274291 +v 2.263882 -1.520478 0.274291 +v 2.273018 -0.98016 -0.388937 +v 2.273018 -0.98016 0.388937 +v 2.292510 -1.457562 -0.360007 +v 2.292510 -1.457562 0.360007 +v 2.296134 -0.90624 -0.296333 +v 2.296134 -0.90624 0.296333 +v 2.311821 -0.85608 -0.166687 +v 2.311821 -0.85608 0.166687 +v 2.317600 -0.8376 0.000000 +v 2.317600 -0.8376 0.000000 +v 2.325600 -1.6818 0.000000 +v 2.325600 -1.6818 0.000000 +v 2.327271 -1.381164 -0.411437 +v 2.327271 -1.381164 0.411437 +v 2.333530 -1.668948 -0.139234 +v 2.333530 -1.668948 0.139234 +v 2.355053 -1.634064 -0.247526 +v 2.355053 -1.634064 0.247526 +v 2.365100 -1.298025 -0.428580 +v 2.365100 -1.298025 0.428580 +v 2.386771 -1.582656 -0.324878 +v 2.386771 -1.582656 0.324878 +v 2.387500 -1.8 0.000000 +v 2.387500 -1.8 0.000000 +v 2.395900 -1.790025 0.122850 +v 2.395900 -1.790025 -0.122850 +v 2.402929 -1.214886 -0.411437 +v 2.402929 -1.214886 0.411437 +v 2.418700 -1.76295 -0.218400 +v 2.418700 -1.76295 0.218400 +v 2.425286 -1.520232 -0.371290 +v 2.425286 -1.520232 0.371290 +v 2.434400 -1.9272 0.000000 +v 2.434400 -1.9272 0.000000 +v 2.437690 -1.138488 -0.360007 +v 2.437690 -1.138488 0.360007 +v 2.443270 -1.919976 0.106466 +v 2.443270 -1.919976 -0.106466 +v 2.452300 -1.72305 -0.286650 +v 2.452300 -1.72305 0.286650 +v 2.466318 -1.075572 -0.274291 +v 2.466318 -1.075572 0.274291 +v 2.467200 -1.4523 -0.386760 +v 2.467200 -1.4523 0.386760 +v 2.467347 -1.900368 0.189274 +v 2.467347 -1.900368 -0.189274 +v 2.477700 -2.0571 0.000000 +v 2.477700 -2.0571 0.000000 +v 2.485743 -1.032879 -0.154289 +v 2.485743 -1.032879 0.154289 +v 2.487343 -2.052375 -0.091411 +v 2.487343 -2.052375 0.091411 +v 2.492900 -1.01715 0.000000 +v 2.492900 -1.01715 0.000000 +v 2.493100 -1.6746 -0.327600 +v 2.493100 -1.6746 0.327600 +v 2.502829 -1.871472 0.248422 +v 2.502829 -1.871472 -0.248422 +v 2.509114 -1.384368 -0.371290 +v 2.509114 -1.384368 0.371290 +v 2.513518 -2.03955 0.162509 +v 2.513518 -2.03955 -0.162509 +v 2.528800 -2.1834 0.000000 +v 2.537500 -1.621875 -0.341250 +v 2.537500 -1.621875 0.341250 +v 2.539821 -2.180796 -0.079013 +v 2.539821 -2.180796 0.079013 +v 2.545914 -1.836384 -0.283910 +v 2.545914 -1.836384 0.283910 +v 2.547629 -1.321944 -0.324878 +v 2.547629 -1.321944 0.324878 +v 2.552090 -2.02065 -0.213293 +v 2.552090 -2.02065 0.213293 +v 2.569734 -2.173728 -0.140467 +v 2.569734 -2.173728 0.140467 +v 2.579347 -1.270536 -0.247526 +v 2.579347 -1.270536 0.247526 +v 2.581900 -1.56915 -0.327600 +v 2.581900 -1.56915 0.327600 +v 2.592800 -1.7982 -0.295740 +v 2.592800 -1.7982 0.295740 +v 2.598929 -1.9977 -0.243763 +v 2.598929 -1.9977 0.243763 +v 2.599100 -2.2998 0.000000 +v 2.599100 -2.2998 0.000000 +v 2.600870 -1.235652 -0.139234 +v 2.600870 -1.235652 0.139234 +v 2.608800 -1.2228 0.000000 +v 2.608800 -1.2228 0.000000 +v 2.612406 -2.298813 0.070600 +v 2.612406 -2.298813 -0.070600 +v 2.613818 -2.163312 -0.184363 +v 2.613818 -2.163312 0.184363 +v 2.622700 -1.5207 -0.286650 +v 2.622700 -1.5207 0.286650 +v 2.639686 -1.760016 -0.283910 +v 2.639686 -1.760016 0.283910 +v 2.648521 -2.296134 0.125510 +v 2.648521 -2.296134 -0.125510 +v 2.649900 -1.972725 0.253920 +v 2.649900 -1.972725 -0.253920 +v 2.656300 -1.4808 -0.218400 +v 2.656300 -1.4808 0.218400 +v 2.667347 -2.150664 -0.210701 +v 2.667347 -2.150664 0.210701 +v 2.679100 -1.453725 0.122850 +v 2.679100 -1.453725 -0.122850 +v 2.682771 -1.724928 0.248422 +v 2.682771 -1.724928 -0.248422 +v 2.687500 -1.44375 0.000000 +v 2.687500 -1.44375 0.000000 +v 2.700000 -2.4 0.000000 +v 2.700000 -2.4 0.000000 +v 2.700000 -2.4 0.000000 +v 2.700871 -1.94775 -0.243763 +v 2.700871 -1.94775 0.243763 +v 2.701743 -2.292186 0.164732 +v 2.701743 -2.292186 -0.164732 +v 2.716800 -2.4 0.067500 +v 2.716800 -2.4 -0.067500 +v 2.716800 -2.4 -0.067500 +v 2.716800 -2.4 0.067500 +v 2.718253 -1.696032 0.189274 +v 2.718253 -1.696032 -0.189274 +v 2.725600 -2.1369 -0.219480 +v 2.725600 -2.1369 0.219480 +v 2.729800 -2.42025 0.000000 +v 2.742330 -1.676424 0.106466 +v 2.742330 -1.676424 -0.106466 +v 2.747407 -2.420406 -0.066744 +v 2.747407 -2.420406 0.066744 +v 2.747710 -1.9248 -0.213293 +v 2.747710 -1.9248 0.213293 +v 2.751200 -1.6692 0.000000 +v 2.751200 -1.6692 0.000000 +v 2.758400 -2.436 0.000000 +v 2.762400 -2.4 0.120000 +v 2.762400 -2.4 -0.120000 +v 2.762400 -2.4 -0.120000 +v 2.762400 -2.4 0.120000 +v 2.766370 -2.287392 0.188266 +v 2.766370 -2.287392 -0.188266 +v 2.776365 -2.436302 -0.064692 +v 2.776365 -2.436302 0.064692 +v 2.783853 -2.123136 -0.210701 +v 2.783853 -2.123136 0.210701 +v 2.784600 -2.44725 0.000000 +v 2.784600 -2.44725 0.000000 +v 2.786282 -1.9059 0.162509 +v 2.786282 -1.9059 -0.162509 +v 2.795198 -2.420829 -0.118656 +v 2.795198 -2.420829 0.118656 +v 2.800000 -2.4 0.000000 +v 2.802528 -2.44768 -0.061668 +v 2.802528 -2.44768 0.061668 +v 2.807200 -2.454 0.000000 +v 2.811200 -2.4 -0.040500 +v 2.811200 -2.4 0.040500 +v 2.812457 -1.893075 0.091411 +v 2.812457 -1.893075 -0.091411 +v 2.822100 -1.88835 0.000000 +v 2.822100 -1.88835 0.000000 +v 2.824200 -2.42025 0.000000 +v 2.824200 -2.42025 0.000000 +v 2.824750 -2.454529 -0.057996 +v 2.824750 -2.454529 0.057996 +v 2.825000 -2.45625 0.000000 +v 2.825000 -2.45625 0.000000 +v 2.825126 -2.437123 -0.115008 +v 2.825126 -2.437123 0.115008 +v 2.829600 -2.4 0.157500 +v 2.829600 -2.4 -0.157500 +v 2.829600 -2.4 -0.157500 +v 2.829600 -2.4 0.157500 +v 2.836672 -2.420519 -0.041256 +v 2.836672 -2.420519 0.041256 +v 2.836700 -2.282175 0.196110 +v 2.836700 -2.282175 -0.196110 +v 2.836800 -2.454 0.000000 +v 2.836800 -2.454 0.000000 +v 2.837382 -2.110488 -0.184363 +v 2.837382 -2.110488 0.184363 +v 2.837600 -2.436 0.000000 +v 2.837600 -2.436 0.000000 +v 2.841400 -2.44725 0.000000 +v 2.841400 -2.44725 0.000000 +v 2.841600 -2.4 -0.072000 +v 2.841600 -2.4 0.072000 +v 2.841887 -2.456841 -0.054000 +v 2.841887 -2.456841 0.054000 +v 2.851189 -2.448847 -0.109632 +v 2.851189 -2.448847 0.109632 +v 2.851331 -2.436454 -0.043308 +v 2.851331 -2.436454 0.043308 +v 2.852794 -2.454605 -0.050004 +v 2.852794 -2.454605 0.050004 +v 2.856323 -2.447812 -0.046332 +v 2.856323 -2.447812 0.046332 +v 2.865626 -2.421453 -0.155736 +v 2.865626 -2.421453 0.155736 +v 2.870524 -2.42125 -0.073344 +v 2.870524 -2.42125 0.073344 +v 2.872387 -2.455966 -0.103104 +v 2.872387 -2.455966 0.103104 +v 2.881466 -2.100072 -0.140467 +v 2.881466 -2.100072 0.140467 +v 2.886400 -2.4 -0.094500 +v 2.886400 -2.4 0.094500 +v 2.887725 -2.458444 -0.096000 +v 2.887725 -2.458444 0.096000 +v 2.888602 -2.437685 -0.076992 +v 2.888602 -2.437685 0.076992 +v 2.896205 -2.456246 0.088896 +v 2.896205 -2.456246 -0.088896 +v 2.896829 -2.449338 -0.082368 +v 2.896829 -2.449338 0.082368 +v 2.896986 -2.438333 -0.150948 +v 2.896986 -2.438333 0.150948 +v 2.907030 -2.276958 0.188266 +v 2.907030 -2.276958 -0.188266 +v 2.911200 -2.4 -0.180000 +v 2.911200 -2.4 -0.180000 +v 2.911200 -2.4 0.180000 +v 2.911379 -2.093004 -0.079013 +v 2.911379 -2.093004 0.079013 +v 2.920412 -2.422328 -0.096264 +v 2.920412 -2.422328 0.096264 +v 2.922400 -2.0904 0.000000 +v 2.922899 -2.450567 -0.143892 +v 2.922899 -2.450567 0.143892 +v 2.940800 -2.4 -0.108000 +v 2.940800 -2.4 0.108000 +v 2.942589 -2.458082 -0.135324 +v 2.942589 -2.458082 0.135324 +v 2.943526 -2.439499 -0.101052 +v 2.943526 -2.439499 0.101052 +v 2.951146 -2.42221 -0.177984 +v 2.951146 -2.42221 0.177984 +v 2.955275 -2.460806 -0.126000 +v 2.955275 -2.460806 0.126000 +v 2.956523 -2.451588 -0.108108 +v 2.956523 -2.451588 0.108108 +v 2.960179 -2.458666 -0.116676 +v 2.960179 -2.458666 0.116676 +v 2.971657 -2.272164 0.164732 +v 2.971657 -2.272164 -0.164732 +v 2.980990 -2.423636 0.110016 +v 2.980990 -2.423636 -0.110016 +v 2.984243 -2.439802 -0.172512 +v 2.984243 -2.439802 0.172512 +v 3.000000 -2.4 -0.187500 +v 3.000000 -2.4 -0.187500 +v 3.000000 -2.4 -0.112500 +v 3.000000 -2.4 0.112500 +v 3.000000 -2.4 0.187500 +v 3.009977 -2.452655 -0.164448 +v 3.009977 -2.452655 0.164448 +v 3.010221 -2.441702 -0.115488 +v 3.010221 -2.441702 0.115488 +v 3.024879 -2.268216 0.125510 +v 3.024879 -2.268216 -0.125510 +v 3.027834 -2.460653 -0.154656 +v 3.027834 -2.460653 0.154656 +v 3.029007 -2.454319 -0.123552 +v 3.029007 -2.454319 0.123552 +v 3.037300 -2.463675 -0.144000 +v 3.037300 -2.463675 0.144000 +v 3.037862 -2.461603 0.133344 +v 3.037862 -2.461603 -0.133344 +v 3.044212 -2.423034 -0.185400 +v 3.044212 -2.423034 0.185400 +v 3.046912 -2.425059 0.114600 +v 3.046912 -2.425059 -0.114600 +v 3.059200 -2.4 -0.108000 +v 3.059200 -2.4 0.108000 +v 3.060994 -2.265537 0.070600 +v 3.060994 -2.265537 -0.070600 +v 3.074300 -2.26455 0.000000 +v 3.074300 -2.26455 0.000000 +v 3.079200 -2.4414 -0.179700 +v 3.079200 -2.4414 0.179700 +v 3.082800 -2.4441 -0.120300 +v 3.082800 -2.4441 0.120300 +v 3.088800 -2.4 -0.180000 +v 3.088800 -2.4 -0.180000 +v 3.088800 -2.4 0.180000 +v 3.104737 -2.454928 -0.171300 +v 3.104738 -2.454928 0.171300 +v 3.107887 -2.457291 -0.128700 +v 3.107887 -2.457291 0.128700 +v 3.112835 -2.426483 0.110016 +v 3.112835 -2.426483 -0.110016 +v 3.113600 -2.4 -0.094500 +v 3.113600 -2.4 0.094500 +v 3.120600 -2.46345 0.161100 +v 3.120600 -2.46345 -0.161100 +v 3.122400 -2.4648 0.138900 +v 3.122400 -2.4648 -0.138900 +v 3.126562 -2.466797 -0.150000 +v 3.126562 -2.466797 0.150000 +v 3.137279 -2.423859 -0.177984 +v 3.137279 -2.423859 0.177984 +v 3.155379 -2.446498 -0.115488 +v 3.155379 -2.446498 0.115488 +v 3.158400 -2.4 -0.072000 +v 3.158400 -2.4 0.072000 +v 3.170400 -2.4 -0.157500 +v 3.170400 -2.4 0.157500 +v 3.170400 -2.4 -0.157500 +v 3.173413 -2.427791 -0.096264 +v 3.173413 -2.427791 0.096264 +v 3.174157 -2.442998 -0.172512 +v 3.174157 -2.442998 0.172512 +v 3.186768 -2.460263 -0.123552 +v 3.186768 -2.460263 0.123552 +v 3.188800 -2.4 -0.040500 +v 3.188800 -2.4 0.040500 +v 3.199498 -2.457201 -0.164448 +v 3.199498 -2.457201 0.164448 +v 3.200000 -2.4 0.000000 +v 3.206938 -2.467997 0.133344 +v 3.206938 -2.467997 -0.133344 +v 3.213366 -2.466247 -0.154656 +v 3.213366 -2.466247 0.154656 +v 3.215825 -2.469919 -0.144000 +v 3.215825 -2.469919 0.144000 +v 3.222074 -2.448701 -0.101052 +v 3.222074 -2.448701 0.101052 +v 3.222799 -2.424616 -0.155736 +v 3.222799 -2.424616 0.155736 +v 3.223301 -2.428868 -0.073344 +v 3.223301 -2.428868 0.073344 +v 3.237600 -2.4 -0.120000 +v 3.237600 -2.4 0.120000 +v 3.237600 -2.4 -0.120000 +v 3.257153 -2.429599 -0.041256 +v 3.257153 -2.429599 0.041256 +v 3.259252 -2.462994 -0.108108 +v 3.259252 -2.462994 0.108108 +v 3.261414 -2.444467 -0.150948 +v 3.261414 -2.444467 0.150948 +v 3.269625 -2.429869 0.000000 +v 3.269625 -2.429869 0.000000 +v 3.276998 -2.450515 -0.076992 +v 3.276998 -2.450515 0.076992 +v 3.283200 -2.4 -0.067500 +v 3.283200 -2.4 0.067500 +v 3.283200 -2.4 -0.067500 +v 3.284621 -2.470934 -0.116676 +v 3.284621 -2.470934 0.116676 +v 3.286576 -2.459289 -0.143892 +v 3.286576 -2.459289 0.143892 +v 3.293227 -2.42524 -0.118656 +v 3.293227 -2.42524 0.118656 +v 3.297850 -2.472787 -0.126000 +v 3.297850 -2.472788 0.126000 +v 3.298611 -2.468818 -0.135324 +v 3.298611 -2.468818 0.135324 +v 3.300000 -2.4 0.000000 +v 3.300000 -2.4 0.000000 +v 3.314269 -2.451746 -0.043308 +v 3.314269 -2.451746 0.043308 +v 3.318946 -2.465243 -0.082368 +v 3.318946 -2.465243 0.082368 +v 3.328000 -2.4522 0.000000 +v 3.328000 -2.4522 0.000000 +v 3.333274 -2.445677 -0.115008 +v 3.333274 -2.445677 0.115008 +v 3.341018 -2.425663 -0.066744 +v 3.341018 -2.425663 0.066744 +v 3.348595 -2.473354 0.088896 +v 3.348595 -2.473354 -0.088896 +v 3.358286 -2.461009 -0.109632 +v 3.358286 -2.461009 0.109632 +v 3.358625 -2.425819 0.000000 +v 3.359452 -2.466769 -0.046332 +v 3.359452 -2.466769 0.046332 +v 3.365400 -2.47515 -0.096000 +v 3.365400 -2.47515 0.096000 +v 3.368813 -2.470934 -0.103104 +v 3.368813 -2.470934 0.103104 +v 3.374375 -2.467331 0.000000 +v 3.374375 -2.467331 0.000000 +v 3.382035 -2.446498 -0.064692 +v 3.382035 -2.446498 0.064692 +v 3.392006 -2.474995 -0.050004 +v 3.392006 -2.474995 0.050004 +v 3.400000 -2.4468 0.000000 +v 3.406947 -2.462176 -0.061668 +v 3.406947 -2.462176 0.061668 +v 3.408000 -2.4756 0.000000 +v 3.408000 -2.4756 0.000000 +v 3.411237 -2.476753 -0.054000 +v 3.411237 -2.476753 0.054000 +v 3.416450 -2.472371 -0.057996 +v 3.416450 -2.472371 0.057996 +v 3.424875 -2.462606 0.000000 +v 3.428125 -2.477344 0.000000 +v 3.428125 -2.477344 0.000000 +v 3.434000 -2.4729 0.000000 + +f 2909 2921 2939 +f 2939 2931 2909 +f 2869 2877 2921 +f 2921 2909 2869 +f 2819 2827 2877 +f 2877 2869 2819 +f 2737 2747 2827 +f 2827 2819 2737 +f 2669 2673 2747 +f 2747 2737 2669 +f 2567 2575 2673 +f 2673 2669 2567 +f 2476 2480 2575 +f 2575 2567 2476 +f 2358 2362 2480 +f 2480 2476 2358 +f 2158 2162 2362 +f 2362 2358 2158 +f 1715 1812 2162 +f 2162 2158 1715 +f 2901 2909 2931 +f 2931 2917 2901 +f 2863 2869 2909 +f 2909 2901 2863 +f 2813 2819 2869 +f 2869 2863 2813 +f 2729 2737 2819 +f 2819 2813 2729 +f 2663 2669 2737 +f 2737 2729 2663 +f 2561 2567 2669 +f 2669 2663 2561 +f 2468 2476 2567 +f 2567 2561 2468 +f 2350 2358 2476 +f 2476 2468 2350 +f 2152 2158 2358 +f 2358 2350 2152 +f 1717 1715 2158 +f 2158 2152 1717 +f 2903 2901 2917 +f 2917 2923 2903 +f 2865 2863 2901 +f 2901 2903 2865 +f 2815 2813 2863 +f 2863 2865 2815 +f 2733 2729 2813 +f 2813 2815 2733 +f 2665 2663 2729 +f 2729 2733 2665 +f 2564 2561 2663 +f 2663 2665 2564 +f 2473 2468 2561 +f 2561 2564 2473 +f 2354 2350 2468 +f 2468 2473 2354 +f 2155 2152 2350 +f 2350 2354 2155 +f 1927 1717 2152 +f 2152 2155 1927 +f 2911 2903 2923 +f 2923 2935 2911 +f 2875 2865 2903 +f 2903 2911 2875 +f 2823 2815 2865 +f 2865 2875 2823 +f 2741 2733 2815 +f 2815 2823 2741 +f 2671 2665 2733 +f 2733 2741 2671 +f 2571 2564 2665 +f 2665 2671 2571 +f 2478 2473 2564 +f 2564 2571 2478 +f 2360 2354 2473 +f 2473 2478 2360 +f 2160 2155 2354 +f 2354 2360 2160 +f 1718 1927 2155 +f 2155 2160 1718 +f 2929 2911 2935 +f 2935 2947 2929 +f 2881 2875 2911 +f 2911 2929 2881 +f 2829 2823 2875 +f 2875 2881 2829 +f 2751 2741 2823 +f 2823 2829 2751 +f 2677 2671 2741 +f 2741 2751 2677 +f 2577 2571 2671 +f 2671 2677 2577 +f 2482 2478 2571 +f 2571 2577 2482 +f 2364 2360 2478 +f 2478 2482 2364 +f 2164 2160 2360 +f 2360 2364 2164 +f 1842 1718 2160 +f 2160 2164 1842 +f 2945 2929 2947 +f 2947 2959 2945 +f 2897 2881 2929 +f 2929 2945 2897 +f 2835 2829 2881 +f 2881 2897 2835 +f 2761 2751 2829 +f 2829 2835 2761 +f 2679 2677 2751 +f 2751 2761 2679 +f 2579 2577 2677 +f 2677 2679 2579 +f 2486 2482 2577 +f 2577 2579 2486 +f 2368 2364 2482 +f 2482 2486 2368 +f 2172 2164 2364 +f 2364 2368 2172 +f 1725 1842 2164 +f 2164 2172 1725 +f 2965 2945 2959 +f 2959 2981 2965 +f 2907 2897 2945 +f 2945 2965 2907 +f 2845 2835 2897 +f 2897 2907 2845 +f 2769 2761 2835 +f 2835 2845 2769 +f 2685 2679 2761 +f 2761 2769 2685 +f 2587 2579 2679 +f 2679 2685 2587 +f 2491 2486 2579 +f 2579 2587 2491 +f 2370 2368 2486 +f 2486 2491 2370 +f 2174 2172 2368 +f 2368 2370 2174 +f 1834 1725 2172 +f 2172 2174 1834 +f 2982 2965 2981 +f 2981 2988 2982 +f 2933 2907 2965 +f 2965 2982 2933 +f 2855 2845 2907 +f 2907 2933 2855 +f 2779 2769 2845 +f 2845 2855 2779 +f 2691 2685 2769 +f 2769 2779 2691 +f 2595 2587 2685 +f 2685 2691 2595 +f 2500 2491 2587 +f 2587 2595 2500 +f 2374 2370 2491 +f 2491 2500 2374 +f 2178 2174 2370 +f 2370 2374 2178 +f 1716 1834 2174 +f 2174 2178 1716 +f 2990 2982 2988 +f 2988 3002 2990 +f 2949 2933 2982 +f 2982 2990 2949 +f 2871 2855 2933 +f 2933 2949 2871 +f 2791 2779 2855 +f 2855 2871 2791 +f 2699 2691 2779 +f 2779 2791 2699 +f 2601 2595 2691 +f 2691 2699 2601 +f 2506 2500 2595 +f 2595 2601 2506 +f 2378 2374 2500 +f 2500 2506 2378 +f 2180 2178 2374 +f 2374 2378 2180 +f 1714 1716 2178 +f 2178 2180 1714 +f 3008 2990 3002 +f 3002 3024 3008 +f 2973 2949 2990 +f 2990 3008 2973 +f 2889 2871 2949 +f 2949 2973 2889 +f 2805 2791 2871 +f 2871 2889 2805 +f 2711 2699 2791 +f 2791 2805 2711 +f 2611 2601 2699 +f 2699 2711 2611 +f 2521 2506 2601 +f 2601 2611 2521 +f 2387 2378 2506 +f 2506 2521 2387 +f 2191 2180 2378 +f 2378 2387 2191 +f 1810 1714 2180 +f 2180 2191 1810 +f 1464 1460 1813 +f 1813 1821 1464 +f 1264 1260 1460 +f 1460 1464 1264 +f 1146 1142 1260 +f 1260 1264 1146 +f 1055 1047 1142 +f 1142 1146 1055 +f 953 949 1047 +f 1047 1055 953 +f 885 875 949 +f 949 953 885 +f 803 795 875 +f 875 885 803 +f 753 745 795 +f 795 803 753 +f 713 701 745 +f 745 753 713 +f 691 683 701 +f 701 713 691 +f 1470 1464 1821 +f 1821 1829 1470 +f 1272 1264 1464 +f 1464 1470 1272 +f 1154 1146 1264 +f 1264 1272 1154 +f 1061 1055 1146 +f 1146 1154 1061 +f 959 953 1055 +f 1055 1061 959 +f 893 885 953 +f 953 959 893 +f 809 803 885 +f 885 893 809 +f 759 753 803 +f 803 809 759 +f 721 713 753 +f 753 759 721 +f 705 691 713 +f 713 721 705 +f 1469 1470 1829 +f 1829 1835 1469 +f 1268 1272 1470 +f 1470 1469 1268 +f 1151 1154 1272 +f 1272 1268 1151 +f 1060 1061 1154 +f 1154 1151 1060 +f 957 959 1061 +f 1061 1060 957 +f 889 893 959 +f 959 957 889 +f 807 809 893 +f 893 889 807 +f 757 759 809 +f 809 807 757 +f 719 721 759 +f 759 757 719 +f 699 705 721 +f 721 719 699 +f 1462 1469 1835 +f 1835 1839 1462 +f 1262 1268 1469 +f 1469 1462 1262 +f 1144 1151 1268 +f 1268 1262 1144 +f 1051 1060 1151 +f 1151 1144 1051 +f 951 957 1060 +f 1060 1051 951 +f 881 889 957 +f 957 951 881 +f 799 807 889 +f 889 881 799 +f 747 757 807 +f 807 799 747 +f 711 719 757 +f 757 747 711 +f 687 699 719 +f 719 711 687 +f 1458 1462 1839 +f 1839 1843 1458 +f 1258 1262 1462 +f 1462 1458 1258 +f 1140 1144 1262 +f 1262 1258 1140 +f 1045 1051 1144 +f 1144 1140 1045 +f 945 951 1051 +f 1051 1045 945 +f 871 881 951 +f 951 945 871 +f 793 799 881 +f 881 871 793 +f 741 747 799 +f 799 793 741 +f 693 711 747 +f 747 741 693 +f 675 687 711 +f 711 693 675 +f 1450 1458 1843 +f 1843 1838 1450 +f 1254 1258 1458 +f 1458 1450 1254 +f 1136 1140 1258 +f 1258 1254 1136 +f 1043 1045 1140 +f 1140 1136 1043 +f 943 945 1045 +f 1045 1043 943 +f 861 871 945 +f 945 943 861 +f 787 793 871 +f 871 861 787 +f 725 741 793 +f 793 787 725 +f 677 693 741 +f 741 725 677 +f 663 675 693 +f 693 677 663 +f 1448 1450 1838 +f 1838 1834 1448 +f 1252 1254 1450 +f 1450 1448 1252 +f 1133 1136 1254 +f 1254 1252 1133 +f 1035 1043 1136 +f 1136 1133 1035 +f 937 943 1043 +f 1043 1035 937 +f 853 861 943 +f 943 937 853 +f 777 787 861 +f 861 853 777 +f 715 725 787 +f 787 777 715 +f 657 677 725 +f 725 715 657 +f 642 663 677 +f 677 657 642 +f 1444 1448 1834 +f 1834 1828 1444 +f 1248 1252 1448 +f 1448 1444 1248 +f 1122 1133 1252 +f 1252 1248 1122 +f 1027 1035 1133 +f 1133 1122 1027 +f 931 937 1035 +f 1035 1027 931 +f 843 853 937 +f 937 931 843 +f 767 777 853 +f 853 843 767 +f 689 715 777 +f 777 767 689 +f 640 657 715 +f 715 689 640 +f 634 642 657 +f 657 640 634 +f 1442 1444 1828 +f 1828 1820 1442 +f 1244 1248 1444 +f 1444 1442 1244 +f 1116 1122 1248 +f 1248 1244 1116 +f 1021 1027 1122 +f 1122 1116 1021 +f 923 931 1027 +f 1027 1021 923 +f 831 843 931 +f 931 923 831 +f 751 767 843 +f 843 831 751 +f 673 689 767 +f 767 751 673 +f 632 640 689 +f 689 673 632 +f 620 634 640 +f 640 632 620 +f 1429 1442 1820 +f 1820 1811 1429 +f 1233 1244 1442 +f 1442 1429 1233 +f 1106 1116 1244 +f 1244 1233 1106 +f 1011 1021 1116 +f 1116 1106 1011 +f 911 923 1021 +f 1021 1011 911 +f 817 831 923 +f 923 911 817 +f 733 751 831 +f 831 817 733 +f 649 673 751 +f 751 733 649 +f 614 632 673 +f 673 649 614 +f 597 620 632 +f 632 614 597 +f 714 702 684 +f 684 692 714 +f 754 746 702 +f 702 714 754 +f 804 796 746 +f 746 754 804 +f 886 876 796 +f 796 804 886 +f 954 950 876 +f 876 886 954 +f 1056 1048 950 +f 950 954 1056 +f 1147 1143 1048 +f 1048 1056 1147 +f 1265 1261 1143 +f 1143 1147 1265 +f 1465 1461 1261 +f 1261 1265 1465 +f 1915 1817 1461 +f 1461 1465 1915 +f 722 714 692 +f 692 706 722 +f 760 754 714 +f 714 722 760 +f 810 804 754 +f 754 760 810 +f 894 886 804 +f 804 810 894 +f 960 954 886 +f 886 894 960 +f 1062 1056 954 +f 954 960 1062 +f 1155 1147 1056 +f 1056 1062 1155 +f 1273 1265 1147 +f 1147 1155 1273 +f 1471 1465 1265 +f 1265 1273 1471 +f 1917 1915 1465 +f 1465 1471 1917 +f 720 722 706 +f 706 700 720 +f 758 760 722 +f 722 720 758 +f 808 810 760 +f 760 758 808 +f 890 894 810 +f 810 808 890 +f 958 960 894 +f 894 890 958 +f 1059 1062 960 +f 960 958 1059 +f 1150 1155 1062 +f 1062 1059 1150 +f 1269 1273 1155 +f 1155 1150 1269 +f 1468 1471 1273 +f 1273 1269 1468 +f 1697 1917 1471 +f 1471 1468 1697 +f 712 720 700 +f 700 688 712 +f 748 758 720 +f 720 712 748 +f 800 808 758 +f 758 748 800 +f 882 890 808 +f 808 800 882 +f 952 958 890 +f 890 882 952 +f 1052 1059 958 +f 958 952 1052 +f 1145 1150 1059 +f 1059 1052 1145 +f 1263 1269 1150 +f 1150 1145 1263 +f 1463 1468 1269 +f 1269 1263 1463 +f 1919 1697 1468 +f 1468 1463 1919 +f 694 712 688 +f 688 676 694 +f 742 748 712 +f 712 694 742 +f 794 800 748 +f 748 742 794 +f 872 882 800 +f 800 794 872 +f 946 952 882 +f 882 872 946 +f 1046 1052 952 +f 952 946 1046 +f 1141 1145 1052 +f 1052 1046 1141 +f 1259 1263 1145 +f 1145 1141 1259 +f 1459 1463 1263 +f 1263 1259 1459 +f 1845 1919 1463 +f 1463 1459 1845 +f 678 694 676 +f 676 664 678 +f 726 742 694 +f 694 678 726 +f 788 794 742 +f 742 726 788 +f 862 872 794 +f 794 788 862 +f 944 946 872 +f 872 862 944 +f 1044 1046 946 +f 946 944 1044 +f 1137 1141 1046 +f 1046 1044 1137 +f 1255 1259 1141 +f 1141 1137 1255 +f 1451 1459 1259 +f 1259 1255 1451 +f 1898 1845 1459 +f 1459 1451 1898 +f 658 678 664 +f 664 642 658 +f 716 726 678 +f 678 658 716 +f 778 788 726 +f 726 716 778 +f 854 862 788 +f 788 778 854 +f 938 944 862 +f 862 854 938 +f 1036 1044 944 +f 944 938 1036 +f 1132 1137 1044 +f 1044 1036 1132 +f 1253 1255 1137 +f 1137 1132 1253 +f 1449 1451 1255 +f 1255 1253 1449 +f 1837 1898 1451 +f 1451 1449 1837 +f 641 658 642 +f 642 635 641 +f 690 716 658 +f 658 641 690 +f 768 778 716 +f 716 690 768 +f 844 854 778 +f 778 768 844 +f 932 938 854 +f 854 844 932 +f 1028 1036 938 +f 938 932 1028 +f 1123 1132 1036 +f 1036 1028 1123 +f 1249 1253 1132 +f 1132 1123 1249 +f 1445 1449 1253 +f 1253 1249 1445 +f 1918 1837 1449 +f 1449 1445 1918 +f 633 641 635 +f 635 621 633 +f 674 690 641 +f 641 633 674 +f 752 768 690 +f 690 674 752 +f 832 844 768 +f 768 752 832 +f 924 932 844 +f 844 832 924 +f 1022 1028 932 +f 932 924 1022 +f 1117 1123 1028 +f 1028 1022 1117 +f 1245 1249 1123 +f 1123 1117 1245 +f 1443 1445 1249 +f 1249 1245 1443 +f 1916 1918 1445 +f 1445 1443 1916 +f 616 633 621 +f 621 600 616 +f 654 674 633 +f 633 616 654 +f 737 752 674 +f 674 654 737 +f 822 832 752 +f 752 737 822 +f 914 924 832 +f 832 822 914 +f 1014 1022 924 +f 924 914 1014 +f 1104 1117 1022 +f 1022 1014 1104 +f 1237 1245 1117 +f 1117 1104 1237 +f 1433 1443 1245 +f 1245 1237 1433 +f 1819 1916 1443 +f 1443 1433 1819 +f 2159 2163 1816 +f 1816 1822 2159 +f 2359 2363 2163 +f 2163 2159 2359 +f 2477 2481 2363 +f 2363 2359 2477 +f 2568 2576 2481 +f 2481 2477 2568 +f 2670 2674 2576 +f 2576 2568 2670 +f 2738 2748 2674 +f 2674 2670 2738 +f 2820 2828 2748 +f 2748 2738 2820 +f 2870 2878 2828 +f 2828 2820 2870 +f 2910 2922 2878 +f 2878 2870 2910 +f 2932 2940 2922 +f 2922 2910 2932 +f 2153 2159 1822 +f 1822 1830 2153 +f 2351 2359 2159 +f 2159 2153 2351 +f 2469 2477 2359 +f 2359 2351 2469 +f 2562 2568 2477 +f 2477 2469 2562 +f 2664 2670 2568 +f 2568 2562 2664 +f 2730 2738 2670 +f 2670 2664 2730 +f 2814 2820 2738 +f 2738 2730 2814 +f 2864 2870 2820 +f 2820 2814 2864 +f 2902 2910 2870 +f 2870 2864 2902 +f 2918 2932 2910 +f 2910 2902 2918 +f 2154 2153 1830 +f 1830 1836 2154 +f 2355 2351 2153 +f 2153 2154 2355 +f 2472 2469 2351 +f 2351 2355 2472 +f 2563 2562 2469 +f 2469 2472 2563 +f 2666 2664 2562 +f 2562 2563 2666 +f 2734 2730 2664 +f 2664 2666 2734 +f 2816 2814 2730 +f 2730 2734 2816 +f 2866 2864 2814 +f 2814 2816 2866 +f 2904 2902 2864 +f 2864 2866 2904 +f 2924 2918 2902 +f 2902 2904 2924 +f 2161 2154 1836 +f 1836 1840 2161 +f 2361 2355 2154 +f 2154 2161 2361 +f 2479 2472 2355 +f 2355 2361 2479 +f 2572 2563 2472 +f 2472 2479 2572 +f 2672 2666 2563 +f 2563 2572 2672 +f 2742 2734 2666 +f 2666 2672 2742 +f 2824 2816 2734 +f 2734 2742 2824 +f 2876 2866 2816 +f 2816 2824 2876 +f 2912 2904 2866 +f 2866 2876 2912 +f 2936 2924 2904 +f 2904 2912 2936 +f 2165 2161 1840 +f 1840 1844 2165 +f 2365 2361 2161 +f 2161 2165 2365 +f 2483 2479 2361 +f 2361 2365 2483 +f 2578 2572 2479 +f 2479 2483 2578 +f 2678 2672 2572 +f 2572 2578 2678 +f 2752 2742 2672 +f 2672 2678 2752 +f 2830 2824 2742 +f 2742 2752 2830 +f 2882 2876 2824 +f 2824 2830 2882 +f 2930 2912 2876 +f 2876 2882 2930 +f 2948 2936 2912 +f 2912 2930 2948 +f 2173 2165 1844 +f 1844 1841 2173 +f 2369 2365 2165 +f 2165 2173 2369 +f 2487 2483 2365 +f 2365 2369 2487 +f 2580 2578 2483 +f 2483 2487 2580 +f 2680 2678 2578 +f 2578 2580 2680 +f 2762 2752 2678 +f 2678 2680 2762 +f 2836 2830 2752 +f 2752 2762 2836 +f 2898 2882 2830 +f 2830 2836 2898 +f 2946 2930 2882 +f 2882 2898 2946 +f 2960 2948 2930 +f 2930 2946 2960 +f 2175 2173 1841 +f 1841 1837 2175 +f 2371 2369 2173 +f 2173 2175 2371 +f 2490 2487 2369 +f 2369 2371 2490 +f 2588 2580 2487 +f 2487 2490 2588 +f 2686 2680 2580 +f 2580 2588 2686 +f 2770 2762 2680 +f 2680 2686 2770 +f 2846 2836 2762 +f 2762 2770 2846 +f 2908 2898 2836 +f 2836 2846 2908 +f 2966 2946 2898 +f 2898 2908 2966 +f 2981 2960 2946 +f 2946 2966 2981 +f 2179 2175 1837 +f 1837 1831 2179 +f 2375 2371 2175 +f 2175 2179 2375 +f 2501 2490 2371 +f 2371 2375 2501 +f 2596 2588 2490 +f 2490 2501 2596 +f 2692 2686 2588 +f 2588 2596 2692 +f 2780 2770 2686 +f 2686 2692 2780 +f 2856 2846 2770 +f 2770 2780 2856 +f 2934 2908 2846 +f 2846 2856 2934 +f 2983 2966 2908 +f 2908 2934 2983 +f 2989 2981 2966 +f 2966 2983 2989 +f 2181 2179 1831 +f 1831 1823 2181 +f 2379 2375 2179 +f 2179 2181 2379 +f 2507 2501 2375 +f 2375 2379 2507 +f 2602 2596 2501 +f 2501 2507 2602 +f 2700 2692 2596 +f 2596 2602 2700 +f 2792 2780 2692 +f 2692 2700 2792 +f 2872 2856 2780 +f 2780 2792 2872 +f 2950 2934 2856 +f 2856 2872 2950 +f 2991 2983 2934 +f 2934 2950 2991 +f 3003 2989 2983 +f 2983 2991 3003 +f 2194 2181 1823 +f 1823 1818 2194 +f 2391 2379 2181 +f 2181 2194 2391 +f 2518 2507 2379 +f 2379 2391 2518 +f 2614 2602 2507 +f 2507 2518 2614 +f 2712 2700 2602 +f 2602 2614 2712 +f 2806 2792 2700 +f 2700 2712 2806 +f 2890 2872 2792 +f 2792 2806 2890 +f 2974 2950 2872 +f 2872 2890 2974 +f 3009 2991 2950 +f 2950 2974 3009 +f 3025 3003 2991 +f 2991 3009 3025 +f 3040 3008 3024 +f 3024 3048 3040 +f 3018 2973 3008 +f 3008 3040 3018 +f 2943 2889 2973 +f 2973 3018 2943 +f 2841 2805 2889 +f 2889 2943 2841 +f 2731 2711 2805 +f 2805 2841 2731 +f 2645 2611 2711 +f 2711 2731 2645 +f 2529 2521 2611 +f 2611 2645 2529 +f 2402 2387 2521 +f 2521 2529 2402 +f 2208 2191 2387 +f 2387 2402 2208 +f 1806 1810 2191 +f 2191 2208 1806 +f 3072 3040 3048 +f 3048 3078 3072 +f 3044 3018 3040 +f 3040 3072 3044 +f 2994 2943 3018 +f 3018 3044 2994 +f 2883 2841 2943 +f 2943 2994 2883 +f 2773 2731 2841 +f 2841 2883 2773 +f 2659 2645 2731 +f 2731 2773 2659 +f 2539 2529 2645 +f 2645 2659 2539 +f 2410 2402 2529 +f 2529 2539 2410 +f 2222 2208 2402 +f 2402 2410 2222 +f 1694 1806 2208 +f 2208 2222 1694 +f 3092 3072 3078 +f 3078 3116 3092 +f 3074 3044 3072 +f 3072 3092 3074 +f 3030 2994 3044 +f 3044 3074 3030 +f 2937 2883 2994 +f 2994 3030 2937 +f 2810 2773 2883 +f 2883 2937 2810 +f 2683 2659 2773 +f 2773 2810 2683 +f 2554 2539 2659 +f 2659 2683 2554 +f 2420 2410 2539 +f 2539 2554 2420 +f 2238 2222 2410 +f 2410 2420 2238 +f 1930 1694 2222 +f 2222 2238 1930 +f 3132 3092 3116 +f 3116 3142 3132 +f 3090 3074 3092 +f 3092 3132 3090 +f 3054 3030 3074 +f 3074 3090 3054 +f 2984 2937 3030 +f 3030 3054 2984 +f 2837 2810 2937 +f 2937 2984 2837 +f 2705 2683 2810 +f 2810 2837 2705 +f 2574 2554 2683 +f 2683 2705 2574 +f 2430 2420 2554 +f 2554 2574 2430 +f 2247 2238 2420 +f 2420 2430 2247 +f 1913 1930 2238 +f 2238 2247 1913 +f 3150 3132 3142 +f 3142 3156 3150 +f 3128 3090 3132 +f 3132 3150 3128 +f 3076 3054 3090 +f 3090 3128 3076 +f 3014 2984 3054 +f 3054 3076 3014 +f 2861 2837 2984 +f 2984 3014 2861 +f 2723 2705 2837 +f 2837 2861 2723 +f 2585 2574 2705 +f 2705 2723 2585 +f 2438 2430 2574 +f 2574 2585 2438 +f 2253 2247 2430 +f 2430 2438 2253 +f 1711 1913 2247 +f 2247 2253 1711 +f 3162 3150 3156 +f 3156 3172 3162 +f 3148 3128 3150 +f 3150 3162 3148 +f 3088 3076 3128 +f 3128 3148 3088 +f 3036 3014 3076 +f 3076 3088 3036 +f 2893 2861 3014 +f 3014 3036 2893 +f 2743 2723 2861 +f 2861 2893 2743 +f 2599 2585 2723 +f 2723 2743 2599 +f 2450 2438 2585 +f 2585 2599 2450 +f 2267 2253 2438 +f 2438 2450 2267 +f 1794 1711 2253 +f 2253 2267 1794 +f 3178 3162 3172 +f 3172 3184 3178 +f 3154 3148 3162 +f 3162 3178 3154 +f 3118 3088 3148 +f 3148 3154 3118 +f 3046 3036 3088 +f 3088 3118 3046 +f 2915 2893 3036 +f 3036 3046 2915 +f 2763 2743 2893 +f 2893 2915 2763 +f 2615 2599 2743 +f 2743 2763 2615 +f 2452 2450 2599 +f 2599 2615 2452 +f 2277 2267 2450 +f 2450 2452 2277 +f 1710 1794 2267 +f 2267 2277 1710 +f 3188 3178 3184 +f 3184 3200 3188 +f 3164 3154 3178 +f 3178 3188 3164 +f 3130 3118 3154 +f 3154 3164 3130 +f 3058 3046 3118 +f 3118 3130 3058 +f 2941 2915 3046 +f 3046 3058 2941 +f 2775 2763 2915 +f 2915 2941 2775 +f 2627 2615 2763 +f 2763 2775 2627 +f 2458 2452 2615 +f 2615 2627 2458 +f 2287 2277 2452 +f 2452 2458 2287 +f 1910 1710 2277 +f 2277 2287 1910 +f 3198 3188 3200 +f 3200 3209 3198 +f 3170 3164 3188 +f 3188 3198 3170 +f 3136 3130 3164 +f 3164 3170 3136 +f 3064 3058 3130 +f 3130 3136 3064 +f 2955 2941 3058 +f 3058 3064 2955 +f 2781 2775 2941 +f 2941 2955 2781 +f 2636 2627 2775 +f 2775 2781 2636 +f 2462 2458 2627 +f 2627 2636 2462 +f 2295 2287 2458 +f 2458 2462 2295 +f 1909 1910 2287 +f 2287 2295 1909 +f 3202 3198 3209 +f 3209 3213 3202 +f 3174 3170 3198 +f 3198 3202 3174 +f 3138 3136 3170 +f 3170 3174 3138 +f 3066 3064 3136 +f 3136 3138 3066 +f 2961 2955 3064 +f 3064 3066 2961 +f 2783 2781 2955 +f 2955 2961 2783 +f 2642 2636 2781 +f 2781 2783 2642 +f 2464 2462 2636 +f 2636 2642 2464 +f 2297 2295 2462 +f 2462 2464 2297 +f 1784 1909 2295 +f 2295 2297 1784 +f 1414 1429 1811 +f 1811 1807 1414 +f 1220 1233 1429 +f 1429 1414 1220 +f 1093 1106 1233 +f 1233 1220 1093 +f 977 1011 1106 +f 1106 1093 977 +f 891 911 1011 +f 1011 977 891 +f 781 817 911 +f 911 891 781 +f 679 733 817 +f 817 781 679 +f 604 649 733 +f 733 679 604 +f 571 614 649 +f 649 604 571 +f 561 597 614 +f 614 571 561 +f 1400 1414 1807 +f 1807 1804 1400 +f 1212 1220 1414 +f 1414 1400 1212 +f 1083 1093 1220 +f 1220 1212 1083 +f 963 977 1093 +f 1093 1083 963 +f 849 891 977 +f 977 963 849 +f 739 781 891 +f 891 849 739 +f 628 679 781 +f 781 739 628 +f 565 604 679 +f 679 628 565 +f 530 571 604 +f 604 565 530 +f 524 561 571 +f 571 530 524 +f 1386 1400 1804 +f 1804 1802 1386 +f 1202 1212 1400 +f 1400 1386 1202 +f 1070 1083 1212 +f 1212 1202 1070 +f 939 963 1083 +f 1083 1070 939 +f 814 849 963 +f 963 939 814 +f 685 739 849 +f 849 814 685 +f 585 628 739 +f 739 685 585 +f 528 565 628 +f 628 585 528 +f 510 530 565 +f 565 528 510 +f 508 524 530 +f 530 510 508 +f 1375 1386 1802 +f 1802 1800 1375 +f 1192 1202 1386 +f 1386 1375 1192 +f 1050 1070 1202 +f 1202 1192 1050 +f 917 939 1070 +f 1070 1050 917 +f 785 814 939 +f 939 917 785 +f 638 685 814 +f 814 785 638 +f 553 585 685 +f 685 638 553 +f 512 528 585 +f 585 553 512 +f 492 510 528 +f 528 512 492 +f 482 508 510 +f 510 492 482 +f 1369 1375 1800 +f 1800 1798 1369 +f 1184 1192 1375 +f 1375 1369 1184 +f 1037 1050 1192 +f 1192 1184 1037 +f 899 917 1050 +f 1050 1037 899 +f 761 785 917 +f 917 899 761 +f 608 638 785 +f 785 761 608 +f 526 553 638 +f 638 608 526 +f 496 512 553 +f 553 526 496 +f 454 492 512 +f 512 496 454 +f 448 482 492 +f 492 454 448 +f 1355 1369 1798 +f 1798 1795 1355 +f 1172 1184 1369 +f 1369 1355 1172 +f 1023 1037 1184 +f 1184 1172 1023 +f 879 899 1037 +f 1037 1023 879 +f 729 761 899 +f 899 879 729 +f 579 608 761 +f 761 729 579 +f 514 526 608 +f 608 579 514 +f 457 496 526 +f 526 514 457 +f 442 454 496 +f 496 457 442 +f 432 448 454 +f 454 442 432 +f 1345 1355 1795 +f 1795 1792 1345 +f 1170 1172 1355 +f 1355 1345 1170 +f 1007 1023 1172 +f 1172 1170 1007 +f 859 879 1023 +f 1023 1007 859 +f 707 729 879 +f 879 859 707 +f 563 579 729 +f 729 707 563 +f 506 514 579 +f 579 563 506 +f 450 457 514 +f 514 506 450 +f 420 442 457 +f 457 450 420 +f 412 432 442 +f 442 420 412 +f 1335 1345 1792 +f 1792 1790 1335 +f 1164 1170 1345 +f 1345 1335 1164 +f 995 1007 1170 +f 1170 1164 995 +f 847 859 1007 +f 1007 995 847 +f 681 707 859 +f 859 847 681 +f 547 563 707 +f 707 681 547 +f 494 506 563 +f 563 547 494 +f 440 450 506 +f 506 494 440 +f 410 420 450 +f 450 440 410 +f 398 412 420 +f 420 410 398 +f 1327 1335 1790 +f 1790 1788 1327 +f 1160 1164 1335 +f 1335 1327 1160 +f 988 995 1164 +f 1164 1160 988 +f 841 847 995 +f 995 988 841 +f 667 681 847 +f 847 841 667 +f 538 547 681 +f 681 667 538 +f 488 494 547 +f 547 538 488 +f 434 440 494 +f 494 488 434 +f 400 410 440 +f 440 434 400 +f 381 398 410 +f 410 400 381 +f 1324 1327 1788 +f 1788 1785 1324 +f 1156 1160 1327 +f 1327 1324 1156 +f 979 988 1160 +f 1160 1156 979 +f 837 841 988 +f 988 979 837 +f 659 667 841 +f 841 837 659 +f 534 538 667 +f 667 659 534 +f 484 488 538 +f 538 534 484 +f 428 434 488 +f 488 484 428 +f 395 400 434 +f 434 428 395 +f 374 381 400 +f 400 395 374 +f 572 616 600 +f 600 562 572 +f 605 654 616 +f 616 572 605 +f 680 737 654 +f 654 605 680 +f 782 822 737 +f 737 680 782 +f 892 914 822 +f 822 782 892 +f 978 1014 914 +f 914 892 978 +f 1094 1104 1014 +f 1014 978 1094 +f 1221 1237 1104 +f 1104 1094 1221 +f 1415 1433 1237 +f 1237 1221 1415 +f 1809 1819 1433 +f 1433 1415 1809 +f 531 572 562 +f 562 525 531 +f 566 605 572 +f 572 531 566 +f 629 680 605 +f 605 566 629 +f 740 782 680 +f 680 629 740 +f 850 892 782 +f 782 740 850 +f 964 978 892 +f 892 850 964 +f 1084 1094 978 +f 978 964 1084 +f 1213 1221 1094 +f 1094 1084 1213 +f 1401 1415 1221 +f 1221 1213 1401 +f 1931 1809 1415 +f 1415 1401 1931 +f 511 531 525 +f 525 509 511 +f 529 566 531 +f 531 511 529 +f 586 629 566 +f 566 529 586 +f 686 740 629 +f 629 586 686 +f 813 850 740 +f 740 686 813 +f 940 964 850 +f 850 813 940 +f 1069 1084 964 +f 964 940 1069 +f 1203 1213 1084 +f 1084 1069 1203 +f 1385 1401 1213 +f 1213 1203 1385 +f 1693 1931 1401 +f 1401 1385 1693 +f 493 511 509 +f 509 483 493 +f 513 529 511 +f 511 493 513 +f 554 586 529 +f 529 513 554 +f 639 686 586 +f 586 554 639 +f 786 813 686 +f 686 639 786 +f 918 940 813 +f 813 786 918 +f 1049 1069 940 +f 940 918 1049 +f 1193 1203 1069 +f 1069 1049 1193 +f 1376 1385 1203 +f 1203 1193 1376 +f 1712 1693 1385 +f 1385 1376 1712 +f 455 493 483 +f 483 449 455 +f 497 513 493 +f 493 455 497 +f 527 554 513 +f 513 497 527 +f 609 639 554 +f 554 527 609 +f 762 786 639 +f 639 609 762 +f 900 918 786 +f 786 762 900 +f 1038 1049 918 +f 918 900 1038 +f 1185 1193 1049 +f 1049 1038 1185 +f 1370 1376 1193 +f 1193 1185 1370 +f 1912 1712 1376 +f 1376 1370 1912 +f 443 455 449 +f 449 433 443 +f 458 497 455 +f 455 443 458 +f 515 527 497 +f 497 458 515 +f 580 609 527 +f 527 515 580 +f 730 762 609 +f 609 580 730 +f 880 900 762 +f 762 730 880 +f 1024 1038 900 +f 900 880 1024 +f 1173 1185 1038 +f 1038 1024 1173 +f 1356 1370 1185 +f 1185 1173 1356 +f 1797 1912 1370 +f 1370 1356 1797 +f 421 443 433 +f 433 413 421 +f 451 458 443 +f 443 421 451 +f 507 515 458 +f 458 451 507 +f 564 580 515 +f 515 507 564 +f 708 730 580 +f 580 564 708 +f 860 880 730 +f 730 708 860 +f 1008 1024 880 +f 880 860 1008 +f 1171 1173 1024 +f 1024 1008 1171 +f 1346 1356 1173 +f 1173 1171 1346 +f 1911 1797 1356 +f 1356 1346 1911 +f 411 421 413 +f 413 399 411 +f 441 451 421 +f 421 411 441 +f 495 507 451 +f 451 441 495 +f 548 564 507 +f 507 495 548 +f 682 708 564 +f 564 548 682 +f 848 860 708 +f 708 682 848 +f 996 1008 860 +f 860 848 996 +f 1165 1171 1008 +f 1008 996 1165 +f 1336 1346 1171 +f 1171 1165 1336 +f 1709 1911 1346 +f 1346 1336 1709 +f 401 411 399 +f 399 382 401 +f 435 441 411 +f 411 401 435 +f 489 495 441 +f 441 435 489 +f 539 548 495 +f 495 489 539 +f 668 682 548 +f 548 539 668 +f 842 848 682 +f 682 668 842 +f 987 996 848 +f 848 842 987 +f 1161 1165 996 +f 996 987 1161 +f 1328 1336 1165 +f 1165 1161 1328 +f 1708 1709 1336 +f 1336 1328 1708 +f 397 401 382 +f 382 376 397 +f 431 435 401 +f 401 397 431 +f 487 489 435 +f 435 431 487 +f 537 539 489 +f 489 487 537 +f 662 668 539 +f 539 537 662 +f 840 842 668 +f 668 662 840 +f 981 987 842 +f 842 840 981 +f 1159 1161 987 +f 987 981 1159 +f 1326 1328 1161 +f 1161 1159 1326 +f 1787 1708 1328 +f 1328 1326 1787 +f 2209 2194 1818 +f 1818 1808 2209 +f 2403 2391 2194 +f 2194 2209 2403 +f 2530 2518 2391 +f 2391 2403 2530 +f 2646 2614 2518 +f 2518 2530 2646 +f 2732 2712 2614 +f 2614 2646 2732 +f 2842 2806 2712 +f 2712 2732 2842 +f 2944 2890 2806 +f 2806 2842 2944 +f 3019 2974 2890 +f 2890 2944 3019 +f 3041 3009 2974 +f 2974 3019 3041 +f 3049 3025 3009 +f 3009 3041 3049 +f 2223 2209 1808 +f 1808 1805 2223 +f 2411 2403 2209 +f 2209 2223 2411 +f 2540 2530 2403 +f 2403 2411 2540 +f 2660 2646 2530 +f 2530 2540 2660 +f 2774 2732 2646 +f 2646 2660 2774 +f 2884 2842 2732 +f 2732 2774 2884 +f 2995 2944 2842 +f 2842 2884 2995 +f 3045 3019 2944 +f 2944 2995 3045 +f 3073 3041 3019 +f 3019 3045 3073 +f 3079 3049 3041 +f 3041 3073 3079 +f 2237 2223 1805 +f 1805 1803 2237 +f 2421 2411 2223 +f 2223 2237 2421 +f 2553 2540 2411 +f 2411 2421 2553 +f 2684 2660 2540 +f 2540 2553 2684 +f 2809 2774 2660 +f 2660 2684 2809 +f 2938 2884 2774 +f 2774 2809 2938 +f 3031 2995 2884 +f 2884 2938 3031 +f 3075 3045 2995 +f 2995 3031 3075 +f 3093 3073 3045 +f 3045 3075 3093 +f 3117 3079 3073 +f 3073 3093 3117 +f 2248 2237 1803 +f 1803 1801 2248 +f 2431 2421 2237 +f 2237 2248 2431 +f 2573 2553 2421 +f 2421 2431 2573 +f 2706 2684 2553 +f 2553 2573 2706 +f 2838 2809 2684 +f 2684 2706 2838 +f 2985 2938 2809 +f 2809 2838 2985 +f 3055 3031 2938 +f 2938 2985 3055 +f 3091 3075 3031 +f 3031 3055 3091 +f 3133 3093 3075 +f 3075 3091 3133 +f 3143 3117 3093 +f 3093 3133 3143 +f 2254 2248 1801 +f 1801 1799 2254 +f 2439 2431 2248 +f 2248 2254 2439 +f 2586 2573 2431 +f 2431 2439 2586 +f 2724 2706 2573 +f 2573 2586 2724 +f 2862 2838 2706 +f 2706 2724 2862 +f 3015 2985 2838 +f 2838 2862 3015 +f 3077 3055 2985 +f 2985 3015 3077 +f 3129 3091 3055 +f 3055 3077 3129 +f 3151 3133 3091 +f 3091 3129 3151 +f 3157 3143 3133 +f 3133 3151 3157 +f 2268 2254 1799 +f 1799 1796 2268 +f 2451 2439 2254 +f 2254 2268 2451 +f 2600 2586 2439 +f 2439 2451 2600 +f 2744 2724 2586 +f 2586 2600 2744 +f 2894 2862 2724 +f 2724 2744 2894 +f 3037 3015 2862 +f 2862 2894 3037 +f 3089 3077 3015 +f 3015 3037 3089 +f 3149 3129 3077 +f 3077 3089 3149 +f 3163 3151 3129 +f 3129 3149 3163 +f 3173 3157 3151 +f 3151 3163 3173 +f 2278 2268 1796 +f 1796 1793 2278 +f 2453 2451 2268 +f 2268 2278 2453 +f 2616 2600 2451 +f 2451 2453 2616 +f 2764 2744 2600 +f 2600 2616 2764 +f 2916 2894 2744 +f 2744 2764 2916 +f 3047 3037 2894 +f 2894 2916 3047 +f 3119 3089 3037 +f 3037 3047 3119 +f 3155 3149 3089 +f 3089 3119 3155 +f 3179 3163 3149 +f 3149 3155 3179 +f 3185 3173 3163 +f 3163 3179 3185 +f 2288 2278 1793 +f 1793 1791 2288 +f 2459 2453 2278 +f 2278 2288 2459 +f 2628 2616 2453 +f 2453 2459 2628 +f 2776 2764 2616 +f 2616 2628 2776 +f 2942 2916 2764 +f 2764 2776 2942 +f 3059 3047 2916 +f 2916 2942 3059 +f 3131 3119 3047 +f 3047 3059 3131 +f 3165 3155 3119 +f 3119 3131 3165 +f 3189 3179 3155 +f 3155 3165 3189 +f 3201 3185 3179 +f 3179 3189 3201 +f 2296 2288 1791 +f 1791 1789 2296 +f 2463 2459 2288 +f 2288 2296 2463 +f 2635 2628 2459 +f 2459 2463 2635 +f 2782 2776 2628 +f 2628 2635 2782 +f 2956 2942 2776 +f 2776 2782 2956 +f 3065 3059 2942 +f 2942 2956 3065 +f 3137 3131 3059 +f 3059 3065 3137 +f 3171 3165 3131 +f 3131 3137 3171 +f 3199 3189 3165 +f 3165 3171 3199 +f 3210 3201 3189 +f 3189 3199 3210 +f 2299 2296 1789 +f 1789 1786 2299 +f 2467 2463 2296 +f 2296 2299 2467 +f 2644 2635 2463 +f 2463 2467 2644 +f 2786 2782 2635 +f 2635 2644 2786 +f 2964 2956 2782 +f 2782 2786 2964 +f 3069 3065 2956 +f 2956 2964 3069 +f 3141 3137 3065 +f 3065 3069 3141 +f 3177 3171 3137 +f 3137 3141 3177 +f 3204 3199 3171 +f 3171 3177 3204 +f 3214 3210 3199 +f 3199 3204 3214 +f 3194 3202 3213 +f 3213 3207 3194 +f 3166 3175 3202 +f 3202 3194 3166 +f 3134 3139 3175 +f 3175 3166 3134 +f 3060 3067 3139 +f 3139 3134 3060 +f 2953 2962 3067 +f 3067 3060 2953 +f 2777 2784 2962 +f 2962 2953 2777 +f 2629 2643 2784 +f 2784 2777 2629 +f 2460 2465 2643 +f 2643 2629 2460 +f 2293 2298 2465 +f 2465 2460 2293 +f 1696 1785 2298 +f 2298 2293 1696 +f 3180 3194 3207 +f 3207 3190 3180 +f 3158 3166 3194 +f 3194 3180 3158 +f 3124 3134 3166 +f 3166 3158 3124 +f 3050 3060 3134 +f 3134 3124 3050 +f 2927 2953 3060 +f 3060 3050 2927 +f 2767 2777 2953 +f 2953 2927 2767 +f 2619 2629 2777 +f 2777 2767 2619 +f 2454 2460 2629 +f 2629 2619 2454 +f 2283 2293 2460 +f 2460 2454 2283 +f 1695 1696 2293 +f 2293 2283 1695 +f 3160 3180 3190 +f 3190 3168 3160 +f 3144 3158 3180 +f 3180 3160 3144 +f 3086 3124 3158 +f 3158 3144 3086 +f 3032 3050 3124 +f 3124 3086 3032 +f 2891 2927 3050 +f 3050 3032 2891 +f 2739 2767 2927 +f 2927 2891 2739 +f 2597 2619 2767 +f 2767 2739 2597 +f 2448 2454 2619 +f 2619 2597 2448 +f 2265 2283 2454 +f 2454 2448 2265 +f 1707 1695 2283 +f 2283 2265 1707 +f 3146 3160 3168 +f 3168 3152 3146 +f 3122 3144 3160 +f 3160 3146 3122 +f 3070 3086 3144 +f 3144 3122 3070 +f 2998 3032 3086 +f 3086 3070 2998 +f 2853 2891 3032 +f 3032 2998 2853 +f 2717 2739 2891 +f 2891 2853 2717 +f 2582 2597 2739 +f 2739 2717 2582 +f 2434 2448 2597 +f 2597 2582 2434 +f 2251 2265 2448 +f 2448 2434 2251 +f 1907 1707 2265 +f 2265 2251 1907 +f 3120 3146 3152 +f 3152 3126 3120 +f 3082 3122 3146 +f 3146 3120 3082 +f 3042 3070 3122 +f 3122 3082 3042 +f 2957 2998 3070 +f 3070 3042 2957 +f 2825 2853 2998 +f 2998 2957 2825 +f 2693 2717 2853 +f 2853 2825 2693 +f 2556 2582 2717 +f 2717 2693 2556 +f 2424 2434 2582 +f 2582 2556 2424 +f 2239 2251 2434 +f 2434 2424 2239 +f 1906 1907 2251 +f 2251 2239 1906 +f 3080 3120 3126 +f 3126 3084 3080 +f 3056 3082 3120 +f 3120 3080 3056 +f 3012 3042 3082 +f 3082 3056 3012 +f 2899 2957 3042 +f 3042 3012 2899 +f 2789 2825 2957 +f 2957 2899 2789 +f 2675 2693 2825 +f 2825 2789 2675 +f 2545 2556 2693 +f 2693 2675 2545 +f 2416 2424 2556 +f 2556 2545 2416 +f 2228 2239 2424 +f 2424 2416 2228 +f 1770 1906 2239 +f 2239 2228 1770 +f 3053 3080 3084 +f 3084 3062 3053 +f 3028 3056 3080 +f 3080 3053 3028 +f 2978 3012 3056 +f 3056 3028 2978 +f 2860 2899 3012 +f 3012 2978 2860 +f 2754 2789 2899 +f 2899 2860 2754 +f 2652 2675 2789 +f 2789 2754 2652 +f 2534 2545 2675 +f 2675 2652 2534 +f 2406 2416 2545 +f 2545 2534 2406 +f 2217 2228 2416 +f 2416 2406 2217 +f 1929 1770 2228 +f 2228 2217 1929 +f 3035 3053 3062 +f 3062 3039 3035 +f 2997 3028 3053 +f 3053 3035 2997 +f 2920 2978 3028 +f 3028 2997 2920 +f 2832 2860 2978 +f 2978 2920 2832 +f 2728 2754 2860 +f 2860 2832 2728 +f 2634 2652 2754 +f 2754 2728 2634 +f 2528 2534 2652 +f 2652 2634 2528 +f 2396 2406 2534 +f 2534 2528 2396 +f 2202 2217 2406 +f 2406 2396 2202 +f 1765 1929 2217 +f 2217 2202 1765 +f 3017 3035 3039 +f 3039 3027 3017 +f 2980 2997 3035 +f 3035 3017 2980 +f 2896 2920 2997 +f 2997 2980 2896 +f 2812 2832 2920 +f 2920 2896 2812 +f 2715 2728 2832 +f 2832 2812 2715 +f 2618 2634 2728 +f 2728 2715 2618 +f 2523 2528 2634 +f 2634 2618 2523 +f 2392 2396 2528 +f 2528 2523 2392 +f 2196 2202 2396 +f 2396 2392 2196 +f 1724 1765 2202 +f 2202 2196 1724 +f 3007 3017 3027 +f 3027 3023 3007 +f 2969 2980 3017 +f 3017 3007 2969 +f 2887 2896 2980 +f 2980 2969 2887 +f 2802 2812 2896 +f 2896 2887 2802 +f 2709 2715 2812 +f 2812 2802 2709 +f 2609 2618 2715 +f 2715 2709 2609 +f 2519 2523 2618 +f 2618 2609 2519 +f 2386 2392 2523 +f 2523 2519 2386 +f 2190 2196 2392 +f 2392 2386 2190 +f 1759 1724 2196 +f 2196 2190 1759 +f 1329 1324 1785 +f 1785 1782 1329 +f 1162 1157 1324 +f 1324 1329 1162 +f 993 982 1157 +f 1157 1162 993 +f 845 838 982 +f 982 993 845 +f 669 660 838 +f 838 845 669 +f 542 535 660 +f 660 669 542 +f 490 485 535 +f 535 542 490 +f 438 429 485 +f 485 490 438 +f 404 396 429 +f 429 438 404 +f 387 376 396 +f 396 404 387 +f 1339 1329 1782 +f 1782 1780 1339 +f 1168 1162 1329 +f 1329 1339 1168 +f 1003 993 1162 +f 1162 1168 1003 +f 855 845 993 +f 993 1003 855 +f 695 669 845 +f 845 855 695 +f 559 542 669 +f 669 695 559 +f 500 490 542 +f 542 559 500 +f 446 438 490 +f 490 500 446 +f 416 404 438 +f 438 446 416 +f 408 387 404 +f 404 416 408 +f 1357 1339 1780 +f 1780 1778 1357 +f 1174 1168 1339 +f 1339 1357 1174 +f 1025 1003 1168 +f 1168 1174 1025 +f 883 855 1003 +f 1003 1025 883 +f 731 695 855 +f 855 883 731 +f 583 559 695 +f 695 731 583 +f 516 500 559 +f 559 583 516 +f 467 446 500 +f 500 516 467 +f 444 416 446 +f 446 467 444 +f 436 408 416 +f 416 444 436 +f 1371 1357 1778 +f 1778 1776 1371 +f 1188 1174 1357 +f 1357 1371 1188 +f 1042 1025 1174 +f 1174 1188 1042 +f 905 883 1025 +f 1025 1042 905 +f 769 731 883 +f 883 905 769 +f 624 583 731 +f 731 769 624 +f 532 516 583 +f 583 624 532 +f 502 467 516 +f 516 532 502 +f 459 444 467 +f 467 502 459 +f 452 436 444 +f 444 459 452 +f 1383 1371 1776 +f 1776 1774 1383 +f 1198 1188 1371 +f 1371 1383 1198 +f 1068 1042 1188 +f 1188 1198 1068 +f 929 905 1042 +f 1042 1068 929 +f 797 769 905 +f 905 929 797 +f 665 624 769 +f 769 797 665 +f 569 532 624 +f 624 665 569 +f 520 502 532 +f 532 569 520 +f 504 459 502 +f 502 520 504 +f 498 452 459 +f 459 504 498 +f 1394 1383 1774 +f 1774 1771 1394 +f 1206 1198 1383 +f 1383 1394 1206 +f 1077 1068 1198 +f 1198 1206 1077 +f 947 929 1068 +f 1068 1077 947 +f 833 797 929 +f 929 947 833 +f 723 665 797 +f 797 833 723 +f 610 569 665 +f 665 723 610 +f 549 520 569 +f 569 610 549 +f 522 504 520 +f 520 549 522 +f 518 498 504 +f 504 522 518 +f 1407 1394 1771 +f 1771 1768 1407 +f 1216 1206 1394 +f 1394 1407 1216 +f 1090 1077 1206 +f 1206 1216 1090 +f 972 947 1077 +f 1077 1090 972 +f 870 833 947 +f 947 972 870 +f 764 723 833 +f 833 870 764 +f 646 610 723 +f 723 764 646 +f 587 549 610 +f 610 646 587 +f 556 522 549 +f 549 587 556 +f 540 518 522 +f 522 556 540 +f 1420 1407 1768 +f 1768 1764 1420 +f 1226 1216 1407 +f 1407 1420 1226 +f 1096 1090 1216 +f 1216 1226 1096 +f 990 972 1090 +f 1090 1096 990 +f 896 870 972 +f 972 990 896 +f 792 764 870 +f 870 896 792 +f 704 646 764 +f 764 792 704 +f 627 587 646 +f 646 704 627 +f 582 556 587 +f 587 627 582 +f 574 540 556 +f 556 582 574 +f 1426 1420 1764 +f 1764 1762 1426 +f 1230 1226 1420 +f 1420 1426 1230 +f 1101 1096 1226 +f 1226 1230 1101 +f 1006 990 1096 +f 1096 1101 1006 +f 907 896 990 +f 990 1006 907 +f 812 792 896 +f 896 907 812 +f 728 704 792 +f 792 812 728 +f 644 627 704 +f 704 728 644 +f 607 582 627 +f 627 644 607 +f 592 574 582 +f 582 607 592 +f 1430 1426 1762 +f 1762 1758 1430 +f 1234 1230 1426 +f 1426 1430 1234 +f 1107 1101 1230 +f 1230 1234 1107 +f 1012 1006 1101 +f 1101 1107 1012 +f 912 907 1006 +f 1006 1012 912 +f 819 812 907 +f 907 912 819 +f 738 728 812 +f 812 819 738 +f 651 644 728 +f 728 738 651 +f 618 607 644 +f 644 651 618 +f 601 592 607 +f 607 618 601 +f 405 397 376 +f 376 388 405 +f 439 430 397 +f 397 405 439 +f 491 486 430 +f 430 439 491 +f 543 536 486 +f 486 491 543 +f 670 661 536 +f 536 543 670 +f 846 839 661 +f 661 670 846 +f 994 980 839 +f 839 846 994 +f 1163 1158 980 +f 980 994 1163 +f 1330 1325 1158 +f 1158 1163 1330 +f 1926 1786 1325 +f 1325 1330 1926 +f 417 405 388 +f 388 409 417 +f 447 439 405 +f 405 417 447 +f 501 491 439 +f 439 447 501 +f 560 543 491 +f 491 501 560 +f 696 670 543 +f 543 560 696 +f 856 846 670 +f 670 696 856 +f 1004 994 846 +f 846 856 1004 +f 1169 1163 994 +f 994 1004 1169 +f 1340 1330 1163 +f 1163 1169 1340 +f 1925 1926 1330 +f 1330 1340 1925 +f 445 417 409 +f 409 437 445 +f 468 447 417 +f 417 445 468 +f 517 501 447 +f 447 468 517 +f 584 560 501 +f 501 517 584 +f 732 696 560 +f 560 584 732 +f 884 856 696 +f 696 732 884 +f 1026 1004 856 +f 856 884 1026 +f 1175 1169 1004 +f 1004 1026 1175 +f 1358 1340 1169 +f 1169 1175 1358 +f 1908 1925 1340 +f 1340 1358 1908 +f 460 445 437 +f 437 453 460 +f 503 468 445 +f 445 460 503 +f 533 517 468 +f 468 503 533 +f 625 584 517 +f 517 533 625 +f 770 732 584 +f 584 625 770 +f 906 884 732 +f 732 770 906 +f 1041 1026 884 +f 884 906 1041 +f 1189 1175 1026 +f 1026 1041 1189 +f 1372 1358 1175 +f 1175 1189 1372 +f 1706 1908 1358 +f 1358 1372 1706 +f 505 460 453 +f 453 499 505 +f 521 503 460 +f 460 505 521 +f 570 533 503 +f 503 521 570 +f 666 625 533 +f 533 570 666 +f 798 770 625 +f 625 666 798 +f 930 906 770 +f 770 798 930 +f 1067 1041 906 +f 906 930 1067 +f 1199 1189 1041 +f 1041 1067 1199 +f 1384 1372 1189 +f 1189 1199 1384 +f 1705 1706 1372 +f 1372 1384 1705 +f 523 505 499 +f 499 519 523 +f 550 521 505 +f 505 523 550 +f 611 570 521 +f 521 550 611 +f 724 666 570 +f 570 611 724 +f 834 798 666 +f 666 724 834 +f 948 930 798 +f 798 834 948 +f 1078 1067 930 +f 930 948 1078 +f 1207 1199 1067 +f 1067 1078 1207 +f 1395 1384 1199 +f 1199 1207 1395 +f 1773 1705 1384 +f 1384 1395 1773 +f 555 523 519 +f 519 541 555 +f 588 550 523 +f 523 555 588 +f 645 611 550 +f 550 588 645 +f 763 724 611 +f 611 645 763 +f 869 834 724 +f 724 763 869 +f 971 948 834 +f 834 869 971 +f 1089 1078 948 +f 948 971 1089 +f 1217 1207 1078 +f 1078 1089 1217 +f 1406 1395 1207 +f 1207 1217 1406 +f 1692 1773 1395 +f 1395 1406 1692 +f 581 555 541 +f 541 573 581 +f 626 588 555 +f 555 581 626 +f 703 645 588 +f 588 626 703 +f 791 763 645 +f 645 703 791 +f 895 869 763 +f 763 791 895 +f 989 971 869 +f 869 895 989 +f 1095 1089 971 +f 971 989 1095 +f 1227 1217 1089 +f 1089 1095 1227 +f 1421 1406 1217 +f 1217 1227 1421 +f 1766 1692 1406 +f 1406 1421 1766 +f 606 581 573 +f 573 591 606 +f 643 626 581 +f 581 606 643 +f 727 703 626 +f 626 643 727 +f 811 791 703 +f 703 727 811 +f 908 895 791 +f 791 811 908 +f 1005 989 895 +f 895 908 1005 +f 1100 1095 989 +f 989 1005 1100 +f 1231 1227 1095 +f 1095 1100 1231 +f 1427 1421 1227 +f 1227 1231 1427 +f 1897 1766 1421 +f 1421 1427 1897 +f 615 606 591 +f 591 598 615 +f 653 643 606 +f 606 615 653 +f 735 727 643 +f 643 653 735 +f 820 811 727 +f 727 735 820 +f 913 908 811 +f 811 820 913 +f 1013 1005 908 +f 908 913 1013 +f 1103 1100 1005 +f 1005 1013 1103 +f 1236 1231 1100 +f 1100 1103 1236 +f 1432 1427 1231 +f 1231 1236 1432 +f 1760 1897 1427 +f 1427 1432 1760 +f 2294 2299 1786 +f 1786 1783 2294 +f 2461 2466 2299 +f 2299 2294 2461 +f 2630 2641 2466 +f 2466 2461 2630 +f 2778 2785 2641 +f 2641 2630 2778 +f 2954 2963 2785 +f 2785 2778 2954 +f 3061 3068 2963 +f 2963 2954 3061 +f 3135 3140 3068 +f 3068 3061 3135 +f 3167 3176 3140 +f 3140 3135 3167 +f 3195 3203 3176 +f 3176 3167 3195 +f 3208 3213 3203 +f 3203 3195 3208 +f 2284 2294 1783 +f 1783 1781 2284 +f 2455 2461 2294 +f 2294 2284 2455 +f 2620 2630 2461 +f 2461 2455 2620 +f 2768 2778 2630 +f 2630 2620 2768 +f 2928 2954 2778 +f 2778 2768 2928 +f 3051 3061 2954 +f 2954 2928 3051 +f 3125 3135 3061 +f 3061 3051 3125 +f 3159 3167 3135 +f 3135 3125 3159 +f 3181 3195 3167 +f 3167 3159 3181 +f 3191 3208 3195 +f 3195 3181 3191 +f 2266 2284 1781 +f 1781 1779 2266 +f 2449 2455 2284 +f 2284 2266 2449 +f 2598 2620 2455 +f 2455 2449 2598 +f 2740 2768 2620 +f 2620 2598 2740 +f 2892 2928 2768 +f 2768 2740 2892 +f 3033 3051 2928 +f 2928 2892 3033 +f 3087 3125 3051 +f 3051 3033 3087 +f 3145 3159 3125 +f 3125 3087 3145 +f 3161 3181 3159 +f 3159 3145 3161 +f 3169 3191 3181 +f 3181 3161 3169 +f 2252 2266 1779 +f 1779 1777 2252 +f 2435 2449 2266 +f 2266 2252 2435 +f 2581 2598 2449 +f 2449 2435 2581 +f 2718 2740 2598 +f 2598 2581 2718 +f 2854 2892 2740 +f 2740 2718 2854 +f 2999 3033 2892 +f 2892 2854 2999 +f 3071 3087 3033 +f 3033 2999 3071 +f 3123 3145 3087 +f 3087 3071 3123 +f 3147 3161 3145 +f 3145 3123 3147 +f 3153 3169 3161 +f 3161 3147 3153 +f 2240 2252 1777 +f 1777 1775 2240 +f 2425 2435 2252 +f 2252 2240 2425 +f 2555 2581 2435 +f 2435 2425 2555 +f 2694 2718 2581 +f 2581 2555 2694 +f 2826 2854 2718 +f 2718 2694 2826 +f 2958 2999 2854 +f 2854 2826 2958 +f 3043 3071 2999 +f 2999 2958 3043 +f 3083 3123 3071 +f 3071 3043 3083 +f 3121 3147 3123 +f 3123 3083 3121 +f 3127 3153 3147 +f 3147 3121 3127 +f 2229 2240 1775 +f 1775 1772 2229 +f 2417 2425 2240 +f 2240 2229 2417 +f 2546 2555 2425 +f 2425 2417 2546 +f 2676 2694 2555 +f 2555 2546 2676 +f 2790 2826 2694 +f 2694 2676 2790 +f 2900 2958 2826 +f 2826 2790 2900 +f 3013 3043 2958 +f 2958 2900 3013 +f 3057 3083 3043 +f 3043 3013 3057 +f 3081 3121 3083 +f 3083 3057 3081 +f 3085 3127 3121 +f 3121 3081 3085 +f 2216 2229 1772 +f 1772 1769 2216 +f 2407 2417 2229 +f 2229 2216 2407 +f 2533 2546 2417 +f 2417 2407 2533 +f 2651 2676 2546 +f 2546 2533 2651 +f 2753 2790 2676 +f 2676 2651 2753 +f 2859 2900 2790 +f 2790 2753 2859 +f 2977 3013 2900 +f 2900 2859 2977 +f 3029 3057 3013 +f 3013 2977 3029 +f 3052 3081 3057 +f 3057 3029 3052 +f 3063 3085 3081 +f 3081 3052 3063 +f 2203 2216 1769 +f 1769 1767 2203 +f 2397 2407 2216 +f 2216 2203 2397 +f 2527 2533 2407 +f 2407 2397 2527 +f 2633 2651 2533 +f 2533 2527 2633 +f 2727 2753 2651 +f 2651 2633 2727 +f 2831 2859 2753 +f 2753 2727 2831 +f 2919 2977 2859 +f 2859 2831 2919 +f 2996 3029 2977 +f 2977 2919 2996 +f 3034 3052 3029 +f 3029 2996 3034 +f 3038 3063 3052 +f 3052 3034 3038 +f 2197 2203 1767 +f 1767 1763 2197 +f 2393 2397 2203 +f 2203 2197 2393 +f 2522 2527 2397 +f 2397 2393 2522 +f 2617 2633 2527 +f 2527 2522 2617 +f 2716 2727 2633 +f 2633 2617 2716 +f 2811 2831 2727 +f 2727 2716 2811 +f 2895 2919 2831 +f 2831 2811 2895 +f 2979 2996 2919 +f 2919 2895 2979 +f 3016 3034 2996 +f 2996 2979 3016 +f 3026 3038 3034 +f 3034 3016 3026 +f 2193 2197 1763 +f 1763 1761 2193 +f 2389 2393 2197 +f 2197 2193 2389 +f 2516 2522 2393 +f 2393 2389 2516 +f 2610 2617 2522 +f 2522 2516 2610 +f 2710 2716 2617 +f 2617 2610 2710 +f 2803 2811 2716 +f 2716 2710 2803 +f 2885 2895 2811 +f 2811 2803 2885 +f 2971 2979 2895 +f 2895 2885 2971 +f 3005 3016 2979 +f 2979 2971 3005 +f 3022 3026 3016 +f 3016 3005 3022 +f 461 545 544 +f 544 456 461 +f 463 551 545 +f 545 461 463 +f 465 557 551 +f 551 463 465 +f 469 567 557 +f 557 465 469 +f 471 575 567 +f 567 469 471 +f 473 577 575 +f 575 471 473 +f 475 589 577 +f 577 473 475 +f 477 593 589 +f 589 475 477 +f 479 595 593 +f 593 477 479 +f 481 599 595 +f 595 479 481 +f 389 461 456 +f 456 392 389 +f 386 463 461 +f 461 389 386 +f 379 465 463 +f 463 386 379 +f 373 469 465 +f 465 379 373 +f 371 471 469 +f 469 373 371 +f 369 473 471 +f 471 371 369 +f 366 475 473 +f 473 369 366 +f 364 477 475 +f 475 366 364 +f 362 479 477 +f 477 364 362 +f 361 481 479 +f 479 362 361 +f 335 389 392 +f 392 337 335 +f 333 386 389 +f 389 335 333 +f 331 379 386 +f 386 333 331 +f 329 373 379 +f 379 331 329 +f 328 371 373 +f 373 329 328 +f 325 369 371 +f 371 328 325 +f 323 366 369 +f 369 325 323 +f 321 364 366 +f 366 323 321 +f 319 362 364 +f 364 321 319 +f 316 361 362 +f 362 319 316 +f 298 335 337 +f 337 302 298 +f 290 333 335 +f 335 298 290 +f 288 331 333 +f 333 290 288 +f 286 329 331 +f 331 288 286 +f 281 328 329 +f 329 286 281 +f 275 325 328 +f 328 281 275 +f 265 323 325 +f 325 275 265 +f 259 321 323 +f 323 265 259 +f 255 319 321 +f 321 259 255 +f 249 316 319 +f 319 255 249 +f 269 298 302 +f 302 271 269 +f 261 290 298 +f 298 269 261 +f 251 288 290 +f 290 261 251 +f 238 286 288 +f 288 251 238 +f 230 281 286 +f 286 238 230 +f 218 275 281 +f 281 230 218 +f 208 265 275 +f 275 218 208 +f 196 259 265 +f 265 208 196 +f 186 255 259 +f 259 196 186 +f 181 249 255 +f 255 186 181 +f 228 269 271 +f 271 234 228 +f 222 261 269 +f 269 228 222 +f 212 251 261 +f 261 222 212 +f 200 238 251 +f 251 212 200 +f 177 230 238 +f 238 200 177 +f 160 218 230 +f 230 177 160 +f 134 208 218 +f 218 160 134 +f 112 196 208 +f 208 134 112 +f 102 186 196 +f 196 112 102 +f 96 181 186 +f 186 102 96 +f 198 228 234 +f 234 205 198 +f 182 222 228 +f 228 198 182 +f 168 212 222 +f 222 182 168 +f 146 200 212 +f 212 168 146 +f 118 177 200 +f 200 146 118 +f 92 160 177 +f 177 118 92 +f 74 134 160 +f 160 92 74 +f 63 112 134 +f 134 74 63 +f 53 102 112 +f 112 63 53 +f 50 96 102 +f 102 53 50 +f 167 198 205 +f 205 170 167 +f 154 182 198 +f 198 167 154 +f 126 168 182 +f 182 154 126 +f 100 146 168 +f 168 126 100 +f 83 118 146 +f 146 100 83 +f 61 92 118 +f 118 83 61 +f 46 74 92 +f 92 61 46 +f 32 63 74 +f 74 46 32 +f 25 53 63 +f 63 32 25 +f 21 50 53 +f 53 25 21 +f 143 167 170 +f 170 150 143 +f 124 154 167 +f 167 143 124 +f 104 126 154 +f 154 124 104 +f 84 100 126 +f 126 104 84 +f 65 83 100 +f 100 84 65 +f 44 61 83 +f 83 65 44 +f 30 46 61 +f 61 44 30 +f 17 32 46 +f 46 30 17 +f 9 25 32 +f 32 17 9 +f 5 21 25 +f 25 9 5 +f 132 143 150 +f 150 140 132 +f 116 124 143 +f 143 132 116 +f 94 104 124 +f 124 116 94 +f 76 84 104 +f 104 94 76 +f 55 65 84 +f 84 76 55 +f 40 44 65 +f 65 55 40 +f 22 30 44 +f 44 40 22 +f 11 17 30 +f 30 22 11 +f 2 9 17 +f 17 11 2 +f 1 5 9 +f 9 2 1 +f 480 596 599 +f 599 481 480 +f 478 594 596 +f 596 480 478 +f 476 590 594 +f 594 478 476 +f 474 578 590 +f 590 476 474 +f 472 576 578 +f 578 474 472 +f 470 568 576 +f 576 472 470 +f 466 558 568 +f 568 470 466 +f 464 552 558 +f 558 466 464 +f 462 546 552 +f 552 464 462 +f 456 544 546 +f 546 462 456 +f 363 480 481 +f 481 360 363 +f 365 478 480 +f 480 363 365 +f 367 476 478 +f 478 365 367 +f 368 474 476 +f 476 367 368 +f 370 472 474 +f 474 368 370 +f 372 470 472 +f 472 370 372 +f 380 466 470 +f 470 372 380 +f 385 464 466 +f 466 380 385 +f 390 462 464 +f 464 385 390 +f 391 456 462 +f 462 390 391 +f 320 363 360 +f 360 316 320 +f 322 365 363 +f 363 320 322 +f 324 367 365 +f 365 322 324 +f 326 368 367 +f 367 324 326 +f 327 370 368 +f 368 326 327 +f 330 372 370 +f 370 327 330 +f 332 380 372 +f 372 330 332 +f 334 385 380 +f 380 332 334 +f 336 390 385 +f 385 334 336 +f 337 391 390 +f 390 336 337 +f 256 320 316 +f 316 250 256 +f 260 322 320 +f 320 256 260 +f 266 324 322 +f 322 260 266 +f 276 326 324 +f 324 266 276 +f 282 327 326 +f 326 276 282 +f 287 330 327 +f 327 282 287 +f 289 332 330 +f 330 287 289 +f 291 334 332 +f 332 289 291 +f 299 336 334 +f 334 291 299 +f 303 337 336 +f 336 299 303 +f 187 256 250 +f 250 181 187 +f 197 260 256 +f 256 187 197 +f 209 266 260 +f 260 197 209 +f 219 276 266 +f 266 209 219 +f 231 282 276 +f 276 219 231 +f 239 287 282 +f 282 231 239 +f 252 289 287 +f 287 239 252 +f 262 291 289 +f 289 252 262 +f 270 299 291 +f 291 262 270 +f 272 303 299 +f 299 270 272 +f 103 187 181 +f 181 97 103 +f 113 197 187 +f 187 103 113 +f 135 209 197 +f 197 113 135 +f 161 219 209 +f 209 135 161 +f 178 231 219 +f 219 161 178 +f 201 239 231 +f 231 178 201 +f 213 252 239 +f 239 201 213 +f 223 262 252 +f 252 213 223 +f 229 270 262 +f 262 223 229 +f 235 272 270 +f 270 229 235 +f 54 103 97 +f 97 50 54 +f 64 113 103 +f 103 54 64 +f 75 135 113 +f 113 64 75 +f 93 161 135 +f 135 75 93 +f 119 178 161 +f 161 93 119 +f 147 201 178 +f 178 119 147 +f 169 213 201 +f 201 147 169 +f 183 223 213 +f 213 169 183 +f 199 229 223 +f 223 183 199 +f 205 235 229 +f 229 199 205 +f 24 54 50 +f 50 21 24 +f 33 64 54 +f 54 24 33 +f 47 75 64 +f 64 33 47 +f 62 93 75 +f 75 47 62 +f 82 119 93 +f 93 62 82 +f 101 147 119 +f 119 82 101 +f 127 169 147 +f 147 101 127 +f 155 183 169 +f 169 127 155 +f 166 199 183 +f 183 155 166 +f 171 205 199 +f 199 166 171 +f 10 24 21 +f 21 6 10 +f 18 33 24 +f 24 10 18 +f 31 47 33 +f 33 18 31 +f 45 62 47 +f 47 31 45 +f 66 82 62 +f 62 45 66 +f 85 101 82 +f 82 66 85 +f 105 127 101 +f 101 85 105 +f 125 155 127 +f 127 105 125 +f 144 166 155 +f 155 125 144 +f 151 171 166 +f 166 144 151 +f 3 10 6 +f 6 1 3 +f 12 18 10 +f 10 3 12 +f 23 31 18 +f 18 12 23 +f 41 45 31 +f 31 23 41 +f 56 66 45 +f 45 41 56 +f 77 85 66 +f 66 56 77 +f 95 105 85 +f 85 77 95 +f 117 125 105 +f 105 95 117 +f 133 144 125 +f 125 117 133 +f 140 151 144 +f 144 133 140 +f 138 132 140 +f 140 145 138 +f 122 116 132 +f 132 138 122 +f 98 94 116 +f 116 122 98 +f 80 76 94 +f 94 98 80 +f 60 55 76 +f 76 80 60 +f 42 40 55 +f 55 60 42 +f 28 22 40 +f 40 42 28 +f 13 11 22 +f 22 28 13 +f 7 2 11 +f 11 13 7 +f 4 1 2 +f 2 7 4 +f 152 138 145 +f 145 158 152 +f 136 122 138 +f 138 152 136 +f 108 98 122 +f 122 136 108 +f 89 80 98 +f 98 108 89 +f 70 60 80 +f 80 89 70 +f 52 42 60 +f 60 70 52 +f 38 28 42 +f 42 52 38 +f 26 13 28 +f 28 38 26 +f 19 7 13 +f 13 26 19 +f 15 4 7 +f 7 19 15 +f 173 152 158 +f 158 176 173 +f 162 136 152 +f 152 173 162 +f 142 108 136 +f 136 162 142 +f 111 89 108 +f 108 142 111 +f 91 70 89 +f 89 111 91 +f 73 52 70 +f 70 91 73 +f 58 38 52 +f 52 73 58 +f 48 26 38 +f 38 58 48 +f 37 19 26 +f 26 48 37 +f 35 15 19 +f 19 37 35 +f 194 173 176 +f 176 202 194 +f 184 162 173 +f 173 194 184 +f 174 142 162 +f 162 184 174 +f 156 111 142 +f 142 174 156 +f 128 91 111 +f 111 156 128 +f 106 73 91 +f 91 128 106 +f 86 58 73 +f 73 106 86 +f 78 48 58 +f 58 86 78 +f 68 37 48 +f 48 78 68 +f 67 35 37 +f 37 68 67 +f 221 194 202 +f 202 225 221 +f 216 184 194 +f 194 221 216 +f 206 174 184 +f 184 216 206 +f 192 156 174 +f 174 206 192 +f 180 128 156 +f 156 192 180 +f 164 106 128 +f 128 180 164 +f 148 86 106 +f 106 164 148 +f 130 78 86 +f 86 148 130 +f 121 68 78 +f 78 130 121 +f 115 67 68 +f 68 121 115 +f 244 221 225 +f 225 247 244 +f 240 216 221 +f 221 244 240 +f 236 206 216 +f 216 240 236 +f 233 192 206 +f 206 236 233 +f 227 180 192 +f 192 233 227 +f 215 164 180 +f 180 227 215 +f 210 148 164 +f 164 215 210 +f 203 130 148 +f 148 210 203 +f 191 121 130 +f 130 203 191 +f 188 115 121 +f 121 191 188 +f 284 244 247 +f 247 285 284 +f 279 240 244 +f 244 284 279 +f 277 236 240 +f 240 279 277 +f 273 233 236 +f 236 277 273 +f 267 227 233 +f 233 273 267 +f 263 215 227 +f 227 267 263 +f 258 210 215 +f 215 263 258 +f 253 203 210 +f 210 258 253 +f 245 191 203 +f 203 253 245 +f 242 188 191 +f 191 245 242 +f 315 284 285 +f 285 318 315 +f 312 279 284 +f 284 315 312 +f 311 277 279 +f 279 312 311 +f 309 273 277 +f 277 311 309 +f 307 267 273 +f 273 309 307 +f 305 263 267 +f 267 307 305 +f 301 258 263 +f 263 305 301 +f 297 253 258 +f 258 301 297 +f 295 245 253 +f 253 297 295 +f 293 242 245 +f 245 295 293 +f 341 315 318 +f 318 339 341 +f 343 312 315 +f 315 341 343 +f 345 311 312 +f 312 343 345 +f 347 309 311 +f 311 345 347 +f 349 307 309 +f 309 347 349 +f 351 305 307 +f 307 349 351 +f 353 301 305 +f 305 351 353 +f 355 297 301 +f 301 353 355 +f 357 295 297 +f 297 355 357 +f 359 293 295 +f 295 357 359 +f 378 341 339 +f 339 376 378 +f 384 343 341 +f 341 378 384 +f 394 345 343 +f 343 384 394 +f 403 347 345 +f 345 394 403 +f 406 349 347 +f 347 403 406 +f 415 351 349 +f 349 406 415 +f 419 353 351 +f 351 415 419 +f 423 355 353 +f 353 419 423 +f 425 357 355 +f 355 423 425 +f 427 359 357 +f 357 425 427 +f 8 3 1 +f 1 4 8 +f 14 12 3 +f 3 8 14 +f 29 23 12 +f 12 14 29 +f 43 41 23 +f 23 29 43 +f 59 56 41 +f 41 43 59 +f 81 77 56 +f 56 59 81 +f 99 95 77 +f 77 81 99 +f 123 117 95 +f 95 99 123 +f 139 133 117 +f 117 123 139 +f 145 140 133 +f 133 139 145 +f 20 8 4 +f 4 16 20 +f 27 14 8 +f 8 20 27 +f 39 29 14 +f 14 27 39 +f 51 43 29 +f 29 39 51 +f 71 59 43 +f 43 51 71 +f 88 81 59 +f 59 71 88 +f 109 99 81 +f 81 88 109 +f 137 123 99 +f 99 109 137 +f 153 139 123 +f 123 137 153 +f 159 145 139 +f 139 153 159 +f 36 20 16 +f 16 34 36 +f 49 27 20 +f 20 36 49 +f 57 39 27 +f 27 49 57 +f 72 51 39 +f 39 57 72 +f 90 71 51 +f 51 72 90 +f 110 88 71 +f 71 90 110 +f 141 109 88 +f 88 110 141 +f 163 137 109 +f 109 141 163 +f 172 153 137 +f 137 163 172 +f 176 159 153 +f 153 172 176 +f 69 36 34 +f 34 67 69 +f 79 49 36 +f 36 69 79 +f 87 57 49 +f 49 79 87 +f 107 72 57 +f 57 87 107 +f 129 90 72 +f 72 107 129 +f 157 110 90 +f 90 129 157 +f 175 141 110 +f 110 157 175 +f 185 163 141 +f 141 175 185 +f 195 172 163 +f 163 185 195 +f 202 176 172 +f 172 195 202 +f 120 69 67 +f 67 114 120 +f 131 79 69 +f 69 120 131 +f 149 87 79 +f 79 131 149 +f 165 107 87 +f 87 149 165 +f 179 129 107 +f 107 165 179 +f 193 157 129 +f 129 179 193 +f 207 175 157 +f 157 193 207 +f 217 185 175 +f 175 207 217 +f 220 195 185 +f 185 217 220 +f 224 202 195 +f 195 220 224 +f 190 120 114 +f 114 189 190 +f 204 131 120 +f 120 190 204 +f 211 149 131 +f 131 204 211 +f 214 165 149 +f 149 211 214 +f 226 179 165 +f 165 214 226 +f 232 193 179 +f 179 226 232 +f 237 207 193 +f 193 232 237 +f 241 217 207 +f 207 237 241 +f 243 220 217 +f 217 241 243 +f 248 224 220 +f 220 243 248 +f 246 190 189 +f 189 242 246 +f 254 204 190 +f 190 246 254 +f 257 211 204 +f 204 254 257 +f 264 214 211 +f 211 257 264 +f 268 226 214 +f 214 264 268 +f 274 232 226 +f 226 268 274 +f 278 237 232 +f 232 274 278 +f 280 241 237 +f 237 278 280 +f 283 243 241 +f 241 280 283 +f 285 248 243 +f 243 283 285 +f 294 246 242 +f 242 292 294 +f 296 254 246 +f 246 294 296 +f 300 257 254 +f 254 296 300 +f 304 264 257 +f 257 300 304 +f 306 268 264 +f 264 304 306 +f 308 274 268 +f 268 306 308 +f 310 278 274 +f 274 308 310 +f 313 280 278 +f 278 310 313 +f 314 283 280 +f 280 313 314 +f 317 285 283 +f 283 314 317 +f 356 294 292 +f 292 358 356 +f 354 296 294 +f 294 356 354 +f 352 300 296 +f 296 354 352 +f 350 304 300 +f 300 352 350 +f 348 306 304 +f 304 350 348 +f 346 308 306 +f 306 348 346 +f 344 310 308 +f 308 346 344 +f 342 313 310 +f 310 344 342 +f 340 314 313 +f 313 342 340 +f 338 317 314 +f 314 340 338 +f 424 356 358 +f 358 426 424 +f 422 354 356 +f 356 424 422 +f 418 352 354 +f 354 422 418 +f 414 350 352 +f 352 418 414 +f 407 348 350 +f 350 414 407 +f 402 346 348 +f 348 407 402 +f 393 344 346 +f 346 402 393 +f 383 342 344 +f 344 393 383 +f 377 340 342 +f 342 383 377 +f 375 338 340 +f 340 377 375 +f 3186 3113 3115 +f 3115 3182 3186 +f 3192 3110 3113 +f 3113 3186 3192 +f 3196 3109 3110 +f 3110 3192 3196 +f 3205 3106 3109 +f 3109 3196 3205 +f 3211 3104 3106 +f 3106 3205 3211 +f 3215 3102 3104 +f 3104 3211 3215 +f 3217 3101 3102 +f 3102 3215 3217 +f 3220 3098 3101 +f 3101 3217 3220 +f 3222 3097 3098 +f 3098 3220 3222 +f 3223 3095 3097 +f 3097 3222 3223 +f 3227 3186 3182 +f 3182 3225 3227 +f 3229 3192 3186 +f 3186 3227 3229 +f 3231 3196 3192 +f 3192 3229 3231 +f 3233 3205 3196 +f 3196 3231 3233 +f 3235 3211 3205 +f 3205 3233 3235 +f 3241 3215 3211 +f 3211 3235 3241 +f 3245 3217 3215 +f 3215 3241 3245 +f 3249 3220 3217 +f 3217 3245 3249 +f 3251 3222 3220 +f 3220 3249 3251 +f 3253 3223 3222 +f 3222 3251 3253 +f 3239 3227 3225 +f 3225 3237 3239 +f 3243 3229 3227 +f 3227 3239 3243 +f 3247 3231 3229 +f 3229 3243 3247 +f 3257 3233 3231 +f 3231 3247 3257 +f 3263 3235 3233 +f 3233 3257 3263 +f 3271 3241 3235 +f 3235 3263 3271 +f 3279 3245 3241 +f 3241 3271 3279 +f 3285 3249 3245 +f 3245 3279 3285 +f 3293 3251 3249 +f 3249 3285 3293 +f 3297 3253 3251 +f 3251 3293 3297 +f 3259 3239 3237 +f 3237 3255 3259 +f 3261 3243 3239 +f 3239 3259 3261 +f 3265 3247 3243 +f 3243 3261 3265 +f 3275 3257 3247 +f 3247 3265 3275 +f 3287 3263 3257 +f 3257 3275 3287 +f 3303 3271 3263 +f 3263 3287 3303 +f 3314 3279 3271 +f 3271 3303 3314 +f 3320 3285 3279 +f 3279 3314 3320 +f 3330 3293 3285 +f 3285 3320 3330 +f 3332 3297 3293 +f 3293 3330 3332 +f 3270 3259 3255 +f 3255 3268 3270 +f 3273 3261 3259 +f 3259 3270 3273 +f 3283 3265 3261 +f 3261 3273 3283 +f 3299 3275 3265 +f 3265 3283 3299 +f 3308 3287 3275 +f 3275 3299 3308 +f 3322 3303 3287 +f 3287 3308 3322 +f 3338 3314 3303 +f 3303 3322 3338 +f 3346 3320 3314 +f 3314 3338 3346 +f 3351 3330 3320 +f 3320 3346 3351 +f 3355 3332 3330 +f 3330 3351 3355 +f 3282 3270 3268 +f 3268 3278 3282 +f 3290 3273 3270 +f 3270 3282 3290 +f 3302 3283 3273 +f 3273 3290 3302 +f 3312 3299 3283 +f 3283 3302 3312 +f 3324 3308 3299 +f 3299 3312 3324 +f 3340 3322 3308 +f 3308 3324 3340 +f 3353 3338 3322 +f 3322 3340 3353 +f 3368 3346 3338 +f 3338 3353 3368 +f 3373 3351 3346 +f 3346 3368 3373 +f 3379 3355 3351 +f 3351 3373 3379 +f 3295 3282 3278 +f 3278 3292 3295 +f 3306 3290 3282 +f 3282 3295 3306 +f 3316 3302 3290 +f 3290 3306 3316 +f 3326 3312 3302 +f 3302 3316 3326 +f 3345 3324 3312 +f 3312 3326 3345 +f 3359 3340 3324 +f 3324 3345 3359 +f 3376 3353 3340 +f 3340 3359 3376 +f 3394 3368 3353 +f 3353 3376 3394 +f 3404 3373 3368 +f 3368 3394 3404 +f 3406 3379 3373 +f 3373 3404 3406 +f 3310 3295 3292 +f 3292 3307 3310 +f 3318 3306 3295 +f 3295 3310 3318 +f 3336 3316 3306 +f 3306 3318 3336 +f 3348 3326 3316 +f 3316 3336 3348 +f 3369 3345 3326 +f 3326 3348 3369 +f 3389 3359 3345 +f 3345 3369 3389 +f 3425 3376 3359 +f 3359 3389 3425 +f 3449 3394 3376 +f 3376 3425 3449 +f 3468 3404 3394 +f 3394 3449 3468 +f 3472 3406 3404 +f 3404 3468 3472 +f 3335 3310 3307 +f 3307 3329 3335 +f 3343 3318 3310 +f 3310 3335 3343 +f 3362 3336 3318 +f 3318 3343 3362 +f 3386 3348 3336 +f 3336 3362 3386 +f 3422 3369 3348 +f 3348 3386 3422 +f 3464 3389 3369 +f 3369 3422 3464 +f 3490 3425 3389 +f 3389 3464 3490 +f 3505 3449 3425 +f 3425 3490 3505 +f 3521 3468 3449 +f 3449 3505 3521 +f 3523 3472 3468 +f 3468 3521 3523 +f 3364 3335 3329 +f 3329 3357 3364 +f 3382 3343 3335 +f 3335 3364 3382 +f 3416 3362 3343 +f 3343 3382 3416 +f 3465 3386 3362 +f 3362 3416 3465 +f 3495 3422 3386 +f 3386 3465 3495 +f 3528 3464 3422 +f 3422 3495 3528 +f 3553 3490 3464 +f 3464 3528 3553 +f 3579 3505 3490 +f 3490 3553 3579 +f 3592 3521 3505 +f 3505 3579 3592 +f 3604 3523 3521 +f 3521 3592 3604 +f 3221 3096 3094 +f 3094 3224 3221 +f 3219 3099 3096 +f 3096 3221 3219 +f 3218 3100 3099 +f 3099 3219 3218 +f 3216 3103 3100 +f 3100 3218 3216 +f 3212 3105 3103 +f 3103 3216 3212 +f 3206 3107 3105 +f 3105 3212 3206 +f 3197 3108 3107 +f 3107 3206 3197 +f 3193 3111 3108 +f 3108 3197 3193 +f 3187 3112 3111 +f 3111 3193 3187 +f 3183 3114 3112 +f 3112 3187 3183 +f 3252 3221 3224 +f 3224 3254 3252 +f 3250 3219 3221 +f 3221 3252 3250 +f 3246 3218 3219 +f 3219 3250 3246 +f 3242 3216 3218 +f 3218 3246 3242 +f 3236 3212 3216 +f 3216 3242 3236 +f 3234 3206 3212 +f 3212 3236 3234 +f 3232 3197 3206 +f 3206 3234 3232 +f 3230 3193 3197 +f 3197 3232 3230 +f 3228 3187 3193 +f 3193 3230 3228 +f 3226 3183 3187 +f 3187 3228 3226 +f 3294 3252 3254 +f 3254 3298 3294 +f 3286 3250 3252 +f 3252 3294 3286 +f 3280 3246 3250 +f 3250 3286 3280 +f 3272 3242 3246 +f 3246 3280 3272 +f 3264 3236 3242 +f 3242 3272 3264 +f 3258 3234 3236 +f 3236 3264 3258 +f 3248 3232 3234 +f 3234 3258 3248 +f 3244 3230 3232 +f 3232 3248 3244 +f 3240 3228 3230 +f 3230 3244 3240 +f 3238 3226 3228 +f 3228 3240 3238 +f 3331 3294 3298 +f 3298 3333 3331 +f 3321 3286 3294 +f 3294 3331 3321 +f 3315 3280 3286 +f 3286 3321 3315 +f 3304 3272 3280 +f 3280 3315 3304 +f 3288 3264 3272 +f 3272 3304 3288 +f 3276 3258 3264 +f 3264 3288 3276 +f 3266 3248 3258 +f 3258 3276 3266 +f 3262 3244 3248 +f 3248 3266 3262 +f 3260 3240 3244 +f 3244 3262 3260 +f 3256 3238 3240 +f 3240 3260 3256 +f 3350 3331 3333 +f 3333 3354 3350 +f 3347 3321 3331 +f 3331 3350 3347 +f 3339 3315 3321 +f 3321 3347 3339 +f 3323 3304 3315 +f 3315 3339 3323 +f 3309 3288 3304 +f 3304 3323 3309 +f 3300 3276 3288 +f 3288 3309 3300 +f 3284 3266 3276 +f 3276 3300 3284 +f 3274 3262 3266 +f 3266 3284 3274 +f 3269 3260 3262 +f 3262 3274 3269 +f 3267 3256 3260 +f 3260 3269 3267 +f 3372 3350 3354 +f 3354 3378 3372 +f 3367 3347 3350 +f 3350 3372 3367 +f 3352 3339 3347 +f 3347 3367 3352 +f 3341 3323 3339 +f 3339 3352 3341 +f 3325 3309 3323 +f 3323 3341 3325 +f 3313 3300 3309 +f 3309 3325 3313 +f 3301 3284 3300 +f 3300 3313 3301 +f 3289 3274 3284 +f 3284 3301 3289 +f 3281 3269 3274 +f 3274 3289 3281 +f 3277 3267 3269 +f 3269 3281 3277 +f 3403 3372 3378 +f 3378 3405 3403 +f 3393 3367 3372 +f 3372 3403 3393 +f 3377 3352 3367 +f 3367 3393 3377 +f 3360 3341 3352 +f 3352 3377 3360 +f 3344 3325 3341 +f 3341 3360 3344 +f 3327 3313 3325 +f 3325 3344 3327 +f 3317 3301 3313 +f 3313 3327 3317 +f 3305 3289 3301 +f 3301 3317 3305 +f 3296 3281 3289 +f 3289 3305 3296 +f 3291 3277 3281 +f 3281 3296 3291 +f 3469 3403 3405 +f 3405 3472 3469 +f 3450 3393 3403 +f 3403 3469 3450 +f 3426 3377 3393 +f 3393 3450 3426 +f 3390 3360 3377 +f 3377 3426 3390 +f 3370 3344 3360 +f 3360 3390 3370 +f 3349 3327 3344 +f 3344 3370 3349 +f 3337 3317 3327 +f 3327 3349 3337 +f 3319 3305 3317 +f 3317 3337 3319 +f 3311 3296 3305 +f 3305 3319 3311 +f 3307 3291 3296 +f 3296 3311 3307 +f 3520 3469 3472 +f 3472 3522 3520 +f 3504 3450 3469 +f 3469 3520 3504 +f 3489 3426 3450 +f 3450 3504 3489 +f 3463 3390 3426 +f 3426 3489 3463 +f 3421 3370 3390 +f 3390 3463 3421 +f 3385 3349 3370 +f 3370 3421 3385 +f 3361 3337 3349 +f 3349 3385 3361 +f 3342 3319 3337 +f 3337 3361 3342 +f 3334 3311 3319 +f 3319 3342 3334 +f 3328 3307 3311 +f 3311 3334 3328 +f 3591 3520 3522 +f 3522 3603 3591 +f 3578 3504 3520 +f 3520 3591 3578 +f 3552 3489 3504 +f 3504 3578 3552 +f 3530 3463 3489 +f 3489 3552 3530 +f 3499 3421 3463 +f 3463 3530 3499 +f 3467 3385 3421 +f 3421 3499 3467 +f 3415 3361 3385 +f 3385 3467 3415 +f 3381 3342 3361 +f 3361 3415 3381 +f 3363 3334 3342 +f 3342 3381 3363 +f 3356 3328 3334 +f 3334 3363 3356 +f 3374 3365 3358 +f 3358 3371 3374 +f 3395 3383 3365 +f 3365 3374 3395 +f 3443 3417 3383 +f 3383 3395 3443 +f 3481 3466 3417 +f 3417 3443 3481 +f 3514 3496 3466 +f 3466 3481 3514 +f 3545 3529 3496 +f 3496 3514 3545 +f 3573 3551 3529 +f 3529 3545 3573 +f 3597 3577 3551 +f 3551 3573 3597 +f 3613 3590 3577 +f 3577 3597 3613 +f 3619 3603 3590 +f 3590 3613 3619 +f 3387 3374 3371 +f 3371 3380 3387 +f 3413 3395 3374 +f 3374 3387 3413 +f 3461 3443 3395 +f 3395 3413 3461 +f 3493 3481 3443 +f 3443 3461 3493 +f 3524 3514 3481 +f 3481 3493 3524 +f 3556 3545 3514 +f 3514 3524 3556 +f 3584 3573 3545 +f 3545 3556 3584 +f 3611 3597 3573 +f 3573 3584 3611 +f 3628 3613 3597 +f 3597 3611 3628 +f 3632 3619 3613 +f 3613 3628 3632 +f 3398 3387 3380 +f 3380 3391 3398 +f 3435 3413 3387 +f 3387 3398 3435 +f 3473 3461 3413 +f 3413 3435 3473 +f 3500 3493 3461 +f 3461 3473 3500 +f 3531 3524 3493 +f 3493 3500 3531 +f 3562 3556 3524 +f 3524 3531 3562 +f 3595 3584 3556 +f 3556 3562 3595 +f 3617 3611 3584 +f 3584 3595 3617 +f 3633 3628 3611 +f 3611 3617 3633 +f 3641 3632 3628 +f 3628 3633 3641 +f 3409 3398 3391 +f 3391 3400 3409 +f 3447 3435 3398 +f 3398 3409 3447 +f 3477 3473 3435 +f 3435 3447 3477 +f 3506 3500 3473 +f 3473 3477 3506 +f 3540 3531 3500 +f 3500 3506 3540 +f 3567 3562 3531 +f 3531 3540 3567 +f 3601 3595 3562 +f 3562 3567 3601 +f 3624 3617 3595 +f 3595 3601 3624 +f 3639 3633 3617 +f 3617 3624 3639 +f 3644 3641 3633 +f 3633 3639 3644 +f 3433 3409 3400 +f 3400 3411 3433 +f 3453 3447 3409 +f 3409 3433 3453 +f 3483 3477 3447 +f 3447 3453 3483 +f 3510 3506 3477 +f 3477 3483 3510 +f 3543 3540 3506 +f 3506 3510 3543 +f 3569 3567 3540 +f 3540 3543 3569 +f 3599 3601 3567 +f 3567 3569 3599 +f 3622 3624 3601 +f 3601 3599 3622 +f 3637 3639 3624 +f 3624 3622 3637 +f 3642 3644 3639 +f 3639 3637 3642 +f 3439 3433 3411 +f 3411 3424 3439 +f 3458 3453 3433 +f 3433 3439 3458 +f 3487 3483 3453 +f 3453 3458 3487 +f 3513 3510 3483 +f 3483 3487 3513 +f 3542 3543 3510 +f 3510 3513 3542 +f 3566 3569 3543 +f 3543 3542 3566 +f 3593 3599 3569 +f 3569 3566 3593 +f 3616 3622 3599 +f 3599 3593 3616 +f 3630 3637 3622 +f 3622 3616 3630 +f 3636 3642 3637 +f 3637 3630 3636 +f 3441 3439 3424 +f 3424 3429 3441 +f 3459 3458 3439 +f 3439 3441 3459 +f 3485 3487 3458 +f 3458 3459 3485 +f 3508 3513 3487 +f 3487 3485 3508 +f 3533 3542 3513 +f 3513 3508 3533 +f 3558 3566 3542 +f 3542 3533 3558 +f 3582 3593 3566 +f 3566 3558 3582 +f 3607 3616 3593 +f 3593 3582 3607 +f 3620 3630 3616 +f 3616 3607 3620 +f 3626 3636 3630 +f 3630 3620 3626 +f 3437 3441 3429 +f 3429 3427 3437 +f 3455 3459 3441 +f 3441 3437 3455 +f 3479 3485 3459 +f 3459 3455 3479 +f 3502 3508 3485 +f 3485 3479 3502 +f 3526 3533 3508 +f 3508 3502 3526 +f 3547 3558 3533 +f 3533 3526 3547 +f 3571 3582 3558 +f 3558 3547 3571 +f 3588 3607 3582 +f 3582 3571 3588 +f 3605 3620 3607 +f 3607 3588 3605 +f 3609 3626 3620 +f 3620 3605 3609 +f 3419 3437 3427 +f 3427 3408 3419 +f 3445 3455 3437 +f 3437 3419 3445 +f 3470 3479 3455 +f 3455 3445 3470 +f 3492 3502 3479 +f 3479 3470 3492 +f 3517 3526 3502 +f 3502 3492 3517 +f 3536 3547 3526 +f 3526 3517 3536 +f 3554 3571 3547 +f 3547 3536 3554 +f 3575 3588 3571 +f 3571 3554 3575 +f 3580 3605 3588 +f 3588 3575 3580 +f 3587 3609 3605 +f 3605 3580 3587 +f 3401 3419 3408 +f 3408 3397 3401 +f 3431 3445 3419 +f 3419 3401 3431 +f 3451 3470 3445 +f 3445 3431 3451 +f 3475 3492 3470 +f 3470 3451 3475 +f 3497 3517 3492 +f 3492 3475 3497 +f 3518 3536 3517 +f 3517 3497 3518 +f 3537 3554 3536 +f 3536 3518 3537 +f 3549 3575 3554 +f 3554 3537 3549 +f 3560 3580 3575 +f 3575 3549 3560 +f 3564 3587 3580 +f 3580 3560 3564 +f 3614 3591 3603 +f 3603 3619 3614 +f 3598 3578 3591 +f 3591 3614 3598 +f 3574 3552 3578 +f 3578 3598 3574 +f 3546 3530 3552 +f 3552 3574 3546 +f 3515 3499 3530 +f 3530 3546 3515 +f 3482 3467 3499 +f 3499 3515 3482 +f 3444 3418 3467 +f 3467 3482 3444 +f 3396 3384 3418 +f 3418 3444 3396 +f 3375 3366 3384 +f 3384 3396 3375 +f 3371 3358 3366 +f 3366 3375 3371 +f 3629 3614 3619 +f 3619 3632 3629 +f 3612 3598 3614 +f 3614 3629 3612 +f 3585 3574 3598 +f 3598 3612 3585 +f 3557 3546 3574 +f 3574 3585 3557 +f 3525 3515 3546 +f 3546 3557 3525 +f 3494 3482 3515 +f 3515 3525 3494 +f 3462 3444 3482 +f 3482 3494 3462 +f 3414 3396 3444 +f 3444 3462 3414 +f 3388 3375 3396 +f 3396 3414 3388 +f 3380 3371 3375 +f 3375 3388 3380 +f 3634 3629 3632 +f 3632 3641 3634 +f 3618 3612 3629 +f 3629 3634 3618 +f 3596 3585 3612 +f 3612 3618 3596 +f 3563 3557 3585 +f 3585 3596 3563 +f 3532 3525 3557 +f 3557 3563 3532 +f 3501 3494 3525 +f 3525 3532 3501 +f 3474 3462 3494 +f 3494 3501 3474 +f 3436 3414 3462 +f 3462 3474 3436 +f 3399 3388 3414 +f 3414 3436 3399 +f 3392 3380 3388 +f 3388 3399 3392 +f 3640 3634 3641 +f 3641 3644 3640 +f 3625 3618 3634 +f 3634 3640 3625 +f 3602 3596 3618 +f 3618 3625 3602 +f 3568 3563 3596 +f 3596 3602 3568 +f 3539 3532 3563 +f 3563 3568 3539 +f 3507 3501 3532 +f 3532 3539 3507 +f 3478 3474 3501 +f 3501 3507 3478 +f 3448 3436 3474 +f 3474 3478 3448 +f 3410 3399 3436 +f 3436 3448 3410 +f 3400 3392 3399 +f 3399 3410 3400 +f 3638 3640 3644 +f 3644 3643 3638 +f 3623 3625 3640 +f 3640 3638 3623 +f 3600 3602 3625 +f 3625 3623 3600 +f 3570 3568 3602 +f 3602 3600 3570 +f 3544 3539 3568 +f 3568 3570 3544 +f 3511 3507 3539 +f 3539 3544 3511 +f 3484 3478 3507 +f 3507 3511 3484 +f 3454 3448 3478 +f 3478 3484 3454 +f 3434 3410 3448 +f 3448 3454 3434 +f 3412 3400 3410 +f 3410 3434 3412 +f 3631 3638 3643 +f 3643 3635 3631 +f 3615 3623 3638 +f 3638 3631 3615 +f 3594 3600 3623 +f 3623 3615 3594 +f 3565 3570 3600 +f 3600 3594 3565 +f 3541 3544 3570 +f 3570 3565 3541 +f 3512 3511 3544 +f 3544 3541 3512 +f 3488 3484 3511 +f 3511 3512 3488 +f 3457 3454 3484 +f 3484 3488 3457 +f 3440 3434 3454 +f 3454 3457 3440 +f 3423 3412 3434 +f 3434 3440 3423 +f 3621 3631 3635 +f 3635 3627 3621 +f 3608 3615 3631 +f 3631 3621 3608 +f 3583 3594 3615 +f 3615 3608 3583 +f 3559 3565 3594 +f 3594 3583 3559 +f 3534 3541 3565 +f 3565 3559 3534 +f 3509 3512 3541 +f 3541 3534 3509 +f 3486 3488 3512 +f 3512 3509 3486 +f 3460 3457 3488 +f 3488 3486 3460 +f 3442 3440 3457 +f 3457 3460 3442 +f 3430 3423 3440 +f 3440 3442 3430 +f 3606 3621 3627 +f 3627 3610 3606 +f 3589 3608 3621 +f 3621 3606 3589 +f 3572 3583 3608 +f 3608 3589 3572 +f 3548 3559 3583 +f 3583 3572 3548 +f 3527 3534 3559 +f 3559 3548 3527 +f 3503 3509 3534 +f 3534 3527 3503 +f 3480 3486 3509 +f 3509 3503 3480 +f 3456 3460 3486 +f 3486 3480 3456 +f 3438 3442 3460 +f 3460 3456 3438 +f 3428 3430 3442 +f 3442 3438 3428 +f 3581 3606 3610 +f 3610 3586 3581 +f 3576 3589 3606 +f 3606 3581 3576 +f 3555 3572 3589 +f 3589 3576 3555 +f 3535 3548 3572 +f 3572 3555 3535 +f 3516 3527 3548 +f 3548 3535 3516 +f 3491 3503 3527 +f 3527 3516 3491 +f 3471 3480 3503 +f 3503 3491 3471 +f 3446 3456 3480 +f 3480 3471 3446 +f 3420 3438 3456 +f 3456 3446 3420 +f 3407 3428 3438 +f 3438 3420 3407 +f 3561 3581 3586 +f 3586 3564 3561 +f 3550 3576 3581 +f 3581 3561 3550 +f 3538 3555 3576 +f 3576 3550 3538 +f 3519 3535 3555 +f 3555 3538 3519 +f 3498 3516 3535 +f 3535 3519 3498 +f 3476 3491 3516 +f 3516 3498 3476 +f 3452 3471 3491 +f 3491 3476 3452 +f 3432 3446 3471 +f 3471 3452 3432 +f 3402 3420 3446 +f 3446 3432 3402 +f 3397 3407 3420 +f 3420 3402 3397 +f 1888 2110 2104 +f 1888 2104 2096 +f 1888 2096 2076 +f 1888 2076 2048 +f 1888 2048 2030 +f 1888 2030 2006 +f 1888 2006 1982 +f 1888 1982 1960 +f 1888 1960 1936 +f 1888 1936 1732 +f 2257 2104 2110 +f 2110 2261 2257 +f 2249 2096 2104 +f 2104 2257 2249 +f 2226 2076 2096 +f 2096 2249 2226 +f 2200 2048 2076 +f 2076 2226 2200 +f 2142 2030 2048 +f 2048 2200 2142 +f 2094 2006 2030 +f 2030 2142 2094 +f 2036 1982 2006 +f 2006 2094 2036 +f 1988 1960 1982 +f 1982 2036 1988 +f 1948 1936 1960 +f 1960 1988 1948 +f 1728 1732 1936 +f 1936 1948 1728 +f 2310 2257 2261 +f 2261 2315 2310 +f 2300 2249 2257 +f 2257 2310 2300 +f 2279 2226 2249 +f 2249 2300 2279 +f 2243 2200 2226 +f 2226 2279 2243 +f 2204 2142 2200 +f 2200 2243 2204 +f 2132 2094 2142 +f 2142 2204 2132 +f 2067 2036 2094 +f 2094 2132 2067 +f 2000 1988 2036 +f 2036 2067 2000 +f 1956 1948 1988 +f 1988 2000 1956 +f 1734 1728 1948 +f 1948 1956 1734 +f 2312 2310 2315 +f 2315 2316 2312 +f 2302 2300 2310 +f 2310 2312 2302 +f 2281 2279 2300 +f 2300 2302 2281 +f 2245 2243 2279 +f 2279 2281 2245 +f 2206 2204 2243 +f 2243 2245 2206 +f 2134 2132 2204 +f 2204 2206 2134 +f 2068 2067 2132 +f 2132 2134 2068 +f 2002 2000 2067 +f 2067 2068 2002 +f 1958 1956 2000 +f 2000 2002 1958 +f 1878 1734 1956 +f 1956 1958 1878 +f 2285 2312 2316 +f 2316 2289 2285 +f 2259 2302 2312 +f 2312 2285 2259 +f 2241 2281 2302 +f 2302 2259 2241 +f 2214 2245 2281 +f 2281 2241 2214 +f 2168 2206 2245 +f 2245 2214 2168 +f 2106 2134 2206 +f 2206 2168 2106 +f 2042 2068 2134 +f 2134 2106 2042 +f 1994 2002 2068 +f 2068 2042 1994 +f 1952 1958 2002 +f 2002 1994 1952 +f 1731 1878 1958 +f 1958 1952 1731 +f 2220 2285 2289 +f 2289 2225 2220 +f 2210 2259 2285 +f 2285 2220 2210 +f 2186 2241 2259 +f 2259 2210 2186 +f 2146 2214 2241 +f 2241 2186 2146 +f 2108 2168 2214 +f 2214 2146 2108 +f 2060 2106 2168 +f 2168 2108 2060 +f 2018 2042 2106 +f 2106 2060 2018 +f 1978 1994 2042 +f 2042 2018 1978 +f 1944 1952 1994 +f 1994 1978 1944 +f 1727 1731 1952 +f 1952 1944 1727 +f 2141 2220 2225 +f 2225 2145 2141 +f 2127 2210 2220 +f 2220 2141 2127 +f 2112 2186 2210 +f 2210 2127 2112 +f 2084 2146 2186 +f 2186 2112 2084 +f 2044 2108 2146 +f 2146 2084 2044 +f 2024 2060 2108 +f 2108 2044 2024 +f 1992 2018 2060 +f 2060 2024 1992 +f 1970 1978 2018 +f 2018 1992 1970 +f 1942 1944 1978 +f 1978 1970 1942 +f 1721 1727 1944 +f 1944 1942 1721 +f 2079 2141 2145 +f 2145 2087 2079 +f 2075 2127 2141 +f 2141 2079 2075 +f 2055 2112 2127 +f 2127 2075 2055 +f 2039 2084 2112 +f 2112 2055 2039 +f 2021 2044 2084 +f 2084 2039 2021 +f 1996 2024 2044 +f 2044 2021 1996 +f 1974 1992 2024 +f 2024 1996 1974 +f 1954 1970 1992 +f 1992 1974 1954 +f 1934 1942 1970 +f 1970 1954 1934 +f 1720 1721 1942 +f 1942 1934 1720 +f 2063 2079 2087 +f 2087 2071 2063 +f 2051 2075 2079 +f 2079 2063 2051 +f 2041 2055 2075 +f 2075 2051 2041 +f 2029 2039 2055 +f 2055 2041 2029 +f 2013 2021 2039 +f 2039 2029 2013 +f 1991 1996 2021 +f 2021 2013 1991 +f 1972 1974 1996 +f 1996 1991 1972 +f 1950 1954 1974 +f 1974 1972 1950 +f 1932 1934 1954 +f 1954 1950 1932 +f 1701 1720 1934 +f 1934 1932 1701 +f 2115 2063 2071 +f 2071 2123 2115 +f 2101 2051 2063 +f 2063 2115 2101 +f 2081 2041 2051 +f 2051 2101 2081 +f 2057 2029 2041 +f 2041 2081 2057 +f 2033 2013 2029 +f 2029 2057 2033 +f 2009 1991 2013 +f 2013 2033 2009 +f 1984 1972 1991 +f 1991 2009 1984 +f 1964 1950 1972 +f 1972 1984 1964 +f 1938 1932 1950 +f 1950 1964 1938 +f 1698 1701 1932 +f 1932 1938 1698 +f 1888 1886 1686 +f 1888 1686 1662 +f 1888 1662 1640 +f 1888 1640 1616 +f 1888 1616 1592 +f 1888 1592 1574 +f 1888 1574 1546 +f 1888 1546 1526 +f 1888 1526 1518 +f 1888 1518 1512 +f 1674 1686 1886 +f 1886 1884 1674 +f 1634 1662 1686 +f 1686 1674 1634 +f 1586 1640 1662 +f 1662 1634 1586 +f 1528 1616 1640 +f 1640 1586 1528 +f 1480 1592 1616 +f 1616 1528 1480 +f 1422 1574 1592 +f 1592 1480 1422 +f 1396 1546 1574 +f 1574 1422 1396 +f 1373 1526 1546 +f 1546 1396 1373 +f 1365 1518 1526 +f 1526 1373 1365 +f 1361 1512 1518 +f 1518 1365 1361 +f 1666 1674 1884 +f 1884 1882 1666 +f 1622 1634 1674 +f 1674 1666 1622 +f 1557 1586 1634 +f 1634 1622 1557 +f 1490 1528 1586 +f 1586 1557 1490 +f 1418 1480 1528 +f 1528 1490 1418 +f 1379 1422 1480 +f 1480 1418 1379 +f 1343 1396 1422 +f 1422 1379 1343 +f 1322 1373 1396 +f 1396 1343 1322 +f 1312 1365 1373 +f 1373 1322 1312 +f 1309 1361 1365 +f 1365 1312 1309 +f 1664 1666 1882 +f 1882 1879 1664 +f 1620 1622 1666 +f 1666 1664 1620 +f 1554 1557 1622 +f 1622 1620 1554 +f 1488 1490 1557 +f 1557 1554 1488 +f 1416 1418 1490 +f 1490 1488 1416 +f 1377 1379 1418 +f 1418 1416 1377 +f 1341 1343 1379 +f 1379 1377 1341 +f 1320 1322 1343 +f 1343 1341 1320 +f 1310 1312 1322 +f 1322 1320 1310 +f 1306 1309 1312 +f 1312 1310 1306 +f 1670 1664 1879 +f 1879 1876 1670 +f 1628 1620 1664 +f 1664 1670 1628 +f 1580 1554 1620 +f 1620 1628 1580 +f 1516 1488 1554 +f 1554 1580 1516 +f 1454 1416 1488 +f 1488 1516 1454 +f 1408 1377 1416 +f 1416 1454 1408 +f 1381 1341 1377 +f 1377 1408 1381 +f 1363 1320 1341 +f 1341 1381 1363 +f 1337 1310 1320 +f 1320 1363 1337 +f 1333 1306 1310 +f 1310 1337 1333 +f 1678 1670 1876 +f 1876 1874 1678 +f 1644 1628 1670 +f 1670 1678 1644 +f 1604 1580 1628 +f 1628 1644 1604 +f 1562 1516 1580 +f 1580 1604 1562 +f 1514 1454 1516 +f 1516 1562 1514 +f 1476 1408 1454 +f 1454 1514 1476 +f 1436 1381 1408 +f 1408 1476 1436 +f 1412 1363 1381 +f 1381 1436 1412 +f 1402 1337 1363 +f 1363 1412 1402 +f 1399 1333 1337 +f 1337 1402 1399 +f 1680 1678 1874 +f 1874 1872 1680 +f 1652 1644 1678 +f 1678 1680 1652 +f 1630 1604 1644 +f 1644 1652 1630 +f 1598 1562 1604 +f 1604 1630 1598 +f 1578 1514 1562 +f 1562 1598 1578 +f 1538 1476 1514 +f 1514 1578 1538 +f 1510 1436 1476 +f 1476 1538 1510 +f 1497 1412 1436 +f 1436 1510 1497 +f 1483 1402 1412 +f 1412 1497 1483 +f 1479 1399 1402 +f 1402 1483 1479 +f 1688 1680 1872 +f 1872 1870 1688 +f 1668 1652 1680 +f 1680 1688 1668 +f 1648 1630 1652 +f 1652 1668 1648 +f 1626 1598 1630 +f 1630 1648 1626 +f 1603 1578 1598 +f 1598 1626 1603 +f 1585 1538 1578 +f 1578 1603 1585 +f 1569 1510 1538 +f 1538 1585 1569 +f 1549 1497 1510 +f 1510 1569 1549 +f 1545 1483 1497 +f 1497 1549 1545 +f 1537 1479 1483 +f 1483 1545 1537 +f 1690 1688 1870 +f 1870 1868 1690 +f 1672 1668 1688 +f 1688 1690 1672 +f 1650 1648 1668 +f 1668 1672 1650 +f 1633 1626 1648 +f 1648 1650 1633 +f 1611 1603 1626 +f 1626 1633 1611 +f 1595 1585 1603 +f 1603 1611 1595 +f 1583 1569 1585 +f 1585 1595 1583 +f 1573 1549 1569 +f 1569 1583 1573 +f 1561 1545 1549 +f 1549 1573 1561 +f 1553 1537 1545 +f 1545 1561 1553 +f 1684 1690 1868 +f 1868 1865 1684 +f 1658 1672 1690 +f 1690 1684 1658 +f 1638 1650 1672 +f 1672 1658 1638 +f 1615 1633 1650 +f 1650 1638 1615 +f 1591 1611 1633 +f 1633 1615 1591 +f 1567 1595 1611 +f 1611 1591 1567 +f 1543 1583 1595 +f 1595 1567 1543 +f 1523 1573 1583 +f 1583 1543 1523 +f 1509 1561 1573 +f 1573 1523 1509 +f 1501 1553 1561 +f 1561 1509 1501 +f 1888 1513 1519 +f 1888 1519 1527 +f 1888 1527 1547 +f 1888 1547 1575 +f 1888 1575 1593 +f 1888 1593 1617 +f 1888 1617 1641 +f 1888 1641 1663 +f 1888 1663 1687 +f 1888 1687 1894 +f 1366 1519 1513 +f 1513 1362 1366 +f 1374 1527 1519 +f 1519 1366 1374 +f 1397 1547 1527 +f 1527 1374 1397 +f 1423 1575 1547 +f 1547 1397 1423 +f 1481 1593 1575 +f 1575 1423 1481 +f 1529 1617 1593 +f 1593 1481 1529 +f 1587 1641 1617 +f 1617 1529 1587 +f 1635 1663 1641 +f 1641 1587 1635 +f 1675 1687 1663 +f 1663 1635 1675 +f 1895 1894 1687 +f 1687 1675 1895 +f 1313 1366 1362 +f 1362 1308 1313 +f 1323 1374 1366 +f 1366 1313 1323 +f 1344 1397 1374 +f 1374 1323 1344 +f 1380 1423 1397 +f 1397 1344 1380 +f 1419 1481 1423 +f 1423 1380 1419 +f 1491 1529 1481 +f 1481 1419 1491 +f 1556 1587 1529 +f 1529 1491 1556 +f 1623 1635 1587 +f 1587 1556 1623 +f 1667 1675 1635 +f 1635 1623 1667 +f 1890 1895 1675 +f 1675 1667 1890 +f 1311 1313 1308 +f 1308 1307 1311 +f 1321 1323 1313 +f 1313 1311 1321 +f 1342 1344 1323 +f 1323 1321 1342 +f 1378 1380 1344 +f 1344 1342 1378 +f 1417 1419 1380 +f 1380 1378 1417 +f 1489 1491 1419 +f 1419 1417 1489 +f 1555 1556 1491 +f 1491 1489 1555 +f 1621 1623 1556 +f 1556 1555 1621 +f 1665 1667 1623 +f 1623 1621 1665 +f 1881 1890 1667 +f 1667 1665 1881 +f 1338 1311 1307 +f 1307 1334 1338 +f 1364 1321 1311 +f 1311 1338 1364 +f 1382 1342 1321 +f 1321 1364 1382 +f 1409 1378 1342 +f 1342 1382 1409 +f 1455 1417 1378 +f 1378 1409 1455 +f 1517 1489 1417 +f 1417 1455 1517 +f 1581 1555 1489 +f 1489 1517 1581 +f 1629 1621 1555 +f 1555 1581 1629 +f 1671 1665 1621 +f 1621 1629 1671 +f 1893 1881 1665 +f 1665 1671 1893 +f 1403 1338 1334 +f 1334 1398 1403 +f 1413 1364 1338 +f 1338 1403 1413 +f 1437 1382 1364 +f 1364 1413 1437 +f 1477 1409 1382 +f 1382 1437 1477 +f 1515 1455 1409 +f 1409 1477 1515 +f 1563 1517 1455 +f 1455 1515 1563 +f 1605 1581 1517 +f 1517 1563 1605 +f 1645 1629 1581 +f 1581 1605 1645 +f 1679 1671 1629 +f 1629 1645 1679 +f 1900 1893 1671 +f 1671 1679 1900 +f 1482 1403 1398 +f 1398 1478 1482 +f 1496 1413 1403 +f 1403 1482 1496 +f 1511 1437 1413 +f 1413 1496 1511 +f 1539 1477 1437 +f 1437 1511 1539 +f 1579 1515 1477 +f 1477 1539 1579 +f 1599 1563 1515 +f 1515 1579 1599 +f 1631 1605 1563 +f 1563 1599 1631 +f 1653 1645 1605 +f 1605 1631 1653 +f 1681 1679 1645 +f 1645 1653 1681 +f 1902 1900 1679 +f 1679 1681 1902 +f 1544 1482 1478 +f 1478 1536 1544 +f 1548 1496 1482 +f 1482 1544 1548 +f 1568 1511 1496 +f 1496 1548 1568 +f 1584 1539 1511 +f 1511 1568 1584 +f 1602 1579 1539 +f 1539 1584 1602 +f 1627 1599 1579 +f 1579 1602 1627 +f 1649 1631 1599 +f 1599 1627 1649 +f 1669 1653 1631 +f 1631 1649 1669 +f 1689 1681 1653 +f 1653 1669 1689 +f 1921 1902 1681 +f 1681 1689 1921 +f 1560 1544 1536 +f 1536 1552 1560 +f 1572 1548 1544 +f 1544 1560 1572 +f 1582 1568 1548 +f 1548 1572 1582 +f 1594 1584 1568 +f 1568 1582 1594 +f 1610 1602 1584 +f 1584 1594 1610 +f 1632 1627 1602 +f 1602 1610 1632 +f 1651 1649 1627 +f 1627 1632 1651 +f 1673 1669 1649 +f 1649 1651 1673 +f 1691 1689 1669 +f 1669 1673 1691 +f 1922 1921 1689 +f 1689 1691 1922 +f 1508 1560 1552 +f 1552 1500 1508 +f 1522 1572 1560 +f 1560 1508 1522 +f 1542 1582 1572 +f 1572 1522 1542 +f 1566 1594 1582 +f 1582 1542 1566 +f 1590 1610 1594 +f 1594 1566 1590 +f 1614 1632 1610 +f 1610 1590 1614 +f 1639 1651 1632 +f 1632 1614 1639 +f 1659 1673 1651 +f 1651 1639 1659 +f 1685 1691 1673 +f 1673 1659 1685 +f 1928 1922 1691 +f 1691 1685 1928 +f 1888 1887 1937 +f 1888 1937 1961 +f 1888 1961 1983 +f 1888 1983 2007 +f 1888 2007 2031 +f 1888 2031 2049 +f 1888 2049 2077 +f 1888 2077 2097 +f 1888 2097 2105 +f 1888 2105 2111 +f 1949 1937 1887 +f 1887 1885 1949 +f 1989 1961 1937 +f 1937 1949 1989 +f 2037 1983 1961 +f 1961 1989 2037 +f 2095 2007 1983 +f 1983 2037 2095 +f 2143 2031 2007 +f 2007 2095 2143 +f 2201 2049 2031 +f 2031 2143 2201 +f 2227 2077 2049 +f 2049 2201 2227 +f 2250 2097 2077 +f 2077 2227 2250 +f 2258 2105 2097 +f 2097 2250 2258 +f 2262 2111 2105 +f 2105 2258 2262 +f 1957 1949 1885 +f 1885 1883 1957 +f 2001 1989 1949 +f 1949 1957 2001 +f 2066 2037 1989 +f 1989 2001 2066 +f 2133 2095 2037 +f 2037 2066 2133 +f 2205 2143 2095 +f 2095 2133 2205 +f 2244 2201 2143 +f 2143 2205 2244 +f 2280 2227 2201 +f 2201 2244 2280 +f 2301 2250 2227 +f 2227 2280 2301 +f 2311 2258 2250 +f 2250 2301 2311 +f 2314 2262 2258 +f 2258 2311 2314 +f 1959 1957 1883 +f 1883 1880 1959 +f 2003 2001 1957 +f 1957 1959 2003 +f 2069 2066 2001 +f 2001 2003 2069 +f 2135 2133 2066 +f 2066 2069 2135 +f 2207 2205 2133 +f 2133 2135 2207 +f 2246 2244 2205 +f 2205 2207 2246 +f 2282 2280 2244 +f 2244 2246 2282 +f 2303 2301 2280 +f 2280 2282 2303 +f 2313 2311 2301 +f 2301 2303 2313 +f 2317 2314 2311 +f 2311 2313 2317 +f 1953 1959 1880 +f 1880 1877 1953 +f 1995 2003 1959 +f 1959 1953 1995 +f 2043 2069 2003 +f 2003 1995 2043 +f 2107 2135 2069 +f 2069 2043 2107 +f 2169 2207 2135 +f 2135 2107 2169 +f 2215 2246 2207 +f 2207 2169 2215 +f 2242 2282 2246 +f 2246 2215 2242 +f 2260 2303 2282 +f 2282 2242 2260 +f 2286 2313 2303 +f 2303 2260 2286 +f 2290 2317 2313 +f 2313 2286 2290 +f 1945 1953 1877 +f 1877 1875 1945 +f 1979 1995 1953 +f 1953 1945 1979 +f 2019 2043 1995 +f 1995 1979 2019 +f 2061 2107 2043 +f 2043 2019 2061 +f 2109 2169 2107 +f 2107 2061 2109 +f 2147 2215 2169 +f 2169 2109 2147 +f 2187 2242 2215 +f 2215 2147 2187 +f 2211 2260 2242 +f 2242 2187 2211 +f 2221 2286 2260 +f 2260 2211 2221 +f 2224 2290 2286 +f 2286 2221 2224 +f 1943 1945 1875 +f 1875 1873 1943 +f 1971 1979 1945 +f 1945 1943 1971 +f 1993 2019 1979 +f 1979 1971 1993 +f 2025 2061 2019 +f 2019 1993 2025 +f 2045 2109 2061 +f 2061 2025 2045 +f 2085 2147 2109 +f 2109 2045 2085 +f 2113 2187 2147 +f 2147 2085 2113 +f 2126 2211 2187 +f 2187 2113 2126 +f 2140 2221 2211 +f 2211 2126 2140 +f 2144 2224 2221 +f 2221 2140 2144 +f 1935 1943 1873 +f 1873 1871 1935 +f 1955 1971 1943 +f 1943 1935 1955 +f 1975 1993 1971 +f 1971 1955 1975 +f 1997 2025 1993 +f 1993 1975 1997 +f 2020 2045 2025 +f 2025 1997 2020 +f 2038 2085 2045 +f 2045 2020 2038 +f 2054 2113 2085 +f 2085 2038 2054 +f 2074 2126 2113 +f 2113 2054 2074 +f 2078 2140 2126 +f 2126 2074 2078 +f 2086 2144 2140 +f 2140 2078 2086 +f 1933 1935 1871 +f 1871 1869 1933 +f 1951 1955 1935 +f 1935 1933 1951 +f 1973 1975 1955 +f 1955 1951 1973 +f 1990 1997 1975 +f 1975 1973 1990 +f 2012 2020 1997 +f 1997 1990 2012 +f 2028 2038 2020 +f 2020 2012 2028 +f 2040 2054 2038 +f 2038 2028 2040 +f 2050 2074 2054 +f 2054 2040 2050 +f 2062 2078 2074 +f 2074 2050 2062 +f 2070 2086 2078 +f 2078 2062 2070 +f 1939 1933 1869 +f 1869 1866 1939 +f 1965 1951 1933 +f 1933 1939 1965 +f 1985 1973 1951 +f 1951 1965 1985 +f 2008 1990 1973 +f 1973 1985 2008 +f 2032 2012 1990 +f 1990 2008 2032 +f 2056 2028 2012 +f 2012 2032 2056 +f 2080 2040 2028 +f 2028 2056 2080 +f 2100 2050 2040 +f 2040 2080 2100 +f 2114 2062 2050 +f 2050 2100 2114 +f 2122 2070 2062 +f 2062 2114 2122 +f 2232 2116 2124 +f 2124 2236 2232 +f 2218 2102 2116 +f 2116 2232 2218 +f 2199 2082 2102 +f 2102 2218 2199 +f 2150 2058 2082 +f 2082 2199 2150 +f 2120 2034 2058 +f 2058 2150 2120 +f 2064 2010 2034 +f 2034 2120 2064 +f 2023 1986 2010 +f 2010 2064 2023 +f 1980 1966 1986 +f 1986 2023 1980 +f 1946 1940 1966 +f 1966 1980 1946 +f 1862 1730 1940 +f 1940 1946 1862 +f 2332 2232 2236 +f 2236 2336 2332 +f 2322 2218 2232 +f 2232 2332 2322 +f 2306 2199 2218 +f 2218 2322 2306 +f 2275 2150 2199 +f 2199 2306 2275 +f 2234 2120 2150 +f 2150 2275 2234 +f 2170 2064 2120 +f 2120 2234 2170 +f 2093 2023 2064 +f 2064 2170 2093 +f 2016 1980 2023 +f 2023 2093 2016 +f 1968 1946 1980 +f 1980 2016 1968 +f 1858 1862 1946 +f 1946 1968 1858 +f 2409 2332 2336 +f 2336 2413 2409 +f 2400 2322 2332 +f 2332 2409 2400 +f 2376 2306 2322 +f 2322 2400 2376 +f 2349 2275 2306 +f 2306 2376 2349 +f 2324 2234 2275 +f 2275 2349 2324 +f 2271 2170 2234 +f 2234 2324 2271 +f 2185 2093 2170 +f 2170 2271 2185 +f 2072 2016 2093 +f 2093 2185 2072 +f 1976 1968 2016 +f 2016 2072 1976 +f 1729 1858 1968 +f 1968 1976 1729 +f 2488 2409 2413 +f 2413 2498 2488 +f 2470 2400 2409 +f 2409 2488 2470 +f 2444 2376 2400 +f 2400 2470 2444 +f 2418 2349 2376 +f 2376 2444 2418 +f 2384 2324 2349 +f 2349 2418 2384 +f 2338 2271 2324 +f 2324 2384 2338 +f 2269 2185 2271 +f 2271 2338 2269 +f 2138 2072 2185 +f 2185 2269 2138 +f 1998 1976 2072 +f 2072 2138 1998 +f 1722 1729 1976 +f 1976 1998 1722 +f 2559 2488 2498 +f 2498 2569 2559 +f 2549 2470 2488 +f 2488 2559 2549 +f 2531 2444 2470 +f 2470 2549 2531 +f 2492 2418 2444 +f 2444 2531 2492 +f 2436 2384 2418 +f 2418 2492 2436 +f 2394 2338 2384 +f 2384 2436 2394 +f 2326 2269 2338 +f 2338 2394 2326 +f 2212 2138 2269 +f 2269 2326 2212 +f 2026 1998 2138 +f 2138 2212 2026 +f 1850 1722 1998 +f 1998 2026 1850 +f 2653 2559 2569 +f 2569 2655 2653 +f 2631 2549 2559 +f 2559 2653 2631 +f 2593 2531 2549 +f 2549 2631 2593 +f 2551 2492 2531 +f 2531 2593 2551 +f 2510 2436 2492 +f 2492 2551 2510 +f 2432 2394 2436 +f 2436 2510 2432 +f 2366 2326 2394 +f 2394 2432 2366 +f 2263 2212 2326 +f 2326 2366 2263 +f 2052 2026 2212 +f 2212 2263 2052 +f 1726 1850 2026 +f 2026 2052 1726 +f 2720 2653 2655 +f 2655 2726 2720 +f 2697 2631 2653 +f 2653 2720 2697 +f 2662 2593 2631 +f 2631 2697 2662 +f 2607 2551 2593 +f 2593 2662 2607 +f 2547 2510 2551 +f 2551 2607 2547 +f 2484 2432 2510 +f 2510 2547 2484 +f 2405 2366 2432 +f 2432 2484 2405 +f 2308 2263 2366 +f 2366 2405 2308 +f 2090 2052 2263 +f 2263 2308 2090 +f 1719 1726 2052 +f 2052 2090 1719 +f 2787 2720 2726 +f 2726 2795 2787 +f 2759 2697 2720 +f 2720 2787 2759 +f 2713 2662 2697 +f 2697 2759 2713 +f 2657 2607 2662 +f 2662 2713 2657 +f 2589 2547 2607 +f 2607 2657 2589 +f 2525 2484 2547 +f 2547 2589 2525 +f 2422 2405 2484 +f 2484 2525 2422 +f 2330 2308 2405 +f 2405 2422 2330 +f 2118 2090 2308 +f 2308 2330 2118 +f 1700 1719 2090 +f 2090 2118 1700 +f 2834 2787 2795 +f 2795 2844 2834 +f 2798 2759 2787 +f 2787 2834 2798 +f 2750 2713 2759 +f 2759 2798 2750 +f 2690 2657 2713 +f 2713 2750 2690 +f 2624 2589 2657 +f 2657 2690 2624 +f 2536 2525 2589 +f 2589 2624 2536 +f 2441 2422 2525 +f 2525 2536 2441 +f 2340 2330 2422 +f 2422 2441 2340 +f 2128 2118 2330 +f 2330 2340 2128 +f 1825 1700 2118 +f 2118 2128 1825 +f 2847 2834 2844 +f 2844 2857 2847 +f 2821 2798 2834 +f 2834 2847 2821 +f 2765 2750 2798 +f 2798 2821 2765 +f 2703 2690 2750 +f 2750 2765 2703 +f 2637 2624 2690 +f 2690 2703 2637 +f 2543 2536 2624 +f 2624 2637 2543 +f 2446 2441 2536 +f 2536 2543 2446 +f 2344 2340 2441 +f 2441 2446 2344 +f 2136 2128 2340 +f 2340 2344 2136 +f 1713 1825 2128 +f 2128 2136 1713 +f 1676 1682 1864 +f 1864 1862 1676 +f 1642 1656 1682 +f 1682 1676 1642 +f 1601 1636 1656 +f 1656 1642 1601 +f 1558 1612 1636 +f 1636 1601 1558 +f 1502 1588 1612 +f 1612 1558 1502 +f 1472 1564 1588 +f 1588 1502 1472 +f 1425 1540 1564 +f 1564 1472 1425 +f 1404 1520 1540 +f 1540 1425 1404 +f 1390 1506 1520 +f 1520 1404 1390 +f 1387 1498 1506 +f 1506 1390 1387 +f 1654 1676 1862 +f 1862 1859 1654 +f 1606 1642 1676 +f 1676 1654 1606 +f 1531 1601 1642 +f 1642 1606 1531 +f 1452 1558 1601 +f 1601 1531 1452 +f 1388 1502 1558 +f 1558 1452 1388 +f 1347 1472 1502 +f 1502 1388 1347 +f 1316 1425 1472 +f 1472 1347 1316 +f 1300 1404 1425 +f 1425 1316 1300 +f 1290 1390 1404 +f 1404 1300 1290 +f 1286 1387 1390 +f 1390 1290 1286 +f 1646 1654 1859 +f 1859 1856 1646 +f 1550 1606 1654 +f 1654 1646 1550 +f 1439 1531 1606 +f 1606 1550 1439 +f 1351 1452 1531 +f 1531 1439 1351 +f 1298 1388 1452 +f 1452 1351 1298 +f 1275 1347 1388 +f 1388 1298 1275 +f 1246 1316 1347 +f 1347 1275 1246 +f 1222 1300 1316 +f 1316 1246 1222 +f 1215 1290 1300 +f 1300 1222 1215 +f 1211 1286 1290 +f 1290 1215 1211 +f 1624 1646 1856 +f 1856 1854 1624 +f 1484 1550 1646 +f 1646 1624 1484 +f 1353 1439 1550 +f 1550 1484 1353 +f 1284 1351 1439 +f 1439 1353 1284 +f 1238 1298 1351 +f 1351 1284 1238 +f 1204 1275 1298 +f 1298 1238 1204 +f 1178 1246 1275 +f 1275 1204 1178 +f 1152 1222 1246 +f 1246 1178 1152 +f 1134 1215 1222 +f 1222 1152 1134 +f 1124 1211 1215 +f 1215 1134 1124 +f 1596 1624 1854 +f 1854 1851 1596 +f 1410 1484 1624 +f 1624 1596 1410 +f 1296 1353 1484 +f 1484 1410 1296 +f 1228 1284 1353 +f 1353 1296 1228 +f 1186 1238 1284 +f 1284 1228 1186 +f 1130 1204 1238 +f 1238 1186 1130 +f 1091 1178 1204 +f 1204 1130 1091 +f 1073 1152 1178 +f 1178 1091 1073 +f 1063 1134 1152 +f 1152 1073 1063 +f 1053 1124 1134 +f 1134 1063 1053 +f 1570 1596 1851 +f 1851 1848 1570 +f 1359 1410 1596 +f 1596 1570 1359 +f 1256 1296 1410 +f 1410 1359 1256 +f 1190 1228 1296 +f 1296 1256 1190 +f 1112 1186 1228 +f 1228 1190 1112 +f 1071 1130 1186 +f 1186 1112 1071 +f 1029 1091 1130 +f 1130 1071 1029 +f 991 1073 1091 +f 1091 1029 991 +f 969 1063 1073 +f 1073 991 969 +f 967 1053 1063 +f 1063 969 967 +f 1532 1570 1848 +f 1848 1846 1532 +f 1314 1359 1570 +f 1570 1532 1314 +f 1219 1256 1359 +f 1359 1314 1219 +f 1138 1190 1256 +f 1256 1219 1138 +f 1075 1112 1190 +f 1190 1138 1075 +f 1015 1071 1112 +f 1112 1075 1015 +f 962 1029 1071 +f 1071 1015 962 +f 925 991 1029 +f 1029 962 925 +f 904 969 991 +f 991 925 904 +f 898 967 969 +f 969 904 898 +f 1504 1532 1846 +f 1846 1832 1504 +f 1292 1314 1532 +f 1532 1504 1292 +f 1200 1219 1314 +f 1314 1292 1200 +f 1097 1138 1219 +f 1219 1200 1097 +f 1033 1075 1138 +f 1138 1097 1033 +f 965 1015 1075 +f 1075 1033 965 +f 909 962 1015 +f 1015 965 909 +f 863 925 962 +f 962 909 863 +f 835 904 925 +f 925 863 835 +f 827 898 904 +f 904 835 827 +f 1494 1504 1832 +f 1832 1824 1494 +f 1282 1292 1504 +f 1504 1494 1282 +f 1183 1200 1292 +f 1292 1282 1183 +f 1088 1097 1200 +f 1200 1183 1088 +f 1000 1033 1097 +f 1097 1088 1000 +f 934 965 1033 +f 1033 1000 934 +f 874 909 965 +f 965 934 874 +f 826 863 909 +f 909 874 826 +f 790 835 863 +f 863 826 790 +f 780 827 835 +f 835 790 780 +f 1486 1494 1824 +f 1824 1814 1486 +f 1278 1282 1494 +f 1494 1486 1278 +f 1176 1183 1282 +f 1282 1278 1176 +f 1079 1088 1183 +f 1183 1176 1079 +f 985 1000 1088 +f 1088 1079 985 +f 919 934 1000 +f 1000 985 919 +f 857 874 934 +f 934 919 857 +f 801 826 874 +f 874 857 801 +f 775 790 826 +f 826 801 775 +f 765 780 790 +f 790 775 765 +f 1391 1507 1499 +f 1499 1387 1391 +f 1405 1521 1507 +f 1507 1391 1405 +f 1424 1541 1521 +f 1521 1405 1424 +f 1473 1565 1541 +f 1541 1424 1473 +f 1503 1589 1565 +f 1565 1473 1503 +f 1559 1613 1589 +f 1589 1503 1559 +f 1600 1637 1613 +f 1613 1559 1600 +f 1643 1657 1637 +f 1637 1600 1643 +f 1677 1683 1657 +f 1657 1643 1677 +f 1863 1892 1683 +f 1683 1677 1863 +f 1291 1391 1387 +f 1387 1287 1291 +f 1301 1405 1391 +f 1391 1291 1301 +f 1317 1424 1405 +f 1405 1301 1317 +f 1348 1473 1424 +f 1424 1317 1348 +f 1389 1503 1473 +f 1473 1348 1389 +f 1453 1559 1503 +f 1503 1389 1453 +f 1530 1600 1559 +f 1559 1453 1530 +f 1607 1643 1600 +f 1600 1530 1607 +f 1655 1677 1643 +f 1643 1607 1655 +f 1861 1863 1677 +f 1677 1655 1861 +f 1214 1291 1287 +f 1287 1210 1214 +f 1223 1301 1291 +f 1291 1214 1223 +f 1247 1317 1301 +f 1301 1223 1247 +f 1274 1348 1317 +f 1317 1247 1274 +f 1299 1389 1348 +f 1348 1274 1299 +f 1352 1453 1389 +f 1389 1299 1352 +f 1438 1530 1453 +f 1453 1352 1438 +f 1551 1607 1530 +f 1530 1438 1551 +f 1647 1655 1607 +f 1607 1551 1647 +f 1891 1861 1655 +f 1655 1647 1891 +f 1135 1214 1210 +f 1210 1125 1135 +f 1153 1223 1214 +f 1214 1135 1153 +f 1179 1247 1223 +f 1223 1153 1179 +f 1205 1274 1247 +f 1247 1179 1205 +f 1239 1299 1274 +f 1274 1205 1239 +f 1285 1352 1299 +f 1299 1239 1285 +f 1354 1438 1352 +f 1352 1285 1354 +f 1485 1551 1438 +f 1438 1354 1485 +f 1625 1647 1551 +f 1551 1485 1625 +f 1901 1891 1647 +f 1647 1625 1901 +f 1064 1135 1125 +f 1125 1054 1064 +f 1074 1153 1135 +f 1135 1064 1074 +f 1092 1179 1153 +f 1153 1074 1092 +f 1131 1205 1179 +f 1179 1092 1131 +f 1187 1239 1205 +f 1205 1131 1187 +f 1229 1285 1239 +f 1239 1187 1229 +f 1297 1354 1285 +f 1285 1229 1297 +f 1411 1485 1354 +f 1354 1297 1411 +f 1597 1625 1485 +f 1485 1411 1597 +f 1853 1901 1625 +f 1625 1597 1853 +f 970 1064 1054 +f 1054 968 970 +f 992 1074 1064 +f 1064 970 992 +f 1030 1092 1074 +f 1074 992 1030 +f 1072 1131 1092 +f 1092 1030 1072 +f 1113 1187 1131 +f 1131 1072 1113 +f 1191 1229 1187 +f 1187 1113 1191 +f 1257 1297 1229 +f 1229 1191 1257 +f 1360 1411 1297 +f 1297 1257 1360 +f 1571 1597 1411 +f 1411 1360 1571 +f 1899 1853 1597 +f 1597 1571 1899 +f 903 970 968 +f 968 897 903 +f 926 992 970 +f 970 903 926 +f 961 1030 992 +f 992 926 961 +f 1016 1072 1030 +f 1030 961 1016 +f 1076 1113 1072 +f 1072 1016 1076 +f 1139 1191 1113 +f 1113 1076 1139 +f 1218 1257 1191 +f 1191 1139 1218 +f 1315 1360 1257 +f 1257 1218 1315 +f 1533 1571 1360 +f 1360 1315 1533 +f 1920 1899 1571 +f 1571 1533 1920 +f 836 903 897 +f 897 828 836 +f 864 926 903 +f 903 836 864 +f 910 961 926 +f 926 864 910 +f 966 1016 961 +f 961 910 966 +f 1034 1076 1016 +f 1016 966 1034 +f 1098 1139 1076 +f 1076 1034 1098 +f 1201 1218 1139 +f 1139 1098 1201 +f 1293 1315 1218 +f 1218 1201 1293 +f 1505 1533 1315 +f 1315 1293 1505 +f 1924 1920 1533 +f 1533 1505 1924 +f 789 836 828 +f 828 779 789 +f 825 864 836 +f 836 789 825 +f 873 910 864 +f 864 825 873 +f 933 966 910 +f 910 873 933 +f 999 1034 966 +f 966 933 999 +f 1087 1098 1034 +f 1034 999 1087 +f 1182 1201 1098 +f 1098 1087 1182 +f 1283 1293 1201 +f 1201 1182 1283 +f 1495 1505 1293 +f 1293 1283 1495 +f 1826 1924 1505 +f 1505 1495 1826 +f 776 789 779 +f 779 766 776 +f 802 825 789 +f 789 776 802 +f 858 873 825 +f 825 802 858 +f 920 933 873 +f 873 858 920 +f 986 999 933 +f 933 920 986 +f 1080 1087 999 +f 999 986 1080 +f 1177 1182 1087 +f 1087 1080 1177 +f 1279 1283 1182 +f 1182 1177 1279 +f 1487 1495 1283 +f 1283 1279 1487 +f 1914 1826 1495 +f 1495 1487 1914 +f 1947 1941 1867 +f 1867 1863 1947 +f 1981 1967 1941 +f 1941 1947 1981 +f 2022 1987 1967 +f 1967 1981 2022 +f 2065 2011 1987 +f 1987 2022 2065 +f 2121 2035 2011 +f 2011 2065 2121 +f 2151 2059 2035 +f 2035 2121 2151 +f 2198 2083 2059 +f 2059 2151 2198 +f 2219 2103 2083 +f 2083 2198 2219 +f 2233 2117 2103 +f 2103 2219 2233 +f 2236 2125 2117 +f 2117 2233 2236 +f 1969 1947 1863 +f 1863 1860 1969 +f 2017 1981 1947 +f 1947 1969 2017 +f 2092 2022 1981 +f 1981 2017 2092 +f 2171 2065 2022 +f 2022 2092 2171 +f 2235 2121 2065 +f 2065 2171 2235 +f 2276 2151 2121 +f 2121 2235 2276 +f 2307 2198 2151 +f 2151 2276 2307 +f 2323 2219 2198 +f 2198 2307 2323 +f 2333 2233 2219 +f 2219 2323 2333 +f 2337 2236 2233 +f 2233 2333 2337 +f 1977 1969 1860 +f 1860 1857 1977 +f 2073 2017 1969 +f 1969 1977 2073 +f 2184 2092 2017 +f 2017 2073 2184 +f 2272 2171 2092 +f 2092 2184 2272 +f 2325 2235 2171 +f 2171 2272 2325 +f 2348 2276 2235 +f 2235 2325 2348 +f 2377 2307 2276 +f 2276 2348 2377 +f 2401 2323 2307 +f 2307 2377 2401 +f 2408 2333 2323 +f 2323 2401 2408 +f 2412 2337 2333 +f 2333 2408 2412 +f 1999 1977 1857 +f 1857 1855 1999 +f 2139 2073 1977 +f 1977 1999 2139 +f 2270 2184 2073 +f 2073 2139 2270 +f 2339 2272 2184 +f 2184 2270 2339 +f 2385 2325 2272 +f 2272 2339 2385 +f 2419 2348 2325 +f 2325 2385 2419 +f 2445 2377 2348 +f 2348 2419 2445 +f 2471 2401 2377 +f 2377 2445 2471 +f 2489 2408 2401 +f 2401 2471 2489 +f 2499 2412 2408 +f 2408 2489 2499 +f 2027 1999 1855 +f 1855 1852 2027 +f 2213 2139 1999 +f 1999 2027 2213 +f 2327 2270 2139 +f 2139 2213 2327 +f 2395 2339 2270 +f 2270 2327 2395 +f 2437 2385 2339 +f 2339 2395 2437 +f 2493 2419 2385 +f 2385 2437 2493 +f 2532 2445 2419 +f 2419 2493 2532 +f 2550 2471 2445 +f 2445 2532 2550 +f 2560 2489 2471 +f 2471 2550 2560 +f 2570 2499 2489 +f 2489 2560 2570 +f 2053 2027 1852 +f 1852 1849 2053 +f 2264 2213 2027 +f 2027 2053 2264 +f 2367 2327 2213 +f 2213 2264 2367 +f 2433 2395 2327 +f 2327 2367 2433 +f 2511 2437 2395 +f 2395 2433 2511 +f 2552 2493 2437 +f 2437 2511 2552 +f 2594 2532 2493 +f 2493 2552 2594 +f 2632 2550 2532 +f 2532 2594 2632 +f 2654 2560 2550 +f 2550 2632 2654 +f 2656 2570 2560 +f 2560 2654 2656 +f 2091 2053 1849 +f 1849 1847 2091 +f 2309 2264 2053 +f 2053 2091 2309 +f 2404 2367 2264 +f 2264 2309 2404 +f 2485 2433 2367 +f 2367 2404 2485 +f 2548 2511 2433 +f 2433 2485 2548 +f 2608 2552 2511 +f 2511 2548 2608 +f 2661 2594 2552 +f 2552 2608 2661 +f 2698 2632 2594 +f 2594 2661 2698 +f 2719 2654 2632 +f 2632 2698 2719 +f 2725 2656 2654 +f 2654 2719 2725 +f 2119 2091 1847 +f 1847 1833 2119 +f 2331 2309 2091 +f 2091 2119 2331 +f 2423 2404 2309 +f 2309 2331 2423 +f 2526 2485 2404 +f 2404 2423 2526 +f 2590 2548 2485 +f 2485 2526 2590 +f 2658 2608 2548 +f 2548 2590 2658 +f 2714 2661 2608 +f 2608 2658 2714 +f 2760 2698 2661 +f 2661 2714 2760 +f 2788 2719 2698 +f 2698 2760 2788 +f 2796 2725 2719 +f 2719 2788 2796 +f 2129 2119 1833 +f 1833 1827 2129 +f 2341 2331 2119 +f 2119 2129 2341 +f 2440 2423 2331 +f 2331 2341 2440 +f 2535 2526 2423 +f 2423 2440 2535 +f 2623 2590 2526 +f 2526 2535 2623 +f 2689 2658 2590 +f 2590 2623 2689 +f 2749 2714 2658 +f 2658 2689 2749 +f 2797 2760 2714 +f 2714 2749 2797 +f 2833 2788 2760 +f 2760 2797 2833 +f 2843 2796 2788 +f 2788 2833 2843 +f 2137 2129 1827 +f 1827 1815 2137 +f 2345 2341 2129 +f 2129 2137 2345 +f 2447 2440 2341 +f 2341 2345 2447 +f 2544 2535 2440 +f 2440 2447 2544 +f 2638 2623 2535 +f 2535 2544 2638 +f 2704 2689 2623 +f 2623 2638 2704 +f 2766 2749 2689 +f 2689 2704 2766 +f 2822 2797 2749 +f 2749 2766 2822 +f 2848 2833 2797 +f 2797 2822 2848 +f 2858 2843 2833 +f 2833 2848 2858 +f 1735 2334 2329 +f 1735 2329 2321 +f 1735 2321 2305 +f 1735 2305 2274 +f 1735 2274 2231 +f 1735 2231 2167 +f 1735 2167 2089 +f 1735 2089 2014 +f 1735 2014 1962 +f 1735 1962 1733 +f 2515 2329 2334 +f 2334 2524 2515 +f 2495 2321 2329 +f 2329 2515 2495 +f 2456 2305 2321 +f 2321 2495 2456 +f 2429 2274 2305 +f 2305 2456 2429 +f 2399 2231 2274 +f 2274 2429 2399 +f 2347 2167 2231 +f 2231 2399 2347 +f 2292 2089 2167 +f 2167 2347 2292 +f 2148 2014 2089 +f 2089 2292 2148 +f 2004 1962 2014 +f 2014 2148 2004 +f 1739 1733 1962 +f 1962 2004 1739 +f 2647 2515 2524 +f 2524 2649 2647 +f 2621 2495 2515 +f 2515 2647 2621 +f 2584 2456 2495 +f 2495 2621 2584 +f 2541 2429 2456 +f 2456 2584 2541 +f 2502 2399 2429 +f 2429 2541 2502 +f 2426 2347 2399 +f 2399 2502 2426 +f 2352 2292 2347 +f 2347 2426 2352 +f 2255 2148 2292 +f 2292 2352 2255 +f 2046 2004 2148 +f 2148 2255 2046 +f 1702 1739 2004 +f 2004 2046 1702 +f 2746 2647 2649 +f 2649 2757 2746 +f 2721 2621 2647 +f 2647 2746 2721 +f 2681 2584 2621 +f 2621 2721 2681 +f 2639 2541 2584 +f 2584 2681 2639 +f 2557 2502 2541 +f 2541 2639 2557 +f 2505 2426 2502 +f 2502 2557 2505 +f 2415 2352 2426 +f 2426 2505 2415 +f 2318 2255 2352 +f 2352 2415 2318 +f 2098 2046 2255 +f 2255 2318 2098 +f 1745 1702 2046 +f 2046 2098 1745 +f 2840 2746 2757 +f 2757 2849 2840 +f 2808 2721 2746 +f 2746 2840 2808 +f 2756 2681 2721 +f 2721 2808 2756 +f 2696 2639 2681 +f 2681 2756 2696 +f 2626 2557 2639 +f 2639 2696 2626 +f 2538 2505 2557 +f 2557 2626 2538 +f 2443 2415 2505 +f 2505 2538 2443 +f 2342 2318 2415 +f 2415 2443 2342 +f 2131 2098 2318 +f 2318 2342 2131 +f 1904 1745 2098 +f 2098 2131 1904 +f 2906 2840 2849 +f 2849 2925 2906 +f 2867 2808 2840 +f 2840 2906 2867 +f 2818 2756 2808 +f 2808 2867 2818 +f 2736 2696 2756 +f 2756 2818 2736 +f 2667 2626 2696 +f 2696 2736 2667 +f 2565 2538 2626 +f 2626 2667 2565 +f 2475 2443 2538 +f 2538 2565 2475 +f 2356 2342 2443 +f 2443 2475 2356 +f 2156 2131 2342 +f 2342 2356 2156 +f 1704 1904 2131 +f 2131 2156 1704 +f 2976 2906 2925 +f 2925 2987 2976 +f 2914 2867 2906 +f 2906 2976 2914 +f 2852 2818 2867 +f 2867 2914 2852 +f 2772 2736 2818 +f 2818 2852 2772 +f 2688 2667 2736 +f 2736 2772 2688 +f 2592 2565 2667 +f 2667 2688 2592 +f 2497 2475 2565 +f 2565 2592 2497 +f 2372 2356 2475 +f 2475 2497 2372 +f 2176 2156 2356 +f 2356 2372 2176 +f 1752 1704 2156 +f 2156 2176 1752 +f 2993 2976 2987 +f 2987 3011 2993 +f 2952 2914 2976 +f 2976 2993 2952 +f 2874 2852 2914 +f 2914 2952 2874 +f 2794 2772 2852 +f 2852 2874 2794 +f 2702 2688 2772 +f 2772 2794 2702 +f 2604 2592 2688 +f 2688 2702 2604 +f 2509 2497 2592 +f 2592 2604 2509 +f 2380 2372 2497 +f 2497 2509 2380 +f 2182 2176 2372 +f 2372 2380 2182 +f 1723 1752 2176 +f 2176 2182 1723 +f 3000 2993 3011 +f 3011 3020 3000 +f 2967 2952 2993 +f 2993 3000 2967 +f 2879 2874 2952 +f 2952 2967 2879 +f 2799 2794 2874 +f 2874 2879 2799 +f 2707 2702 2794 +f 2794 2799 2707 +f 2605 2604 2702 +f 2702 2707 2605 +f 2512 2509 2604 +f 2604 2605 2512 +f 2382 2380 2509 +f 2509 2512 2382 +f 2188 2182 2380 +f 2380 2382 2188 +f 1699 1723 2182 +f 2182 2188 1699 +f 3006 3000 3020 +f 3020 3022 3006 +f 2972 2967 3000 +f 3000 3006 2972 +f 2888 2879 2967 +f 2967 2972 2888 +f 2804 2799 2879 +f 2879 2888 2804 +f 2710 2707 2799 +f 2799 2804 2710 +f 2613 2605 2707 +f 2707 2710 2613 +f 2520 2512 2605 +f 2605 2613 2520 +f 2388 2382 2512 +f 2512 2520 2388 +f 2192 2188 2382 +f 2382 2388 2192 +f 1760 1699 2188 +f 2188 2192 1760 +f 1735 1737 1660 +f 1735 1660 1608 +f 1735 1608 1535 +f 1735 1535 1457 +f 1735 1457 1393 +f 1735 1393 1350 +f 1735 1350 1319 +f 1735 1319 1303 +f 1735 1303 1295 +f 1735 1295 1288 +f 1618 1660 1737 +f 1737 1739 1618 +f 1474 1608 1660 +f 1660 1618 1474 +f 1332 1535 1608 +f 1608 1474 1332 +f 1277 1457 1535 +f 1535 1332 1277 +f 1225 1393 1457 +f 1457 1277 1225 +f 1195 1350 1393 +f 1393 1225 1195 +f 1166 1319 1350 +f 1350 1195 1166 +f 1129 1303 1319 +f 1319 1166 1129 +f 1109 1295 1303 +f 1303 1129 1109 +f 1099 1288 1295 +f 1295 1109 1099 +f 1576 1618 1739 +f 1739 1741 1576 +f 1367 1474 1618 +f 1618 1576 1367 +f 1270 1332 1474 +f 1474 1367 1270 +f 1196 1277 1332 +f 1332 1270 1196 +f 1120 1225 1277 +f 1277 1196 1120 +f 1081 1195 1225 +f 1225 1120 1081 +f 1040 1166 1195 +f 1195 1081 1040 +f 1001 1129 1166 +f 1166 1040 1001 +f 975 1109 1129 +f 1129 1001 975 +f 973 1099 1109 +f 1109 975 973 +f 1524 1576 1741 +f 1741 1744 1524 +f 1304 1367 1576 +f 1576 1524 1304 +f 1209 1270 1367 +f 1367 1304 1209 +f 1119 1196 1270 +f 1270 1209 1119 +f 1065 1120 1196 +f 1196 1119 1065 +f 983 1081 1120 +f 1120 1065 983 +f 941 1040 1081 +f 1081 983 941 +f 901 1001 1040 +f 1040 941 901 +f 878 975 1001 +f 1001 901 878 +f 865 973 975 +f 975 878 865 +f 1493 1524 1744 +f 1744 1747 1493 +f 1280 1304 1524 +f 1524 1493 1280 +f 1181 1209 1304 +f 1304 1280 1181 +f 1086 1119 1209 +f 1209 1181 1086 +f 998 1065 1119 +f 1119 1086 998 +f 928 983 1065 +f 1065 998 928 +f 868 941 983 +f 983 928 868 +f 816 901 941 +f 941 868 816 +f 784 878 901 +f 901 816 784 +f 773 865 878 +f 878 784 773 +f 1466 1493 1747 +f 1747 1749 1466 +f 1266 1280 1493 +f 1493 1466 1266 +f 1149 1181 1280 +f 1280 1266 1149 +f 1057 1086 1181 +f 1181 1149 1057 +f 955 998 1086 +f 1086 1057 955 +f 888 928 998 +f 998 955 888 +f 806 868 928 +f 928 888 806 +f 755 816 868 +f 868 806 755 +f 718 784 816 +f 816 755 718 +f 697 773 784 +f 784 718 697 +f 1446 1466 1749 +f 1749 1753 1446 +f 1250 1266 1466 +f 1466 1446 1250 +f 1127 1149 1266 +f 1266 1250 1127 +f 1032 1057 1149 +f 1149 1127 1032 +f 936 955 1057 +f 1057 1032 936 +f 852 888 955 +f 955 936 852 +f 772 806 888 +f 888 852 772 +f 710 755 806 +f 806 772 710 +f 648 718 755 +f 755 710 648 +f 637 697 718 +f 718 648 637 +f 1440 1446 1753 +f 1753 1755 1440 +f 1242 1250 1446 +f 1446 1440 1242 +f 1115 1127 1250 +f 1250 1242 1115 +f 1020 1032 1127 +f 1127 1115 1020 +f 922 936 1032 +f 1032 1020 922 +f 830 852 936 +f 936 922 830 +f 750 772 852 +f 852 830 750 +f 672 710 772 +f 772 750 672 +f 631 648 710 +f 710 672 631 +f 613 637 648 +f 648 631 613 +f 1434 1440 1755 +f 1755 1757 1434 +f 1240 1242 1440 +f 1440 1434 1240 +f 1110 1115 1242 +f 1242 1240 1110 +f 1017 1020 1115 +f 1115 1110 1017 +f 915 922 1020 +f 1020 1017 915 +f 823 830 922 +f 922 915 823 +f 743 750 830 +f 830 823 743 +f 655 672 750 +f 750 743 655 +f 622 631 672 +f 672 655 622 +f 602 613 631 +f 631 622 602 +f 1428 1434 1757 +f 1757 1760 1428 +f 1232 1240 1434 +f 1434 1428 1232 +f 1105 1110 1240 +f 1240 1232 1105 +f 1010 1017 1110 +f 1110 1105 1010 +f 913 915 1017 +f 1017 1010 913 +f 821 823 915 +f 915 913 821 +f 736 743 823 +f 823 821 736 +f 652 655 743 +f 743 736 652 +f 619 622 655 +f 655 652 619 +f 601 602 622 +f 622 619 601 +f 1735 1289 1294 +f 1735 1294 1302 +f 1735 1302 1318 +f 1735 1318 1349 +f 1735 1349 1392 +f 1735 1392 1456 +f 1735 1456 1534 +f 1735 1534 1609 +f 1735 1609 1661 +f 1735 1661 1889 +f 1108 1294 1289 +f 1289 1099 1108 +f 1128 1302 1294 +f 1294 1108 1128 +f 1167 1318 1302 +f 1302 1128 1167 +f 1194 1349 1318 +f 1318 1167 1194 +f 1224 1392 1349 +f 1349 1194 1224 +f 1276 1456 1392 +f 1392 1224 1276 +f 1331 1534 1456 +f 1456 1276 1331 +f 1475 1609 1534 +f 1534 1331 1475 +f 1619 1661 1609 +f 1609 1475 1619 +f 1738 1889 1661 +f 1661 1619 1738 +f 976 1108 1099 +f 1099 974 976 +f 1002 1128 1108 +f 1108 976 1002 +f 1039 1167 1128 +f 1128 1002 1039 +f 1082 1194 1167 +f 1167 1039 1082 +f 1121 1224 1194 +f 1194 1082 1121 +f 1197 1276 1224 +f 1224 1121 1197 +f 1271 1331 1276 +f 1276 1197 1271 +f 1368 1475 1331 +f 1331 1271 1368 +f 1577 1619 1475 +f 1475 1368 1577 +f 1903 1738 1619 +f 1619 1577 1903 +f 877 976 974 +f 974 866 877 +f 902 1002 976 +f 976 877 902 +f 942 1039 1002 +f 1002 902 942 +f 984 1082 1039 +f 1039 942 984 +f 1066 1121 1082 +f 1082 984 1066 +f 1118 1197 1121 +f 1121 1066 1118 +f 1208 1271 1197 +f 1197 1118 1208 +f 1305 1368 1271 +f 1271 1208 1305 +f 1525 1577 1368 +f 1368 1305 1525 +f 1742 1903 1577 +f 1577 1525 1742 +f 783 877 866 +f 866 774 783 +f 815 902 877 +f 877 783 815 +f 867 942 902 +f 902 815 867 +f 927 984 942 +f 942 867 927 +f 997 1066 984 +f 984 927 997 +f 1085 1118 1066 +f 1066 997 1085 +f 1180 1208 1118 +f 1118 1085 1180 +f 1281 1305 1208 +f 1208 1180 1281 +f 1492 1525 1305 +f 1305 1281 1492 +f 1703 1742 1525 +f 1525 1492 1703 +f 717 783 774 +f 774 698 717 +f 756 815 783 +f 783 717 756 +f 805 867 815 +f 815 756 805 +f 887 927 867 +f 867 805 887 +f 956 997 927 +f 927 887 956 +f 1058 1085 997 +f 997 956 1058 +f 1148 1180 1085 +f 1085 1058 1148 +f 1267 1281 1180 +f 1180 1148 1267 +f 1467 1492 1281 +f 1281 1267 1467 +f 1905 1703 1492 +f 1492 1467 1905 +f 647 717 698 +f 698 636 647 +f 709 756 717 +f 717 647 709 +f 771 805 756 +f 756 709 771 +f 851 887 805 +f 805 771 851 +f 935 956 887 +f 887 851 935 +f 1031 1058 956 +f 956 935 1031 +f 1126 1148 1058 +f 1058 1031 1126 +f 1251 1267 1148 +f 1148 1126 1251 +f 1447 1467 1267 +f 1267 1251 1447 +f 1751 1905 1467 +f 1467 1447 1751 +f 630 647 636 +f 636 612 630 +f 671 709 647 +f 647 630 671 +f 749 771 709 +f 709 671 749 +f 829 851 771 +f 771 749 829 +f 921 935 851 +f 851 829 921 +f 1019 1031 935 +f 935 921 1019 +f 1114 1126 1031 +f 1031 1019 1114 +f 1243 1251 1126 +f 1126 1114 1243 +f 1441 1447 1251 +f 1251 1243 1441 +f 1896 1751 1447 +f 1447 1441 1896 +f 623 630 612 +f 612 603 623 +f 656 671 630 +f 630 623 656 +f 744 749 671 +f 671 656 744 +f 824 829 749 +f 749 744 824 +f 916 921 829 +f 829 824 916 +f 1018 1019 921 +f 921 916 1018 +f 1111 1114 1019 +f 1019 1018 1111 +f 1241 1243 1114 +f 1114 1111 1241 +f 1435 1441 1243 +f 1243 1241 1435 +f 1923 1896 1441 +f 1441 1435 1923 +f 617 623 603 +f 603 601 617 +f 650 656 623 +f 623 617 650 +f 734 744 656 +f 656 650 734 +f 818 824 744 +f 744 734 818 +f 912 916 824 +f 824 818 912 +f 1009 1018 916 +f 916 912 1009 +f 1102 1111 1018 +f 1018 1009 1102 +f 1235 1241 1111 +f 1111 1102 1235 +f 1431 1435 1241 +f 1241 1235 1431 +f 1759 1923 1435 +f 1435 1431 1759 +f 1735 1736 1963 +f 1735 1963 2015 +f 1735 2015 2088 +f 1735 2088 2166 +f 1735 2166 2230 +f 1735 2230 2273 +f 1735 2273 2304 +f 1735 2304 2320 +f 1735 2320 2328 +f 1735 2328 2335 +f 2005 1963 1736 +f 1736 1738 2005 +f 2149 2015 1963 +f 1963 2005 2149 +f 2291 2088 2015 +f 2015 2149 2291 +f 2346 2166 2088 +f 2088 2291 2346 +f 2398 2230 2166 +f 2166 2346 2398 +f 2428 2273 2230 +f 2230 2398 2428 +f 2457 2304 2273 +f 2273 2428 2457 +f 2494 2320 2304 +f 2304 2457 2494 +f 2514 2328 2320 +f 2320 2494 2514 +f 2524 2335 2328 +f 2328 2514 2524 +f 2047 2005 1738 +f 1738 1740 2047 +f 2256 2149 2005 +f 2005 2047 2256 +f 2353 2291 2149 +f 2149 2256 2353 +f 2427 2346 2291 +f 2291 2353 2427 +f 2503 2398 2346 +f 2346 2427 2503 +f 2542 2428 2398 +f 2398 2503 2542 +f 2583 2457 2428 +f 2428 2542 2583 +f 2622 2494 2457 +f 2457 2583 2622 +f 2648 2514 2494 +f 2494 2622 2648 +f 2650 2524 2514 +f 2514 2648 2650 +f 2099 2047 1740 +f 1740 1743 2099 +f 2319 2256 2047 +f 2047 2099 2319 +f 2414 2353 2256 +f 2256 2319 2414 +f 2504 2427 2353 +f 2353 2414 2504 +f 2558 2503 2427 +f 2427 2504 2558 +f 2640 2542 2503 +f 2503 2558 2640 +f 2682 2583 2542 +f 2542 2640 2682 +f 2722 2622 2583 +f 2583 2682 2722 +f 2745 2648 2622 +f 2622 2722 2745 +f 2758 2650 2648 +f 2648 2745 2758 +f 2130 2099 1743 +f 1743 1746 2130 +f 2343 2319 2099 +f 2099 2130 2343 +f 2442 2414 2319 +f 2319 2343 2442 +f 2537 2504 2414 +f 2414 2442 2537 +f 2625 2558 2504 +f 2504 2537 2625 +f 2695 2640 2558 +f 2558 2625 2695 +f 2755 2682 2640 +f 2640 2695 2755 +f 2807 2722 2682 +f 2682 2755 2807 +f 2839 2745 2722 +f 2722 2807 2839 +f 2850 2758 2745 +f 2745 2839 2850 +f 2157 2130 1746 +f 1746 1748 2157 +f 2357 2343 2130 +f 2130 2157 2357 +f 2474 2442 2343 +f 2343 2357 2474 +f 2566 2537 2442 +f 2442 2474 2566 +f 2668 2625 2537 +f 2537 2566 2668 +f 2735 2695 2625 +f 2625 2668 2735 +f 2817 2755 2695 +f 2695 2735 2817 +f 2868 2807 2755 +f 2755 2817 2868 +f 2905 2839 2807 +f 2807 2868 2905 +f 2926 2850 2839 +f 2839 2905 2926 +f 2177 2157 1748 +f 1748 1750 2177 +f 2373 2357 2157 +f 2157 2177 2373 +f 2496 2474 2357 +f 2357 2373 2496 +f 2591 2566 2474 +f 2474 2496 2591 +f 2687 2668 2566 +f 2566 2591 2687 +f 2771 2735 2668 +f 2668 2687 2771 +f 2851 2817 2735 +f 2735 2771 2851 +f 2913 2868 2817 +f 2817 2851 2913 +f 2975 2905 2868 +f 2868 2913 2975 +f 2986 2926 2905 +f 2905 2975 2986 +f 2183 2177 1750 +f 1750 1754 2183 +f 2381 2373 2177 +f 2177 2183 2381 +f 2508 2496 2373 +f 2373 2381 2508 +f 2603 2591 2496 +f 2496 2508 2603 +f 2701 2687 2591 +f 2591 2603 2701 +f 2793 2771 2687 +f 2687 2701 2793 +f 2873 2851 2771 +f 2771 2793 2873 +f 2951 2913 2851 +f 2851 2873 2951 +f 2992 2975 2913 +f 2913 2951 2992 +f 3010 2986 2975 +f 2975 2992 3010 +f 2189 2183 1754 +f 1754 1756 2189 +f 2383 2381 2183 +f 2183 2189 2383 +f 2513 2508 2381 +f 2381 2383 2513 +f 2606 2603 2508 +f 2508 2513 2606 +f 2708 2701 2603 +f 2603 2606 2708 +f 2800 2793 2701 +f 2701 2708 2800 +f 2880 2873 2793 +f 2793 2800 2880 +f 2968 2951 2873 +f 2873 2880 2968 +f 3001 2992 2951 +f 2951 2968 3001 +f 3021 3010 2992 +f 2992 3001 3021 +f 2195 2189 1756 +f 1756 1759 2195 +f 2390 2383 2189 +f 2189 2195 2390 +f 2517 2513 2383 +f 2383 2390 2517 +f 2612 2606 2513 +f 2513 2517 2612 +f 2709 2708 2606 +f 2606 2612 2709 +f 2801 2800 2708 +f 2708 2709 2801 +f 2886 2880 2800 +f 2800 2801 2886 +f 2970 2968 2880 +f 2880 2886 2970 +f 3004 3001 2968 +f 2968 2970 3004 +f 3022 3021 3001 +f 3001 3004 3022 diff --git a/content/handbook_2e/examples/17 Shapes/Ex_07/Ex_07.pde b/content/handbook_2e/examples/17 Shapes/Ex_07/Ex_07.pde new file mode 100644 index 000000000..54a212978 --- /dev/null +++ b/content/handbook_2e/examples/17 Shapes/Ex_07/Ex_07.pde @@ -0,0 +1,19 @@ + +PShape pot; +float angle = 0.0; + +void setup() { + size(100, 100, P3D); + pot = loadShape("teapot.obj"); +} + +void draw() { + background(0); + lights(); + translate(50, 50); + scale(12); + rotateX(angle); + shape(pot, 0, 0); + angle += 0.05; +} + diff --git a/content/handbook_2e/examples/17 Shapes/Ex_07/data/teapot.obj b/content/handbook_2e/examples/17 Shapes/Ex_07/data/teapot.obj new file mode 100644 index 000000000..f1ac38adc --- /dev/null +++ b/content/handbook_2e/examples/17 Shapes/Ex_07/data/teapot.obj @@ -0,0 +1,9965 @@ +v -3.000000 -1.8 0.000000 +v -2.991600 -1.8 -0.081000 +v -2.991600 -1.8 0.081000 +v -2.989450 -1.666162 0.000000 +v -2.985000 -1.92195 0.000000 +v -2.985000 -1.92195 0.000000 +v -2.981175 -1.667844 -0.081000 +v -2.981175 -1.667844 0.081000 +v -2.976687 -1.920243 -0.081000 +v -2.976687 -1.920243 0.081000 +v -2.968800 -1.8 -0.144000 +v -2.968800 -1.8 0.144000 +v -2.958713 -1.672406 -0.144000 +v -2.958713 -1.672406 0.144000 +v -2.957600 -1.5348 0.000000 +v -2.957600 -1.5348 0.000000 +v -2.954122 -1.915609 -0.144000 +v -2.954122 -1.915609 0.144000 +v -2.949693 -1.53779 -0.081000 +v -2.949693 -1.53779 0.081000 +v -2.940000 -2.0196 0.000000 +v -2.935200 -1.8 -0.189000 +v -2.935200 -1.8 0.189000 +v -2.931958 -2.016526 0.081000 +v -2.931958 -2.016526 -0.081000 +v -2.928230 -1.545907 -0.144000 +v -2.928230 -1.545907 0.144000 +v -2.925611 -1.679131 -0.189000 +v -2.925611 -1.679131 0.189000 +v -2.920870 -1.908779 -0.189000 +v -2.920870 -1.908779 0.189000 +v -2.910131 -2.008181 -0.144000 +v -2.910131 -2.008181 0.144000 +v -2.904150 -1.406137 0.000000 +v -2.904150 -1.406137 0.000000 +v -2.896846 -1.410135 0.081000 +v -2.896846 -1.410135 -0.081000 +v -2.896602 -1.557869 -0.189000 +v -2.896602 -1.557869 0.189000 +v -2.894400 -1.8 -0.216000 +v -2.894400 -1.8 0.216000 +v -2.885416 -1.687296 -0.216000 +v -2.885416 -1.687296 0.216000 +v -2.880491 -1.900487 -0.216000 +v -2.880491 -1.900487 0.216000 +v -2.877965 -1.995883 -0.189000 +v -2.877965 -1.995883 0.189000 +v -2.877022 -1.420985 -0.144000 +v -2.877022 -1.420985 0.144000 +v -2.865000 -2.09565 0.000000 +v -2.858195 -1.572394 0.216000 +v -2.858195 -1.572394 -0.216000 +v -2.857432 -2.091511 -0.081000 +v -2.857432 -2.091511 0.081000 +v -2.850000 -1.8 -0.225000 +v -2.850000 -1.8 0.225000 +v -2.847806 -1.436974 0.189000 +v -2.847806 -1.436974 -0.189000 +v -2.841675 -1.696181 0.225000 +v -2.841675 -1.696181 -0.225000 +v -2.838906 -1.98095 -0.216000 +v -2.838906 -1.98095 0.216000 +v -2.836889 -2.080276 -0.144000 +v -2.836889 -2.080276 0.144000 +v -2.836550 -1.891463 -0.225000 +v -2.836550 -1.891463 0.225000 +v -2.828800 -1.2804 0.000000 +v -2.822326 -1.285171 -0.081000 +v -2.822326 -1.285171 0.081000 +v -2.816400 -1.5882 -0.225000 +v -2.816400 -1.5882 0.225000 +v -2.812331 -1.45639 0.216000 +v -2.812331 -1.45639 -0.216000 +v -2.806615 -2.06372 -0.189000 +v -2.806615 -2.06372 0.189000 +v -2.805600 -1.8 -0.216000 +v -2.805600 -1.8 0.216000 +v -2.804755 -1.298122 -0.144000 +v -2.804755 -1.298122 0.144000 +v -2.797934 -1.705067 -0.216000 +v -2.797934 -1.705067 0.216000 +v -2.796400 -1.9647 0.225000 +v -2.796400 -1.9647 -0.225000 +v -2.792609 -1.882438 -0.216000 +v -2.792609 -1.882438 0.216000 +v -2.778861 -1.317206 -0.189000 +v -2.778861 -1.317206 0.189000 +v -2.774605 -1.604006 0.216000 +v -2.774605 -1.604006 -0.216000 +v -2.773725 -1.477519 0.225000 +v -2.773725 -1.477519 -0.225000 +v -2.769854 -2.043616 -0.216000 +v -2.769854 -2.043616 0.216000 +v -2.764800 -1.8 -0.189000 +v -2.764800 -1.8 0.189000 +v -2.760000 -2.1528 0.000000 +v -2.760000 -2.1528 0.000000 +v -2.757739 -1.713232 -0.189000 +v -2.757739 -1.713232 0.189000 +v -2.753894 -1.94845 -0.216000 +v -2.753894 -1.94845 0.216000 +v -2.753123 -2.147861 -0.081000 +v -2.753123 -2.147861 0.081000 +v -2.752230 -1.874146 -0.189000 +v -2.752230 -1.874146 0.189000 +v -2.747418 -1.340381 -0.216000 +v -2.747418 -1.340381 0.216000 +v -2.736198 -1.618531 -0.189000 +v -2.736198 -1.618531 0.189000 +v -2.735119 -1.498648 0.216000 +v -2.735119 -1.498648 -0.216000 +v -2.734458 -2.134454 -0.144000 +v -2.734458 -2.134454 0.144000 +v -2.731250 -1.157813 0.000000 +v -2.731250 -1.157813 0.000000 +v -2.731200 -1.8 -0.144000 +v -2.731200 -1.8 0.144000 +v -2.729850 -2.021737 -0.225000 +v -2.729850 -2.021737 0.225000 +v -2.725825 -1.163194 0.081000 +v -2.725825 -1.163194 -0.081000 +v -2.724637 -1.719956 -0.144000 +v -2.724637 -1.719956 0.144000 +v -2.718978 -1.867316 -0.144000 +v -2.718978 -1.867316 0.144000 +v -2.714835 -1.933517 -0.189000 +v -2.714835 -1.933517 0.189000 +v -2.713200 -1.3656 -0.225000 +v -2.713200 -1.3656 0.225000 +v -2.711100 -1.1778 -0.144000 +v -2.711100 -1.1778 0.144000 +v -2.708400 -1.8 -0.081000 +v -2.708400 -1.8 0.081000 +v -2.706950 -2.114698 -0.189000 +v -2.706950 -2.114698 0.189000 +v -2.704570 -1.630493 -0.144000 +v -2.704570 -1.630493 0.144000 +v -2.702175 -1.724519 -0.081000 +v -2.702175 -1.724519 0.081000 +v -2.700000 -1.8 0.000000 +v -2.699644 -1.518063 0.189000 +v -2.699644 -1.518063 -0.189000 +v -2.696413 -1.862682 -0.081000 +v -2.696413 -1.862682 0.081000 +v -2.693900 -1.7262 0.000000 +v -2.689846 -1.999859 -0.216000 +v -2.689846 -1.999859 0.216000 +v -2.689400 -1.199325 -0.189000 +v -2.689400 -1.199325 0.189000 +v -2.688100 -1.860975 0.000000 +v -2.688100 -1.860975 0.000000 +v -2.683107 -1.63861 -0.081000 +v -2.683107 -1.63861 0.081000 +v -2.682669 -1.921219 -0.144000 +v -2.682669 -1.921219 0.144000 +v -2.678982 -1.390819 -0.216000 +v -2.678982 -1.390819 0.216000 +v -2.675200 -1.6416 0.000000 +v -2.675200 -1.6416 0.000000 +v -2.673549 -2.090707 -0.216000 +v -2.673549 -2.090707 0.216000 +v -2.670428 -1.534053 -0.144000 +v -2.670428 -1.534053 0.144000 +v -2.663050 -1.225463 -0.216000 +v -2.663050 -1.225463 0.216000 +v -2.660842 -1.912874 0.081000 +v -2.660842 -1.912874 -0.081000 +v -2.653085 -1.979755 -0.189000 +v -2.653085 -1.979755 0.189000 +v -2.652800 -1.9098 0.000000 +v -2.652800 -1.9098 0.000000 +v -2.650604 -1.544903 0.081000 +v -2.650604 -1.544903 -0.081000 +v -2.647539 -1.413994 -0.189000 +v -2.647539 -1.413994 0.189000 +v -2.643300 -1.5489 0.000000 +v -2.637200 -2.0646 -0.225000 +v -2.637200 -2.0646 0.225000 +v -2.634375 -1.253906 0.225000 +v -2.634375 -1.253906 -0.225000 +v -2.625000 -2.19375 0.000000 +v -2.622811 -1.963199 -0.144000 +v -2.622811 -1.963199 0.144000 +v -2.621645 -1.433078 -0.144000 +v -2.621645 -1.433078 0.144000 +v -2.619050 -2.188238 -0.081000 +v -2.619050 -2.188238 0.081000 +v -2.611200 -1.0386 0.000000 +v -2.611200 -1.0386 0.000000 +v -2.607034 -1.044497 0.081000 +v -2.607034 -1.044497 -0.081000 +v -2.605700 -1.28235 -0.216000 +v -2.605700 -1.28235 0.216000 +v -2.604074 -1.446029 -0.081000 +v -2.604074 -1.446029 0.081000 +v -2.602900 -2.173275 -0.144000 +v -2.602900 -2.173275 0.144000 +v -2.602268 -1.951964 -0.081000 +v -2.602268 -1.951964 0.081000 +v -2.600851 -2.038493 -0.216000 +v -2.600851 -2.038493 0.216000 +v -2.597600 -1.4508 0.000000 +v -2.595725 -1.060502 -0.144000 +v -2.595725 -1.060502 0.144000 +v -2.594700 -1.947825 0.000000 +v -2.579350 -1.308488 -0.189000 +v -2.579350 -1.308488 0.189000 +v -2.579100 -2.151225 -0.189000 +v -2.579100 -2.151225 0.189000 +v -2.579059 -1.08409 -0.189000 +v -2.579059 -1.08409 0.189000 +v -2.567450 -2.014502 -0.189000 +v -2.567450 -2.014502 0.189000 +v -2.558822 -1.112731 0.216000 +v -2.558822 -1.112731 -0.216000 +v -2.557650 -1.330013 -0.144000 +v -2.557650 -1.330013 0.144000 +v -2.550200 -2.12445 -0.216000 +v -2.550200 -2.12445 0.216000 +v -2.542925 -1.344619 0.081000 +v -2.542925 -1.344619 -0.081000 +v -2.539942 -1.994746 -0.144000 +v -2.539942 -1.994746 0.144000 +v -2.537500 -1.35 0.000000 +v -2.537500 -1.35 0.000000 +v -2.536800 -1.1439 0.225000 +v -2.536800 -1.1439 -0.225000 +v -2.521277 -1.981339 -0.081000 +v -2.521277 -1.981339 0.081000 +v -2.518750 -2.095312 -0.225000 +v -2.518750 -2.095312 0.225000 +v -2.514778 -1.175069 0.216000 +v -2.514778 -1.175069 -0.216000 +v -2.514400 -1.9764 0.000000 +v -2.514400 -1.9764 0.000000 +v -2.494541 -1.20371 -0.189000 +v -2.494541 -1.20371 0.189000 +v -2.487300 -2.066175 -0.216000 +v -2.487300 -2.066175 0.216000 +v -2.477875 -1.227298 -0.144000 +v -2.477875 -1.227298 0.144000 +v -2.468350 -0.922987 0.000000 +v -2.466566 -1.243303 0.081000 +v -2.466566 -1.243303 -0.081000 +v -2.465644 -0.929375 -0.081000 +v -2.465644 -0.929375 0.081000 +v -2.462400 -1.2492 0.000000 +v -2.462400 -1.2492 0.000000 +v -2.460000 -2.2212 0.000000 +v -2.460000 -2.2212 0.000000 +v -2.458400 -2.0394 -0.189000 +v -2.458400 -2.0394 0.189000 +v -2.458298 -0.946711 -0.144000 +v -2.458298 -0.946711 0.144000 +v -2.455229 -2.215303 -0.081000 +v -2.455229 -2.215303 0.081000 +v -2.447474 -0.97226 0.189000 +v -2.447474 -0.97226 -0.189000 +v -2.442278 -2.199298 -0.144000 +v -2.442278 -2.199298 0.144000 +v -2.434600 -2.01735 -0.144000 +v -2.434600 -2.01735 0.144000 +v -2.434329 -1.003283 -0.216000 +v -2.434329 -1.003283 0.216000 +v -2.423194 -2.17571 -0.189000 +v -2.423194 -2.17571 0.189000 +v -2.420025 -1.037044 -0.225000 +v -2.420025 -1.037044 0.225000 +v -2.418450 -2.002387 -0.081000 +v -2.418450 -2.002388 0.081000 +v -2.412500 -1.996875 0.000000 +v -2.412500 -1.996875 0.000000 +v -2.405721 -1.070804 -0.216000 +v -2.405721 -1.070804 0.216000 +v -2.400019 -2.147069 -0.216000 +v -2.400019 -2.147069 0.216000 +v -2.392576 -1.101828 -0.189000 +v -2.392576 -1.101828 0.189000 +v -2.381752 -1.127376 -0.144000 +v -2.381752 -1.127376 0.144000 +v -2.374800 -2.1159 -0.225000 +v -2.374800 -2.1159 0.225000 +v -2.374406 -1.144713 0.081000 +v -2.374406 -1.144713 -0.081000 +v -2.371700 -1.1511 0.000000 +v -2.349581 -2.084731 -0.216000 +v -2.349581 -2.084731 0.216000 +v -2.326406 -2.05609 -0.189000 +v -2.326406 -2.05609 0.189000 +v -2.307322 -2.032502 -0.144000 +v -2.307322 -2.032502 0.144000 +v -2.302400 -0.8112 0.000000 +v -2.302400 -0.8112 0.000000 +v -2.301347 -0.818122 0.081000 +v -2.301347 -0.818122 -0.081000 +v -2.298490 -0.836909 0.144000 +v -2.298490 -0.836909 -0.144000 +v -2.294371 -2.016497 -0.081000 +v -2.294371 -2.016497 0.081000 +v -2.294278 -0.864595 0.189000 +v -2.294278 -0.864595 -0.189000 +v -2.289600 -2.0106 0.000000 +v -2.289600 -2.0106 0.000000 +v -2.289165 -0.898214 0.216000 +v -2.289165 -0.898214 -0.216000 +v -2.283600 -0.9348 0.225000 +v -2.283600 -0.9348 -0.225000 +v -2.278035 -0.971386 0.216000 +v -2.278035 -0.971386 -0.216000 +v -2.272922 -1.005005 0.189000 +v -2.272922 -1.005005 -0.189000 +v -2.268710 -1.032691 -0.144000 +v -2.268710 -1.032691 0.144000 +v -2.265853 -1.051478 0.081000 +v -2.265853 -1.051478 -0.081000 +v -2.265000 -2.23785 0.000000 +v -2.264800 -1.0584 0.000000 +v -2.264800 -1.0584 0.000000 +v -2.261676 -2.23172 -0.081000 +v -2.261676 -2.23172 0.081000 +v -2.252655 -2.215082 -0.144000 +v -2.252655 -2.215082 0.144000 +v -2.239361 -2.190562 -0.189000 +v -2.239361 -2.190562 0.189000 +v -2.223218 -2.160788 -0.216000 +v -2.223218 -2.160788 0.216000 +v -2.205650 -2.128387 0.225000 +v -2.205650 -2.128388 -0.225000 +v -2.188082 -2.095987 -0.216000 +v -2.188082 -2.095987 0.216000 +v -2.171939 -2.066213 -0.189000 +v -2.171939 -2.066213 0.189000 +v -2.158645 -2.041693 -0.144000 +v -2.158645 -2.041693 0.144000 +v -2.149624 -2.025055 -0.081000 +v -2.149624 -2.025055 0.081000 +v -2.146300 -2.018925 0.000000 +v -2.141100 -0.9738 0.000000 +v -2.141100 -0.9738 0.000000 +v -2.140315 -0.966231 0.081000 +v -2.140315 -0.966231 -0.081000 +v -2.138183 -0.945685 0.144000 +v -2.138183 -0.945685 -0.144000 +v -2.135041 -0.915407 0.189000 +v -2.135041 -0.915407 -0.189000 +v -2.131226 -0.878641 0.216000 +v -2.131226 -0.878641 -0.216000 +v -2.127075 -0.838631 0.225000 +v -2.127075 -0.838631 -0.225000 +v -2.122924 -0.798621 0.216000 +v -2.122924 -0.798621 -0.216000 +v -2.119109 -0.761855 0.189000 +v -2.119109 -0.761855 -0.189000 +v -2.115967 -0.731578 0.144000 +v -2.115967 -0.731578 -0.144000 +v -2.113835 -0.711032 0.081000 +v -2.113835 -0.711032 -0.081000 +v -2.113050 -0.703463 0.000000 +v -2.113050 -0.703463 0.000000 +v -2.040000 -2.2464 0.000000 +v -2.040000 -2.2464 0.000000 +v -2.038410 -2.24015 -0.081000 +v -2.038410 -2.24015 0.081000 +v -2.034093 -2.223187 -0.144000 +v -2.034093 -2.223187 0.144000 +v -2.027731 -2.198189 -0.189000 +v -2.027731 -2.198189 0.189000 +v -2.020006 -2.167834 0.216000 +v -2.020006 -2.167834 -0.216000 +v -2.011600 -2.1348 0.225000 +v -2.011600 -2.1348 -0.225000 +v -2.003194 -2.101766 0.216000 +v -2.003194 -2.101766 -0.216000 +v -2.000000 -0.9 0.000000 +v -2.000000 -0.9 0.000000 +v -2.000000 -0.9 0.000000 +v -1.997200 -0.8916 0.081000 +v -1.997200 -0.8916 -0.081000 +v -1.995469 -2.071411 -0.189000 +v -1.995469 -2.071411 0.189000 +v -1.992750 -1.037175 -0.000000 +v -1.992750 -1.037175 0.000000 +v -1.989600 -0.8688 0.144000 +v -1.989600 -0.8688 -0.144000 +v -1.989107 -2.046413 0.144000 +v -1.989107 -2.046413 -0.144000 +v -1.986000 -0.771675 0.000000 +v -1.986000 -0.771675 0.000000 +v -1.984790 -2.02945 -0.081000 +v -1.984790 -2.02945 0.081000 +v -1.983200 -2.0232 0.000000 +v -1.983200 -2.0232 0.000000 +v -1.978400 -0.8352 0.189000 +v -1.978400 -0.8352 -0.189000 +v -1.974240 -0.9 -0.328160 +v -1.974240 -0.9 -0.328160 +v -1.974240 -0.9 0.328160 +v -1.972000 -1.1784 -0.000000 +v -1.972000 -1.1784 0.000000 +v -1.967083 -1.037175 -0.326970 +v -1.967083 -1.037175 0.326970 +v -1.964800 -0.7944 0.216000 +v -1.964800 -0.7944 -0.216000 +v -1.960420 -0.771675 -0.325863 +v -1.960420 -0.771675 0.325863 +v -1.950000 -0.75 -0.225000 +v -1.950000 -0.75 0.225000 +v -1.948000 -0.6564 0.000000 +v -1.948000 -0.6564 0.000000 +v -1.946601 -1.1784 -0.323566 +v -1.946601 -1.1784 0.323566 +v -1.939250 -1.323225 0.000000 +v -1.939250 -1.323225 0.000000 +v -1.935200 -0.7056 0.216000 +v -1.935200 -0.7056 -0.216000 +v -1.922910 -0.6564 -0.319628 +v -1.922910 -0.6564 0.319628 +v -1.921600 -0.6648 0.189000 +v -1.921600 -0.6648 -0.189000 +v -1.914272 -1.323225 -0.318192 +v -1.914272 -1.323225 0.318192 +v -1.910400 -0.6312 0.144000 +v -1.910400 -0.6312 -0.144000 +v -1.902800 -0.6084 0.081000 +v -1.902800 -0.6084 -0.081000 +v -1.900000 -0.6 0.000000 +v -1.900000 -0.6 0.000000 +v -1.899520 -0.9 -0.638080 +v -1.899520 -0.9 -0.638080 +v -1.899520 -0.9 0.638080 +v -1.899520 -0.9 0.638080 +v -1.896000 -1.4712 0.000000 +v -1.896000 -1.4712 0.000000 +v -1.892634 -1.037175 -0.635767 +v -1.892634 -1.037175 0.635767 +v -1.892000 -0.553725 0.000000 +v -1.892000 -0.553725 0.000000 +v -1.886223 -0.771675 -0.633613 +v -1.886223 -0.771675 0.633613 +v -1.872927 -1.1784 -0.629147 +v -1.872927 -1.1784 0.629147 +v -1.871580 -1.4712 -0.311096 +v -1.871580 -1.4712 0.311096 +v -1.867631 -0.553725 -0.310439 +v -1.867631 -0.553725 0.310439 +v -1.850132 -0.6564 -0.621490 +v -1.850132 -0.6564 0.621490 +v -1.843750 -1.621875 0.000000 +v -1.843750 -1.621875 0.000000 +v -1.841822 -1.323225 -0.618698 +v -1.841822 -1.323225 0.618698 +v -1.824000 -0.4632 -0.000000 +v -1.824000 -0.4632 0.000000 +v -1.820003 -1.621875 -0.302522 +v -1.820003 -1.621875 0.302523 +v -1.800900 -2.024775 0.000000 +v -1.800745 -1.4712 -0.604900 +v -1.800745 -1.4712 0.604900 +v -1.800507 -0.4632 -0.299282 +v -1.800507 -0.4632 0.299282 +v -1.800455 -2.031069 -0.081000 +v -1.800455 -2.031069 0.081000 +v -1.799246 -2.048152 -0.144000 +v -1.799246 -2.048152 0.144000 +v -1.797466 -2.073326 -0.189000 +v -1.797466 -2.073326 0.189000 +v -1.796946 -0.553725 -0.603624 +v -1.796946 -0.553725 0.603624 +v -1.795303 -2.103896 -0.216000 +v -1.795303 -2.103896 0.216000 +v -1.792950 -2.137163 -0.225000 +v -1.792950 -2.137163 0.225000 +v -1.790597 -2.170429 -0.216000 +v -1.790597 -2.170429 0.216000 +v -1.788434 -2.200999 -0.189000 +v -1.788434 -2.200999 0.189000 +v -1.786654 -2.226173 -0.144000 +v -1.786654 -2.226173 0.144000 +v -1.785445 -2.243256 -0.081000 +v -1.785445 -2.243256 0.081000 +v -1.785000 -2.24955 0.000000 +v -1.784000 -1.7748 -0.000000 +v -1.784000 -1.7748 0.000000 +v -1.779680 -0.9 -0.925920 +v -1.779680 -0.9 -0.925920 +v -1.779680 -0.9 0.925920 +v -1.779680 -0.9 0.925920 +v -1.773229 -1.037175 -0.922564 +v -1.773229 -1.037175 0.922564 +v -1.767222 -0.771675 -0.919439 +v -1.767222 -0.771675 0.919439 +v -1.761022 -1.7748 -0.292719 +v -1.761022 -1.7748 0.292719 +v -1.754764 -1.1784 -0.912957 +v -1.754764 -1.1784 0.912957 +v -1.751120 -1.621875 -0.588230 +v -1.751120 -1.621875 0.588230 +v -1.750000 -0.384375 -0.000000 +v -1.750000 -0.384375 0.000000 +v -1.733408 -0.6564 -0.901846 +v -1.733408 -0.6564 0.901846 +v -1.732362 -0.4632 -0.581929 +v -1.732362 -0.4632 0.581929 +v -1.727460 -0.384375 -0.287140 +v -1.727460 -0.384375 0.287140 +v -1.725622 -1.323225 -0.897795 +v -1.725622 -1.323225 0.897795 +v -1.718250 -1.929525 -0.000000 +v -1.718250 -1.929525 0.000000 +v -1.696119 -1.929525 -0.281930 +v -1.696119 -1.929525 0.281930 +v -1.694372 -1.7748 -0.569167 +v -1.694372 -1.7748 0.569167 +v -1.687137 -1.4712 -0.877772 +v -1.687137 -1.4712 0.877772 +v -1.683577 -0.553725 -0.875920 +v -1.683577 -0.553725 0.875920 +v -1.676000 -0.3168 0.000000 +v -1.676000 -0.3168 0.000000 +v -1.662080 -0.384375 -0.558320 +v -1.662080 -0.384375 0.558320 +v -1.654413 -0.3168 -0.274998 +v -1.654413 -0.3168 0.274998 +v -1.648000 -2.0856 0.000000 +v -1.648000 -2.0856 0.000000 +v -1.640643 -1.621875 -0.853583 +v -1.640643 -1.621875 0.853583 +v -1.631925 -1.929525 -0.548190 +v -1.631925 -1.929525 0.548190 +v -1.626774 -2.0856 -0.270404 +v -1.626774 -2.0856 0.270404 +v -1.623068 -0.4632 -0.844439 +v -1.623068 -0.4632 0.844439 +v -1.618560 -0.9 -1.187840 +v -1.618560 -0.9 -1.187840 +v -1.618560 -0.9 1.187840 +v -1.618560 -0.9 1.187840 +v -1.612693 -1.037175 -1.183534 +v -1.612693 -1.037175 1.183534 +v -1.608000 -0.260025 -0.000000 +v -1.608000 -0.260025 0.000000 +v -1.607230 -0.771675 -1.179525 +v -1.607230 -0.771675 1.179525 +v -1.600000 -2.025 0.000000 +v -1.597200 -2.0313 -0.081000 +v -1.597200 -2.0313 0.081000 +v -1.595900 -1.1784 -1.171210 +v -1.595900 -1.1784 1.171210 +v -1.591798 -0.3168 -0.534711 +v -1.591798 -0.3168 0.534711 +v -1.589600 -2.0484 -0.144000 +v -1.589600 -2.0484 0.144000 +v -1.587475 -1.7748 -0.825921 +v -1.587475 -1.7748 0.825921 +v -1.587289 -0.260025 0.263841 +v -1.587289 -0.260025 -0.263841 +v -1.578400 -2.0736 -0.189000 +v -1.578400 -2.0736 0.189000 +v -1.576477 -0.6564 -1.156956 +v -1.576477 -0.6564 1.156956 +v -1.574750 -2.242575 0.000000 +v -1.574750 -2.242575 0.000000 +v -1.569396 -1.323225 -1.151759 +v -1.569396 -1.323225 1.151759 +v -1.565204 -2.0856 -0.525778 +v -1.565204 -2.0856 0.525778 +v -1.564800 -2.1042 -0.216000 +v -1.564800 -2.1042 0.216000 +v -1.557220 -0.384375 -0.810180 +v -1.557220 -0.384375 0.810180 +v -1.554467 -2.242575 -0.258385 +v -1.554467 -2.242575 0.258385 +v -1.552000 -0.2136 0.000000 +v -1.552000 -0.2136 0.000000 +v -1.550000 -2.1375 -0.225000 +v -1.550000 -2.1375 0.225000 +v -1.535200 -2.1708 -0.216000 +v -1.535200 -2.1708 0.216000 +v -1.534395 -1.4712 -1.126072 +v -1.534395 -1.4712 1.126072 +v -1.532010 -0.2136 0.254652 +v -1.532010 -0.2136 -0.254652 +v -1.531158 -0.553725 -1.123697 +v -1.531158 -0.553725 1.123697 +v -1.528968 -1.929525 -0.795481 +v -1.528968 -1.929525 0.795481 +v -1.527214 -0.260025 -0.513016 +v -1.527214 -0.260025 0.513016 +v -1.521600 -2.2014 -0.189000 +v -1.521600 -2.2014 0.189000 +v -1.514000 -0.177075 0.000000 +v -1.514000 -0.177075 0.000000 +v -1.510400 -2.2266 -0.144000 +v -1.510400 -2.2266 0.144000 +v -1.502800 -2.2437 -0.081000 +v -1.502800 -2.2437 0.081000 +v -1.500000 -2.4 0.000000 +v -1.500000 -0.15 0.000000 +v -1.500000 -2.25 0.000000 +v -1.500000 -2.4 0.000000 +v -1.500000 -0.15 0.000000 +v -1.496475 -0.127575 -0.000000 +v -1.496475 -0.127575 0.000000 +v -1.495635 -2.242575 -0.502408 +v -1.495635 -2.242575 0.502408 +v -1.494500 -0.177075 0.248417 +v -1.494500 -0.177075 -0.248417 +v -1.492110 -1.621875 -1.095040 +v -1.492110 -1.621875 1.095040 +v -1.491372 -0.3168 -0.775921 +v -1.491372 -0.3168 0.775921 +v -1.480800 -0.1056 0.000000 +v -1.480800 -0.1056 -0.000000 +v -1.480680 -2.4 -0.246120 +v -1.480680 -0.15 0.246120 +v -1.480680 -2.4 0.246120 +v -1.480680 -0.15 -0.246120 +v -1.480680 -0.15 -0.246120 +v -1.480680 -0.15 0.246120 +v -1.480325 -2.435437 0.000000 +v -1.480325 -2.435437 0.000000 +v -1.477200 -0.127575 0.245542 +v -1.477200 -0.127575 -0.245542 +v -1.476127 -0.4632 -1.083310 +v -1.476127 -0.4632 1.083310 +v -1.474028 -0.2136 0.495150 +v -1.474028 -0.2136 -0.495150 +v -1.466456 -2.0856 -0.762958 +v -1.466456 -2.0856 0.762958 +v -1.461727 -0.1056 -0.242970 +v -1.461727 -0.1056 0.242970 +v -1.461258 -2.435437 -0.242892 +v -1.461258 -2.435437 0.242892 +v -1.459600 -2.463 0.000000 +v -1.459600 -2.463 0.000000 +v -1.445325 -0.084525 0.000000 +v -1.445325 -0.084525 0.000000 +v -1.443756 -1.7748 -1.059553 +v -1.443756 -1.7748 1.059553 +v -1.440800 -2.463 -0.239491 +v -1.440800 -2.463 0.239491 +v -1.439025 -2.482687 0.000000 +v -1.437937 -0.177075 0.483027 +v -1.437937 -0.177075 -0.483027 +v -1.430863 -0.260025 0.744440 +v -1.430863 -0.260025 -0.744440 +v -1.426709 -0.084525 -0.237149 +v -1.426709 -0.084525 0.237149 +v -1.424640 -2.4 -0.478560 +v -1.424640 -0.15 -0.478560 +v -1.424640 -0.15 -0.478560 +v -1.424640 -0.15 0.478560 +v -1.424640 -0.15 0.478560 +v -1.424640 -2.4 0.478560 +v -1.421292 -0.127575 0.477435 +v -1.421292 -0.127575 -0.477435 +v -1.420490 -2.482687 -0.236115 +v -1.420490 -2.482687 0.236115 +v -1.420000 -0.9 -1.420000 +v -1.420000 -0.9 -1.420000 +v -1.420000 -0.9 1.420000 +v -1.420000 -0.9 1.420000 +v -1.419800 -2.4945 0.000000 +v -1.419800 -2.4945 0.000000 +v -1.416240 -0.384375 -1.039360 +v -1.416240 -0.384375 1.039360 +v -1.414853 -1.037175 -1.414853 +v -1.414853 -1.037175 1.414853 +v -1.410060 -0.771675 -1.410060 +v -1.410060 -0.771675 1.410060 +v -1.406405 -0.1056 -0.472434 +v -1.406405 -0.1056 0.472434 +v -1.405953 -2.435437 -0.472283 +v -1.405953 -2.435437 0.472283 +v -1.403125 -2.498438 0.000000 +v -1.403125 -2.498438 0.000000 +v -1.401513 -2.4945 -0.232961 +v -1.401513 -2.4945 0.232961 +v -1.401276 -2.242575 -0.729046 +v -1.401276 -2.242575 0.729046 +v -1.400120 -1.1784 -1.400120 +v -1.400120 -1.1784 1.400120 +v -1.400000 -2.4 0.000000 +v -1.400000 -2.4 0.000000 +v -1.390545 -1.929525 -1.020503 +v -1.390545 -1.929525 1.020503 +v -1.390200 -2.4945 0.000000 +v -1.390200 -2.4945 0.000000 +v -1.386270 -2.463 -0.465671 +v -1.386270 -2.463 0.465671 +v -1.385925 -2.435437 0.000000 +v -1.385925 -2.435437 0.000000 +v -1.385053 -2.498438 -0.230225 +v -1.385053 -2.498438 0.230225 +v -1.383080 -0.6564 -1.383080 +v -1.383080 -0.6564 1.383080 +v -1.382400 -0.0648 -0.000000 +v -1.382400 -0.0648 0.000000 +v -1.382225 -2.482687 -0.000000 +v -1.382225 -2.482687 0.000000 +v -1.381968 -2.4 -0.229712 +v -1.381968 -2.4 0.229712 +v -1.381032 -0.2136 0.718514 +v -1.381032 -0.2136 -0.718514 +v -1.380400 -2.463 0.000000 +v -1.380400 -2.463 0.000000 +v -1.376868 -1.323225 -1.376867 +v -1.376867 -1.323225 1.376868 +v -1.372712 -0.084525 -0.461116 +v -1.372712 -0.084525 0.461116 +v -1.372294 -2.4945 -0.228104 +v -1.372294 -2.4945 0.228104 +v -1.368074 -2.435437 -0.227403 +v -1.368074 -2.435437 0.227403 +v -1.366728 -2.482687 -0.459107 +v -1.366728 -2.482687 0.459107 +v -1.364595 -0.0648 -0.226824 +v -1.364595 -0.0648 0.226824 +v -1.364422 -2.482687 -0.226795 +v -1.364422 -2.482687 0.226795 +v -1.362620 -2.463 -0.226496 +v -1.362620 -2.463 0.226496 +v -1.356353 -0.3168 -0.995410 +v -1.356353 -0.3168 0.995410 +v -1.348469 -2.4945 -0.452973 +v -1.348469 -2.4945 0.452973 +v -1.347218 -0.177075 0.700921 +v -1.347218 -0.177075 -0.700921 +v -1.346160 -1.4712 -1.346160 +v -1.346160 -1.4712 1.346160 +v -1.343320 -0.553725 -1.343320 +v -1.343320 -0.553725 1.343320 +v -1.334760 -2.4 -0.694440 +v -1.334760 -0.15 -0.694440 +v -1.334760 -0.15 0.694440 +v -1.334760 -0.15 0.694440 +v -1.334760 -2.4 0.694440 +v -1.334760 -0.15 -0.694440 +v -1.333693 -2.0856 -0.978780 +v -1.333693 -2.0856 0.978780 +v -1.332632 -2.498438 -0.447653 +v -1.332632 -2.498438 0.447653 +v -1.331623 -0.127575 0.692808 +v -1.331623 -0.127575 -0.692808 +v -1.329664 -2.4 -0.446656 +v -1.329664 -2.4 0.446656 +v -1.320356 -2.4945 -0.443529 +v -1.320356 -2.4945 0.443529 +v -1.317675 -0.1056 -0.685551 +v -1.317675 -0.1056 0.685551 +v -1.317252 -2.435437 -0.685331 +v -1.317252 -2.435437 0.685331 +v -1.316296 -2.435437 -0.442166 +v -1.316296 -2.435437 0.442166 +v -1.312948 -0.0648 0.441041 +v -1.312948 -0.0648 -0.441041 +v -1.312782 -2.482687 -0.440985 +v -1.312782 -2.482687 0.440985 +v -1.311049 -2.463 -0.440403 +v -1.311049 -2.463 0.440403 +v -1.309063 -1.621875 -1.309063 +v -1.309063 -1.621875 1.309063 +v -1.301322 -0.260025 0.955023 +v -1.301322 -0.260025 -0.955023 +v -1.300000 -2.4 0.000000 +v -1.300000 -2.4 0.000000 +v -1.298810 -2.463 -0.675736 +v -1.298810 -2.463 0.675736 +v -1.295040 -0.4632 -1.295040 +v -1.295040 -0.4632 1.295040 +v -1.286108 -0.084525 -0.669128 +v -1.286108 -0.084525 0.669128 +v -1.284375 -0.046875 0.000000 +v -1.284375 -0.046875 0.000000 +v -1.283256 -2.4 -0.213304 +v -1.283256 -2.4 0.213304 +v -1.280502 -2.482687 -0.666211 +v -1.280502 -2.482687 0.666211 +v -1.274600 -2.4408 0.000000 +v -1.274600 -2.4408 0.000000 +v -1.274414 -2.242575 -0.935276 +v -1.274414 -2.242575 0.935276 +v -1.267832 -0.046875 -0.210740 +v -1.267832 -0.046875 0.210740 +v -1.266640 -1.7748 -1.266640 +v -1.266640 -1.7748 1.266640 +v -1.263395 -2.4945 -0.657311 +v -1.263395 -2.4945 0.657311 +v -1.258183 -2.4408 0.209136 +v -1.258183 -2.4408 -0.209136 +v -1.256003 -0.2136 0.921764 +v -1.256003 -0.2136 -0.921764 +v -1.248557 -2.498438 -0.649591 +v -1.248557 -2.498438 0.649591 +v -1.245776 -2.4 -0.648144 +v -1.245776 -2.4 0.648144 +v -1.242500 -0.384375 -1.242500 +v -1.242500 -0.384375 1.242500 +v -1.237056 -2.4945 -0.643607 +v -1.237056 -2.4945 0.643607 +v -1.234688 -2.4 -0.414752 +v -1.234688 -2.4 0.414752 +v -1.233252 -2.435437 -0.641628 +v -1.233252 -2.435437 0.641628 +v -1.230115 -0.0648 -0.639996 +v -1.230115 -0.0648 0.639996 +v -1.229959 -2.482687 -0.639915 +v -1.229959 -2.482687 0.639915 +v -1.228335 -2.463 -0.639070 +v -1.228335 -2.463 0.639070 +v -1.225250 -0.177075 0.899195 +v -1.225250 -0.177075 -0.899195 +v -1.219958 -1.929525 1.219958 +v -1.219958 -1.929525 -1.219958 +v -1.219848 -0.046875 -0.409767 +v -1.219848 -0.046875 0.409767 +v -1.213920 -2.4 -0.890880 +v -1.213920 -0.15 -0.890880 +v -1.213920 -0.15 -0.890880 +v -1.213920 -0.15 0.890880 +v -1.213920 -0.15 0.890880 +v -1.213920 -2.4 0.890880 +v -1.211067 -0.127575 0.888786 +v -1.211067 -0.127575 -0.888786 +v -1.210564 -2.4408 0.406648 +v -1.210564 -2.4408 -0.406648 +v -1.204800 -2.4744 0.000000 +v -1.204800 -2.4744 0.000000 +v -1.198382 -0.1056 -0.879477 +v -1.198382 -0.1056 0.879477 +v -1.197997 -2.435437 -0.879195 +v -1.197997 -2.435437 0.879195 +v -1.189960 -0.3168 -1.189960 +v -1.189960 -0.3168 1.189960 +v -1.189282 -2.4744 -0.197684 +v -1.189282 -2.4744 0.197684 +v -1.187840 -0.9 -1.618560 +v -1.187840 -0.9 -1.618560 +v -1.187840 -0.9 1.618560 +v -1.187840 -0.9 1.618560 +v -1.183534 -1.037175 -1.612693 +v -1.183534 -1.037175 1.612693 +v -1.181225 -2.463 -0.866886 +v -1.181225 -2.463 0.866886 +v -1.179525 -0.771675 -1.607230 +v -1.179525 -0.771675 1.607230 +v -1.171210 -1.1784 -1.595900 +v -1.171210 -1.1784 1.595900 +v -1.170080 -2.0856 -1.170080 +v -1.170080 -2.0856 1.170080 +v -1.169673 -0.084525 -0.858407 +v -1.169673 -0.084525 0.858407 +v -1.164574 -2.482687 -0.854666 +v -1.164574 -2.482687 0.854666 +v -1.156956 -0.6564 -1.576477 +v -1.156956 -0.6564 1.576477 +v -1.156792 -2.4 -0.601848 +v -1.156792 -2.4 0.601848 +v -1.151759 -1.323225 -1.569396 +v -1.151759 -1.323225 1.569396 +v -1.149016 -2.4945 -0.843248 +v -1.149016 -2.4945 0.843248 +v -1.144271 -2.4744 -0.384379 +v -1.144271 -2.4744 0.384379 +v -1.143600 -0.0312 0.000000 +v -1.143600 -0.0312 0.000000 +v -1.142888 -0.046875 -0.594614 +v -1.142888 -0.046875 0.594614 +v -1.141680 -0.260025 1.141680 +v -1.141680 -0.260025 -1.141680 +v -1.135521 -2.498438 -0.833344 +v -1.135521 -2.498438 0.833344 +v -1.134190 -2.4408 0.590089 +v -1.134190 -2.4408 -0.590089 +v -1.132992 -2.4 -0.831488 +v -1.132992 -2.4 0.831488 +v -1.128870 -0.0312 -0.187642 +v -1.128870 -0.0312 0.187642 +v -1.126072 -1.4712 -1.534395 +v -1.126072 -1.4712 1.534395 +v -1.125061 -2.4945 -0.825668 +v -1.125061 -2.4945 0.825668 +v -1.123697 -0.553725 -1.531158 +v -1.123697 -0.553725 1.531158 +v -1.121601 -2.435437 -0.823129 +v -1.121601 -2.435437 0.823129 +v -1.118749 -0.0648 -0.821035 +v -1.118749 -0.0648 0.821035 +v -1.118607 -2.482687 -0.820931 +v -1.118607 -2.482687 0.820931 +v -1.118073 -2.242575 -1.118073 +v -1.118073 -2.242575 1.118073 +v -1.117130 -2.463 -0.819847 +v -1.117130 -2.463 0.819847 +v -1.101920 -0.2136 1.101920 +v -1.101920 -0.2136 -1.101920 +v -1.100200 -2.5026 0.000000 +v -1.100200 -2.5026 0.000000 +v -1.095040 -1.621875 -1.492110 +v -1.095040 -1.621875 1.492110 +v -1.086146 -0.0312 0.364854 +v -1.086146 -0.0312 -0.364854 +v -1.086029 -2.5026 0.180521 +v -1.086029 -2.5026 -0.180521 +v -1.083310 -0.4632 -1.476127 +v -1.083310 -0.4632 1.476127 +v -1.074940 -0.177075 -1.074940 +v -1.074940 -0.177075 1.074940 +v -1.072079 -2.4744 -0.557774 +v -1.072079 -2.4744 0.557774 +v -1.065000 -2.4 -1.065000 +v -1.065000 -0.15 -1.065000 +v -1.065000 -0.15 1.065000 +v -1.065000 -2.4 1.065000 +v -1.062497 -0.127575 1.062497 +v -1.062497 -0.127575 -1.062497 +v -1.059553 -1.7748 -1.443756 +v -1.059553 -1.7748 1.443756 +v -1.052064 -2.4 -0.772096 +v -1.052064 -2.4 0.772096 +v -1.051368 -0.1056 -1.051368 +v -1.051368 -0.1056 1.051368 +v -1.051031 -2.435437 -1.051031 +v -1.051031 -2.435437 1.051031 +v -1.044926 -2.5026 -0.351008 +v -1.044926 -2.5026 0.351008 +v -1.039419 -0.046875 -0.762816 +v -1.039419 -0.046875 0.762816 +v -1.039360 -0.384375 -1.416240 +v -1.039360 -0.384375 1.416240 +v -1.036316 -2.463 -1.036316 +v -1.036316 -2.463 1.036316 +v -1.031508 -2.4408 0.757010 +v -1.031508 -2.4408 -0.757010 +v -1.026181 -0.084525 -1.026181 +v -1.026181 -0.084525 1.026181 +v -1.021708 -2.482687 -1.021708 +v -1.021708 -2.482687 1.021708 +v -1.020503 -1.929525 -1.390545 +v -1.020503 -1.929525 1.390545 +v -1.017621 -0.0312 0.529441 +v -1.017621 -0.0312 -0.529441 +v -1.008058 -2.4945 -1.008058 +v -1.008058 -2.4945 1.008058 +v -0.996219 -2.498438 -0.996219 +v -0.996219 -2.498438 0.996219 +v -0.995410 -0.3168 -1.356353 +v -0.995410 -0.3168 1.356353 +v -0.994000 -2.4 -0.994000 +v -0.994000 -2.4 0.994000 +v -0.987042 -2.4945 -0.987042 +v -0.987042 -2.4945 0.987042 +v -0.984007 -2.435437 -0.984007 +v -0.984007 -2.435437 0.984007 +v -0.981504 -0.0648 0.981504 +v -0.981504 -0.0648 -0.981504 +v -0.981380 -2.482687 -0.981380 +v -0.981380 -2.482687 0.981380 +v -0.980084 -2.463 -0.980084 +v -0.980084 -2.463 0.980084 +v -0.979002 -2.5026 0.509349 +v -0.979002 -2.5026 -0.509349 +v -0.978780 -2.0856 -1.333693 +v -0.978780 -2.0856 1.333693 +v -0.975021 -2.4744 -0.715555 +v -0.975021 -2.4744 0.715555 +v -0.970400 -2.5272 0.000000 +v -0.970400 -2.5272 0.000000 +v -0.957901 -2.5272 -0.159223 +v -0.957901 -2.5272 0.159223 +v -0.955023 -0.260025 1.301322 +v -0.955023 -0.260025 -1.301322 +v -0.952425 -0.018225 -0.000000 +v -0.952425 -0.018225 0.000000 +v -0.940158 -0.018225 0.156274 +v -0.940158 -0.018225 -0.156274 +v -0.935276 -2.242575 -1.274414 +v -0.935276 -2.242575 1.274414 +v -0.925920 -0.9 -1.779680 +v -0.925920 -0.9 1.779680 +v -0.925920 -0.9 1.779680 +v -0.925920 -0.9 -1.779680 +v -0.925493 -0.0312 0.679207 +v -0.925493 -0.0312 -0.679207 +v -0.923000 -2.4 -0.923000 +v -0.923000 -2.4 0.923000 +v -0.922564 -1.037175 1.773229 +v -0.922564 -1.037175 -1.773229 +v -0.921764 -0.2136 1.256003 +v -0.921764 -0.2136 -1.256003 +v -0.921647 -2.5272 -0.309596 +v -0.921647 -2.5272 0.309596 +v -0.919439 -0.771675 -1.767222 +v -0.919439 -0.771675 1.767222 +v -0.912957 -1.1784 -1.754764 +v -0.912957 -1.1784 1.754764 +v -0.911906 -0.046875 -0.911906 +v -0.911906 -0.046875 0.911906 +v -0.904966 -2.4408 0.904966 +v -0.904966 -2.4408 -0.904966 +v -0.904575 -0.018225 0.303862 +v -0.904575 -0.018225 -0.303862 +v -0.901846 -0.6564 -1.733408 +v -0.901846 -0.6564 1.733408 +v -0.899195 -0.177075 1.225250 +v -0.899195 -0.177075 -1.225250 +v -0.897795 -1.323225 -1.725622 +v -0.897795 -1.323225 1.725622 +v -0.890880 -0.15 -1.213920 +v -0.890880 -0.15 1.213920 +v -0.890880 -2.4 -1.213920 +v -0.890880 -0.15 -1.213920 +v -0.890880 -0.15 1.213920 +v -0.890880 -2.4 1.213920 +v -0.890370 -2.5026 -0.653431 +v -0.890370 -2.5026 0.653431 +v -0.888786 -0.127575 1.211067 +v -0.888786 -0.127575 -1.211067 +v -0.879477 -0.1056 -1.198382 +v -0.879477 -0.1056 1.198382 +v -0.879195 -2.435437 -1.197997 +v -0.879195 -2.435437 1.197997 +v -0.877772 -1.4712 -1.687137 +v -0.877772 -1.4712 1.687137 +v -0.875920 -0.553725 -1.683577 +v -0.875920 -0.553725 1.683577 +v -0.866886 -2.463 -1.181225 +v -0.866886 -2.463 1.181225 +v -0.863501 -2.5272 -0.449256 +v -0.863501 -2.5272 0.449256 +v -0.858407 -0.084525 -1.169673 +v -0.858407 -0.084525 1.169673 +v -0.855408 -2.4744 -0.855408 +v -0.855408 -2.4744 0.855408 +v -0.854666 -2.482687 -1.164574 +v -0.854666 -2.482687 1.164574 +v -0.853583 -1.621875 -1.640643 +v -0.853583 -1.621875 1.640643 +v -0.847506 -0.018225 -0.440935 +v -0.847506 -0.018225 0.440935 +v -0.844439 -0.4632 1.623068 +v -0.844439 -0.4632 -1.623068 +v -0.843248 -2.4945 -1.149016 +v -0.843248 -2.4945 1.149016 +v -0.833344 -2.498438 -1.135521 +v -0.833344 -2.498438 1.135521 +v -0.831488 -2.4 -1.132992 +v -0.831488 -2.4 1.132992 +v -0.825921 -1.7748 1.587475 +v -0.825921 -1.7748 -1.587475 +v -0.825668 -2.4945 -1.125061 +v -0.825668 -2.4945 1.125061 +v -0.825000 -2.55 0.000000 +v -0.825000 -2.55 0.000000 +v -0.823129 -2.435437 -1.121601 +v -0.823129 -2.435437 1.121601 +v -0.821035 -0.0648 1.118749 +v -0.821035 -0.0648 -1.118749 +v -0.820931 -2.482687 1.118607 +v -0.820931 -2.482687 -1.118607 +v -0.819847 -2.463 -1.117130 +v -0.819847 -2.463 1.117130 +v -0.814374 -2.55 -0.135366 +v -0.814374 -2.55 0.135366 +v -0.811956 -0.0312 0.811956 +v -0.811956 -0.0312 -0.811956 +v -0.810180 -0.384375 1.557220 +v -0.810180 -0.384375 -1.557220 +v -0.795481 -1.929525 1.528968 +v -0.795481 -1.929525 -1.528968 +v -0.785325 -2.5272 -0.576340 +v -0.785325 -2.5272 0.576340 +v -0.783552 -2.55 -0.263208 +v -0.783552 -2.55 0.263208 +v -0.781142 -2.5026 -0.781142 +v -0.781142 -2.5026 0.781142 +v -0.775921 -0.3168 -1.491372 +v -0.775921 -0.3168 1.491372 +v -0.772096 -2.4 -1.052064 +v -0.772096 -2.4 1.052064 +v -0.770779 -0.018225 0.565664 +v -0.770779 -0.018225 -0.565664 +v -0.762958 -2.0856 -1.466456 +v -0.762958 -2.0856 1.466456 +v -0.762816 -0.046875 -1.039419 +v -0.762816 -0.046875 1.039419 +v -0.757010 -2.4408 1.031508 +v -0.757010 -2.4408 -1.031508 +v -0.744440 -0.260025 1.430863 +v -0.744440 -0.260025 -1.430863 +v -0.734118 -2.55 -0.381942 +v -0.734118 -2.55 0.381942 +v -0.729046 -2.242575 -1.401276 +v -0.729046 -2.242575 1.401276 +v -0.718514 -0.2136 1.381032 +v -0.718514 -0.2136 -1.381032 +v -0.715555 -2.4744 -0.975021 +v -0.715555 -2.4744 0.975021 +v -0.703200 -0.0084 0.000000 +v -0.700921 -0.177075 1.347218 +v -0.700921 -0.177075 -1.347218 +v -0.694440 -0.15 -1.334760 +v -0.694440 -0.15 1.334760 +v -0.694440 -2.4 1.334760 +v -0.694440 -0.15 1.334760 +v -0.694440 -2.4 -1.334760 +v -0.694440 -0.15 -1.334760 +v -0.694143 -0.0084 -0.115381 +v -0.694143 -0.0084 0.115381 +v -0.692808 -0.127575 1.331623 +v -0.692808 -0.127575 -1.331623 +v -0.688984 -2.5272 -0.688984 +v -0.688984 -2.5272 0.688984 +v -0.685551 -0.1056 -1.317675 +v -0.685551 -0.1056 1.317675 +v -0.685331 -2.435437 -1.317252 +v -0.685331 -2.435437 1.317252 +v -0.679207 -0.0312 -0.925493 +v -0.679207 -0.0312 0.925493 +v -0.676222 -0.018225 0.676222 +v -0.676222 -0.018225 -0.676222 +v -0.675736 -2.463 -1.298810 +v -0.675736 -2.463 1.298810 +v -0.673600 -2.5728 0.000000 +v -0.673600 -2.5728 0.000000 +v -0.669128 -0.084525 -1.286108 +v -0.669128 -0.084525 1.286108 +v -0.667871 -0.0084 -0.224349 +v -0.667871 -0.0084 0.224349 +v -0.667656 -2.55 -0.489984 +v -0.667656 -2.55 0.489984 +v -0.666211 -2.482687 1.280502 +v -0.666211 -2.482687 -1.280502 +v -0.664924 -2.5728 -0.110524 +v -0.664924 -2.5728 0.110524 +v -0.657311 -2.4945 -1.263395 +v -0.657311 -2.4945 1.263395 +v -0.653431 -2.5026 -0.890370 +v -0.653431 -2.5026 0.890370 +v -0.649591 -2.498438 -1.248557 +v -0.649591 -2.498438 1.248557 +v -0.648144 -2.4 -1.245776 +v -0.648144 -2.4 1.245776 +v -0.643607 -2.4945 -1.237056 +v -0.643607 -2.4945 1.237056 +v -0.641628 -2.435437 -1.233252 +v -0.641628 -2.435437 1.233252 +v -0.639996 -0.0648 -1.230115 +v -0.639996 -0.0648 1.230115 +v -0.639915 -2.482687 1.229959 +v -0.639915 -2.482687 -1.229959 +v -0.639758 -2.5728 -0.214905 +v -0.639758 -2.5728 0.214905 +v -0.639070 -2.463 -1.228335 +v -0.639070 -2.463 1.228335 +v -0.638080 -0.9 -1.899520 +v -0.638080 -0.9 -1.899520 +v -0.638080 -0.9 1.899520 +v -0.638080 -0.9 1.899520 +v -0.635767 -1.037175 -1.892634 +v -0.635767 -1.037175 1.892634 +v -0.633613 -0.771675 -1.886223 +v -0.633613 -0.771675 1.886223 +v -0.629147 -1.1784 -1.872927 +v -0.629147 -1.1784 1.872927 +v -0.625735 -0.0084 0.325553 +v -0.625735 -0.0084 -0.325553 +v -0.621490 -0.6564 -1.850132 +v -0.621490 -0.6564 1.850132 +v -0.618698 -1.323225 -1.841822 +v -0.618698 -1.323225 1.841822 +v -0.604900 -1.4712 -1.800745 +v -0.604900 -1.4712 1.800745 +v -0.603624 -0.553725 -1.796946 +v -0.603624 -0.553725 1.796946 +v -0.601848 -2.4 -1.156792 +v -0.601848 -2.4 1.156792 +v -0.599396 -2.5728 -0.311850 +v -0.599396 -2.5728 0.311850 +v -0.594614 -0.046875 -1.142888 +v -0.594614 -0.046875 1.142888 +v -0.590089 -2.4408 1.134190 +v -0.590089 -2.4408 -1.134190 +v -0.588230 -1.621875 -1.751120 +v -0.588230 -1.621875 1.751120 +v -0.585750 -2.55 -0.585750 +v -0.585750 -2.55 0.585750 +v -0.581929 -0.4632 -1.732362 +v -0.581929 -0.4632 1.732362 +v -0.576340 -2.5272 -0.785325 +v -0.576340 -2.5272 0.785325 +v -0.569167 -1.7748 -1.694372 +v -0.569167 -1.7748 1.694372 +v -0.569086 -0.0084 -0.417645 +v -0.569086 -0.0084 0.417645 +v -0.565664 -0.018225 0.770779 +v -0.565664 -0.018225 -0.770779 +v -0.558320 -0.384375 -1.662080 +v -0.558320 -0.384375 1.662080 +v -0.557774 -2.4744 -1.072079 +v -0.557774 -2.4744 1.072079 +v -0.548190 -1.929525 -1.631925 +v -0.548190 -1.929525 1.631925 +v -0.545131 -2.5728 -0.400065 +v -0.545131 -2.5728 0.400065 +v -0.534711 -0.3168 -1.591798 +v -0.534711 -0.3168 1.591798 +v -0.529441 -0.0312 -1.017621 +v -0.529441 -0.0312 1.017621 +v -0.525800 -2.5974 0.000000 +v -0.525800 -2.5974 0.000000 +v -0.525778 -2.0856 -1.565204 +v -0.525778 -2.0856 1.565204 +v -0.519028 -2.5974 0.086273 +v -0.519028 -2.5974 -0.086273 +v -0.513016 -0.260025 -1.527214 +v -0.513016 -0.260025 1.527214 +v -0.509349 -2.5026 0.979002 +v -0.509349 -2.5026 -0.979002 +v -0.502408 -2.242575 -1.495635 +v -0.502408 -2.242575 1.495635 +v -0.499384 -2.5974 -0.167751 +v -0.499384 -2.5974 0.167751 +v -0.499272 -0.0084 -0.499272 +v -0.499272 -0.0084 0.499272 +v -0.495150 -0.2136 -1.474028 +v -0.495150 -0.2136 1.474028 +v -0.489984 -2.55 -0.667656 +v -0.489984 -2.55 0.667656 +v -0.483027 -0.177075 -1.437937 +v -0.483027 -0.177075 1.437937 +v -0.478560 -0.15 1.424640 +v -0.478560 -2.4 -1.424640 +v -0.478560 -0.15 -1.424640 +v -0.478560 -0.15 -1.424640 +v -0.478560 -0.15 1.424640 +v -0.478560 -2.4 1.424640 +v -0.478256 -2.5728 -0.478256 +v -0.478256 -2.5728 0.478256 +v -0.477435 -0.127575 1.421292 +v -0.477435 -0.127575 -1.421292 +v -0.472434 -0.1056 1.406405 +v -0.472434 -0.1056 -1.406405 +v -0.472283 -2.435437 -1.405953 +v -0.472283 -2.435437 1.405953 +v -0.467878 -2.5974 -0.243424 +v -0.467878 -2.5974 0.243424 +v -0.465671 -2.463 -1.386270 +v -0.465671 -2.463 1.386270 +v -0.461116 -0.084525 1.372712 +v -0.461116 -0.084525 -1.372712 +v -0.459107 -2.482687 -1.366728 +v -0.459107 -2.482687 1.366728 +v -0.452973 -2.4945 -1.348469 +v -0.452973 -2.4945 1.348469 +v -0.449256 -2.5272 -0.863501 +v -0.449256 -2.5272 0.863501 +v -0.447653 -2.498438 -1.332632 +v -0.447653 -2.498438 1.332632 +v -0.446656 -2.4 -1.329664 +v -0.446656 -2.4 1.329664 +v -0.443529 -2.4945 -1.320356 +v -0.443529 -2.4945 1.320356 +v -0.442166 -2.435437 -1.316296 +v -0.442166 -2.435437 1.316296 +v -0.441041 -0.0648 1.312948 +v -0.441041 -0.0648 -1.312948 +v -0.440985 -2.482687 -1.312782 +v -0.440985 -2.482687 1.312782 +v -0.440935 -0.018225 0.847506 +v -0.440935 -0.018225 -0.847506 +v -0.440403 -2.463 -1.311049 +v -0.440403 -2.463 1.311049 +v -0.425519 -2.5974 0.312283 +v -0.425519 -2.5974 -0.312283 +v -0.417645 -0.0084 -0.569086 +v -0.417645 -0.0084 0.569086 +v -0.414752 -2.4 -1.234688 +v -0.414752 -2.4 1.234688 +v -0.409767 -0.046875 1.219848 +v -0.409767 -0.046875 -1.219848 +v -0.406648 -2.4408 -1.210564 +v -0.406648 -2.4408 1.210564 +v -0.400065 -2.5728 -0.545131 +v -0.400065 -2.5728 0.545131 +v -0.391200 -2.6256 0.000000 +v -0.391200 -2.6256 0.000000 +v -0.388275 -0.002175 -0.000000 +v -0.388275 -0.002175 0.000000 +v -0.386161 -2.6256 -0.064188 +v -0.386161 -2.6256 0.064188 +v -0.384379 -2.4744 -1.144271 +v -0.384379 -2.4744 1.144271 +v -0.383274 -0.002175 -0.063708 +v -0.383274 -0.002175 0.063708 +v -0.381942 -2.55 -0.734118 +v -0.381942 -2.55 0.734118 +v -0.373318 -2.5974 -0.373318 +v -0.373318 -2.5974 0.373318 +v -0.371546 -2.6256 -0.124808 +v -0.371546 -2.6256 0.124808 +v -0.368768 -0.002175 -0.123875 +v -0.368768 -0.002175 0.123875 +v -0.364854 -0.0312 1.086146 +v -0.364854 -0.0312 -1.086146 +v -0.358400 -3.0348 0.000000 +v -0.358400 -3.0348 0.000000 +v -0.358200 -3.08115 0.000000 +v -0.358200 -3.08115 0.000000 +v -0.353807 -3.0348 -0.059016 +v -0.353807 -3.0348 0.059016 +v -0.353610 -3.08115 -0.058988 +v -0.353610 -3.08115 0.058988 +v -0.351008 -2.5026 -1.044926 +v -0.351008 -2.5026 1.044926 +v -0.348105 -2.6256 -0.181110 +v -0.348105 -2.6256 0.181110 +v -0.345503 -0.002175 -0.179756 +v -0.345503 -0.002175 0.179756 +v -0.340477 -3.0348 -0.114676 +v -0.340477 -3.0348 0.114676 +v -0.340289 -3.08115 -0.114619 +v -0.340289 -3.08115 0.114619 +v -0.328160 -0.9 -1.974240 +v -0.328160 -0.9 1.974240 +v -0.328160 -0.9 1.974240 +v -0.326970 -1.037175 -1.967083 +v -0.326970 -1.037175 1.967083 +v -0.325863 -0.771675 -1.960420 +v -0.325863 -0.771675 1.960420 +v -0.325553 -0.0084 -0.625735 +v -0.325553 -0.0084 0.625735 +v -0.325000 -2.98125 0.000000 +v -0.325000 -2.98125 0.000000 +v -0.323566 -1.1784 -1.946601 +v -0.323566 -1.1784 1.946601 +v -0.320834 -2.98125 -0.053508 +v -0.320834 -2.98125 0.053508 +v -0.319628 -0.6564 -1.922910 +v -0.319628 -0.6564 1.922910 +v -0.319082 -3.0348 -0.166306 +v -0.319082 -3.0348 0.166306 +v -0.318907 -3.08115 -0.166221 +v -0.318907 -3.08115 0.166221 +v -0.318192 -1.323225 -1.914272 +v -0.318192 -1.323225 1.914272 +v -0.316590 -2.6256 -0.232342 +v -0.316590 -2.6256 0.232342 +v -0.314223 -0.002175 -0.230604 +v -0.314223 -0.002175 0.230604 +v -0.312283 -2.5974 -0.425519 +v -0.312283 -2.5974 0.425519 +v -0.311850 -2.5728 -0.599396 +v -0.311850 -2.5728 0.599396 +v -0.311096 -1.4712 -1.871580 +v -0.311096 -1.4712 1.871580 +v -0.310439 -0.553725 -1.867631 +v -0.310439 -0.553725 1.867631 +v -0.309596 -2.5272 -0.921647 +v -0.309596 -2.5272 0.921647 +v -0.308800 -3.1176 0.000000 +v -0.308800 -3.1176 0.000000 +v -0.308744 -2.98125 -0.103976 +v -0.308744 -2.98125 0.103976 +v -0.304843 -3.1176 -0.050855 +v -0.304843 -3.1176 0.050855 +v -0.303862 -0.018225 0.904575 +v -0.303862 -0.018225 -0.904575 +v -0.302523 -1.621875 -1.820003 +v -0.302522 -1.621875 1.820003 +v -0.299282 -0.4632 -1.800507 +v -0.299282 -0.4632 1.800507 +v -0.293360 -3.1176 -0.098814 +v -0.293360 -3.1176 0.098814 +v -0.292719 -1.7748 -1.761022 +v -0.292719 -1.7748 1.761022 +v -0.290295 -3.0348 -0.213234 +v -0.290295 -3.0348 0.213234 +v -0.290138 -3.08115 -0.213123 +v -0.290138 -3.08115 0.213123 +v -0.289340 -2.98125 -0.150793 +v -0.289340 -2.98125 0.150793 +v -0.287140 -0.384375 -1.727460 +v -0.287140 -0.384375 1.727460 +v -0.281930 -1.929525 1.696119 +v -0.281930 -1.929525 -1.696119 +v -0.279400 -2.6592 0.000000 +v -0.277752 -2.6256 -0.277752 +v -0.277752 -2.6256 0.277752 +v -0.275801 -2.6592 -0.045844 +v -0.275801 -2.6592 0.045844 +v -0.275675 -0.002175 -0.275675 +v -0.275675 -0.002175 0.275675 +v -0.274998 -0.3168 -1.654413 +v -0.274998 -0.3168 1.654413 +v -0.274928 -3.1176 -0.143301 +v -0.274928 -3.1176 0.143301 +v -0.273600 -2.9232 0.000000 +v -0.273600 -2.9232 0.000000 +v -0.270404 -2.0856 -1.626774 +v -0.270404 -2.0856 1.626774 +v -0.270092 -2.9232 -0.045032 +v -0.270092 -2.9232 0.045032 +v -0.265363 -2.6592 -0.089140 +v -0.265363 -2.6592 0.089140 +v -0.263841 -0.260025 1.587289 +v -0.263841 -0.260025 -1.587289 +v -0.263232 -2.98125 -0.193348 +v -0.263232 -2.98125 0.193348 +v -0.263208 -2.55 -0.783552 +v -0.263208 -2.55 0.783552 +v -0.259910 -2.9232 -0.087511 +v -0.259910 -2.9232 0.087511 +v -0.258385 -2.242575 -1.554467 +v -0.258385 -2.242575 1.554467 +v -0.254788 -3.0348 -0.254788 +v -0.254788 -3.0348 0.254788 +v -0.254653 -3.08115 -0.254653 +v -0.254653 -3.08115 0.254653 +v -0.254652 -0.2136 -1.532010 +v -0.254652 -0.2136 1.532010 +v -0.250127 -3.1176 -0.183734 +v -0.250127 -3.1176 0.183734 +v -0.248621 -2.6592 0.129351 +v -0.248621 -2.6592 -0.129351 +v -0.248417 -0.177075 -1.494500 +v -0.248417 -0.177075 1.494500 +v -0.246120 -0.15 1.480680 +v -0.246120 -2.4 -1.480680 +v -0.246120 -0.15 -1.480680 +v -0.246120 -0.15 -1.480680 +v -0.246120 -0.15 1.480680 +v -0.246120 -2.4 1.480680 +v -0.245542 -0.127575 1.477200 +v -0.245542 -0.127575 -1.477200 +v -0.243569 -2.9232 -0.126920 +v -0.243569 -2.9232 0.126920 +v -0.243424 -2.5974 0.467878 +v -0.243424 -2.5974 -0.467878 +v -0.242970 -0.1056 1.461727 +v -0.242970 -0.1056 -1.461727 +v -0.242892 -2.435437 -1.461258 +v -0.242892 -2.435437 1.461258 +v -0.239491 -2.463 -1.440800 +v -0.239491 -2.463 1.440800 +v -0.237149 -0.084525 1.426709 +v -0.237149 -0.084525 -1.426709 +v -0.236115 -2.482687 -1.420490 +v -0.236115 -2.482687 1.420490 +v -0.232961 -2.4945 -1.401513 +v -0.232961 -2.4945 1.401513 +v -0.232342 -2.6256 -0.316590 +v -0.232342 -2.6256 0.316590 +v -0.231031 -2.98125 -0.231031 +v -0.231031 -2.98125 0.231031 +v -0.230604 -0.002175 -0.314223 +v -0.230604 -0.002175 0.314223 +v -0.230225 -2.498438 -1.385053 +v -0.230225 -2.498438 1.385053 +v -0.229712 -2.4 -1.381968 +v -0.229712 -2.4 1.381968 +v -0.228104 -2.4945 -1.372294 +v -0.228104 -2.4945 1.372294 +v -0.227403 -2.435437 -1.368074 +v -0.227403 -2.435437 1.368074 +v -0.226824 -0.0648 1.364595 +v -0.226824 -0.0648 -1.364595 +v -0.226795 -2.482687 1.364422 +v -0.226795 -2.482687 -1.364422 +v -0.226496 -2.463 -1.362620 +v -0.226496 -2.463 1.362620 +v -0.226113 -2.6592 -0.165941 +v -0.226113 -2.6592 0.165941 +v -0.224349 -0.0084 0.667871 +v -0.224349 -0.0084 -0.667871 +v -0.221585 -2.9232 -0.162745 +v -0.221585 -2.9232 0.162745 +v -0.219800 -2.86335 0.000000 +v -0.219800 -2.86335 0.000000 +v -0.219536 -3.1176 -0.219536 +v -0.219536 -3.1176 0.219536 +v -0.216979 -2.86335 0.036157 +v -0.216979 -2.86335 -0.036157 +v -0.214905 -2.5728 -0.639758 +v -0.214905 -2.5728 0.639758 +v -0.213304 -2.4 -1.283256 +v -0.213304 -2.4 1.283256 +v -0.213234 -3.0348 -0.290295 +v -0.213234 -3.0348 0.290295 +v -0.213123 -3.08115 -0.290138 +v -0.213123 -3.08115 0.290138 +v -0.210740 -0.046875 -1.267832 +v -0.210740 -0.046875 1.267832 +v -0.209136 -2.4408 -1.258183 +v -0.209136 -2.4408 1.258183 +v -0.208794 -2.86335 0.070270 +v -0.208794 -2.86335 -0.070270 +v -0.200000 -2.7 0.000000 +v -0.200000 -2.7 0.000000 +v -0.200000 -2.7 0.000000 +v -0.200000 -2.7 0.000000 +v -0.198374 -2.6592 -0.198374 +v -0.198374 -2.6592 0.198374 +v -0.197684 -2.4744 -1.189282 +v -0.197684 -2.4744 1.189282 +v -0.197424 -2.7 -0.032816 +v -0.197424 -2.7 0.032816 +v -0.197424 -2.7 0.032816 +v -0.197424 -2.7 -0.032816 +v -0.195658 -2.86335 -0.101925 +v -0.195658 -2.86335 0.101925 +v -0.194600 -3.14145 0.000000 +v -0.194600 -3.14145 0.000000 +v -0.194472 -2.9232 -0.194472 +v -0.194472 -2.9232 0.194472 +v -0.193348 -2.98125 -0.263232 +v -0.193348 -2.98125 0.263232 +v -0.192107 -3.14145 -0.032048 +v -0.192107 -3.14145 0.032048 +v -0.189952 -2.7 -0.063808 +v -0.189952 -2.7 0.063808 +v -0.189952 -2.7 0.063808 +v -0.189952 -2.7 -0.063808 +v -0.187642 -0.0312 1.128870 +v -0.187642 -0.0312 -1.128870 +v -0.184870 -3.14145 -0.062272 +v -0.184870 -3.14145 0.062272 +v -0.183734 -3.1176 -0.250127 +v -0.183734 -3.1176 0.250127 +v -0.181110 -2.6256 0.348105 +v -0.181110 -2.6256 -0.348105 +v -0.180521 -2.5026 -1.086029 +v -0.180521 -2.5026 1.086029 +v -0.179756 -0.002175 -0.345503 +v -0.179756 -0.002175 0.345503 +v -0.179200 -2.8044 0.000000 +v -0.179200 -2.8044 0.000000 +v -0.177989 -2.86335 -0.130707 +v -0.177989 -2.86335 0.130707 +v -0.177968 -2.7 -0.092592 +v -0.177968 -2.7 0.092592 +v -0.177968 -2.7 0.092592 +v -0.177968 -2.7 -0.092592 +v -0.176897 -2.8044 0.029450 +v -0.176897 -2.8044 -0.029450 +v -0.173255 -3.14145 -0.090306 +v -0.173255 -3.14145 0.090306 +v -0.170215 -2.8044 0.057246 +v -0.170215 -2.8044 -0.057246 +v -0.167751 -2.5974 -0.499384 +v -0.167751 -2.5974 0.499384 +v -0.167400 -2.74905 0.000000 +v -0.167400 -2.74905 0.000000 +v -0.166306 -3.0348 -0.319082 +v -0.166306 -3.0348 0.319082 +v -0.166221 -3.08115 0.318907 +v -0.166221 -3.08115 -0.318907 +v -0.165941 -2.6592 -0.226113 +v -0.165941 -2.6592 0.226113 +v -0.165245 -2.74905 0.027480 +v -0.165245 -2.74905 -0.027480 +v -0.162745 -2.9232 -0.221585 +v -0.162745 -2.9232 0.221585 +v -0.161856 -2.7 -0.118784 +v -0.161856 -2.7 0.118784 +v -0.161856 -2.7 0.118784 +v -0.161856 -2.7 -0.118784 +v -0.159496 -2.8044 0.083047 +v -0.159496 -2.8044 -0.083047 +v -0.159223 -2.5272 -0.957901 +v -0.159223 -2.5272 0.957901 +v -0.158995 -2.74905 0.053428 +v -0.158995 -2.74905 -0.053428 +v -0.157626 -3.14145 -0.115787 +v -0.157626 -3.14145 0.115787 +v -0.156274 -0.018225 0.940158 +v -0.156274 -0.018225 -0.940158 +v -0.156200 -2.86335 -0.156200 +v -0.156200 -2.86335 0.156200 +v -0.150793 -2.98125 -0.289340 +v -0.150793 -2.98125 0.289340 +v -0.148969 -2.74905 0.077523 +v -0.148969 -2.74905 -0.077523 +v -0.145078 -2.8044 0.106513 +v -0.145078 -2.8044 -0.106513 +v -0.143301 -3.1176 -0.274928 +v -0.143301 -3.1176 0.274928 +v -0.142000 -2.7 -0.142000 +v -0.142000 -2.7 0.142000 +v -0.142000 -2.7 0.142000 +v -0.142000 -2.7 -0.142000 +v -0.138348 -3.14145 -0.138348 +v -0.138348 -3.14145 0.138348 +v -0.135489 -2.74905 0.099446 +v -0.135489 -2.74905 -0.099446 +v -0.135366 -2.55 -0.814374 +v -0.135366 -2.55 0.814374 +v -0.130707 -2.86335 -0.177989 +v -0.130707 -2.86335 0.177989 +v -0.129351 -2.6592 0.248621 +v -0.129351 -2.6592 -0.248621 +v -0.127304 -2.8044 0.127304 +v -0.127304 -2.8044 -0.127304 +v -0.126920 -2.9232 -0.243569 +v -0.126920 -2.9232 0.243569 +v -0.124808 -2.6256 -0.371546 +v -0.124808 -2.6256 0.371546 +v -0.123875 -0.002175 0.368768 +v -0.123875 -0.002175 -0.368768 +v -0.118874 -2.74905 0.118874 +v -0.118874 -2.74905 -0.118874 +v -0.118784 -2.7 -0.161856 +v -0.118784 -2.7 0.161856 +v -0.118784 -2.7 0.161856 +v -0.118784 -2.7 -0.161856 +v -0.115787 -3.14145 -0.157626 +v -0.115787 -3.14145 0.157626 +v -0.115381 -0.0084 0.694143 +v -0.115381 -0.0084 -0.694143 +v -0.114676 -3.0348 -0.340477 +v -0.114676 -3.0348 0.340477 +v -0.114619 -3.08115 -0.340289 +v -0.114619 -3.08115 0.340289 +v -0.110524 -2.5728 -0.664924 +v -0.110524 -2.5728 0.664924 +v -0.106513 -2.8044 -0.145078 +v -0.106513 -2.8044 0.145078 +v -0.103976 -2.98125 -0.308744 +v -0.103976 -2.98125 0.308744 +v -0.101925 -2.86335 -0.195658 +v -0.101925 -2.86335 0.195658 +v -0.099446 -2.74905 0.135489 +v -0.099446 -2.74905 -0.135489 +v -0.098814 -3.1176 -0.293360 +v -0.098814 -3.1176 0.293360 +v -0.092592 -2.7 -0.177968 +v -0.092592 -2.7 0.177968 +v -0.092592 -2.7 -0.177968 +v -0.092592 -2.7 0.177968 +v -0.090306 -3.14145 -0.173255 +v -0.090306 -3.14145 0.173255 +v -0.089140 -2.6592 -0.265363 +v -0.089140 -2.6592 0.265363 +v -0.087511 -2.9232 -0.259910 +v -0.087511 -2.9232 0.259910 +v -0.086273 -2.5974 -0.519028 +v -0.086273 -2.5974 0.519028 +v -0.083047 -2.8044 -0.159496 +v -0.083047 -2.8044 0.159496 +v -0.077523 -2.74905 -0.148969 +v -0.077523 -2.74905 0.148969 +v -0.070270 -2.86335 -0.208794 +v -0.070270 -2.86335 0.208794 +v -0.064188 -2.6256 -0.386161 +v -0.064188 -2.6256 0.386161 +v -0.063808 -2.7 -0.189952 +v -0.063808 -2.7 0.189952 +v -0.063808 -2.7 -0.189952 +v -0.063808 -2.7 0.189952 +v -0.063708 -0.002175 0.383274 +v -0.063708 -0.002175 -0.383274 +v -0.062272 -3.14145 -0.184870 +v -0.062272 -3.14145 0.184870 +v -0.059016 -3.0348 -0.353807 +v -0.059016 -3.0348 0.353807 +v -0.058988 -3.08115 -0.353610 +v -0.058988 -3.08115 0.353610 +v -0.057246 -2.8044 -0.170215 +v -0.057246 -2.8044 0.170215 +v -0.053508 -2.98125 -0.320834 +v -0.053508 -2.98125 0.320834 +v -0.053428 -2.74905 -0.158995 +v -0.053428 -2.74905 0.158995 +v -0.050855 -3.1176 -0.304843 +v -0.050855 -3.1176 0.304843 +v -0.045844 -2.6592 -0.275801 +v -0.045844 -2.6592 0.275801 +v -0.045032 -2.9232 -0.270092 +v -0.045032 -2.9232 0.270092 +v -0.036157 -2.86335 -0.216979 +v -0.036157 -2.86335 0.216979 +v -0.032816 -2.7 -0.197424 +v -0.032816 -2.7 0.197424 +v -0.032816 -2.7 -0.197424 +v -0.032816 -2.7 0.197424 +v -0.032048 -3.14145 -0.192107 +v -0.032048 -3.14145 0.192107 +v -0.029450 -2.8044 -0.176897 +v -0.029450 -2.8044 0.176897 +v -0.027480 -2.74905 -0.165245 +v -0.027480 -2.74905 0.165245 +v -0.000000 -0.260025 1.608000 +v -0.000000 -1.929525 1.718250 +v -0.000000 -2.0856 -1.648000 +v -0.000000 -0.6564 -1.948000 +v -0.000000 -0.771675 -1.986000 +v -0.000000 -2.482687 1.382225 +v -0.000000 -2.7 -0.200000 +v -0.000000 -0.127575 1.496475 +v -0.000000 -2.4744 -1.204800 +v -0.000000 -2.74905 -0.167400 +v -0.000000 -0.018225 0.952425 +v -0.000000 -0.046875 -1.284375 +v -0.000000 -0.0648 1.382400 +v -0.000000 -0.384375 1.750000 +v -0.000000 -0.4632 1.824000 +v -0.000000 -0.553725 -1.892000 +v -0.000000 -1.037175 1.992750 +v -0.000000 -1.1784 1.972000 +v -0.000000 -1.323225 -1.939250 +v -0.000000 -1.621875 -1.843750 +v -0.000000 -1.7748 1.784000 +v -0.000000 -2.4 -1.300000 +v -0.000000 -2.435437 -1.480325 +v -0.000000 -2.435437 -1.385925 +v -0.000000 -2.463 -1.459600 +v -0.000000 -2.463 -1.380400 +v -0.000000 -2.4945 -1.390200 +v -0.000000 -2.5026 -1.100200 +v -0.000000 -2.8044 -0.179200 +v -0.000000 -2.86335 -0.219800 +v -0.000000 -2.5728 -0.673600 +v -0.000000 -0.1056 1.480800 +v -0.000000 -0.177075 -1.514000 +v -0.000000 -2.4945 -1.419800 +v -0.000000 -2.5272 -0.970400 +v -0.000000 -2.9232 -0.273600 +v -0.000000 -3.1176 -0.308800 +v -0.000000 -2.5974 -0.525800 +v -0.000000 -2.7 -0.200000 +v -0.000000 -2.98125 -0.325000 +v -0.000000 -3.14145 -0.194600 +v -0.000000 -0.002175 0.388275 +v -0.000000 -3.08115 -0.358200 +v 0.000000 -0.0 0.000000 +v 0.000000 -0.002175 -0.388275 +v 0.000000 -0.002175 0.388275 +v 0.000000 -0.0084 -0.703200 +v 0.000000 -0.0084 0.703200 +v 0.000000 -0.018225 -0.952425 +v 0.000000 -0.018225 0.952425 +v 0.000000 -0.0312 -1.143600 +v 0.000000 -0.0312 -1.143600 +v 0.000000 -0.0312 1.143600 +v 0.000000 -0.0312 1.143600 +v 0.000000 -0.046875 -1.284375 +v 0.000000 -0.046875 1.284375 +v 0.000000 -0.0648 -1.382400 +v 0.000000 -0.0648 1.382400 +v 0.000000 -0.084525 -1.445325 +v 0.000000 -0.084525 -1.445325 +v 0.000000 -0.084525 1.445325 +v 0.000000 -0.084525 1.445325 +v 0.000000 -0.1056 -1.480800 +v 0.000000 -0.1056 1.480800 +v 0.000000 -0.127575 -1.496475 +v 0.000000 -0.127575 1.496475 +v 0.000000 -0.15 -1.500000 +v 0.000000 -0.15 -1.500000 +v 0.000000 -0.15 1.500000 +v 0.000000 -0.15 1.500000 +v 0.000000 -0.177075 -1.514000 +v 0.000000 -0.177075 1.514000 +v 0.000000 -0.2136 -1.552000 +v 0.000000 -0.2136 -1.552000 +v 0.000000 -0.2136 1.552000 +v 0.000000 -0.2136 1.552000 +v 0.000000 -0.260025 -1.608000 +v 0.000000 -0.260025 1.608000 +v 0.000000 -0.3168 -1.676000 +v 0.000000 -0.3168 -1.676000 +v 0.000000 -0.3168 1.676000 +v 0.000000 -0.3168 1.676000 +v 0.000000 -0.384375 -1.750000 +v 0.000000 -0.384375 1.750000 +v 0.000000 -0.4632 -1.824000 +v 0.000000 -0.4632 1.824000 +v 0.000000 -0.553725 -1.892000 +v 0.000000 -0.553725 1.892000 +v 0.000000 -0.6564 -1.948000 +v 0.000000 -0.6564 1.948000 +v 0.000000 -0.771675 -1.986000 +v 0.000000 -0.771675 1.986000 +v 0.000000 -0.9 -2.000000 +v 0.000000 -0.9 -2.000000 +v 0.000000 -0.9 2.000000 +v 0.000000 -0.9 2.000000 +v 0.000000 -1.037175 -1.992750 +v 0.000000 -1.037175 1.992750 +v 0.000000 -1.1784 -1.972000 +v 0.000000 -1.1784 1.972000 +v 0.000000 -1.323225 -1.939250 +v 0.000000 -1.323225 1.939250 +v 0.000000 -1.4712 -1.896000 +v 0.000000 -1.4712 -1.896000 +v 0.000000 -1.4712 1.896000 +v 0.000000 -1.4712 1.896000 +v 0.000000 -1.621875 -1.843750 +v 0.000000 -1.621875 1.843750 +v 0.000000 -1.7748 -1.784000 +v 0.000000 -1.7748 1.784000 +v 0.000000 -1.929525 -1.718250 +v 0.000000 -1.929525 1.718250 +v 0.000000 -2.0856 -1.648000 +v 0.000000 -2.0856 1.648000 +v 0.000000 -2.242575 -1.574750 +v 0.000000 -2.242575 -1.574750 +v 0.000000 -2.242575 1.574750 +v 0.000000 -2.242575 1.574750 +v 0.000000 -2.4 -1.500000 +v 0.000000 -2.4 -1.500000 +v 0.000000 -2.4 -1.400000 +v 0.000000 -2.4 -1.400000 +v 0.000000 -2.4 -1.300000 +v 0.000000 -2.4 1.300000 +v 0.000000 -2.4 1.400000 +v 0.000000 -2.4 1.400000 +v 0.000000 -2.4 1.500000 +v 0.000000 -2.4 1.500000 +v 0.000000 -2.435437 -1.480325 +v 0.000000 -2.435437 -1.385925 +v 0.000000 -2.435437 1.385925 +v 0.000000 -2.435437 1.480325 +v 0.000000 -2.4408 -1.274600 +v 0.000000 -2.4408 -1.274600 +v 0.000000 -2.4408 1.274600 +v 0.000000 -2.4408 1.274600 +v 0.000000 -2.463 -1.459600 +v 0.000000 -2.463 -1.380400 +v 0.000000 -2.463 1.380400 +v 0.000000 -2.463 1.459600 +v 0.000000 -2.4744 -1.204800 +v 0.000000 -2.4744 1.204800 +v 0.000000 -2.482687 -1.439025 +v 0.000000 -2.482687 -1.382225 +v 0.000000 -2.482687 1.382225 +v 0.000000 -2.482687 1.439025 +v 0.000000 -2.4945 -1.419800 +v 0.000000 -2.4945 -1.390200 +v 0.000000 -2.4945 1.390200 +v 0.000000 -2.4945 1.419800 +v 0.000000 -2.498438 -1.403125 +v 0.000000 -2.498438 -1.403125 +v 0.000000 -2.498438 1.403125 +v 0.000000 -2.498438 1.403125 +v 0.000000 -2.5026 -1.100200 +v 0.000000 -2.5026 1.100200 +v 0.000000 -2.5272 -0.970400 +v 0.000000 -2.5272 0.970400 +v 0.000000 -2.55 -0.825000 +v 0.000000 -2.55 -0.825000 +v 0.000000 -2.55 0.825000 +v 0.000000 -2.55 0.825000 +v 0.000000 -2.5728 -0.673600 +v 0.000000 -2.5728 0.673600 +v 0.000000 -2.5974 -0.525800 +v 0.000000 -2.5974 0.525800 +v 0.000000 -2.6256 -0.391200 +v 0.000000 -2.6256 -0.391200 +v 0.000000 -2.6256 0.391200 +v 0.000000 -2.6256 0.391200 +v 0.000000 -2.6592 -0.279400 +v 0.000000 -2.6592 0.279400 +v 0.000000 -2.7 -0.200000 +v 0.000000 -2.7 -0.200000 +v 0.000000 -2.7 0.200000 +v 0.000000 -2.7 0.200000 +v 0.000000 -2.74905 -0.167400 +v 0.000000 -2.74905 0.167400 +v 0.000000 -2.8044 -0.179200 +v 0.000000 -2.8044 0.179200 +v 0.000000 -2.86335 -0.219800 +v 0.000000 -2.86335 0.219800 +v 0.000000 -2.9232 -0.273600 +v 0.000000 -2.9232 0.273600 +v 0.000000 -2.98125 -0.325000 +v 0.000000 -2.98125 0.325000 +v 0.000000 -3.0348 -0.358400 +v 0.000000 -3.0348 -0.358400 +v 0.000000 -3.0348 0.358400 +v 0.000000 -3.0348 0.358400 +v 0.000000 -3.08115 -0.358200 +v 0.000000 -3.08115 0.358200 +v 0.000000 -3.1176 -0.308800 +v 0.000000 -3.1176 0.308800 +v 0.000000 -3.14145 -0.194600 +v 0.000000 -3.14145 0.194600 +v 0.000000 -3.15 0.000000 +v 0.000000 -0.002175 -0.388275 +v 0.000000 -3.08115 0.358200 +v 0.000000 -2.5974 0.525800 +v 0.000000 -2.7 0.200000 +v 0.000000 -2.98125 0.325000 +v 0.000000 -3.14145 0.194600 +v 0.000000 -3.1176 0.308800 +v 0.000000 -0.1056 -1.480800 +v 0.000000 -0.177075 1.514000 +v 0.000000 -2.4945 1.419800 +v 0.000000 -2.5272 0.970400 +v 0.000000 -2.9232 0.273600 +v 0.000000 -2.5728 0.673600 +v 0.000000 -2.86335 0.219800 +v 0.000000 -0.018225 -0.952425 +v 0.000000 -0.046875 1.284375 +v 0.000000 -0.0648 -1.382400 +v 0.000000 -0.384375 -1.750000 +v 0.000000 -0.4632 -1.824000 +v 0.000000 -0.553725 1.892000 +v 0.000000 -1.037175 -1.992750 +v 0.000000 -1.1784 -1.972000 +v 0.000000 -1.323225 1.939250 +v 0.000000 -1.621875 1.843750 +v 0.000000 -1.7748 -1.784000 +v 0.000000 -2.4 1.300000 +v 0.000000 -2.435437 1.385925 +v 0.000000 -2.435437 1.480325 +v 0.000000 -2.463 1.380400 +v 0.000000 -2.463 1.459600 +v 0.000000 -2.4945 1.390200 +v 0.000000 -2.5026 1.100200 +v 0.000000 -2.8044 0.179200 +v 0.000000 -2.74905 0.167400 +v 0.000000 -0.127575 -1.496475 +v 0.000000 -2.4744 1.204800 +v 0.000000 -0.6564 1.948000 +v 0.000000 -0.771675 1.986000 +v 0.000000 -2.482687 -1.382225 +v 0.000000 -2.7 0.200000 +v 0.000000 -0.260025 -1.608000 +v 0.000000 -1.929525 -1.718250 +v 0.000000 -2.0856 1.648000 +v 0.027480 -2.74905 -0.165245 +v 0.027480 -2.74905 0.165245 +v 0.029450 -2.8044 -0.176897 +v 0.029450 -2.8044 0.176897 +v 0.032048 -3.14145 -0.192107 +v 0.032048 -3.14145 0.192107 +v 0.032816 -2.7 -0.197424 +v 0.032816 -2.7 0.197424 +v 0.032816 -2.7 -0.197424 +v 0.032816 -2.7 0.197424 +v 0.036157 -2.86335 -0.216979 +v 0.036157 -2.86335 0.216979 +v 0.045032 -2.9232 -0.270092 +v 0.045032 -2.9232 0.270092 +v 0.045844 -2.6592 -0.275801 +v 0.045844 -2.6592 0.275801 +v 0.050855 -3.1176 -0.304843 +v 0.050855 -3.1176 0.304843 +v 0.053428 -2.74905 -0.158995 +v 0.053428 -2.74905 0.158995 +v 0.053508 -2.98125 -0.320834 +v 0.053508 -2.98125 0.320834 +v 0.057246 -2.8044 -0.170215 +v 0.057246 -2.8044 0.170215 +v 0.058988 -3.08115 -0.353610 +v 0.058988 -3.08115 0.353610 +v 0.059016 -3.0348 -0.353807 +v 0.059016 -3.0348 0.353807 +v 0.062272 -3.14145 -0.184870 +v 0.062272 -3.14145 0.184870 +v 0.063708 -0.002175 0.383274 +v 0.063708 -0.002175 -0.383274 +v 0.063808 -2.7 -0.189952 +v 0.063808 -2.7 0.189952 +v 0.063808 -2.7 -0.189952 +v 0.063808 -2.7 0.189952 +v 0.064188 -2.6256 -0.386161 +v 0.064188 -2.6256 0.386161 +v 0.070270 -2.86335 -0.208794 +v 0.070270 -2.86335 0.208794 +v 0.077523 -2.74905 -0.148969 +v 0.077523 -2.74905 0.148969 +v 0.083047 -2.8044 -0.159496 +v 0.083047 -2.8044 0.159496 +v 0.086273 -2.5974 -0.519028 +v 0.086273 -2.5974 0.519028 +v 0.087511 -2.9232 -0.259910 +v 0.087511 -2.9232 0.259910 +v 0.089140 -2.6592 -0.265363 +v 0.089140 -2.6592 0.265363 +v 0.090306 -3.14145 -0.173255 +v 0.090306 -3.14145 0.173255 +v 0.092592 -2.7 -0.177968 +v 0.092592 -2.7 0.177968 +v 0.092592 -2.7 -0.177968 +v 0.092592 -2.7 0.177968 +v 0.098814 -3.1176 -0.293360 +v 0.098814 -3.1176 0.293360 +v 0.099446 -2.74905 0.135489 +v 0.099446 -2.74905 -0.135489 +v 0.101925 -2.86335 -0.195658 +v 0.101925 -2.86335 0.195658 +v 0.103976 -2.98125 -0.308744 +v 0.103976 -2.98125 0.308744 +v 0.106513 -2.8044 -0.145078 +v 0.106513 -2.8044 0.145078 +v 0.110524 -2.5728 -0.664924 +v 0.110524 -2.5728 0.664924 +v 0.114619 -3.08115 -0.340289 +v 0.114619 -3.08115 0.340289 +v 0.114676 -3.0348 -0.340477 +v 0.114676 -3.0348 0.340477 +v 0.115381 -0.0084 0.694143 +v 0.115381 -0.0084 -0.694143 +v 0.115787 -3.14145 -0.157626 +v 0.115787 -3.14145 0.157626 +v 0.118784 -2.7 0.161856 +v 0.118784 -2.7 -0.161856 +v 0.118784 -2.7 -0.161856 +v 0.118784 -2.7 0.161856 +v 0.118874 -2.74905 0.118874 +v 0.118874 -2.74905 -0.118874 +v 0.123875 -0.002175 0.368768 +v 0.123875 -0.002175 -0.368768 +v 0.124808 -2.6256 -0.371546 +v 0.124808 -2.6256 0.371546 +v 0.126920 -2.9232 -0.243569 +v 0.126920 -2.9232 0.243569 +v 0.127304 -2.8044 0.127304 +v 0.127304 -2.8044 -0.127304 +v 0.129351 -2.6592 0.248621 +v 0.129351 -2.6592 -0.248621 +v 0.130707 -2.86335 -0.177989 +v 0.130707 -2.86335 0.177989 +v 0.135366 -2.55 -0.814374 +v 0.135366 -2.55 0.814374 +v 0.135489 -2.74905 0.099446 +v 0.135489 -2.74905 -0.099446 +v 0.138348 -3.14145 -0.138348 +v 0.138348 -3.14145 0.138348 +v 0.142000 -2.7 0.142000 +v 0.142000 -2.7 -0.142000 +v 0.142000 -2.7 -0.142000 +v 0.142000 -2.7 0.142000 +v 0.143301 -3.1176 -0.274928 +v 0.143301 -3.1176 0.274928 +v 0.145078 -2.8044 0.106513 +v 0.145078 -2.8044 -0.106513 +v 0.148969 -2.74905 0.077523 +v 0.148969 -2.74905 -0.077523 +v 0.150793 -2.98125 -0.289340 +v 0.150793 -2.98125 0.289340 +v 0.156200 -2.86335 -0.156200 +v 0.156200 -2.86335 0.156200 +v 0.156274 -0.018225 0.940158 +v 0.156274 -0.018225 -0.940158 +v 0.157626 -3.14145 -0.115787 +v 0.157626 -3.14145 0.115787 +v 0.158995 -2.74905 0.053428 +v 0.158995 -2.74905 -0.053428 +v 0.159223 -2.5272 -0.957901 +v 0.159223 -2.5272 0.957901 +v 0.159496 -2.8044 0.083047 +v 0.159496 -2.8044 -0.083047 +v 0.161856 -2.7 0.118784 +v 0.161856 -2.7 -0.118784 +v 0.161856 -2.7 -0.118784 +v 0.161856 -2.7 0.118784 +v 0.162745 -2.9232 -0.221585 +v 0.162745 -2.9232 0.221585 +v 0.165245 -2.74905 0.027480 +v 0.165245 -2.74905 -0.027480 +v 0.165941 -2.6592 -0.226113 +v 0.165941 -2.6592 0.226113 +v 0.166221 -3.08115 0.318907 +v 0.166221 -3.08115 -0.318907 +v 0.166306 -3.0348 -0.319082 +v 0.166306 -3.0348 0.319082 +v 0.167400 -2.74905 -0.000000 +v 0.167400 -2.74905 0.000000 +v 0.167751 -2.5974 -0.499384 +v 0.167751 -2.5974 0.499384 +v 0.170215 -2.8044 0.057246 +v 0.170215 -2.8044 -0.057246 +v 0.173255 -3.14145 -0.090306 +v 0.173255 -3.14145 0.090306 +v 0.176897 -2.8044 0.029450 +v 0.176897 -2.8044 -0.029450 +v 0.177968 -2.7 0.092592 +v 0.177968 -2.7 -0.092592 +v 0.177968 -2.7 -0.092592 +v 0.177968 -2.7 0.092592 +v 0.177989 -2.86335 -0.130707 +v 0.177989 -2.86335 0.130707 +v 0.179200 -2.8044 -0.000000 +v 0.179200 -2.8044 0.000000 +v 0.179756 -0.002175 -0.345503 +v 0.179756 -0.002175 0.345503 +v 0.180521 -2.5026 -1.086029 +v 0.180521 -2.5026 1.086029 +v 0.181110 -2.6256 0.348105 +v 0.181110 -2.6256 -0.348105 +v 0.183734 -3.1176 -0.250127 +v 0.183734 -3.1176 0.250127 +v 0.184870 -3.14145 -0.062272 +v 0.184870 -3.14145 0.062272 +v 0.187642 -0.0312 1.128870 +v 0.187642 -0.0312 -1.128870 +v 0.189952 -2.7 0.063808 +v 0.189952 -2.7 -0.063808 +v 0.189952 -2.7 -0.063808 +v 0.189952 -2.7 0.063808 +v 0.192107 -3.14145 -0.032048 +v 0.192107 -3.14145 0.032048 +v 0.193348 -2.98125 -0.263232 +v 0.193348 -2.98125 0.263232 +v 0.194472 -2.9232 -0.194472 +v 0.194472 -2.9232 0.194472 +v 0.194600 -3.14145 0.000000 +v 0.194600 -3.14145 -0.000000 +v 0.195658 -2.86335 -0.101925 +v 0.195658 -2.86335 0.101925 +v 0.197424 -2.7 0.032816 +v 0.197424 -2.7 -0.032816 +v 0.197424 -2.7 -0.032816 +v 0.197424 -2.7 0.032816 +v 0.197684 -2.4744 -1.189282 +v 0.197684 -2.4744 1.189282 +v 0.198374 -2.6592 -0.198374 +v 0.198374 -2.6592 0.198374 +v 0.200000 -2.7 -0.000000 +v 0.200000 -2.7 0.000000 +v 0.200000 -2.7 0.000000 +v 0.200000 -2.7 -0.000000 +v 0.208794 -2.86335 0.070270 +v 0.208794 -2.86335 -0.070270 +v 0.209136 -2.4408 -1.258183 +v 0.209136 -2.4408 1.258183 +v 0.210740 -0.046875 -1.267832 +v 0.210740 -0.046875 1.267832 +v 0.213123 -3.08115 -0.290138 +v 0.213123 -3.08115 0.290138 +v 0.213234 -3.0348 -0.290295 +v 0.213234 -3.0348 0.290295 +v 0.213304 -2.4 -1.283256 +v 0.213304 -2.4 1.283256 +v 0.214905 -2.5728 -0.639758 +v 0.214905 -2.5728 0.639758 +v 0.216979 -2.86335 0.036157 +v 0.216979 -2.86335 -0.036157 +v 0.219536 -3.1176 -0.219536 +v 0.219536 -3.1176 0.219536 +v 0.219800 -2.86335 -0.000000 +v 0.219800 -2.86335 0.000000 +v 0.221585 -2.9232 -0.162745 +v 0.221585 -2.9232 0.162745 +v 0.224349 -0.0084 0.667871 +v 0.224349 -0.0084 -0.667871 +v 0.226113 -2.6592 -0.165941 +v 0.226113 -2.6592 0.165941 +v 0.226496 -2.463 -1.362620 +v 0.226496 -2.463 1.362620 +v 0.226795 -2.482687 1.364422 +v 0.226795 -2.482687 -1.364422 +v 0.226824 -0.0648 1.364595 +v 0.226824 -0.0648 -1.364595 +v 0.227403 -2.435437 -1.368074 +v 0.227403 -2.435437 1.368074 +v 0.228104 -2.4945 -1.372294 +v 0.228104 -2.4945 1.372294 +v 0.229712 -2.4 -1.381968 +v 0.229712 -2.4 1.381968 +v 0.230225 -2.498438 -1.385053 +v 0.230225 -2.498438 1.385053 +v 0.230604 -0.002175 -0.314223 +v 0.230604 -0.002175 0.314223 +v 0.231031 -2.98125 -0.231031 +v 0.231031 -2.98125 0.231031 +v 0.232342 -2.6256 -0.316590 +v 0.232342 -2.6256 0.316590 +v 0.232961 -2.4945 -1.401513 +v 0.232961 -2.4945 1.401513 +v 0.236115 -2.482687 -1.420490 +v 0.236115 -2.482687 1.420490 +v 0.237149 -0.084525 1.426709 +v 0.237149 -0.084525 -1.426709 +v 0.239491 -2.463 -1.440800 +v 0.239491 -2.463 1.440800 +v 0.242892 -2.435437 -1.461258 +v 0.242892 -2.435437 1.461258 +v 0.242970 -0.1056 1.461727 +v 0.242970 -0.1056 -1.461727 +v 0.243424 -2.5974 0.467878 +v 0.243424 -2.5974 -0.467878 +v 0.243569 -2.9232 -0.126920 +v 0.243569 -2.9232 0.126920 +v 0.245542 -0.127575 1.477200 +v 0.245542 -0.127575 -1.477200 +v 0.246120 -0.15 -1.480680 +v 0.246120 -2.4 -1.480680 +v 0.246120 -0.15 1.480680 +v 0.246120 -0.15 1.480680 +v 0.246120 -2.4 1.480680 +v 0.246120 -0.15 -1.480680 +v 0.248417 -0.177075 -1.494500 +v 0.248417 -0.177075 1.494500 +v 0.248621 -2.6592 0.129351 +v 0.248621 -2.6592 -0.129351 +v 0.250127 -3.1176 -0.183734 +v 0.250127 -3.1176 0.183734 +v 0.254652 -0.2136 -1.532010 +v 0.254652 -0.2136 1.532010 +v 0.254653 -3.08115 -0.254653 +v 0.254653 -3.08115 0.254653 +v 0.254788 -3.0348 -0.254788 +v 0.254788 -3.0348 0.254788 +v 0.258385 -2.242575 -1.554467 +v 0.258385 -2.242575 1.554467 +v 0.259910 -2.9232 -0.087511 +v 0.259910 -2.9232 0.087511 +v 0.263208 -2.55 -0.783552 +v 0.263208 -2.55 0.783552 +v 0.263232 -2.98125 -0.193348 +v 0.263232 -2.98125 0.193348 +v 0.263841 -0.260025 1.587289 +v 0.263841 -0.260025 -1.587289 +v 0.265363 -2.6592 -0.089140 +v 0.265363 -2.6592 0.089140 +v 0.270092 -2.9232 -0.045032 +v 0.270092 -2.9232 0.045032 +v 0.270404 -2.0856 -1.626774 +v 0.270404 -2.0856 1.626774 +v 0.273600 -2.9232 -0.000000 +v 0.273600 -2.9232 0.000000 +v 0.274928 -3.1176 -0.143301 +v 0.274928 -3.1176 0.143301 +v 0.274998 -0.3168 -1.654413 +v 0.274998 -0.3168 1.654413 +v 0.275675 -0.002175 -0.275675 +v 0.275675 -0.002175 0.275675 +v 0.275801 -2.6592 -0.045844 +v 0.275801 -2.6592 0.045844 +v 0.277752 -2.6256 -0.277752 +v 0.277752 -2.6256 0.277752 +v 0.279400 -2.6592 0.000000 +v 0.281930 -1.929525 1.696119 +v 0.281930 -1.929525 -1.696119 +v 0.287140 -0.384375 -1.727460 +v 0.287140 -0.384375 1.727460 +v 0.289340 -2.98125 -0.150793 +v 0.289340 -2.98125 0.150793 +v 0.290138 -3.08115 -0.213123 +v 0.290138 -3.08115 0.213123 +v 0.290295 -3.0348 -0.213234 +v 0.290295 -3.0348 0.213234 +v 0.292719 -1.7748 -1.761022 +v 0.292719 -1.7748 1.761022 +v 0.293360 -3.1176 -0.098814 +v 0.293360 -3.1176 0.098814 +v 0.299282 -0.4632 -1.800507 +v 0.299282 -0.4632 1.800507 +v 0.302522 -1.621875 -1.820003 +v 0.302523 -1.621875 1.820003 +v 0.303862 -0.018225 0.904575 +v 0.303862 -0.018225 -0.904575 +v 0.304843 -3.1176 -0.050855 +v 0.304843 -3.1176 0.050855 +v 0.308744 -2.98125 -0.103976 +v 0.308744 -2.98125 0.103976 +v 0.308800 -3.1176 0.000000 +v 0.308800 -3.1176 -0.000000 +v 0.309596 -2.5272 -0.921647 +v 0.309596 -2.5272 0.921647 +v 0.310439 -0.553725 -1.867631 +v 0.310439 -0.553725 1.867631 +v 0.311096 -1.4712 -1.871580 +v 0.311096 -1.4712 1.871580 +v 0.311850 -2.5728 -0.599396 +v 0.311850 -2.5728 0.599396 +v 0.312283 -2.5974 -0.425519 +v 0.312283 -2.5974 0.425519 +v 0.314223 -0.002175 -0.230604 +v 0.314223 -0.002175 0.230604 +v 0.316590 -2.6256 -0.232342 +v 0.316590 -2.6256 0.232342 +v 0.318192 -1.323225 -1.914272 +v 0.318192 -1.323225 1.914272 +v 0.318907 -3.08115 -0.166221 +v 0.318907 -3.08115 0.166221 +v 0.319082 -3.0348 -0.166306 +v 0.319082 -3.0348 0.166306 +v 0.319628 -0.6564 -1.922910 +v 0.319628 -0.6564 1.922910 +v 0.320834 -2.98125 -0.053508 +v 0.320834 -2.98125 0.053508 +v 0.323566 -1.1784 -1.946601 +v 0.323566 -1.1784 1.946601 +v 0.325000 -2.98125 0.000000 +v 0.325000 -2.98125 -0.000000 +v 0.325553 -0.0084 -0.625735 +v 0.325553 -0.0084 0.625735 +v 0.325863 -0.771675 -1.960420 +v 0.325863 -0.771675 1.960420 +v 0.326970 -1.037175 -1.967083 +v 0.326970 -1.037175 1.967083 +v 0.328160 -0.9 -1.974240 +v 0.328160 -0.9 -1.974240 +v 0.328160 -0.9 1.974240 +v 0.340289 -3.08115 -0.114619 +v 0.340289 -3.08115 0.114619 +v 0.340477 -3.0348 -0.114676 +v 0.340477 -3.0348 0.114676 +v 0.345503 -0.002175 -0.179756 +v 0.345503 -0.002175 0.179756 +v 0.348105 -2.6256 -0.181110 +v 0.348105 -2.6256 0.181110 +v 0.351008 -2.5026 -1.044926 +v 0.351008 -2.5026 1.044926 +v 0.353610 -3.08115 -0.058988 +v 0.353610 -3.08115 0.058988 +v 0.353807 -3.0348 -0.059016 +v 0.353807 -3.0348 0.059016 +v 0.358200 -3.08115 -0.000000 +v 0.358200 -3.08115 0.000000 +v 0.358400 -3.0348 0.000000 +v 0.358400 -3.0348 0.000000 +v 0.364854 -0.0312 1.086146 +v 0.364854 -0.0312 -1.086146 +v 0.368768 -0.002175 -0.123875 +v 0.368768 -0.002175 0.123875 +v 0.371546 -2.6256 -0.124808 +v 0.371546 -2.6256 0.124808 +v 0.373318 -2.5974 -0.373318 +v 0.373318 -2.5974 0.373318 +v 0.381942 -2.55 -0.734118 +v 0.381942 -2.55 0.734118 +v 0.383274 -0.002175 -0.063708 +v 0.383274 -0.002175 0.063708 +v 0.384379 -2.4744 -1.144271 +v 0.384379 -2.4744 1.144271 +v 0.386161 -2.6256 -0.064188 +v 0.386161 -2.6256 0.064188 +v 0.388275 -0.002175 0.000000 +v 0.388275 -0.002175 0.000000 +v 0.391200 -2.6256 0.000000 +v 0.391200 -2.6256 0.000000 +v 0.400065 -2.5728 -0.545131 +v 0.400065 -2.5728 0.545131 +v 0.406648 -2.4408 -1.210564 +v 0.406648 -2.4408 1.210564 +v 0.409767 -0.046875 1.219848 +v 0.409767 -0.046875 -1.219848 +v 0.414752 -2.4 -1.234688 +v 0.414752 -2.4 1.234688 +v 0.417645 -0.0084 -0.569086 +v 0.417645 -0.0084 0.569086 +v 0.425519 -2.5974 0.312283 +v 0.425519 -2.5974 -0.312283 +v 0.440403 -2.463 -1.311049 +v 0.440403 -2.463 1.311049 +v 0.440935 -0.018225 0.847506 +v 0.440935 -0.018225 -0.847506 +v 0.440985 -2.482687 -1.312782 +v 0.440985 -2.482687 1.312782 +v 0.441041 -0.0648 1.312948 +v 0.441041 -0.0648 -1.312948 +v 0.442166 -2.435437 -1.316296 +v 0.442166 -2.435437 1.316296 +v 0.443529 -2.4945 -1.320356 +v 0.443529 -2.4945 1.320356 +v 0.446656 -2.4 -1.329664 +v 0.446656 -2.4 1.329664 +v 0.447653 -2.498438 -1.332632 +v 0.447653 -2.498438 1.332632 +v 0.449256 -2.5272 -0.863501 +v 0.449256 -2.5272 0.863501 +v 0.452973 -2.4945 -1.348469 +v 0.452973 -2.4945 1.348469 +v 0.459107 -2.482687 -1.366728 +v 0.459107 -2.482687 1.366728 +v 0.461116 -0.084525 1.372712 +v 0.461116 -0.084525 -1.372712 +v 0.465671 -2.463 -1.386270 +v 0.465671 -2.463 1.386270 +v 0.467878 -2.5974 -0.243424 +v 0.467878 -2.5974 0.243424 +v 0.472283 -2.435437 -1.405953 +v 0.472283 -2.435437 1.405953 +v 0.472434 -0.1056 1.406405 +v 0.472434 -0.1056 -1.406405 +v 0.477435 -0.127575 1.421292 +v 0.477435 -0.127575 -1.421292 +v 0.478256 -2.5728 -0.478256 +v 0.478256 -2.5728 0.478256 +v 0.478560 -0.15 -1.424640 +v 0.478560 -2.4 -1.424640 +v 0.478560 -0.15 1.424640 +v 0.478560 -0.15 1.424640 +v 0.478560 -0.15 -1.424640 +v 0.478560 -2.4 1.424640 +v 0.483027 -0.177075 -1.437937 +v 0.483027 -0.177075 1.437937 +v 0.489984 -2.55 -0.667656 +v 0.489984 -2.55 0.667656 +v 0.495150 -0.2136 -1.474028 +v 0.495150 -0.2136 1.474028 +v 0.499272 -0.0084 -0.499272 +v 0.499272 -0.0084 0.499272 +v 0.499384 -2.5974 -0.167751 +v 0.499384 -2.5974 0.167751 +v 0.502408 -2.242575 -1.495635 +v 0.502408 -2.242575 1.495635 +v 0.509349 -2.5026 0.979002 +v 0.509349 -2.5026 -0.979002 +v 0.513016 -0.260025 -1.527214 +v 0.513016 -0.260025 1.527214 +v 0.519028 -2.5974 0.086273 +v 0.519028 -2.5974 -0.086273 +v 0.525778 -2.0856 -1.565204 +v 0.525778 -2.0856 1.565204 +v 0.525800 -2.5974 -0.000000 +v 0.525800 -2.5974 0.000000 +v 0.529441 -0.0312 -1.017621 +v 0.529441 -0.0312 1.017621 +v 0.534711 -0.3168 -1.591798 +v 0.534711 -0.3168 1.591798 +v 0.545131 -2.5728 -0.400065 +v 0.545131 -2.5728 0.400065 +v 0.548190 -1.929525 -1.631925 +v 0.548190 -1.929525 1.631925 +v 0.557774 -2.4744 -1.072079 +v 0.557774 -2.4744 1.072079 +v 0.558320 -0.384375 -1.662080 +v 0.558320 -0.384375 1.662080 +v 0.565664 -0.018225 0.770779 +v 0.565664 -0.018225 -0.770779 +v 0.569086 -0.0084 -0.417645 +v 0.569086 -0.0084 0.417645 +v 0.569167 -1.7748 -1.694372 +v 0.569167 -1.7748 1.694372 +v 0.576340 -2.5272 -0.785325 +v 0.576340 -2.5272 0.785325 +v 0.581929 -0.4632 -1.732362 +v 0.581929 -0.4632 1.732362 +v 0.585750 -2.55 -0.585750 +v 0.585750 -2.55 0.585750 +v 0.588230 -1.621875 -1.751120 +v 0.588230 -1.621875 1.751120 +v 0.590089 -2.4408 1.134190 +v 0.590089 -2.4408 -1.134190 +v 0.594614 -0.046875 -1.142888 +v 0.594614 -0.046875 1.142888 +v 0.599396 -2.5728 -0.311850 +v 0.599396 -2.5728 0.311850 +v 0.601848 -2.4 -1.156792 +v 0.601848 -2.4 1.156792 +v 0.603624 -0.553725 -1.796946 +v 0.603624 -0.553725 1.796946 +v 0.604900 -1.4712 -1.800745 +v 0.604900 -1.4712 1.800745 +v 0.618698 -1.323225 -1.841822 +v 0.618698 -1.323225 1.841822 +v 0.621490 -0.6564 -1.850132 +v 0.621490 -0.6564 1.850132 +v 0.625735 -0.0084 0.325553 +v 0.625735 -0.0084 -0.325553 +v 0.629147 -1.1784 -1.872927 +v 0.629147 -1.1784 1.872927 +v 0.633613 -0.771675 -1.886223 +v 0.633613 -0.771675 1.886223 +v 0.635767 -1.037175 -1.892634 +v 0.635767 -1.037175 1.892634 +v 0.638080 -0.9 -1.899520 +v 0.638080 -0.9 -1.899520 +v 0.638080 -0.9 1.899520 +v 0.638080 -0.9 1.899520 +v 0.639070 -2.463 -1.228335 +v 0.639070 -2.463 1.228335 +v 0.639758 -2.5728 -0.214905 +v 0.639758 -2.5728 0.214905 +v 0.639915 -2.482687 1.229959 +v 0.639915 -2.482687 -1.229959 +v 0.639996 -0.0648 -1.230115 +v 0.639996 -0.0648 1.230115 +v 0.641628 -2.435437 -1.233252 +v 0.641628 -2.435437 1.233252 +v 0.643607 -2.4945 -1.237056 +v 0.643607 -2.4945 1.237056 +v 0.648144 -2.4 -1.245776 +v 0.648144 -2.4 1.245776 +v 0.649591 -2.498438 -1.248557 +v 0.649591 -2.498438 1.248557 +v 0.653431 -2.5026 -0.890370 +v 0.653431 -2.5026 0.890370 +v 0.657311 -2.4945 -1.263395 +v 0.657311 -2.4945 1.263395 +v 0.664924 -2.5728 -0.110524 +v 0.664924 -2.5728 0.110524 +v 0.666211 -2.482687 1.280502 +v 0.666211 -2.482687 -1.280502 +v 0.667656 -2.55 -0.489984 +v 0.667656 -2.55 0.489984 +v 0.667871 -0.0084 -0.224349 +v 0.667871 -0.0084 0.224349 +v 0.669128 -0.084525 -1.286108 +v 0.669128 -0.084525 1.286108 +v 0.673600 -2.5728 0.000000 +v 0.673600 -2.5728 -0.000000 +v 0.675736 -2.463 -1.298810 +v 0.675736 -2.463 1.298810 +v 0.676222 -0.018225 0.676222 +v 0.676222 -0.018225 -0.676222 +v 0.679207 -0.0312 -0.925493 +v 0.679207 -0.0312 0.925493 +v 0.685331 -2.435437 -1.317252 +v 0.685331 -2.435437 1.317252 +v 0.685551 -0.1056 -1.317675 +v 0.685551 -0.1056 1.317675 +v 0.688984 -2.5272 -0.688984 +v 0.688984 -2.5272 0.688984 +v 0.692808 -0.127575 1.331623 +v 0.692808 -0.127575 -1.331623 +v 0.694143 -0.0084 -0.115381 +v 0.694143 -0.0084 0.115381 +v 0.694440 -0.15 1.334760 +v 0.694440 -0.15 -1.334760 +v 0.694440 -2.4 1.334760 +v 0.694440 -0.15 -1.334760 +v 0.694440 -0.15 1.334760 +v 0.694440 -2.4 -1.334760 +v 0.700921 -0.177075 1.347218 +v 0.700921 -0.177075 -1.347218 +v 0.703200 -0.0084 0.000000 +v 0.715555 -2.4744 -0.975021 +v 0.715555 -2.4744 0.975021 +v 0.718514 -0.2136 1.381032 +v 0.718514 -0.2136 -1.381032 +v 0.729046 -2.242575 -1.401276 +v 0.729046 -2.242575 1.401276 +v 0.734118 -2.55 -0.381942 +v 0.734118 -2.55 0.381942 +v 0.744440 -0.260025 1.430863 +v 0.744440 -0.260025 -1.430863 +v 0.757010 -2.4408 1.031508 +v 0.757010 -2.4408 -1.031508 +v 0.762816 -0.046875 -1.039419 +v 0.762816 -0.046875 1.039419 +v 0.762958 -2.0856 -1.466456 +v 0.762958 -2.0856 1.466456 +v 0.770779 -0.018225 0.565664 +v 0.770779 -0.018225 -0.565664 +v 0.772096 -2.4 -1.052064 +v 0.772096 -2.4 1.052064 +v 0.775921 -0.3168 -1.491372 +v 0.775921 -0.3168 1.491372 +v 0.781142 -2.5026 -0.781142 +v 0.781142 -2.5026 0.781142 +v 0.783552 -2.55 -0.263208 +v 0.783552 -2.55 0.263208 +v 0.785325 -2.5272 -0.576340 +v 0.785325 -2.5272 0.576340 +v 0.795481 -1.929525 1.528968 +v 0.795481 -1.929525 -1.528968 +v 0.810180 -0.384375 1.557220 +v 0.810180 -0.384375 -1.557220 +v 0.811956 -0.0312 0.811956 +v 0.811956 -0.0312 -0.811956 +v 0.814374 -2.55 -0.135366 +v 0.814374 -2.55 0.135366 +v 0.819847 -2.463 -1.117130 +v 0.819847 -2.463 1.117130 +v 0.820931 -2.482687 1.118607 +v 0.820931 -2.482687 -1.118607 +v 0.821035 -0.0648 1.118749 +v 0.821035 -0.0648 -1.118749 +v 0.823129 -2.435437 -1.121601 +v 0.823129 -2.435437 1.121601 +v 0.825000 -2.55 0.000000 +v 0.825000 -2.55 0.000000 +v 0.825668 -2.4945 -1.125061 +v 0.825668 -2.4945 1.125061 +v 0.825921 -1.7748 1.587475 +v 0.825921 -1.7748 -1.587475 +v 0.831488 -2.4 -1.132992 +v 0.831488 -2.4 1.132992 +v 0.833344 -2.498438 -1.135521 +v 0.833344 -2.498438 1.135521 +v 0.843248 -2.4945 -1.149016 +v 0.843248 -2.4945 1.149016 +v 0.844439 -0.4632 1.623068 +v 0.844439 -0.4632 -1.623068 +v 0.847506 -0.018225 -0.440935 +v 0.847506 -0.018225 0.440935 +v 0.853583 -1.621875 -1.640643 +v 0.853583 -1.621875 1.640643 +v 0.854666 -2.482687 -1.164574 +v 0.854666 -2.482687 1.164574 +v 0.855408 -2.4744 -0.855408 +v 0.855408 -2.4744 0.855408 +v 0.858407 -0.084525 -1.169673 +v 0.858407 -0.084525 1.169673 +v 0.863501 -2.5272 -0.449256 +v 0.863501 -2.5272 0.449256 +v 0.866886 -2.463 -1.181225 +v 0.866886 -2.463 1.181225 +v 0.875920 -0.553725 -1.683577 +v 0.875920 -0.553725 1.683577 +v 0.877772 -1.4712 -1.687137 +v 0.877772 -1.4712 1.687137 +v 0.879195 -2.435437 -1.197997 +v 0.879195 -2.435437 1.197997 +v 0.879477 -0.1056 -1.198382 +v 0.879477 -0.1056 1.198382 +v 0.888786 -0.127575 1.211067 +v 0.888786 -0.127575 -1.211067 +v 0.890370 -2.5026 -0.653431 +v 0.890370 -2.5026 0.653431 +v 0.890880 -0.15 -1.213920 +v 0.890880 -0.15 1.213920 +v 0.890880 -2.4 -1.213920 +v 0.890880 -0.15 -1.213920 +v 0.890880 -0.15 1.213920 +v 0.890880 -2.4 1.213920 +v 0.897795 -1.323225 -1.725622 +v 0.897795 -1.323225 1.725622 +v 0.899195 -0.177075 1.225250 +v 0.899195 -0.177075 -1.225250 +v 0.901846 -0.6564 -1.733408 +v 0.901846 -0.6564 1.733408 +v 0.904575 -0.018225 0.303862 +v 0.904575 -0.018225 -0.303862 +v 0.904966 -2.4408 0.904966 +v 0.904966 -2.4408 -0.904966 +v 0.911906 -0.046875 -0.911906 +v 0.911906 -0.046875 0.911906 +v 0.912957 -1.1784 -1.754764 +v 0.912957 -1.1784 1.754764 +v 0.919439 -0.771675 -1.767222 +v 0.919439 -0.771675 1.767222 +v 0.921647 -2.5272 -0.309596 +v 0.921647 -2.5272 0.309596 +v 0.921764 -0.2136 1.256003 +v 0.921764 -0.2136 -1.256003 +v 0.922564 -1.037175 1.773229 +v 0.922564 -1.037175 -1.773229 +v 0.923000 -2.4 -0.923000 +v 0.923000 -2.4 0.923000 +v 0.925493 -0.0312 0.679207 +v 0.925493 -0.0312 -0.679207 +v 0.925920 -0.9 1.779680 +v 0.925920 -0.9 -1.779680 +v 0.925920 -0.9 -1.779680 +v 0.925920 -0.9 1.779680 +v 0.935276 -2.242575 -1.274414 +v 0.935276 -2.242575 1.274414 +v 0.940158 -0.018225 0.156274 +v 0.940158 -0.018225 -0.156274 +v 0.952425 -0.018225 0.000000 +v 0.952425 -0.018225 0.000000 +v 0.955023 -0.260025 1.301322 +v 0.955023 -0.260025 -1.301322 +v 0.957901 -2.5272 -0.159223 +v 0.957901 -2.5272 0.159223 +v 0.970400 -2.5272 0.000000 +v 0.970400 -2.5272 -0.000000 +v 0.975021 -2.4744 -0.715555 +v 0.975021 -2.4744 0.715555 +v 0.978780 -2.0856 -1.333693 +v 0.978780 -2.0856 1.333693 +v 0.979002 -2.5026 0.509349 +v 0.979002 -2.5026 -0.509349 +v 0.980084 -2.463 -0.980084 +v 0.980084 -2.463 0.980084 +v 0.981380 -2.482687 -0.981380 +v 0.981380 -2.482687 0.981380 +v 0.981504 -0.0648 0.981504 +v 0.981504 -0.0648 -0.981504 +v 0.984007 -2.435437 -0.984007 +v 0.984007 -2.435437 0.984007 +v 0.987042 -2.4945 -0.987042 +v 0.987042 -2.4945 0.987042 +v 0.994000 -2.4 -0.994000 +v 0.994000 -2.4 0.994000 +v 0.995410 -0.3168 -1.356353 +v 0.995410 -0.3168 1.356353 +v 0.996219 -2.498438 -0.996219 +v 0.996219 -2.498438 0.996219 +v 1.008058 -2.4945 -1.008058 +v 1.008058 -2.4945 1.008058 +v 1.017621 -0.0312 0.529441 +v 1.017621 -0.0312 -0.529441 +v 1.020503 -1.929525 -1.390545 +v 1.020503 -1.929525 1.390545 +v 1.021708 -2.482687 -1.021708 +v 1.021708 -2.482687 1.021708 +v 1.026181 -0.084525 -1.026181 +v 1.026181 -0.084525 1.026181 +v 1.031508 -2.4408 0.757010 +v 1.031508 -2.4408 -0.757010 +v 1.036316 -2.463 -1.036316 +v 1.036316 -2.463 1.036316 +v 1.039360 -0.384375 -1.416240 +v 1.039360 -0.384375 1.416240 +v 1.039419 -0.046875 -0.762816 +v 1.039419 -0.046875 0.762816 +v 1.044926 -2.5026 -0.351008 +v 1.044926 -2.5026 0.351008 +v 1.051031 -2.435437 -1.051031 +v 1.051031 -2.435437 1.051031 +v 1.051368 -0.1056 -1.051368 +v 1.051368 -0.1056 1.051368 +v 1.052064 -2.4 -0.772096 +v 1.052064 -2.4 0.772096 +v 1.059553 -1.7748 -1.443756 +v 1.059553 -1.7748 1.443756 +v 1.062497 -0.127575 1.062497 +v 1.062497 -0.127575 -1.062497 +v 1.065000 -0.15 -1.065000 +v 1.065000 -0.15 1.065000 +v 1.065000 -2.4 -1.065000 +v 1.065000 -2.4 1.065000 +v 1.072079 -2.4744 -0.557774 +v 1.072079 -2.4744 0.557774 +v 1.074940 -0.177075 -1.074940 +v 1.074940 -0.177075 1.074940 +v 1.083310 -0.4632 -1.476127 +v 1.083310 -0.4632 1.476127 +v 1.086029 -2.5026 0.180521 +v 1.086029 -2.5026 -0.180521 +v 1.086146 -0.0312 0.364854 +v 1.086146 -0.0312 -0.364854 +v 1.095040 -1.621875 -1.492110 +v 1.095040 -1.621875 1.492110 +v 1.100200 -2.5026 -0.000000 +v 1.100200 -2.5026 0.000000 +v 1.101920 -0.2136 1.101920 +v 1.101920 -0.2136 -1.101920 +v 1.117130 -2.463 -0.819847 +v 1.117130 -2.463 0.819847 +v 1.118073 -2.242575 -1.118073 +v 1.118073 -2.242575 1.118073 +v 1.118607 -2.482687 -0.820931 +v 1.118607 -2.482687 0.820931 +v 1.118749 -0.0648 -0.821035 +v 1.118749 -0.0648 0.821035 +v 1.121601 -2.435437 -0.823129 +v 1.121601 -2.435437 0.823129 +v 1.123697 -0.553725 -1.531158 +v 1.123697 -0.553725 1.531158 +v 1.125061 -2.4945 -0.825668 +v 1.125061 -2.4945 0.825668 +v 1.126072 -1.4712 -1.534395 +v 1.126072 -1.4712 1.534395 +v 1.128870 -0.0312 -0.187642 +v 1.128870 -0.0312 0.187642 +v 1.132992 -2.4 -0.831488 +v 1.132992 -2.4 0.831488 +v 1.134190 -2.4408 0.590089 +v 1.134190 -2.4408 -0.590089 +v 1.135521 -2.498438 -0.833344 +v 1.135521 -2.498438 0.833344 +v 1.141680 -0.260025 1.141680 +v 1.141680 -0.260025 -1.141680 +v 1.142888 -0.046875 -0.594614 +v 1.142888 -0.046875 0.594614 +v 1.143600 -0.0312 0.000000 +v 1.143600 -0.0312 0.000000 +v 1.144271 -2.4744 -0.384379 +v 1.144271 -2.4744 0.384379 +v 1.149016 -2.4945 -0.843248 +v 1.149016 -2.4945 0.843248 +v 1.151759 -1.323225 -1.569396 +v 1.151759 -1.323225 1.569396 +v 1.156792 -2.4 -0.601848 +v 1.156792 -2.4 0.601848 +v 1.156956 -0.6564 -1.576477 +v 1.156956 -0.6564 1.576477 +v 1.164574 -2.482687 -0.854666 +v 1.164574 -2.482687 0.854666 +v 1.169673 -0.084525 -0.858407 +v 1.169673 -0.084525 0.858407 +v 1.170080 -2.0856 -1.170080 +v 1.170080 -2.0856 1.170080 +v 1.171210 -1.1784 -1.595900 +v 1.171210 -1.1784 1.595900 +v 1.179525 -0.771675 -1.607230 +v 1.179525 -0.771675 1.607230 +v 1.181225 -2.463 -0.866886 +v 1.181225 -2.463 0.866886 +v 1.183534 -1.037175 -1.612693 +v 1.183534 -1.037175 1.612693 +v 1.187840 -0.9 -1.618560 +v 1.187840 -0.9 -1.618560 +v 1.187840 -0.9 1.618560 +v 1.187840 -0.9 1.618560 +v 1.189282 -2.4744 -0.197684 +v 1.189282 -2.4744 0.197684 +v 1.189960 -0.3168 -1.189960 +v 1.189960 -0.3168 1.189960 +v 1.197997 -2.435437 -0.879195 +v 1.197997 -2.435437 0.879195 +v 1.198382 -0.1056 -0.879477 +v 1.198382 -0.1056 0.879477 +v 1.204800 -2.4744 0.000000 +v 1.204800 -2.4744 -0.000000 +v 1.210564 -2.4408 0.406648 +v 1.210564 -2.4408 -0.406648 +v 1.211067 -0.127575 0.888786 +v 1.211067 -0.127575 -0.888786 +v 1.213920 -0.15 -0.890880 +v 1.213920 -0.15 -0.890880 +v 1.213920 -0.15 0.890880 +v 1.213920 -0.15 0.890880 +v 1.213920 -2.4 -0.890880 +v 1.213920 -2.4 0.890880 +v 1.219848 -0.046875 -0.409767 +v 1.219848 -0.046875 0.409767 +v 1.219958 -1.929525 1.219958 +v 1.219958 -1.929525 -1.219958 +v 1.225250 -0.177075 0.899195 +v 1.225250 -0.177075 -0.899195 +v 1.228335 -2.463 -0.639070 +v 1.228335 -2.463 0.639070 +v 1.229959 -2.482687 -0.639915 +v 1.229959 -2.482687 0.639915 +v 1.230115 -0.0648 -0.639996 +v 1.230115 -0.0648 0.639996 +v 1.233252 -2.435437 -0.641628 +v 1.233252 -2.435437 0.641628 +v 1.234688 -2.4 -0.414752 +v 1.234688 -2.4 0.414752 +v 1.237056 -2.4945 -0.643607 +v 1.237056 -2.4945 0.643607 +v 1.242500 -0.384375 -1.242500 +v 1.242500 -0.384375 1.242500 +v 1.245776 -2.4 -0.648144 +v 1.245776 -2.4 0.648144 +v 1.248557 -2.498438 -0.649591 +v 1.248557 -2.498438 0.649591 +v 1.256003 -0.2136 0.921764 +v 1.256003 -0.2136 -0.921764 +v 1.258183 -2.4408 0.209136 +v 1.258183 -2.4408 -0.209136 +v 1.263395 -2.4945 -0.657311 +v 1.263395 -2.4945 0.657311 +v 1.266640 -1.7748 -1.266640 +v 1.266640 -1.7748 1.266640 +v 1.267832 -0.046875 -0.210740 +v 1.267832 -0.046875 0.210740 +v 1.274414 -2.242575 -0.935276 +v 1.274414 -2.242575 0.935276 +v 1.274600 -2.4408 0.000000 +v 1.274600 -2.4408 0.000000 +v 1.280502 -2.482687 -0.666211 +v 1.280502 -2.482687 0.666211 +v 1.283256 -2.4 -0.213304 +v 1.283256 -2.4 0.213304 +v 1.284375 -0.046875 0.000000 +v 1.284375 -0.046875 -0.000000 +v 1.286108 -0.084525 -0.669128 +v 1.286108 -0.084525 0.669128 +v 1.295040 -0.4632 -1.295040 +v 1.295040 -0.4632 1.295040 +v 1.298810 -2.463 -0.675736 +v 1.298810 -2.463 0.675736 +v 1.300000 -2.4 0.000000 +v 1.300000 -2.4 -0.000000 +v 1.301322 -0.260025 0.955023 +v 1.301322 -0.260025 -0.955023 +v 1.309063 -1.621875 -1.309063 +v 1.309063 -1.621875 1.309063 +v 1.311049 -2.463 -0.440403 +v 1.311049 -2.463 0.440403 +v 1.312782 -2.482687 -0.440985 +v 1.312782 -2.482687 0.440985 +v 1.312948 -0.0648 0.441041 +v 1.312948 -0.0648 -0.441041 +v 1.316296 -2.435437 -0.442166 +v 1.316296 -2.435437 0.442166 +v 1.317252 -2.435437 -0.685331 +v 1.317252 -2.435437 0.685331 +v 1.317675 -0.1056 -0.685551 +v 1.317675 -0.1056 0.685551 +v 1.320356 -2.4945 -0.443529 +v 1.320356 -2.4945 0.443529 +v 1.329664 -2.4 -0.446656 +v 1.329664 -2.4 0.446656 +v 1.331623 -0.127575 0.692808 +v 1.331623 -0.127575 -0.692808 +v 1.332632 -2.498438 -0.447653 +v 1.332632 -2.498438 0.447653 +v 1.333693 -2.0856 -0.978780 +v 1.333693 -2.0856 0.978780 +v 1.334760 -0.15 0.694440 +v 1.334760 -0.15 -0.694440 +v 1.334760 -0.15 -0.694440 +v 1.334760 -0.15 0.694440 +v 1.334760 -2.4 -0.694440 +v 1.334760 -2.4 0.694440 +v 1.343320 -0.553725 -1.343320 +v 1.343320 -0.553725 1.343320 +v 1.346160 -1.4712 -1.346160 +v 1.346160 -1.4712 1.346160 +v 1.347218 -0.177075 0.700921 +v 1.347218 -0.177075 -0.700921 +v 1.348469 -2.4945 -0.452973 +v 1.348469 -2.4945 0.452973 +v 1.356353 -0.3168 -0.995410 +v 1.356353 -0.3168 0.995410 +v 1.362620 -2.463 -0.226496 +v 1.362620 -2.463 0.226496 +v 1.364422 -2.482687 -0.226795 +v 1.364422 -2.482687 0.226795 +v 1.364595 -0.0648 -0.226824 +v 1.364595 -0.0648 0.226824 +v 1.366728 -2.482687 -0.459107 +v 1.366728 -2.482687 0.459107 +v 1.368074 -2.435437 -0.227403 +v 1.368074 -2.435437 0.227403 +v 1.372294 -2.4945 -0.228104 +v 1.372294 -2.4945 0.228104 +v 1.372712 -0.084525 -0.461116 +v 1.372712 -0.084525 0.461116 +v 1.376867 -1.323225 -1.376868 +v 1.376868 -1.323225 1.376867 +v 1.380400 -2.463 0.000000 +v 1.380400 -2.463 -0.000000 +v 1.381032 -0.2136 0.718514 +v 1.381032 -0.2136 -0.718514 +v 1.381968 -2.4 -0.229712 +v 1.381968 -2.4 0.229712 +v 1.382225 -2.482687 0.000000 +v 1.382225 -2.482687 0.000000 +v 1.382400 -0.0648 0.000000 +v 1.382400 -0.0648 0.000000 +v 1.383080 -0.6564 -1.383080 +v 1.383080 -0.6564 1.383080 +v 1.385053 -2.498438 -0.230225 +v 1.385053 -2.498438 0.230225 +v 1.385925 -2.435437 0.000000 +v 1.385925 -2.435437 -0.000000 +v 1.386270 -2.463 -0.465671 +v 1.386270 -2.463 0.465671 +v 1.390200 -2.4945 0.000000 +v 1.390200 -2.4945 -0.000000 +v 1.390545 -1.929525 -1.020503 +v 1.390545 -1.929525 1.020503 +v 1.400000 -2.4 0.000000 +v 1.400000 -2.4 0.000000 +v 1.400120 -1.1784 -1.400120 +v 1.400120 -1.1784 1.400120 +v 1.401276 -2.242575 -0.729046 +v 1.401276 -2.242575 0.729046 +v 1.401513 -2.4945 -0.232961 +v 1.401513 -2.4945 0.232961 +v 1.403125 -2.498438 0.000000 +v 1.403125 -2.498438 0.000000 +v 1.405953 -2.435437 -0.472283 +v 1.405953 -2.435437 0.472283 +v 1.406405 -0.1056 -0.472434 +v 1.406405 -0.1056 0.472434 +v 1.410060 -0.771675 -1.410060 +v 1.410060 -0.771675 1.410060 +v 1.414853 -1.037175 -1.414853 +v 1.414853 -1.037175 1.414853 +v 1.416240 -0.384375 -1.039360 +v 1.416240 -0.384375 1.039360 +v 1.419800 -2.4945 0.000000 +v 1.419800 -2.4945 -0.000000 +v 1.420000 -0.9 -1.420000 +v 1.420000 -0.9 -1.420000 +v 1.420000 -0.9 1.420000 +v 1.420000 -0.9 1.420000 +v 1.420490 -2.482687 -0.236115 +v 1.420490 -2.482687 0.236115 +v 1.421292 -0.127575 0.477435 +v 1.421292 -0.127575 -0.477435 +v 1.424640 -0.15 -0.478560 +v 1.424640 -0.15 -0.478560 +v 1.424640 -0.15 0.478560 +v 1.424640 -0.15 0.478560 +v 1.424640 -2.4 -0.478560 +v 1.424640 -2.4 0.478560 +v 1.426709 -0.084525 -0.237149 +v 1.426709 -0.084525 0.237149 +v 1.430863 -0.260025 0.744440 +v 1.430863 -0.260025 -0.744440 +v 1.437937 -0.177075 0.483027 +v 1.437937 -0.177075 -0.483027 +v 1.439025 -2.482687 0.000000 +v 1.440800 -2.463 -0.239491 +v 1.440800 -2.463 0.239491 +v 1.443756 -1.7748 -1.059553 +v 1.443756 -1.7748 1.059553 +v 1.445325 -0.084525 0.000000 +v 1.445325 -0.084525 0.000000 +v 1.459600 -2.463 0.000000 +v 1.459600 -2.463 -0.000000 +v 1.461258 -2.435437 -0.242892 +v 1.461258 -2.435437 0.242892 +v 1.461727 -0.1056 -0.242970 +v 1.461727 -0.1056 0.242970 +v 1.466456 -2.0856 -0.762958 +v 1.466456 -2.0856 0.762958 +v 1.474028 -0.2136 0.495150 +v 1.474028 -0.2136 -0.495150 +v 1.476127 -0.4632 -1.083310 +v 1.476127 -0.4632 1.083310 +v 1.477200 -0.127575 0.245542 +v 1.477200 -0.127575 -0.245542 +v 1.480325 -2.435437 0.000000 +v 1.480325 -2.435437 -0.000000 +v 1.480680 -0.15 -0.246120 +v 1.480680 -0.15 0.246120 +v 1.480680 -0.15 0.246120 +v 1.480680 -0.15 -0.246120 +v 1.480680 -2.4 -0.246120 +v 1.480680 -2.4 0.246120 +v 1.480800 -0.1056 0.000000 +v 1.480800 -0.1056 0.000000 +v 1.491372 -0.3168 -0.775921 +v 1.491372 -0.3168 0.775921 +v 1.492110 -1.621875 -1.095040 +v 1.492110 -1.621875 1.095040 +v 1.494500 -0.177075 0.248417 +v 1.494500 -0.177075 -0.248417 +v 1.495635 -2.242575 -0.502408 +v 1.495635 -2.242575 0.502408 +v 1.496475 -0.127575 0.000000 +v 1.496475 -0.127575 0.000000 +v 1.500000 -0.15 0.000000 +v 1.500000 -0.15 0.000000 +v 1.500000 -2.4 0.000000 +v 1.500000 -2.4 0.000000 +v 1.514000 -0.177075 -0.000000 +v 1.514000 -0.177075 0.000000 +v 1.527214 -0.260025 -0.513016 +v 1.527214 -0.260025 0.513016 +v 1.528968 -1.929525 -0.795481 +v 1.528968 -1.929525 0.795481 +v 1.531158 -0.553725 -1.123697 +v 1.531158 -0.553725 1.123697 +v 1.532010 -0.2136 0.254652 +v 1.532010 -0.2136 -0.254652 +v 1.534395 -1.4712 -1.126072 +v 1.534395 -1.4712 1.126072 +v 1.552000 -0.2136 0.000000 +v 1.552000 -0.2136 0.000000 +v 1.554467 -2.242575 -0.258385 +v 1.554467 -2.242575 0.258385 +v 1.557220 -0.384375 -0.810180 +v 1.557220 -0.384375 0.810180 +v 1.565204 -2.0856 -0.525778 +v 1.565204 -2.0856 0.525778 +v 1.569396 -1.323225 -1.151759 +v 1.569396 -1.323225 1.151759 +v 1.574750 -2.242575 0.000000 +v 1.574750 -2.242575 0.000000 +v 1.576477 -0.6564 -1.156956 +v 1.576477 -0.6564 1.156956 +v 1.587289 -0.260025 0.263841 +v 1.587289 -0.260025 -0.263841 +v 1.587475 -1.7748 -0.825921 +v 1.587475 -1.7748 0.825921 +v 1.591798 -0.3168 -0.534711 +v 1.591798 -0.3168 0.534711 +v 1.595900 -1.1784 -1.171210 +v 1.595900 -1.1784 1.171210 +v 1.607230 -0.771675 -1.179525 +v 1.607230 -0.771675 1.179525 +v 1.608000 -0.260025 0.000000 +v 1.608000 -0.260025 0.000000 +v 1.612693 -1.037175 -1.183534 +v 1.612693 -1.037175 1.183534 +v 1.618560 -0.9 -1.187840 +v 1.618560 -0.9 -1.187840 +v 1.618560 -0.9 1.187840 +v 1.618560 -0.9 1.187840 +v 1.623068 -0.4632 -0.844439 +v 1.623068 -0.4632 0.844439 +v 1.626774 -2.0856 -0.270404 +v 1.626774 -2.0856 0.270404 +v 1.631925 -1.929525 -0.548190 +v 1.631925 -1.929525 0.548190 +v 1.640643 -1.621875 -0.853583 +v 1.640643 -1.621875 0.853583 +v 1.648000 -2.0856 0.000000 +v 1.648000 -2.0856 -0.000000 +v 1.654413 -0.3168 -0.274998 +v 1.654413 -0.3168 0.274998 +v 1.662080 -0.384375 -0.558320 +v 1.662080 -0.384375 0.558320 +v 1.676000 -0.3168 0.000000 +v 1.676000 -0.3168 0.000000 +v 1.683577 -0.553725 -0.875920 +v 1.683577 -0.553725 0.875920 +v 1.687137 -1.4712 -0.877772 +v 1.687137 -1.4712 0.877772 +v 1.694372 -1.7748 -0.569167 +v 1.694372 -1.7748 0.569167 +v 1.696119 -1.929525 -0.281930 +v 1.696119 -1.929525 0.281930 +v 1.700000 -0.6 0.000000 +v 1.700000 -0.6 0.000000 +v 1.700000 -0.6231 0.178200 +v 1.700000 -0.6231 -0.178200 +v 1.700000 -0.6858 -0.316800 +v 1.700000 -0.6858 0.316800 +v 1.700000 -0.7782 0.415800 +v 1.700000 -0.7782 -0.415800 +v 1.700000 -0.8904 -0.475200 +v 1.700000 -0.8904 0.475200 +v 1.700000 -1.0125 -0.495000 +v 1.700000 -1.0125 0.495000 +v 1.700000 -1.1346 -0.475200 +v 1.700000 -1.1346 0.475200 +v 1.700000 -1.2468 0.415800 +v 1.700000 -1.2468 -0.415800 +v 1.700000 -1.3392 -0.316800 +v 1.700000 -1.3392 0.316800 +v 1.700000 -1.4019 0.178200 +v 1.700000 -1.4019 -0.178200 +v 1.700000 -1.425 0.000000 +v 1.700000 -1.425 0.000000 +v 1.718250 -1.929525 0.000000 +v 1.718250 -1.929525 0.000000 +v 1.725622 -1.323225 -0.897795 +v 1.725622 -1.323225 0.897795 +v 1.727460 -0.384375 -0.287140 +v 1.727460 -0.384375 0.287140 +v 1.732362 -0.4632 -0.581929 +v 1.732362 -0.4632 0.581929 +v 1.733408 -0.6564 -0.901846 +v 1.733408 -0.6564 0.901846 +v 1.750000 -0.384375 0.000000 +v 1.750000 -0.384375 0.000000 +v 1.751120 -1.621875 -0.588230 +v 1.751120 -1.621875 0.588230 +v 1.754764 -1.1784 -0.912957 +v 1.754764 -1.1784 0.912957 +v 1.761022 -1.7748 -0.292719 +v 1.761022 -1.7748 0.292719 +v 1.767222 -0.771675 -0.919439 +v 1.767222 -0.771675 0.919439 +v 1.773229 -1.037175 -0.922564 +v 1.773229 -1.037175 0.922564 +v 1.779680 -0.9 -0.925920 +v 1.779680 -0.9 -0.925920 +v 1.779680 -0.9 0.925920 +v 1.779680 -0.9 0.925920 +v 1.784000 -1.7748 0.000000 +v 1.784000 -1.7748 0.000000 +v 1.796946 -0.553725 -0.603624 +v 1.796946 -0.553725 0.603624 +v 1.800507 -0.4632 -0.299282 +v 1.800507 -0.4632 0.299282 +v 1.800745 -1.4712 -0.604900 +v 1.800745 -1.4712 0.604900 +v 1.820003 -1.621875 -0.302523 +v 1.820003 -1.621875 0.302522 +v 1.824000 -0.4632 0.000000 +v 1.824000 -0.4632 0.000000 +v 1.841822 -1.323225 -0.618698 +v 1.841822 -1.323225 0.618698 +v 1.843750 -1.621875 0.000000 +v 1.843750 -1.621875 -0.000000 +v 1.850132 -0.6564 -0.621490 +v 1.850132 -0.6564 0.621490 +v 1.867631 -0.553725 -0.310439 +v 1.867631 -0.553725 0.310439 +v 1.871580 -1.4712 -0.311096 +v 1.871580 -1.4712 0.311096 +v 1.872927 -1.1784 -0.629147 +v 1.872927 -1.1784 0.629147 +v 1.886223 -0.771675 -0.633613 +v 1.886223 -0.771675 0.633613 +v 1.892000 -0.553725 0.000000 +v 1.892000 -0.553725 -0.000000 +v 1.892634 -1.037175 -0.635767 +v 1.892634 -1.037175 0.635767 +v 1.896000 -1.4712 0.000000 +v 1.896000 -1.4712 0.000000 +v 1.899520 -0.9 -0.638080 +v 1.899520 -0.9 -0.638080 +v 1.899520 -0.9 0.638080 +v 1.899520 -0.9 0.638080 +v 1.914272 -1.323225 -0.318192 +v 1.914272 -1.323225 0.318192 +v 1.922910 -0.6564 -0.319628 +v 1.922910 -0.6564 0.319628 +v 1.935900 -1.4442 0.000000 +v 1.935900 -1.4442 0.000000 +v 1.939250 -1.323225 0.000000 +v 1.939250 -1.323225 -0.000000 +v 1.939394 -1.423221 -0.175100 +v 1.939394 -1.423221 0.175100 +v 1.946601 -1.1784 -0.323566 +v 1.946601 -1.1784 0.323566 +v 1.948000 -0.6564 0.000000 +v 1.948000 -0.6564 -0.000000 +v 1.948879 -1.366278 -0.311290 +v 1.948879 -1.366278 0.311290 +v 1.960420 -0.771675 -0.325863 +v 1.960420 -0.771675 0.325863 +v 1.962857 -1.282362 -0.408568 +v 1.962857 -1.282362 0.408568 +v 1.967083 -1.037175 -0.326970 +v 1.967083 -1.037175 0.326970 +v 1.972000 -1.1784 0.000000 +v 1.972000 -1.1784 0.000000 +v 1.974240 -0.9 -0.328160 +v 1.974240 -0.9 0.328160 +v 1.974240 -0.9 0.328160 +v 1.979830 -1.180464 -0.466934 +v 1.979830 -1.180464 0.466934 +v 1.986000 -0.771675 0.000000 +v 1.986000 -0.771675 -0.000000 +v 1.992750 -1.037175 0.000000 +v 1.992750 -1.037175 0.000000 +v 1.998300 -1.069575 -0.486390 +v 1.998300 -1.069575 0.486390 +v 2.000000 -0.9 0.000000 +v 2.000000 -0.9 0.000000 +v 2.016770 -0.958686 -0.466934 +v 2.016770 -0.958686 0.466934 +v 2.033743 -0.856788 -0.408568 +v 2.033743 -0.856788 0.408568 +v 2.047721 -0.772872 0.311290 +v 2.047721 -0.772872 -0.311290 +v 2.057206 -0.715929 0.175100 +v 2.057206 -0.715929 -0.175100 +v 2.060700 -0.69495 0.000000 +v 2.060700 -0.69495 0.000000 +v 2.111200 -1.4976 0.000000 +v 2.111200 -1.4976 0.000000 +v 2.116979 -1.47912 -0.166687 +v 2.116979 -1.47912 0.166687 +v 2.132666 -1.42896 -0.296333 +v 2.132666 -1.42896 0.296333 +v 2.155782 -1.35504 -0.388937 +v 2.155782 -1.35504 0.388937 +v 2.183853 -1.26528 -0.444499 +v 2.183853 -1.26528 0.444499 +v 2.214400 -1.1676 -0.463020 +v 2.214400 -1.1676 0.463020 +v 2.237300 -1.5789 0.000000 +v 2.237300 -1.5789 0.000000 +v 2.244457 -1.563171 -0.154289 +v 2.244457 -1.563171 0.154289 +v 2.244947 -1.06992 -0.444499 +v 2.244947 -1.06992 0.444499 +v 2.263882 -1.520478 -0.274291 +v 2.263882 -1.520478 0.274291 +v 2.273018 -0.98016 -0.388937 +v 2.273018 -0.98016 0.388937 +v 2.292510 -1.457562 -0.360007 +v 2.292510 -1.457562 0.360007 +v 2.296134 -0.90624 -0.296333 +v 2.296134 -0.90624 0.296333 +v 2.311821 -0.85608 -0.166687 +v 2.311821 -0.85608 0.166687 +v 2.317600 -0.8376 0.000000 +v 2.317600 -0.8376 0.000000 +v 2.325600 -1.6818 0.000000 +v 2.325600 -1.6818 0.000000 +v 2.327271 -1.381164 -0.411437 +v 2.327271 -1.381164 0.411437 +v 2.333530 -1.668948 -0.139234 +v 2.333530 -1.668948 0.139234 +v 2.355053 -1.634064 -0.247526 +v 2.355053 -1.634064 0.247526 +v 2.365100 -1.298025 -0.428580 +v 2.365100 -1.298025 0.428580 +v 2.386771 -1.582656 -0.324878 +v 2.386771 -1.582656 0.324878 +v 2.387500 -1.8 0.000000 +v 2.387500 -1.8 0.000000 +v 2.395900 -1.790025 0.122850 +v 2.395900 -1.790025 -0.122850 +v 2.402929 -1.214886 -0.411437 +v 2.402929 -1.214886 0.411437 +v 2.418700 -1.76295 -0.218400 +v 2.418700 -1.76295 0.218400 +v 2.425286 -1.520232 -0.371290 +v 2.425286 -1.520232 0.371290 +v 2.434400 -1.9272 0.000000 +v 2.434400 -1.9272 0.000000 +v 2.437690 -1.138488 -0.360007 +v 2.437690 -1.138488 0.360007 +v 2.443270 -1.919976 0.106466 +v 2.443270 -1.919976 -0.106466 +v 2.452300 -1.72305 -0.286650 +v 2.452300 -1.72305 0.286650 +v 2.466318 -1.075572 -0.274291 +v 2.466318 -1.075572 0.274291 +v 2.467200 -1.4523 -0.386760 +v 2.467200 -1.4523 0.386760 +v 2.467347 -1.900368 0.189274 +v 2.467347 -1.900368 -0.189274 +v 2.477700 -2.0571 0.000000 +v 2.477700 -2.0571 0.000000 +v 2.485743 -1.032879 -0.154289 +v 2.485743 -1.032879 0.154289 +v 2.487343 -2.052375 -0.091411 +v 2.487343 -2.052375 0.091411 +v 2.492900 -1.01715 0.000000 +v 2.492900 -1.01715 0.000000 +v 2.493100 -1.6746 -0.327600 +v 2.493100 -1.6746 0.327600 +v 2.502829 -1.871472 0.248422 +v 2.502829 -1.871472 -0.248422 +v 2.509114 -1.384368 -0.371290 +v 2.509114 -1.384368 0.371290 +v 2.513518 -2.03955 0.162509 +v 2.513518 -2.03955 -0.162509 +v 2.528800 -2.1834 0.000000 +v 2.537500 -1.621875 -0.341250 +v 2.537500 -1.621875 0.341250 +v 2.539821 -2.180796 -0.079013 +v 2.539821 -2.180796 0.079013 +v 2.545914 -1.836384 -0.283910 +v 2.545914 -1.836384 0.283910 +v 2.547629 -1.321944 -0.324878 +v 2.547629 -1.321944 0.324878 +v 2.552090 -2.02065 -0.213293 +v 2.552090 -2.02065 0.213293 +v 2.569734 -2.173728 -0.140467 +v 2.569734 -2.173728 0.140467 +v 2.579347 -1.270536 -0.247526 +v 2.579347 -1.270536 0.247526 +v 2.581900 -1.56915 -0.327600 +v 2.581900 -1.56915 0.327600 +v 2.592800 -1.7982 -0.295740 +v 2.592800 -1.7982 0.295740 +v 2.598929 -1.9977 -0.243763 +v 2.598929 -1.9977 0.243763 +v 2.599100 -2.2998 0.000000 +v 2.599100 -2.2998 0.000000 +v 2.600870 -1.235652 -0.139234 +v 2.600870 -1.235652 0.139234 +v 2.608800 -1.2228 0.000000 +v 2.608800 -1.2228 0.000000 +v 2.612406 -2.298813 0.070600 +v 2.612406 -2.298813 -0.070600 +v 2.613818 -2.163312 -0.184363 +v 2.613818 -2.163312 0.184363 +v 2.622700 -1.5207 -0.286650 +v 2.622700 -1.5207 0.286650 +v 2.639686 -1.760016 -0.283910 +v 2.639686 -1.760016 0.283910 +v 2.648521 -2.296134 0.125510 +v 2.648521 -2.296134 -0.125510 +v 2.649900 -1.972725 0.253920 +v 2.649900 -1.972725 -0.253920 +v 2.656300 -1.4808 -0.218400 +v 2.656300 -1.4808 0.218400 +v 2.667347 -2.150664 -0.210701 +v 2.667347 -2.150664 0.210701 +v 2.679100 -1.453725 0.122850 +v 2.679100 -1.453725 -0.122850 +v 2.682771 -1.724928 0.248422 +v 2.682771 -1.724928 -0.248422 +v 2.687500 -1.44375 0.000000 +v 2.687500 -1.44375 0.000000 +v 2.700000 -2.4 0.000000 +v 2.700000 -2.4 0.000000 +v 2.700000 -2.4 0.000000 +v 2.700871 -1.94775 -0.243763 +v 2.700871 -1.94775 0.243763 +v 2.701743 -2.292186 0.164732 +v 2.701743 -2.292186 -0.164732 +v 2.716800 -2.4 0.067500 +v 2.716800 -2.4 -0.067500 +v 2.716800 -2.4 -0.067500 +v 2.716800 -2.4 0.067500 +v 2.718253 -1.696032 0.189274 +v 2.718253 -1.696032 -0.189274 +v 2.725600 -2.1369 -0.219480 +v 2.725600 -2.1369 0.219480 +v 2.729800 -2.42025 0.000000 +v 2.742330 -1.676424 0.106466 +v 2.742330 -1.676424 -0.106466 +v 2.747407 -2.420406 -0.066744 +v 2.747407 -2.420406 0.066744 +v 2.747710 -1.9248 -0.213293 +v 2.747710 -1.9248 0.213293 +v 2.751200 -1.6692 0.000000 +v 2.751200 -1.6692 0.000000 +v 2.758400 -2.436 0.000000 +v 2.762400 -2.4 0.120000 +v 2.762400 -2.4 -0.120000 +v 2.762400 -2.4 -0.120000 +v 2.762400 -2.4 0.120000 +v 2.766370 -2.287392 0.188266 +v 2.766370 -2.287392 -0.188266 +v 2.776365 -2.436302 -0.064692 +v 2.776365 -2.436302 0.064692 +v 2.783853 -2.123136 -0.210701 +v 2.783853 -2.123136 0.210701 +v 2.784600 -2.44725 0.000000 +v 2.784600 -2.44725 0.000000 +v 2.786282 -1.9059 0.162509 +v 2.786282 -1.9059 -0.162509 +v 2.795198 -2.420829 -0.118656 +v 2.795198 -2.420829 0.118656 +v 2.800000 -2.4 0.000000 +v 2.802528 -2.44768 -0.061668 +v 2.802528 -2.44768 0.061668 +v 2.807200 -2.454 0.000000 +v 2.811200 -2.4 -0.040500 +v 2.811200 -2.4 0.040500 +v 2.812457 -1.893075 0.091411 +v 2.812457 -1.893075 -0.091411 +v 2.822100 -1.88835 0.000000 +v 2.822100 -1.88835 0.000000 +v 2.824200 -2.42025 0.000000 +v 2.824200 -2.42025 0.000000 +v 2.824750 -2.454529 -0.057996 +v 2.824750 -2.454529 0.057996 +v 2.825000 -2.45625 0.000000 +v 2.825000 -2.45625 0.000000 +v 2.825126 -2.437123 -0.115008 +v 2.825126 -2.437123 0.115008 +v 2.829600 -2.4 0.157500 +v 2.829600 -2.4 -0.157500 +v 2.829600 -2.4 -0.157500 +v 2.829600 -2.4 0.157500 +v 2.836672 -2.420519 -0.041256 +v 2.836672 -2.420519 0.041256 +v 2.836700 -2.282175 0.196110 +v 2.836700 -2.282175 -0.196110 +v 2.836800 -2.454 0.000000 +v 2.836800 -2.454 0.000000 +v 2.837382 -2.110488 -0.184363 +v 2.837382 -2.110488 0.184363 +v 2.837600 -2.436 0.000000 +v 2.837600 -2.436 0.000000 +v 2.841400 -2.44725 0.000000 +v 2.841400 -2.44725 0.000000 +v 2.841600 -2.4 -0.072000 +v 2.841600 -2.4 0.072000 +v 2.841887 -2.456841 -0.054000 +v 2.841887 -2.456841 0.054000 +v 2.851189 -2.448847 -0.109632 +v 2.851189 -2.448847 0.109632 +v 2.851331 -2.436454 -0.043308 +v 2.851331 -2.436454 0.043308 +v 2.852794 -2.454605 -0.050004 +v 2.852794 -2.454605 0.050004 +v 2.856323 -2.447812 -0.046332 +v 2.856323 -2.447812 0.046332 +v 2.865626 -2.421453 -0.155736 +v 2.865626 -2.421453 0.155736 +v 2.870524 -2.42125 -0.073344 +v 2.870524 -2.42125 0.073344 +v 2.872387 -2.455966 -0.103104 +v 2.872387 -2.455966 0.103104 +v 2.881466 -2.100072 -0.140467 +v 2.881466 -2.100072 0.140467 +v 2.886400 -2.4 -0.094500 +v 2.886400 -2.4 0.094500 +v 2.887725 -2.458444 -0.096000 +v 2.887725 -2.458444 0.096000 +v 2.888602 -2.437685 -0.076992 +v 2.888602 -2.437685 0.076992 +v 2.896205 -2.456246 0.088896 +v 2.896205 -2.456246 -0.088896 +v 2.896829 -2.449338 -0.082368 +v 2.896829 -2.449338 0.082368 +v 2.896986 -2.438333 -0.150948 +v 2.896986 -2.438333 0.150948 +v 2.907030 -2.276958 0.188266 +v 2.907030 -2.276958 -0.188266 +v 2.911200 -2.4 -0.180000 +v 2.911200 -2.4 -0.180000 +v 2.911200 -2.4 0.180000 +v 2.911379 -2.093004 -0.079013 +v 2.911379 -2.093004 0.079013 +v 2.920412 -2.422328 -0.096264 +v 2.920412 -2.422328 0.096264 +v 2.922400 -2.0904 0.000000 +v 2.922899 -2.450567 -0.143892 +v 2.922899 -2.450567 0.143892 +v 2.940800 -2.4 -0.108000 +v 2.940800 -2.4 0.108000 +v 2.942589 -2.458082 -0.135324 +v 2.942589 -2.458082 0.135324 +v 2.943526 -2.439499 -0.101052 +v 2.943526 -2.439499 0.101052 +v 2.951146 -2.42221 -0.177984 +v 2.951146 -2.42221 0.177984 +v 2.955275 -2.460806 -0.126000 +v 2.955275 -2.460806 0.126000 +v 2.956523 -2.451588 -0.108108 +v 2.956523 -2.451588 0.108108 +v 2.960179 -2.458666 -0.116676 +v 2.960179 -2.458666 0.116676 +v 2.971657 -2.272164 0.164732 +v 2.971657 -2.272164 -0.164732 +v 2.980990 -2.423636 0.110016 +v 2.980990 -2.423636 -0.110016 +v 2.984243 -2.439802 -0.172512 +v 2.984243 -2.439802 0.172512 +v 3.000000 -2.4 -0.187500 +v 3.000000 -2.4 -0.187500 +v 3.000000 -2.4 -0.112500 +v 3.000000 -2.4 0.112500 +v 3.000000 -2.4 0.187500 +v 3.009977 -2.452655 -0.164448 +v 3.009977 -2.452655 0.164448 +v 3.010221 -2.441702 -0.115488 +v 3.010221 -2.441702 0.115488 +v 3.024879 -2.268216 0.125510 +v 3.024879 -2.268216 -0.125510 +v 3.027834 -2.460653 -0.154656 +v 3.027834 -2.460653 0.154656 +v 3.029007 -2.454319 -0.123552 +v 3.029007 -2.454319 0.123552 +v 3.037300 -2.463675 -0.144000 +v 3.037300 -2.463675 0.144000 +v 3.037862 -2.461603 0.133344 +v 3.037862 -2.461603 -0.133344 +v 3.044212 -2.423034 -0.185400 +v 3.044212 -2.423034 0.185400 +v 3.046912 -2.425059 0.114600 +v 3.046912 -2.425059 -0.114600 +v 3.059200 -2.4 -0.108000 +v 3.059200 -2.4 0.108000 +v 3.060994 -2.265537 0.070600 +v 3.060994 -2.265537 -0.070600 +v 3.074300 -2.26455 0.000000 +v 3.074300 -2.26455 0.000000 +v 3.079200 -2.4414 -0.179700 +v 3.079200 -2.4414 0.179700 +v 3.082800 -2.4441 -0.120300 +v 3.082800 -2.4441 0.120300 +v 3.088800 -2.4 -0.180000 +v 3.088800 -2.4 -0.180000 +v 3.088800 -2.4 0.180000 +v 3.104737 -2.454928 -0.171300 +v 3.104738 -2.454928 0.171300 +v 3.107887 -2.457291 -0.128700 +v 3.107887 -2.457291 0.128700 +v 3.112835 -2.426483 0.110016 +v 3.112835 -2.426483 -0.110016 +v 3.113600 -2.4 -0.094500 +v 3.113600 -2.4 0.094500 +v 3.120600 -2.46345 0.161100 +v 3.120600 -2.46345 -0.161100 +v 3.122400 -2.4648 0.138900 +v 3.122400 -2.4648 -0.138900 +v 3.126562 -2.466797 -0.150000 +v 3.126562 -2.466797 0.150000 +v 3.137279 -2.423859 -0.177984 +v 3.137279 -2.423859 0.177984 +v 3.155379 -2.446498 -0.115488 +v 3.155379 -2.446498 0.115488 +v 3.158400 -2.4 -0.072000 +v 3.158400 -2.4 0.072000 +v 3.170400 -2.4 -0.157500 +v 3.170400 -2.4 0.157500 +v 3.170400 -2.4 -0.157500 +v 3.173413 -2.427791 -0.096264 +v 3.173413 -2.427791 0.096264 +v 3.174157 -2.442998 -0.172512 +v 3.174157 -2.442998 0.172512 +v 3.186768 -2.460263 -0.123552 +v 3.186768 -2.460263 0.123552 +v 3.188800 -2.4 -0.040500 +v 3.188800 -2.4 0.040500 +v 3.199498 -2.457201 -0.164448 +v 3.199498 -2.457201 0.164448 +v 3.200000 -2.4 0.000000 +v 3.206938 -2.467997 0.133344 +v 3.206938 -2.467997 -0.133344 +v 3.213366 -2.466247 -0.154656 +v 3.213366 -2.466247 0.154656 +v 3.215825 -2.469919 -0.144000 +v 3.215825 -2.469919 0.144000 +v 3.222074 -2.448701 -0.101052 +v 3.222074 -2.448701 0.101052 +v 3.222799 -2.424616 -0.155736 +v 3.222799 -2.424616 0.155736 +v 3.223301 -2.428868 -0.073344 +v 3.223301 -2.428868 0.073344 +v 3.237600 -2.4 -0.120000 +v 3.237600 -2.4 0.120000 +v 3.237600 -2.4 -0.120000 +v 3.257153 -2.429599 -0.041256 +v 3.257153 -2.429599 0.041256 +v 3.259252 -2.462994 -0.108108 +v 3.259252 -2.462994 0.108108 +v 3.261414 -2.444467 -0.150948 +v 3.261414 -2.444467 0.150948 +v 3.269625 -2.429869 0.000000 +v 3.269625 -2.429869 0.000000 +v 3.276998 -2.450515 -0.076992 +v 3.276998 -2.450515 0.076992 +v 3.283200 -2.4 -0.067500 +v 3.283200 -2.4 0.067500 +v 3.283200 -2.4 -0.067500 +v 3.284621 -2.470934 -0.116676 +v 3.284621 -2.470934 0.116676 +v 3.286576 -2.459289 -0.143892 +v 3.286576 -2.459289 0.143892 +v 3.293227 -2.42524 -0.118656 +v 3.293227 -2.42524 0.118656 +v 3.297850 -2.472787 -0.126000 +v 3.297850 -2.472788 0.126000 +v 3.298611 -2.468818 -0.135324 +v 3.298611 -2.468818 0.135324 +v 3.300000 -2.4 0.000000 +v 3.300000 -2.4 0.000000 +v 3.314269 -2.451746 -0.043308 +v 3.314269 -2.451746 0.043308 +v 3.318946 -2.465243 -0.082368 +v 3.318946 -2.465243 0.082368 +v 3.328000 -2.4522 0.000000 +v 3.328000 -2.4522 0.000000 +v 3.333274 -2.445677 -0.115008 +v 3.333274 -2.445677 0.115008 +v 3.341018 -2.425663 -0.066744 +v 3.341018 -2.425663 0.066744 +v 3.348595 -2.473354 0.088896 +v 3.348595 -2.473354 -0.088896 +v 3.358286 -2.461009 -0.109632 +v 3.358286 -2.461009 0.109632 +v 3.358625 -2.425819 0.000000 +v 3.359452 -2.466769 -0.046332 +v 3.359452 -2.466769 0.046332 +v 3.365400 -2.47515 -0.096000 +v 3.365400 -2.47515 0.096000 +v 3.368813 -2.470934 -0.103104 +v 3.368813 -2.470934 0.103104 +v 3.374375 -2.467331 0.000000 +v 3.374375 -2.467331 0.000000 +v 3.382035 -2.446498 -0.064692 +v 3.382035 -2.446498 0.064692 +v 3.392006 -2.474995 -0.050004 +v 3.392006 -2.474995 0.050004 +v 3.400000 -2.4468 0.000000 +v 3.406947 -2.462176 -0.061668 +v 3.406947 -2.462176 0.061668 +v 3.408000 -2.4756 0.000000 +v 3.408000 -2.4756 0.000000 +v 3.411237 -2.476753 -0.054000 +v 3.411237 -2.476753 0.054000 +v 3.416450 -2.472371 -0.057996 +v 3.416450 -2.472371 0.057996 +v 3.424875 -2.462606 0.000000 +v 3.428125 -2.477344 0.000000 +v 3.428125 -2.477344 0.000000 +v 3.434000 -2.4729 0.000000 + +f 2909 2921 2939 +f 2939 2931 2909 +f 2869 2877 2921 +f 2921 2909 2869 +f 2819 2827 2877 +f 2877 2869 2819 +f 2737 2747 2827 +f 2827 2819 2737 +f 2669 2673 2747 +f 2747 2737 2669 +f 2567 2575 2673 +f 2673 2669 2567 +f 2476 2480 2575 +f 2575 2567 2476 +f 2358 2362 2480 +f 2480 2476 2358 +f 2158 2162 2362 +f 2362 2358 2158 +f 1715 1812 2162 +f 2162 2158 1715 +f 2901 2909 2931 +f 2931 2917 2901 +f 2863 2869 2909 +f 2909 2901 2863 +f 2813 2819 2869 +f 2869 2863 2813 +f 2729 2737 2819 +f 2819 2813 2729 +f 2663 2669 2737 +f 2737 2729 2663 +f 2561 2567 2669 +f 2669 2663 2561 +f 2468 2476 2567 +f 2567 2561 2468 +f 2350 2358 2476 +f 2476 2468 2350 +f 2152 2158 2358 +f 2358 2350 2152 +f 1717 1715 2158 +f 2158 2152 1717 +f 2903 2901 2917 +f 2917 2923 2903 +f 2865 2863 2901 +f 2901 2903 2865 +f 2815 2813 2863 +f 2863 2865 2815 +f 2733 2729 2813 +f 2813 2815 2733 +f 2665 2663 2729 +f 2729 2733 2665 +f 2564 2561 2663 +f 2663 2665 2564 +f 2473 2468 2561 +f 2561 2564 2473 +f 2354 2350 2468 +f 2468 2473 2354 +f 2155 2152 2350 +f 2350 2354 2155 +f 1927 1717 2152 +f 2152 2155 1927 +f 2911 2903 2923 +f 2923 2935 2911 +f 2875 2865 2903 +f 2903 2911 2875 +f 2823 2815 2865 +f 2865 2875 2823 +f 2741 2733 2815 +f 2815 2823 2741 +f 2671 2665 2733 +f 2733 2741 2671 +f 2571 2564 2665 +f 2665 2671 2571 +f 2478 2473 2564 +f 2564 2571 2478 +f 2360 2354 2473 +f 2473 2478 2360 +f 2160 2155 2354 +f 2354 2360 2160 +f 1718 1927 2155 +f 2155 2160 1718 +f 2929 2911 2935 +f 2935 2947 2929 +f 2881 2875 2911 +f 2911 2929 2881 +f 2829 2823 2875 +f 2875 2881 2829 +f 2751 2741 2823 +f 2823 2829 2751 +f 2677 2671 2741 +f 2741 2751 2677 +f 2577 2571 2671 +f 2671 2677 2577 +f 2482 2478 2571 +f 2571 2577 2482 +f 2364 2360 2478 +f 2478 2482 2364 +f 2164 2160 2360 +f 2360 2364 2164 +f 1842 1718 2160 +f 2160 2164 1842 +f 2945 2929 2947 +f 2947 2959 2945 +f 2897 2881 2929 +f 2929 2945 2897 +f 2835 2829 2881 +f 2881 2897 2835 +f 2761 2751 2829 +f 2829 2835 2761 +f 2679 2677 2751 +f 2751 2761 2679 +f 2579 2577 2677 +f 2677 2679 2579 +f 2486 2482 2577 +f 2577 2579 2486 +f 2368 2364 2482 +f 2482 2486 2368 +f 2172 2164 2364 +f 2364 2368 2172 +f 1725 1842 2164 +f 2164 2172 1725 +f 2965 2945 2959 +f 2959 2981 2965 +f 2907 2897 2945 +f 2945 2965 2907 +f 2845 2835 2897 +f 2897 2907 2845 +f 2769 2761 2835 +f 2835 2845 2769 +f 2685 2679 2761 +f 2761 2769 2685 +f 2587 2579 2679 +f 2679 2685 2587 +f 2491 2486 2579 +f 2579 2587 2491 +f 2370 2368 2486 +f 2486 2491 2370 +f 2174 2172 2368 +f 2368 2370 2174 +f 1834 1725 2172 +f 2172 2174 1834 +f 2982 2965 2981 +f 2981 2988 2982 +f 2933 2907 2965 +f 2965 2982 2933 +f 2855 2845 2907 +f 2907 2933 2855 +f 2779 2769 2845 +f 2845 2855 2779 +f 2691 2685 2769 +f 2769 2779 2691 +f 2595 2587 2685 +f 2685 2691 2595 +f 2500 2491 2587 +f 2587 2595 2500 +f 2374 2370 2491 +f 2491 2500 2374 +f 2178 2174 2370 +f 2370 2374 2178 +f 1716 1834 2174 +f 2174 2178 1716 +f 2990 2982 2988 +f 2988 3002 2990 +f 2949 2933 2982 +f 2982 2990 2949 +f 2871 2855 2933 +f 2933 2949 2871 +f 2791 2779 2855 +f 2855 2871 2791 +f 2699 2691 2779 +f 2779 2791 2699 +f 2601 2595 2691 +f 2691 2699 2601 +f 2506 2500 2595 +f 2595 2601 2506 +f 2378 2374 2500 +f 2500 2506 2378 +f 2180 2178 2374 +f 2374 2378 2180 +f 1714 1716 2178 +f 2178 2180 1714 +f 3008 2990 3002 +f 3002 3024 3008 +f 2973 2949 2990 +f 2990 3008 2973 +f 2889 2871 2949 +f 2949 2973 2889 +f 2805 2791 2871 +f 2871 2889 2805 +f 2711 2699 2791 +f 2791 2805 2711 +f 2611 2601 2699 +f 2699 2711 2611 +f 2521 2506 2601 +f 2601 2611 2521 +f 2387 2378 2506 +f 2506 2521 2387 +f 2191 2180 2378 +f 2378 2387 2191 +f 1810 1714 2180 +f 2180 2191 1810 +f 1464 1460 1813 +f 1813 1821 1464 +f 1264 1260 1460 +f 1460 1464 1264 +f 1146 1142 1260 +f 1260 1264 1146 +f 1055 1047 1142 +f 1142 1146 1055 +f 953 949 1047 +f 1047 1055 953 +f 885 875 949 +f 949 953 885 +f 803 795 875 +f 875 885 803 +f 753 745 795 +f 795 803 753 +f 713 701 745 +f 745 753 713 +f 691 683 701 +f 701 713 691 +f 1470 1464 1821 +f 1821 1829 1470 +f 1272 1264 1464 +f 1464 1470 1272 +f 1154 1146 1264 +f 1264 1272 1154 +f 1061 1055 1146 +f 1146 1154 1061 +f 959 953 1055 +f 1055 1061 959 +f 893 885 953 +f 953 959 893 +f 809 803 885 +f 885 893 809 +f 759 753 803 +f 803 809 759 +f 721 713 753 +f 753 759 721 +f 705 691 713 +f 713 721 705 +f 1469 1470 1829 +f 1829 1835 1469 +f 1268 1272 1470 +f 1470 1469 1268 +f 1151 1154 1272 +f 1272 1268 1151 +f 1060 1061 1154 +f 1154 1151 1060 +f 957 959 1061 +f 1061 1060 957 +f 889 893 959 +f 959 957 889 +f 807 809 893 +f 893 889 807 +f 757 759 809 +f 809 807 757 +f 719 721 759 +f 759 757 719 +f 699 705 721 +f 721 719 699 +f 1462 1469 1835 +f 1835 1839 1462 +f 1262 1268 1469 +f 1469 1462 1262 +f 1144 1151 1268 +f 1268 1262 1144 +f 1051 1060 1151 +f 1151 1144 1051 +f 951 957 1060 +f 1060 1051 951 +f 881 889 957 +f 957 951 881 +f 799 807 889 +f 889 881 799 +f 747 757 807 +f 807 799 747 +f 711 719 757 +f 757 747 711 +f 687 699 719 +f 719 711 687 +f 1458 1462 1839 +f 1839 1843 1458 +f 1258 1262 1462 +f 1462 1458 1258 +f 1140 1144 1262 +f 1262 1258 1140 +f 1045 1051 1144 +f 1144 1140 1045 +f 945 951 1051 +f 1051 1045 945 +f 871 881 951 +f 951 945 871 +f 793 799 881 +f 881 871 793 +f 741 747 799 +f 799 793 741 +f 693 711 747 +f 747 741 693 +f 675 687 711 +f 711 693 675 +f 1450 1458 1843 +f 1843 1838 1450 +f 1254 1258 1458 +f 1458 1450 1254 +f 1136 1140 1258 +f 1258 1254 1136 +f 1043 1045 1140 +f 1140 1136 1043 +f 943 945 1045 +f 1045 1043 943 +f 861 871 945 +f 945 943 861 +f 787 793 871 +f 871 861 787 +f 725 741 793 +f 793 787 725 +f 677 693 741 +f 741 725 677 +f 663 675 693 +f 693 677 663 +f 1448 1450 1838 +f 1838 1834 1448 +f 1252 1254 1450 +f 1450 1448 1252 +f 1133 1136 1254 +f 1254 1252 1133 +f 1035 1043 1136 +f 1136 1133 1035 +f 937 943 1043 +f 1043 1035 937 +f 853 861 943 +f 943 937 853 +f 777 787 861 +f 861 853 777 +f 715 725 787 +f 787 777 715 +f 657 677 725 +f 725 715 657 +f 642 663 677 +f 677 657 642 +f 1444 1448 1834 +f 1834 1828 1444 +f 1248 1252 1448 +f 1448 1444 1248 +f 1122 1133 1252 +f 1252 1248 1122 +f 1027 1035 1133 +f 1133 1122 1027 +f 931 937 1035 +f 1035 1027 931 +f 843 853 937 +f 937 931 843 +f 767 777 853 +f 853 843 767 +f 689 715 777 +f 777 767 689 +f 640 657 715 +f 715 689 640 +f 634 642 657 +f 657 640 634 +f 1442 1444 1828 +f 1828 1820 1442 +f 1244 1248 1444 +f 1444 1442 1244 +f 1116 1122 1248 +f 1248 1244 1116 +f 1021 1027 1122 +f 1122 1116 1021 +f 923 931 1027 +f 1027 1021 923 +f 831 843 931 +f 931 923 831 +f 751 767 843 +f 843 831 751 +f 673 689 767 +f 767 751 673 +f 632 640 689 +f 689 673 632 +f 620 634 640 +f 640 632 620 +f 1429 1442 1820 +f 1820 1811 1429 +f 1233 1244 1442 +f 1442 1429 1233 +f 1106 1116 1244 +f 1244 1233 1106 +f 1011 1021 1116 +f 1116 1106 1011 +f 911 923 1021 +f 1021 1011 911 +f 817 831 923 +f 923 911 817 +f 733 751 831 +f 831 817 733 +f 649 673 751 +f 751 733 649 +f 614 632 673 +f 673 649 614 +f 597 620 632 +f 632 614 597 +f 714 702 684 +f 684 692 714 +f 754 746 702 +f 702 714 754 +f 804 796 746 +f 746 754 804 +f 886 876 796 +f 796 804 886 +f 954 950 876 +f 876 886 954 +f 1056 1048 950 +f 950 954 1056 +f 1147 1143 1048 +f 1048 1056 1147 +f 1265 1261 1143 +f 1143 1147 1265 +f 1465 1461 1261 +f 1261 1265 1465 +f 1915 1817 1461 +f 1461 1465 1915 +f 722 714 692 +f 692 706 722 +f 760 754 714 +f 714 722 760 +f 810 804 754 +f 754 760 810 +f 894 886 804 +f 804 810 894 +f 960 954 886 +f 886 894 960 +f 1062 1056 954 +f 954 960 1062 +f 1155 1147 1056 +f 1056 1062 1155 +f 1273 1265 1147 +f 1147 1155 1273 +f 1471 1465 1265 +f 1265 1273 1471 +f 1917 1915 1465 +f 1465 1471 1917 +f 720 722 706 +f 706 700 720 +f 758 760 722 +f 722 720 758 +f 808 810 760 +f 760 758 808 +f 890 894 810 +f 810 808 890 +f 958 960 894 +f 894 890 958 +f 1059 1062 960 +f 960 958 1059 +f 1150 1155 1062 +f 1062 1059 1150 +f 1269 1273 1155 +f 1155 1150 1269 +f 1468 1471 1273 +f 1273 1269 1468 +f 1697 1917 1471 +f 1471 1468 1697 +f 712 720 700 +f 700 688 712 +f 748 758 720 +f 720 712 748 +f 800 808 758 +f 758 748 800 +f 882 890 808 +f 808 800 882 +f 952 958 890 +f 890 882 952 +f 1052 1059 958 +f 958 952 1052 +f 1145 1150 1059 +f 1059 1052 1145 +f 1263 1269 1150 +f 1150 1145 1263 +f 1463 1468 1269 +f 1269 1263 1463 +f 1919 1697 1468 +f 1468 1463 1919 +f 694 712 688 +f 688 676 694 +f 742 748 712 +f 712 694 742 +f 794 800 748 +f 748 742 794 +f 872 882 800 +f 800 794 872 +f 946 952 882 +f 882 872 946 +f 1046 1052 952 +f 952 946 1046 +f 1141 1145 1052 +f 1052 1046 1141 +f 1259 1263 1145 +f 1145 1141 1259 +f 1459 1463 1263 +f 1263 1259 1459 +f 1845 1919 1463 +f 1463 1459 1845 +f 678 694 676 +f 676 664 678 +f 726 742 694 +f 694 678 726 +f 788 794 742 +f 742 726 788 +f 862 872 794 +f 794 788 862 +f 944 946 872 +f 872 862 944 +f 1044 1046 946 +f 946 944 1044 +f 1137 1141 1046 +f 1046 1044 1137 +f 1255 1259 1141 +f 1141 1137 1255 +f 1451 1459 1259 +f 1259 1255 1451 +f 1898 1845 1459 +f 1459 1451 1898 +f 658 678 664 +f 664 642 658 +f 716 726 678 +f 678 658 716 +f 778 788 726 +f 726 716 778 +f 854 862 788 +f 788 778 854 +f 938 944 862 +f 862 854 938 +f 1036 1044 944 +f 944 938 1036 +f 1132 1137 1044 +f 1044 1036 1132 +f 1253 1255 1137 +f 1137 1132 1253 +f 1449 1451 1255 +f 1255 1253 1449 +f 1837 1898 1451 +f 1451 1449 1837 +f 641 658 642 +f 642 635 641 +f 690 716 658 +f 658 641 690 +f 768 778 716 +f 716 690 768 +f 844 854 778 +f 778 768 844 +f 932 938 854 +f 854 844 932 +f 1028 1036 938 +f 938 932 1028 +f 1123 1132 1036 +f 1036 1028 1123 +f 1249 1253 1132 +f 1132 1123 1249 +f 1445 1449 1253 +f 1253 1249 1445 +f 1918 1837 1449 +f 1449 1445 1918 +f 633 641 635 +f 635 621 633 +f 674 690 641 +f 641 633 674 +f 752 768 690 +f 690 674 752 +f 832 844 768 +f 768 752 832 +f 924 932 844 +f 844 832 924 +f 1022 1028 932 +f 932 924 1022 +f 1117 1123 1028 +f 1028 1022 1117 +f 1245 1249 1123 +f 1123 1117 1245 +f 1443 1445 1249 +f 1249 1245 1443 +f 1916 1918 1445 +f 1445 1443 1916 +f 616 633 621 +f 621 600 616 +f 654 674 633 +f 633 616 654 +f 737 752 674 +f 674 654 737 +f 822 832 752 +f 752 737 822 +f 914 924 832 +f 832 822 914 +f 1014 1022 924 +f 924 914 1014 +f 1104 1117 1022 +f 1022 1014 1104 +f 1237 1245 1117 +f 1117 1104 1237 +f 1433 1443 1245 +f 1245 1237 1433 +f 1819 1916 1443 +f 1443 1433 1819 +f 2159 2163 1816 +f 1816 1822 2159 +f 2359 2363 2163 +f 2163 2159 2359 +f 2477 2481 2363 +f 2363 2359 2477 +f 2568 2576 2481 +f 2481 2477 2568 +f 2670 2674 2576 +f 2576 2568 2670 +f 2738 2748 2674 +f 2674 2670 2738 +f 2820 2828 2748 +f 2748 2738 2820 +f 2870 2878 2828 +f 2828 2820 2870 +f 2910 2922 2878 +f 2878 2870 2910 +f 2932 2940 2922 +f 2922 2910 2932 +f 2153 2159 1822 +f 1822 1830 2153 +f 2351 2359 2159 +f 2159 2153 2351 +f 2469 2477 2359 +f 2359 2351 2469 +f 2562 2568 2477 +f 2477 2469 2562 +f 2664 2670 2568 +f 2568 2562 2664 +f 2730 2738 2670 +f 2670 2664 2730 +f 2814 2820 2738 +f 2738 2730 2814 +f 2864 2870 2820 +f 2820 2814 2864 +f 2902 2910 2870 +f 2870 2864 2902 +f 2918 2932 2910 +f 2910 2902 2918 +f 2154 2153 1830 +f 1830 1836 2154 +f 2355 2351 2153 +f 2153 2154 2355 +f 2472 2469 2351 +f 2351 2355 2472 +f 2563 2562 2469 +f 2469 2472 2563 +f 2666 2664 2562 +f 2562 2563 2666 +f 2734 2730 2664 +f 2664 2666 2734 +f 2816 2814 2730 +f 2730 2734 2816 +f 2866 2864 2814 +f 2814 2816 2866 +f 2904 2902 2864 +f 2864 2866 2904 +f 2924 2918 2902 +f 2902 2904 2924 +f 2161 2154 1836 +f 1836 1840 2161 +f 2361 2355 2154 +f 2154 2161 2361 +f 2479 2472 2355 +f 2355 2361 2479 +f 2572 2563 2472 +f 2472 2479 2572 +f 2672 2666 2563 +f 2563 2572 2672 +f 2742 2734 2666 +f 2666 2672 2742 +f 2824 2816 2734 +f 2734 2742 2824 +f 2876 2866 2816 +f 2816 2824 2876 +f 2912 2904 2866 +f 2866 2876 2912 +f 2936 2924 2904 +f 2904 2912 2936 +f 2165 2161 1840 +f 1840 1844 2165 +f 2365 2361 2161 +f 2161 2165 2365 +f 2483 2479 2361 +f 2361 2365 2483 +f 2578 2572 2479 +f 2479 2483 2578 +f 2678 2672 2572 +f 2572 2578 2678 +f 2752 2742 2672 +f 2672 2678 2752 +f 2830 2824 2742 +f 2742 2752 2830 +f 2882 2876 2824 +f 2824 2830 2882 +f 2930 2912 2876 +f 2876 2882 2930 +f 2948 2936 2912 +f 2912 2930 2948 +f 2173 2165 1844 +f 1844 1841 2173 +f 2369 2365 2165 +f 2165 2173 2369 +f 2487 2483 2365 +f 2365 2369 2487 +f 2580 2578 2483 +f 2483 2487 2580 +f 2680 2678 2578 +f 2578 2580 2680 +f 2762 2752 2678 +f 2678 2680 2762 +f 2836 2830 2752 +f 2752 2762 2836 +f 2898 2882 2830 +f 2830 2836 2898 +f 2946 2930 2882 +f 2882 2898 2946 +f 2960 2948 2930 +f 2930 2946 2960 +f 2175 2173 1841 +f 1841 1837 2175 +f 2371 2369 2173 +f 2173 2175 2371 +f 2490 2487 2369 +f 2369 2371 2490 +f 2588 2580 2487 +f 2487 2490 2588 +f 2686 2680 2580 +f 2580 2588 2686 +f 2770 2762 2680 +f 2680 2686 2770 +f 2846 2836 2762 +f 2762 2770 2846 +f 2908 2898 2836 +f 2836 2846 2908 +f 2966 2946 2898 +f 2898 2908 2966 +f 2981 2960 2946 +f 2946 2966 2981 +f 2179 2175 1837 +f 1837 1831 2179 +f 2375 2371 2175 +f 2175 2179 2375 +f 2501 2490 2371 +f 2371 2375 2501 +f 2596 2588 2490 +f 2490 2501 2596 +f 2692 2686 2588 +f 2588 2596 2692 +f 2780 2770 2686 +f 2686 2692 2780 +f 2856 2846 2770 +f 2770 2780 2856 +f 2934 2908 2846 +f 2846 2856 2934 +f 2983 2966 2908 +f 2908 2934 2983 +f 2989 2981 2966 +f 2966 2983 2989 +f 2181 2179 1831 +f 1831 1823 2181 +f 2379 2375 2179 +f 2179 2181 2379 +f 2507 2501 2375 +f 2375 2379 2507 +f 2602 2596 2501 +f 2501 2507 2602 +f 2700 2692 2596 +f 2596 2602 2700 +f 2792 2780 2692 +f 2692 2700 2792 +f 2872 2856 2780 +f 2780 2792 2872 +f 2950 2934 2856 +f 2856 2872 2950 +f 2991 2983 2934 +f 2934 2950 2991 +f 3003 2989 2983 +f 2983 2991 3003 +f 2194 2181 1823 +f 1823 1818 2194 +f 2391 2379 2181 +f 2181 2194 2391 +f 2518 2507 2379 +f 2379 2391 2518 +f 2614 2602 2507 +f 2507 2518 2614 +f 2712 2700 2602 +f 2602 2614 2712 +f 2806 2792 2700 +f 2700 2712 2806 +f 2890 2872 2792 +f 2792 2806 2890 +f 2974 2950 2872 +f 2872 2890 2974 +f 3009 2991 2950 +f 2950 2974 3009 +f 3025 3003 2991 +f 2991 3009 3025 +f 3040 3008 3024 +f 3024 3048 3040 +f 3018 2973 3008 +f 3008 3040 3018 +f 2943 2889 2973 +f 2973 3018 2943 +f 2841 2805 2889 +f 2889 2943 2841 +f 2731 2711 2805 +f 2805 2841 2731 +f 2645 2611 2711 +f 2711 2731 2645 +f 2529 2521 2611 +f 2611 2645 2529 +f 2402 2387 2521 +f 2521 2529 2402 +f 2208 2191 2387 +f 2387 2402 2208 +f 1806 1810 2191 +f 2191 2208 1806 +f 3072 3040 3048 +f 3048 3078 3072 +f 3044 3018 3040 +f 3040 3072 3044 +f 2994 2943 3018 +f 3018 3044 2994 +f 2883 2841 2943 +f 2943 2994 2883 +f 2773 2731 2841 +f 2841 2883 2773 +f 2659 2645 2731 +f 2731 2773 2659 +f 2539 2529 2645 +f 2645 2659 2539 +f 2410 2402 2529 +f 2529 2539 2410 +f 2222 2208 2402 +f 2402 2410 2222 +f 1694 1806 2208 +f 2208 2222 1694 +f 3092 3072 3078 +f 3078 3116 3092 +f 3074 3044 3072 +f 3072 3092 3074 +f 3030 2994 3044 +f 3044 3074 3030 +f 2937 2883 2994 +f 2994 3030 2937 +f 2810 2773 2883 +f 2883 2937 2810 +f 2683 2659 2773 +f 2773 2810 2683 +f 2554 2539 2659 +f 2659 2683 2554 +f 2420 2410 2539 +f 2539 2554 2420 +f 2238 2222 2410 +f 2410 2420 2238 +f 1930 1694 2222 +f 2222 2238 1930 +f 3132 3092 3116 +f 3116 3142 3132 +f 3090 3074 3092 +f 3092 3132 3090 +f 3054 3030 3074 +f 3074 3090 3054 +f 2984 2937 3030 +f 3030 3054 2984 +f 2837 2810 2937 +f 2937 2984 2837 +f 2705 2683 2810 +f 2810 2837 2705 +f 2574 2554 2683 +f 2683 2705 2574 +f 2430 2420 2554 +f 2554 2574 2430 +f 2247 2238 2420 +f 2420 2430 2247 +f 1913 1930 2238 +f 2238 2247 1913 +f 3150 3132 3142 +f 3142 3156 3150 +f 3128 3090 3132 +f 3132 3150 3128 +f 3076 3054 3090 +f 3090 3128 3076 +f 3014 2984 3054 +f 3054 3076 3014 +f 2861 2837 2984 +f 2984 3014 2861 +f 2723 2705 2837 +f 2837 2861 2723 +f 2585 2574 2705 +f 2705 2723 2585 +f 2438 2430 2574 +f 2574 2585 2438 +f 2253 2247 2430 +f 2430 2438 2253 +f 1711 1913 2247 +f 2247 2253 1711 +f 3162 3150 3156 +f 3156 3172 3162 +f 3148 3128 3150 +f 3150 3162 3148 +f 3088 3076 3128 +f 3128 3148 3088 +f 3036 3014 3076 +f 3076 3088 3036 +f 2893 2861 3014 +f 3014 3036 2893 +f 2743 2723 2861 +f 2861 2893 2743 +f 2599 2585 2723 +f 2723 2743 2599 +f 2450 2438 2585 +f 2585 2599 2450 +f 2267 2253 2438 +f 2438 2450 2267 +f 1794 1711 2253 +f 2253 2267 1794 +f 3178 3162 3172 +f 3172 3184 3178 +f 3154 3148 3162 +f 3162 3178 3154 +f 3118 3088 3148 +f 3148 3154 3118 +f 3046 3036 3088 +f 3088 3118 3046 +f 2915 2893 3036 +f 3036 3046 2915 +f 2763 2743 2893 +f 2893 2915 2763 +f 2615 2599 2743 +f 2743 2763 2615 +f 2452 2450 2599 +f 2599 2615 2452 +f 2277 2267 2450 +f 2450 2452 2277 +f 1710 1794 2267 +f 2267 2277 1710 +f 3188 3178 3184 +f 3184 3200 3188 +f 3164 3154 3178 +f 3178 3188 3164 +f 3130 3118 3154 +f 3154 3164 3130 +f 3058 3046 3118 +f 3118 3130 3058 +f 2941 2915 3046 +f 3046 3058 2941 +f 2775 2763 2915 +f 2915 2941 2775 +f 2627 2615 2763 +f 2763 2775 2627 +f 2458 2452 2615 +f 2615 2627 2458 +f 2287 2277 2452 +f 2452 2458 2287 +f 1910 1710 2277 +f 2277 2287 1910 +f 3198 3188 3200 +f 3200 3209 3198 +f 3170 3164 3188 +f 3188 3198 3170 +f 3136 3130 3164 +f 3164 3170 3136 +f 3064 3058 3130 +f 3130 3136 3064 +f 2955 2941 3058 +f 3058 3064 2955 +f 2781 2775 2941 +f 2941 2955 2781 +f 2636 2627 2775 +f 2775 2781 2636 +f 2462 2458 2627 +f 2627 2636 2462 +f 2295 2287 2458 +f 2458 2462 2295 +f 1909 1910 2287 +f 2287 2295 1909 +f 3202 3198 3209 +f 3209 3213 3202 +f 3174 3170 3198 +f 3198 3202 3174 +f 3138 3136 3170 +f 3170 3174 3138 +f 3066 3064 3136 +f 3136 3138 3066 +f 2961 2955 3064 +f 3064 3066 2961 +f 2783 2781 2955 +f 2955 2961 2783 +f 2642 2636 2781 +f 2781 2783 2642 +f 2464 2462 2636 +f 2636 2642 2464 +f 2297 2295 2462 +f 2462 2464 2297 +f 1784 1909 2295 +f 2295 2297 1784 +f 1414 1429 1811 +f 1811 1807 1414 +f 1220 1233 1429 +f 1429 1414 1220 +f 1093 1106 1233 +f 1233 1220 1093 +f 977 1011 1106 +f 1106 1093 977 +f 891 911 1011 +f 1011 977 891 +f 781 817 911 +f 911 891 781 +f 679 733 817 +f 817 781 679 +f 604 649 733 +f 733 679 604 +f 571 614 649 +f 649 604 571 +f 561 597 614 +f 614 571 561 +f 1400 1414 1807 +f 1807 1804 1400 +f 1212 1220 1414 +f 1414 1400 1212 +f 1083 1093 1220 +f 1220 1212 1083 +f 963 977 1093 +f 1093 1083 963 +f 849 891 977 +f 977 963 849 +f 739 781 891 +f 891 849 739 +f 628 679 781 +f 781 739 628 +f 565 604 679 +f 679 628 565 +f 530 571 604 +f 604 565 530 +f 524 561 571 +f 571 530 524 +f 1386 1400 1804 +f 1804 1802 1386 +f 1202 1212 1400 +f 1400 1386 1202 +f 1070 1083 1212 +f 1212 1202 1070 +f 939 963 1083 +f 1083 1070 939 +f 814 849 963 +f 963 939 814 +f 685 739 849 +f 849 814 685 +f 585 628 739 +f 739 685 585 +f 528 565 628 +f 628 585 528 +f 510 530 565 +f 565 528 510 +f 508 524 530 +f 530 510 508 +f 1375 1386 1802 +f 1802 1800 1375 +f 1192 1202 1386 +f 1386 1375 1192 +f 1050 1070 1202 +f 1202 1192 1050 +f 917 939 1070 +f 1070 1050 917 +f 785 814 939 +f 939 917 785 +f 638 685 814 +f 814 785 638 +f 553 585 685 +f 685 638 553 +f 512 528 585 +f 585 553 512 +f 492 510 528 +f 528 512 492 +f 482 508 510 +f 510 492 482 +f 1369 1375 1800 +f 1800 1798 1369 +f 1184 1192 1375 +f 1375 1369 1184 +f 1037 1050 1192 +f 1192 1184 1037 +f 899 917 1050 +f 1050 1037 899 +f 761 785 917 +f 917 899 761 +f 608 638 785 +f 785 761 608 +f 526 553 638 +f 638 608 526 +f 496 512 553 +f 553 526 496 +f 454 492 512 +f 512 496 454 +f 448 482 492 +f 492 454 448 +f 1355 1369 1798 +f 1798 1795 1355 +f 1172 1184 1369 +f 1369 1355 1172 +f 1023 1037 1184 +f 1184 1172 1023 +f 879 899 1037 +f 1037 1023 879 +f 729 761 899 +f 899 879 729 +f 579 608 761 +f 761 729 579 +f 514 526 608 +f 608 579 514 +f 457 496 526 +f 526 514 457 +f 442 454 496 +f 496 457 442 +f 432 448 454 +f 454 442 432 +f 1345 1355 1795 +f 1795 1792 1345 +f 1170 1172 1355 +f 1355 1345 1170 +f 1007 1023 1172 +f 1172 1170 1007 +f 859 879 1023 +f 1023 1007 859 +f 707 729 879 +f 879 859 707 +f 563 579 729 +f 729 707 563 +f 506 514 579 +f 579 563 506 +f 450 457 514 +f 514 506 450 +f 420 442 457 +f 457 450 420 +f 412 432 442 +f 442 420 412 +f 1335 1345 1792 +f 1792 1790 1335 +f 1164 1170 1345 +f 1345 1335 1164 +f 995 1007 1170 +f 1170 1164 995 +f 847 859 1007 +f 1007 995 847 +f 681 707 859 +f 859 847 681 +f 547 563 707 +f 707 681 547 +f 494 506 563 +f 563 547 494 +f 440 450 506 +f 506 494 440 +f 410 420 450 +f 450 440 410 +f 398 412 420 +f 420 410 398 +f 1327 1335 1790 +f 1790 1788 1327 +f 1160 1164 1335 +f 1335 1327 1160 +f 988 995 1164 +f 1164 1160 988 +f 841 847 995 +f 995 988 841 +f 667 681 847 +f 847 841 667 +f 538 547 681 +f 681 667 538 +f 488 494 547 +f 547 538 488 +f 434 440 494 +f 494 488 434 +f 400 410 440 +f 440 434 400 +f 381 398 410 +f 410 400 381 +f 1324 1327 1788 +f 1788 1785 1324 +f 1156 1160 1327 +f 1327 1324 1156 +f 979 988 1160 +f 1160 1156 979 +f 837 841 988 +f 988 979 837 +f 659 667 841 +f 841 837 659 +f 534 538 667 +f 667 659 534 +f 484 488 538 +f 538 534 484 +f 428 434 488 +f 488 484 428 +f 395 400 434 +f 434 428 395 +f 374 381 400 +f 400 395 374 +f 572 616 600 +f 600 562 572 +f 605 654 616 +f 616 572 605 +f 680 737 654 +f 654 605 680 +f 782 822 737 +f 737 680 782 +f 892 914 822 +f 822 782 892 +f 978 1014 914 +f 914 892 978 +f 1094 1104 1014 +f 1014 978 1094 +f 1221 1237 1104 +f 1104 1094 1221 +f 1415 1433 1237 +f 1237 1221 1415 +f 1809 1819 1433 +f 1433 1415 1809 +f 531 572 562 +f 562 525 531 +f 566 605 572 +f 572 531 566 +f 629 680 605 +f 605 566 629 +f 740 782 680 +f 680 629 740 +f 850 892 782 +f 782 740 850 +f 964 978 892 +f 892 850 964 +f 1084 1094 978 +f 978 964 1084 +f 1213 1221 1094 +f 1094 1084 1213 +f 1401 1415 1221 +f 1221 1213 1401 +f 1931 1809 1415 +f 1415 1401 1931 +f 511 531 525 +f 525 509 511 +f 529 566 531 +f 531 511 529 +f 586 629 566 +f 566 529 586 +f 686 740 629 +f 629 586 686 +f 813 850 740 +f 740 686 813 +f 940 964 850 +f 850 813 940 +f 1069 1084 964 +f 964 940 1069 +f 1203 1213 1084 +f 1084 1069 1203 +f 1385 1401 1213 +f 1213 1203 1385 +f 1693 1931 1401 +f 1401 1385 1693 +f 493 511 509 +f 509 483 493 +f 513 529 511 +f 511 493 513 +f 554 586 529 +f 529 513 554 +f 639 686 586 +f 586 554 639 +f 786 813 686 +f 686 639 786 +f 918 940 813 +f 813 786 918 +f 1049 1069 940 +f 940 918 1049 +f 1193 1203 1069 +f 1069 1049 1193 +f 1376 1385 1203 +f 1203 1193 1376 +f 1712 1693 1385 +f 1385 1376 1712 +f 455 493 483 +f 483 449 455 +f 497 513 493 +f 493 455 497 +f 527 554 513 +f 513 497 527 +f 609 639 554 +f 554 527 609 +f 762 786 639 +f 639 609 762 +f 900 918 786 +f 786 762 900 +f 1038 1049 918 +f 918 900 1038 +f 1185 1193 1049 +f 1049 1038 1185 +f 1370 1376 1193 +f 1193 1185 1370 +f 1912 1712 1376 +f 1376 1370 1912 +f 443 455 449 +f 449 433 443 +f 458 497 455 +f 455 443 458 +f 515 527 497 +f 497 458 515 +f 580 609 527 +f 527 515 580 +f 730 762 609 +f 609 580 730 +f 880 900 762 +f 762 730 880 +f 1024 1038 900 +f 900 880 1024 +f 1173 1185 1038 +f 1038 1024 1173 +f 1356 1370 1185 +f 1185 1173 1356 +f 1797 1912 1370 +f 1370 1356 1797 +f 421 443 433 +f 433 413 421 +f 451 458 443 +f 443 421 451 +f 507 515 458 +f 458 451 507 +f 564 580 515 +f 515 507 564 +f 708 730 580 +f 580 564 708 +f 860 880 730 +f 730 708 860 +f 1008 1024 880 +f 880 860 1008 +f 1171 1173 1024 +f 1024 1008 1171 +f 1346 1356 1173 +f 1173 1171 1346 +f 1911 1797 1356 +f 1356 1346 1911 +f 411 421 413 +f 413 399 411 +f 441 451 421 +f 421 411 441 +f 495 507 451 +f 451 441 495 +f 548 564 507 +f 507 495 548 +f 682 708 564 +f 564 548 682 +f 848 860 708 +f 708 682 848 +f 996 1008 860 +f 860 848 996 +f 1165 1171 1008 +f 1008 996 1165 +f 1336 1346 1171 +f 1171 1165 1336 +f 1709 1911 1346 +f 1346 1336 1709 +f 401 411 399 +f 399 382 401 +f 435 441 411 +f 411 401 435 +f 489 495 441 +f 441 435 489 +f 539 548 495 +f 495 489 539 +f 668 682 548 +f 548 539 668 +f 842 848 682 +f 682 668 842 +f 987 996 848 +f 848 842 987 +f 1161 1165 996 +f 996 987 1161 +f 1328 1336 1165 +f 1165 1161 1328 +f 1708 1709 1336 +f 1336 1328 1708 +f 397 401 382 +f 382 376 397 +f 431 435 401 +f 401 397 431 +f 487 489 435 +f 435 431 487 +f 537 539 489 +f 489 487 537 +f 662 668 539 +f 539 537 662 +f 840 842 668 +f 668 662 840 +f 981 987 842 +f 842 840 981 +f 1159 1161 987 +f 987 981 1159 +f 1326 1328 1161 +f 1161 1159 1326 +f 1787 1708 1328 +f 1328 1326 1787 +f 2209 2194 1818 +f 1818 1808 2209 +f 2403 2391 2194 +f 2194 2209 2403 +f 2530 2518 2391 +f 2391 2403 2530 +f 2646 2614 2518 +f 2518 2530 2646 +f 2732 2712 2614 +f 2614 2646 2732 +f 2842 2806 2712 +f 2712 2732 2842 +f 2944 2890 2806 +f 2806 2842 2944 +f 3019 2974 2890 +f 2890 2944 3019 +f 3041 3009 2974 +f 2974 3019 3041 +f 3049 3025 3009 +f 3009 3041 3049 +f 2223 2209 1808 +f 1808 1805 2223 +f 2411 2403 2209 +f 2209 2223 2411 +f 2540 2530 2403 +f 2403 2411 2540 +f 2660 2646 2530 +f 2530 2540 2660 +f 2774 2732 2646 +f 2646 2660 2774 +f 2884 2842 2732 +f 2732 2774 2884 +f 2995 2944 2842 +f 2842 2884 2995 +f 3045 3019 2944 +f 2944 2995 3045 +f 3073 3041 3019 +f 3019 3045 3073 +f 3079 3049 3041 +f 3041 3073 3079 +f 2237 2223 1805 +f 1805 1803 2237 +f 2421 2411 2223 +f 2223 2237 2421 +f 2553 2540 2411 +f 2411 2421 2553 +f 2684 2660 2540 +f 2540 2553 2684 +f 2809 2774 2660 +f 2660 2684 2809 +f 2938 2884 2774 +f 2774 2809 2938 +f 3031 2995 2884 +f 2884 2938 3031 +f 3075 3045 2995 +f 2995 3031 3075 +f 3093 3073 3045 +f 3045 3075 3093 +f 3117 3079 3073 +f 3073 3093 3117 +f 2248 2237 1803 +f 1803 1801 2248 +f 2431 2421 2237 +f 2237 2248 2431 +f 2573 2553 2421 +f 2421 2431 2573 +f 2706 2684 2553 +f 2553 2573 2706 +f 2838 2809 2684 +f 2684 2706 2838 +f 2985 2938 2809 +f 2809 2838 2985 +f 3055 3031 2938 +f 2938 2985 3055 +f 3091 3075 3031 +f 3031 3055 3091 +f 3133 3093 3075 +f 3075 3091 3133 +f 3143 3117 3093 +f 3093 3133 3143 +f 2254 2248 1801 +f 1801 1799 2254 +f 2439 2431 2248 +f 2248 2254 2439 +f 2586 2573 2431 +f 2431 2439 2586 +f 2724 2706 2573 +f 2573 2586 2724 +f 2862 2838 2706 +f 2706 2724 2862 +f 3015 2985 2838 +f 2838 2862 3015 +f 3077 3055 2985 +f 2985 3015 3077 +f 3129 3091 3055 +f 3055 3077 3129 +f 3151 3133 3091 +f 3091 3129 3151 +f 3157 3143 3133 +f 3133 3151 3157 +f 2268 2254 1799 +f 1799 1796 2268 +f 2451 2439 2254 +f 2254 2268 2451 +f 2600 2586 2439 +f 2439 2451 2600 +f 2744 2724 2586 +f 2586 2600 2744 +f 2894 2862 2724 +f 2724 2744 2894 +f 3037 3015 2862 +f 2862 2894 3037 +f 3089 3077 3015 +f 3015 3037 3089 +f 3149 3129 3077 +f 3077 3089 3149 +f 3163 3151 3129 +f 3129 3149 3163 +f 3173 3157 3151 +f 3151 3163 3173 +f 2278 2268 1796 +f 1796 1793 2278 +f 2453 2451 2268 +f 2268 2278 2453 +f 2616 2600 2451 +f 2451 2453 2616 +f 2764 2744 2600 +f 2600 2616 2764 +f 2916 2894 2744 +f 2744 2764 2916 +f 3047 3037 2894 +f 2894 2916 3047 +f 3119 3089 3037 +f 3037 3047 3119 +f 3155 3149 3089 +f 3089 3119 3155 +f 3179 3163 3149 +f 3149 3155 3179 +f 3185 3173 3163 +f 3163 3179 3185 +f 2288 2278 1793 +f 1793 1791 2288 +f 2459 2453 2278 +f 2278 2288 2459 +f 2628 2616 2453 +f 2453 2459 2628 +f 2776 2764 2616 +f 2616 2628 2776 +f 2942 2916 2764 +f 2764 2776 2942 +f 3059 3047 2916 +f 2916 2942 3059 +f 3131 3119 3047 +f 3047 3059 3131 +f 3165 3155 3119 +f 3119 3131 3165 +f 3189 3179 3155 +f 3155 3165 3189 +f 3201 3185 3179 +f 3179 3189 3201 +f 2296 2288 1791 +f 1791 1789 2296 +f 2463 2459 2288 +f 2288 2296 2463 +f 2635 2628 2459 +f 2459 2463 2635 +f 2782 2776 2628 +f 2628 2635 2782 +f 2956 2942 2776 +f 2776 2782 2956 +f 3065 3059 2942 +f 2942 2956 3065 +f 3137 3131 3059 +f 3059 3065 3137 +f 3171 3165 3131 +f 3131 3137 3171 +f 3199 3189 3165 +f 3165 3171 3199 +f 3210 3201 3189 +f 3189 3199 3210 +f 2299 2296 1789 +f 1789 1786 2299 +f 2467 2463 2296 +f 2296 2299 2467 +f 2644 2635 2463 +f 2463 2467 2644 +f 2786 2782 2635 +f 2635 2644 2786 +f 2964 2956 2782 +f 2782 2786 2964 +f 3069 3065 2956 +f 2956 2964 3069 +f 3141 3137 3065 +f 3065 3069 3141 +f 3177 3171 3137 +f 3137 3141 3177 +f 3204 3199 3171 +f 3171 3177 3204 +f 3214 3210 3199 +f 3199 3204 3214 +f 3194 3202 3213 +f 3213 3207 3194 +f 3166 3175 3202 +f 3202 3194 3166 +f 3134 3139 3175 +f 3175 3166 3134 +f 3060 3067 3139 +f 3139 3134 3060 +f 2953 2962 3067 +f 3067 3060 2953 +f 2777 2784 2962 +f 2962 2953 2777 +f 2629 2643 2784 +f 2784 2777 2629 +f 2460 2465 2643 +f 2643 2629 2460 +f 2293 2298 2465 +f 2465 2460 2293 +f 1696 1785 2298 +f 2298 2293 1696 +f 3180 3194 3207 +f 3207 3190 3180 +f 3158 3166 3194 +f 3194 3180 3158 +f 3124 3134 3166 +f 3166 3158 3124 +f 3050 3060 3134 +f 3134 3124 3050 +f 2927 2953 3060 +f 3060 3050 2927 +f 2767 2777 2953 +f 2953 2927 2767 +f 2619 2629 2777 +f 2777 2767 2619 +f 2454 2460 2629 +f 2629 2619 2454 +f 2283 2293 2460 +f 2460 2454 2283 +f 1695 1696 2293 +f 2293 2283 1695 +f 3160 3180 3190 +f 3190 3168 3160 +f 3144 3158 3180 +f 3180 3160 3144 +f 3086 3124 3158 +f 3158 3144 3086 +f 3032 3050 3124 +f 3124 3086 3032 +f 2891 2927 3050 +f 3050 3032 2891 +f 2739 2767 2927 +f 2927 2891 2739 +f 2597 2619 2767 +f 2767 2739 2597 +f 2448 2454 2619 +f 2619 2597 2448 +f 2265 2283 2454 +f 2454 2448 2265 +f 1707 1695 2283 +f 2283 2265 1707 +f 3146 3160 3168 +f 3168 3152 3146 +f 3122 3144 3160 +f 3160 3146 3122 +f 3070 3086 3144 +f 3144 3122 3070 +f 2998 3032 3086 +f 3086 3070 2998 +f 2853 2891 3032 +f 3032 2998 2853 +f 2717 2739 2891 +f 2891 2853 2717 +f 2582 2597 2739 +f 2739 2717 2582 +f 2434 2448 2597 +f 2597 2582 2434 +f 2251 2265 2448 +f 2448 2434 2251 +f 1907 1707 2265 +f 2265 2251 1907 +f 3120 3146 3152 +f 3152 3126 3120 +f 3082 3122 3146 +f 3146 3120 3082 +f 3042 3070 3122 +f 3122 3082 3042 +f 2957 2998 3070 +f 3070 3042 2957 +f 2825 2853 2998 +f 2998 2957 2825 +f 2693 2717 2853 +f 2853 2825 2693 +f 2556 2582 2717 +f 2717 2693 2556 +f 2424 2434 2582 +f 2582 2556 2424 +f 2239 2251 2434 +f 2434 2424 2239 +f 1906 1907 2251 +f 2251 2239 1906 +f 3080 3120 3126 +f 3126 3084 3080 +f 3056 3082 3120 +f 3120 3080 3056 +f 3012 3042 3082 +f 3082 3056 3012 +f 2899 2957 3042 +f 3042 3012 2899 +f 2789 2825 2957 +f 2957 2899 2789 +f 2675 2693 2825 +f 2825 2789 2675 +f 2545 2556 2693 +f 2693 2675 2545 +f 2416 2424 2556 +f 2556 2545 2416 +f 2228 2239 2424 +f 2424 2416 2228 +f 1770 1906 2239 +f 2239 2228 1770 +f 3053 3080 3084 +f 3084 3062 3053 +f 3028 3056 3080 +f 3080 3053 3028 +f 2978 3012 3056 +f 3056 3028 2978 +f 2860 2899 3012 +f 3012 2978 2860 +f 2754 2789 2899 +f 2899 2860 2754 +f 2652 2675 2789 +f 2789 2754 2652 +f 2534 2545 2675 +f 2675 2652 2534 +f 2406 2416 2545 +f 2545 2534 2406 +f 2217 2228 2416 +f 2416 2406 2217 +f 1929 1770 2228 +f 2228 2217 1929 +f 3035 3053 3062 +f 3062 3039 3035 +f 2997 3028 3053 +f 3053 3035 2997 +f 2920 2978 3028 +f 3028 2997 2920 +f 2832 2860 2978 +f 2978 2920 2832 +f 2728 2754 2860 +f 2860 2832 2728 +f 2634 2652 2754 +f 2754 2728 2634 +f 2528 2534 2652 +f 2652 2634 2528 +f 2396 2406 2534 +f 2534 2528 2396 +f 2202 2217 2406 +f 2406 2396 2202 +f 1765 1929 2217 +f 2217 2202 1765 +f 3017 3035 3039 +f 3039 3027 3017 +f 2980 2997 3035 +f 3035 3017 2980 +f 2896 2920 2997 +f 2997 2980 2896 +f 2812 2832 2920 +f 2920 2896 2812 +f 2715 2728 2832 +f 2832 2812 2715 +f 2618 2634 2728 +f 2728 2715 2618 +f 2523 2528 2634 +f 2634 2618 2523 +f 2392 2396 2528 +f 2528 2523 2392 +f 2196 2202 2396 +f 2396 2392 2196 +f 1724 1765 2202 +f 2202 2196 1724 +f 3007 3017 3027 +f 3027 3023 3007 +f 2969 2980 3017 +f 3017 3007 2969 +f 2887 2896 2980 +f 2980 2969 2887 +f 2802 2812 2896 +f 2896 2887 2802 +f 2709 2715 2812 +f 2812 2802 2709 +f 2609 2618 2715 +f 2715 2709 2609 +f 2519 2523 2618 +f 2618 2609 2519 +f 2386 2392 2523 +f 2523 2519 2386 +f 2190 2196 2392 +f 2392 2386 2190 +f 1759 1724 2196 +f 2196 2190 1759 +f 1329 1324 1785 +f 1785 1782 1329 +f 1162 1157 1324 +f 1324 1329 1162 +f 993 982 1157 +f 1157 1162 993 +f 845 838 982 +f 982 993 845 +f 669 660 838 +f 838 845 669 +f 542 535 660 +f 660 669 542 +f 490 485 535 +f 535 542 490 +f 438 429 485 +f 485 490 438 +f 404 396 429 +f 429 438 404 +f 387 376 396 +f 396 404 387 +f 1339 1329 1782 +f 1782 1780 1339 +f 1168 1162 1329 +f 1329 1339 1168 +f 1003 993 1162 +f 1162 1168 1003 +f 855 845 993 +f 993 1003 855 +f 695 669 845 +f 845 855 695 +f 559 542 669 +f 669 695 559 +f 500 490 542 +f 542 559 500 +f 446 438 490 +f 490 500 446 +f 416 404 438 +f 438 446 416 +f 408 387 404 +f 404 416 408 +f 1357 1339 1780 +f 1780 1778 1357 +f 1174 1168 1339 +f 1339 1357 1174 +f 1025 1003 1168 +f 1168 1174 1025 +f 883 855 1003 +f 1003 1025 883 +f 731 695 855 +f 855 883 731 +f 583 559 695 +f 695 731 583 +f 516 500 559 +f 559 583 516 +f 467 446 500 +f 500 516 467 +f 444 416 446 +f 446 467 444 +f 436 408 416 +f 416 444 436 +f 1371 1357 1778 +f 1778 1776 1371 +f 1188 1174 1357 +f 1357 1371 1188 +f 1042 1025 1174 +f 1174 1188 1042 +f 905 883 1025 +f 1025 1042 905 +f 769 731 883 +f 883 905 769 +f 624 583 731 +f 731 769 624 +f 532 516 583 +f 583 624 532 +f 502 467 516 +f 516 532 502 +f 459 444 467 +f 467 502 459 +f 452 436 444 +f 444 459 452 +f 1383 1371 1776 +f 1776 1774 1383 +f 1198 1188 1371 +f 1371 1383 1198 +f 1068 1042 1188 +f 1188 1198 1068 +f 929 905 1042 +f 1042 1068 929 +f 797 769 905 +f 905 929 797 +f 665 624 769 +f 769 797 665 +f 569 532 624 +f 624 665 569 +f 520 502 532 +f 532 569 520 +f 504 459 502 +f 502 520 504 +f 498 452 459 +f 459 504 498 +f 1394 1383 1774 +f 1774 1771 1394 +f 1206 1198 1383 +f 1383 1394 1206 +f 1077 1068 1198 +f 1198 1206 1077 +f 947 929 1068 +f 1068 1077 947 +f 833 797 929 +f 929 947 833 +f 723 665 797 +f 797 833 723 +f 610 569 665 +f 665 723 610 +f 549 520 569 +f 569 610 549 +f 522 504 520 +f 520 549 522 +f 518 498 504 +f 504 522 518 +f 1407 1394 1771 +f 1771 1768 1407 +f 1216 1206 1394 +f 1394 1407 1216 +f 1090 1077 1206 +f 1206 1216 1090 +f 972 947 1077 +f 1077 1090 972 +f 870 833 947 +f 947 972 870 +f 764 723 833 +f 833 870 764 +f 646 610 723 +f 723 764 646 +f 587 549 610 +f 610 646 587 +f 556 522 549 +f 549 587 556 +f 540 518 522 +f 522 556 540 +f 1420 1407 1768 +f 1768 1764 1420 +f 1226 1216 1407 +f 1407 1420 1226 +f 1096 1090 1216 +f 1216 1226 1096 +f 990 972 1090 +f 1090 1096 990 +f 896 870 972 +f 972 990 896 +f 792 764 870 +f 870 896 792 +f 704 646 764 +f 764 792 704 +f 627 587 646 +f 646 704 627 +f 582 556 587 +f 587 627 582 +f 574 540 556 +f 556 582 574 +f 1426 1420 1764 +f 1764 1762 1426 +f 1230 1226 1420 +f 1420 1426 1230 +f 1101 1096 1226 +f 1226 1230 1101 +f 1006 990 1096 +f 1096 1101 1006 +f 907 896 990 +f 990 1006 907 +f 812 792 896 +f 896 907 812 +f 728 704 792 +f 792 812 728 +f 644 627 704 +f 704 728 644 +f 607 582 627 +f 627 644 607 +f 592 574 582 +f 582 607 592 +f 1430 1426 1762 +f 1762 1758 1430 +f 1234 1230 1426 +f 1426 1430 1234 +f 1107 1101 1230 +f 1230 1234 1107 +f 1012 1006 1101 +f 1101 1107 1012 +f 912 907 1006 +f 1006 1012 912 +f 819 812 907 +f 907 912 819 +f 738 728 812 +f 812 819 738 +f 651 644 728 +f 728 738 651 +f 618 607 644 +f 644 651 618 +f 601 592 607 +f 607 618 601 +f 405 397 376 +f 376 388 405 +f 439 430 397 +f 397 405 439 +f 491 486 430 +f 430 439 491 +f 543 536 486 +f 486 491 543 +f 670 661 536 +f 536 543 670 +f 846 839 661 +f 661 670 846 +f 994 980 839 +f 839 846 994 +f 1163 1158 980 +f 980 994 1163 +f 1330 1325 1158 +f 1158 1163 1330 +f 1926 1786 1325 +f 1325 1330 1926 +f 417 405 388 +f 388 409 417 +f 447 439 405 +f 405 417 447 +f 501 491 439 +f 439 447 501 +f 560 543 491 +f 491 501 560 +f 696 670 543 +f 543 560 696 +f 856 846 670 +f 670 696 856 +f 1004 994 846 +f 846 856 1004 +f 1169 1163 994 +f 994 1004 1169 +f 1340 1330 1163 +f 1163 1169 1340 +f 1925 1926 1330 +f 1330 1340 1925 +f 445 417 409 +f 409 437 445 +f 468 447 417 +f 417 445 468 +f 517 501 447 +f 447 468 517 +f 584 560 501 +f 501 517 584 +f 732 696 560 +f 560 584 732 +f 884 856 696 +f 696 732 884 +f 1026 1004 856 +f 856 884 1026 +f 1175 1169 1004 +f 1004 1026 1175 +f 1358 1340 1169 +f 1169 1175 1358 +f 1908 1925 1340 +f 1340 1358 1908 +f 460 445 437 +f 437 453 460 +f 503 468 445 +f 445 460 503 +f 533 517 468 +f 468 503 533 +f 625 584 517 +f 517 533 625 +f 770 732 584 +f 584 625 770 +f 906 884 732 +f 732 770 906 +f 1041 1026 884 +f 884 906 1041 +f 1189 1175 1026 +f 1026 1041 1189 +f 1372 1358 1175 +f 1175 1189 1372 +f 1706 1908 1358 +f 1358 1372 1706 +f 505 460 453 +f 453 499 505 +f 521 503 460 +f 460 505 521 +f 570 533 503 +f 503 521 570 +f 666 625 533 +f 533 570 666 +f 798 770 625 +f 625 666 798 +f 930 906 770 +f 770 798 930 +f 1067 1041 906 +f 906 930 1067 +f 1199 1189 1041 +f 1041 1067 1199 +f 1384 1372 1189 +f 1189 1199 1384 +f 1705 1706 1372 +f 1372 1384 1705 +f 523 505 499 +f 499 519 523 +f 550 521 505 +f 505 523 550 +f 611 570 521 +f 521 550 611 +f 724 666 570 +f 570 611 724 +f 834 798 666 +f 666 724 834 +f 948 930 798 +f 798 834 948 +f 1078 1067 930 +f 930 948 1078 +f 1207 1199 1067 +f 1067 1078 1207 +f 1395 1384 1199 +f 1199 1207 1395 +f 1773 1705 1384 +f 1384 1395 1773 +f 555 523 519 +f 519 541 555 +f 588 550 523 +f 523 555 588 +f 645 611 550 +f 550 588 645 +f 763 724 611 +f 611 645 763 +f 869 834 724 +f 724 763 869 +f 971 948 834 +f 834 869 971 +f 1089 1078 948 +f 948 971 1089 +f 1217 1207 1078 +f 1078 1089 1217 +f 1406 1395 1207 +f 1207 1217 1406 +f 1692 1773 1395 +f 1395 1406 1692 +f 581 555 541 +f 541 573 581 +f 626 588 555 +f 555 581 626 +f 703 645 588 +f 588 626 703 +f 791 763 645 +f 645 703 791 +f 895 869 763 +f 763 791 895 +f 989 971 869 +f 869 895 989 +f 1095 1089 971 +f 971 989 1095 +f 1227 1217 1089 +f 1089 1095 1227 +f 1421 1406 1217 +f 1217 1227 1421 +f 1766 1692 1406 +f 1406 1421 1766 +f 606 581 573 +f 573 591 606 +f 643 626 581 +f 581 606 643 +f 727 703 626 +f 626 643 727 +f 811 791 703 +f 703 727 811 +f 908 895 791 +f 791 811 908 +f 1005 989 895 +f 895 908 1005 +f 1100 1095 989 +f 989 1005 1100 +f 1231 1227 1095 +f 1095 1100 1231 +f 1427 1421 1227 +f 1227 1231 1427 +f 1897 1766 1421 +f 1421 1427 1897 +f 615 606 591 +f 591 598 615 +f 653 643 606 +f 606 615 653 +f 735 727 643 +f 643 653 735 +f 820 811 727 +f 727 735 820 +f 913 908 811 +f 811 820 913 +f 1013 1005 908 +f 908 913 1013 +f 1103 1100 1005 +f 1005 1013 1103 +f 1236 1231 1100 +f 1100 1103 1236 +f 1432 1427 1231 +f 1231 1236 1432 +f 1760 1897 1427 +f 1427 1432 1760 +f 2294 2299 1786 +f 1786 1783 2294 +f 2461 2466 2299 +f 2299 2294 2461 +f 2630 2641 2466 +f 2466 2461 2630 +f 2778 2785 2641 +f 2641 2630 2778 +f 2954 2963 2785 +f 2785 2778 2954 +f 3061 3068 2963 +f 2963 2954 3061 +f 3135 3140 3068 +f 3068 3061 3135 +f 3167 3176 3140 +f 3140 3135 3167 +f 3195 3203 3176 +f 3176 3167 3195 +f 3208 3213 3203 +f 3203 3195 3208 +f 2284 2294 1783 +f 1783 1781 2284 +f 2455 2461 2294 +f 2294 2284 2455 +f 2620 2630 2461 +f 2461 2455 2620 +f 2768 2778 2630 +f 2630 2620 2768 +f 2928 2954 2778 +f 2778 2768 2928 +f 3051 3061 2954 +f 2954 2928 3051 +f 3125 3135 3061 +f 3061 3051 3125 +f 3159 3167 3135 +f 3135 3125 3159 +f 3181 3195 3167 +f 3167 3159 3181 +f 3191 3208 3195 +f 3195 3181 3191 +f 2266 2284 1781 +f 1781 1779 2266 +f 2449 2455 2284 +f 2284 2266 2449 +f 2598 2620 2455 +f 2455 2449 2598 +f 2740 2768 2620 +f 2620 2598 2740 +f 2892 2928 2768 +f 2768 2740 2892 +f 3033 3051 2928 +f 2928 2892 3033 +f 3087 3125 3051 +f 3051 3033 3087 +f 3145 3159 3125 +f 3125 3087 3145 +f 3161 3181 3159 +f 3159 3145 3161 +f 3169 3191 3181 +f 3181 3161 3169 +f 2252 2266 1779 +f 1779 1777 2252 +f 2435 2449 2266 +f 2266 2252 2435 +f 2581 2598 2449 +f 2449 2435 2581 +f 2718 2740 2598 +f 2598 2581 2718 +f 2854 2892 2740 +f 2740 2718 2854 +f 2999 3033 2892 +f 2892 2854 2999 +f 3071 3087 3033 +f 3033 2999 3071 +f 3123 3145 3087 +f 3087 3071 3123 +f 3147 3161 3145 +f 3145 3123 3147 +f 3153 3169 3161 +f 3161 3147 3153 +f 2240 2252 1777 +f 1777 1775 2240 +f 2425 2435 2252 +f 2252 2240 2425 +f 2555 2581 2435 +f 2435 2425 2555 +f 2694 2718 2581 +f 2581 2555 2694 +f 2826 2854 2718 +f 2718 2694 2826 +f 2958 2999 2854 +f 2854 2826 2958 +f 3043 3071 2999 +f 2999 2958 3043 +f 3083 3123 3071 +f 3071 3043 3083 +f 3121 3147 3123 +f 3123 3083 3121 +f 3127 3153 3147 +f 3147 3121 3127 +f 2229 2240 1775 +f 1775 1772 2229 +f 2417 2425 2240 +f 2240 2229 2417 +f 2546 2555 2425 +f 2425 2417 2546 +f 2676 2694 2555 +f 2555 2546 2676 +f 2790 2826 2694 +f 2694 2676 2790 +f 2900 2958 2826 +f 2826 2790 2900 +f 3013 3043 2958 +f 2958 2900 3013 +f 3057 3083 3043 +f 3043 3013 3057 +f 3081 3121 3083 +f 3083 3057 3081 +f 3085 3127 3121 +f 3121 3081 3085 +f 2216 2229 1772 +f 1772 1769 2216 +f 2407 2417 2229 +f 2229 2216 2407 +f 2533 2546 2417 +f 2417 2407 2533 +f 2651 2676 2546 +f 2546 2533 2651 +f 2753 2790 2676 +f 2676 2651 2753 +f 2859 2900 2790 +f 2790 2753 2859 +f 2977 3013 2900 +f 2900 2859 2977 +f 3029 3057 3013 +f 3013 2977 3029 +f 3052 3081 3057 +f 3057 3029 3052 +f 3063 3085 3081 +f 3081 3052 3063 +f 2203 2216 1769 +f 1769 1767 2203 +f 2397 2407 2216 +f 2216 2203 2397 +f 2527 2533 2407 +f 2407 2397 2527 +f 2633 2651 2533 +f 2533 2527 2633 +f 2727 2753 2651 +f 2651 2633 2727 +f 2831 2859 2753 +f 2753 2727 2831 +f 2919 2977 2859 +f 2859 2831 2919 +f 2996 3029 2977 +f 2977 2919 2996 +f 3034 3052 3029 +f 3029 2996 3034 +f 3038 3063 3052 +f 3052 3034 3038 +f 2197 2203 1767 +f 1767 1763 2197 +f 2393 2397 2203 +f 2203 2197 2393 +f 2522 2527 2397 +f 2397 2393 2522 +f 2617 2633 2527 +f 2527 2522 2617 +f 2716 2727 2633 +f 2633 2617 2716 +f 2811 2831 2727 +f 2727 2716 2811 +f 2895 2919 2831 +f 2831 2811 2895 +f 2979 2996 2919 +f 2919 2895 2979 +f 3016 3034 2996 +f 2996 2979 3016 +f 3026 3038 3034 +f 3034 3016 3026 +f 2193 2197 1763 +f 1763 1761 2193 +f 2389 2393 2197 +f 2197 2193 2389 +f 2516 2522 2393 +f 2393 2389 2516 +f 2610 2617 2522 +f 2522 2516 2610 +f 2710 2716 2617 +f 2617 2610 2710 +f 2803 2811 2716 +f 2716 2710 2803 +f 2885 2895 2811 +f 2811 2803 2885 +f 2971 2979 2895 +f 2895 2885 2971 +f 3005 3016 2979 +f 2979 2971 3005 +f 3022 3026 3016 +f 3016 3005 3022 +f 461 545 544 +f 544 456 461 +f 463 551 545 +f 545 461 463 +f 465 557 551 +f 551 463 465 +f 469 567 557 +f 557 465 469 +f 471 575 567 +f 567 469 471 +f 473 577 575 +f 575 471 473 +f 475 589 577 +f 577 473 475 +f 477 593 589 +f 589 475 477 +f 479 595 593 +f 593 477 479 +f 481 599 595 +f 595 479 481 +f 389 461 456 +f 456 392 389 +f 386 463 461 +f 461 389 386 +f 379 465 463 +f 463 386 379 +f 373 469 465 +f 465 379 373 +f 371 471 469 +f 469 373 371 +f 369 473 471 +f 471 371 369 +f 366 475 473 +f 473 369 366 +f 364 477 475 +f 475 366 364 +f 362 479 477 +f 477 364 362 +f 361 481 479 +f 479 362 361 +f 335 389 392 +f 392 337 335 +f 333 386 389 +f 389 335 333 +f 331 379 386 +f 386 333 331 +f 329 373 379 +f 379 331 329 +f 328 371 373 +f 373 329 328 +f 325 369 371 +f 371 328 325 +f 323 366 369 +f 369 325 323 +f 321 364 366 +f 366 323 321 +f 319 362 364 +f 364 321 319 +f 316 361 362 +f 362 319 316 +f 298 335 337 +f 337 302 298 +f 290 333 335 +f 335 298 290 +f 288 331 333 +f 333 290 288 +f 286 329 331 +f 331 288 286 +f 281 328 329 +f 329 286 281 +f 275 325 328 +f 328 281 275 +f 265 323 325 +f 325 275 265 +f 259 321 323 +f 323 265 259 +f 255 319 321 +f 321 259 255 +f 249 316 319 +f 319 255 249 +f 269 298 302 +f 302 271 269 +f 261 290 298 +f 298 269 261 +f 251 288 290 +f 290 261 251 +f 238 286 288 +f 288 251 238 +f 230 281 286 +f 286 238 230 +f 218 275 281 +f 281 230 218 +f 208 265 275 +f 275 218 208 +f 196 259 265 +f 265 208 196 +f 186 255 259 +f 259 196 186 +f 181 249 255 +f 255 186 181 +f 228 269 271 +f 271 234 228 +f 222 261 269 +f 269 228 222 +f 212 251 261 +f 261 222 212 +f 200 238 251 +f 251 212 200 +f 177 230 238 +f 238 200 177 +f 160 218 230 +f 230 177 160 +f 134 208 218 +f 218 160 134 +f 112 196 208 +f 208 134 112 +f 102 186 196 +f 196 112 102 +f 96 181 186 +f 186 102 96 +f 198 228 234 +f 234 205 198 +f 182 222 228 +f 228 198 182 +f 168 212 222 +f 222 182 168 +f 146 200 212 +f 212 168 146 +f 118 177 200 +f 200 146 118 +f 92 160 177 +f 177 118 92 +f 74 134 160 +f 160 92 74 +f 63 112 134 +f 134 74 63 +f 53 102 112 +f 112 63 53 +f 50 96 102 +f 102 53 50 +f 167 198 205 +f 205 170 167 +f 154 182 198 +f 198 167 154 +f 126 168 182 +f 182 154 126 +f 100 146 168 +f 168 126 100 +f 83 118 146 +f 146 100 83 +f 61 92 118 +f 118 83 61 +f 46 74 92 +f 92 61 46 +f 32 63 74 +f 74 46 32 +f 25 53 63 +f 63 32 25 +f 21 50 53 +f 53 25 21 +f 143 167 170 +f 170 150 143 +f 124 154 167 +f 167 143 124 +f 104 126 154 +f 154 124 104 +f 84 100 126 +f 126 104 84 +f 65 83 100 +f 100 84 65 +f 44 61 83 +f 83 65 44 +f 30 46 61 +f 61 44 30 +f 17 32 46 +f 46 30 17 +f 9 25 32 +f 32 17 9 +f 5 21 25 +f 25 9 5 +f 132 143 150 +f 150 140 132 +f 116 124 143 +f 143 132 116 +f 94 104 124 +f 124 116 94 +f 76 84 104 +f 104 94 76 +f 55 65 84 +f 84 76 55 +f 40 44 65 +f 65 55 40 +f 22 30 44 +f 44 40 22 +f 11 17 30 +f 30 22 11 +f 2 9 17 +f 17 11 2 +f 1 5 9 +f 9 2 1 +f 480 596 599 +f 599 481 480 +f 478 594 596 +f 596 480 478 +f 476 590 594 +f 594 478 476 +f 474 578 590 +f 590 476 474 +f 472 576 578 +f 578 474 472 +f 470 568 576 +f 576 472 470 +f 466 558 568 +f 568 470 466 +f 464 552 558 +f 558 466 464 +f 462 546 552 +f 552 464 462 +f 456 544 546 +f 546 462 456 +f 363 480 481 +f 481 360 363 +f 365 478 480 +f 480 363 365 +f 367 476 478 +f 478 365 367 +f 368 474 476 +f 476 367 368 +f 370 472 474 +f 474 368 370 +f 372 470 472 +f 472 370 372 +f 380 466 470 +f 470 372 380 +f 385 464 466 +f 466 380 385 +f 390 462 464 +f 464 385 390 +f 391 456 462 +f 462 390 391 +f 320 363 360 +f 360 316 320 +f 322 365 363 +f 363 320 322 +f 324 367 365 +f 365 322 324 +f 326 368 367 +f 367 324 326 +f 327 370 368 +f 368 326 327 +f 330 372 370 +f 370 327 330 +f 332 380 372 +f 372 330 332 +f 334 385 380 +f 380 332 334 +f 336 390 385 +f 385 334 336 +f 337 391 390 +f 390 336 337 +f 256 320 316 +f 316 250 256 +f 260 322 320 +f 320 256 260 +f 266 324 322 +f 322 260 266 +f 276 326 324 +f 324 266 276 +f 282 327 326 +f 326 276 282 +f 287 330 327 +f 327 282 287 +f 289 332 330 +f 330 287 289 +f 291 334 332 +f 332 289 291 +f 299 336 334 +f 334 291 299 +f 303 337 336 +f 336 299 303 +f 187 256 250 +f 250 181 187 +f 197 260 256 +f 256 187 197 +f 209 266 260 +f 260 197 209 +f 219 276 266 +f 266 209 219 +f 231 282 276 +f 276 219 231 +f 239 287 282 +f 282 231 239 +f 252 289 287 +f 287 239 252 +f 262 291 289 +f 289 252 262 +f 270 299 291 +f 291 262 270 +f 272 303 299 +f 299 270 272 +f 103 187 181 +f 181 97 103 +f 113 197 187 +f 187 103 113 +f 135 209 197 +f 197 113 135 +f 161 219 209 +f 209 135 161 +f 178 231 219 +f 219 161 178 +f 201 239 231 +f 231 178 201 +f 213 252 239 +f 239 201 213 +f 223 262 252 +f 252 213 223 +f 229 270 262 +f 262 223 229 +f 235 272 270 +f 270 229 235 +f 54 103 97 +f 97 50 54 +f 64 113 103 +f 103 54 64 +f 75 135 113 +f 113 64 75 +f 93 161 135 +f 135 75 93 +f 119 178 161 +f 161 93 119 +f 147 201 178 +f 178 119 147 +f 169 213 201 +f 201 147 169 +f 183 223 213 +f 213 169 183 +f 199 229 223 +f 223 183 199 +f 205 235 229 +f 229 199 205 +f 24 54 50 +f 50 21 24 +f 33 64 54 +f 54 24 33 +f 47 75 64 +f 64 33 47 +f 62 93 75 +f 75 47 62 +f 82 119 93 +f 93 62 82 +f 101 147 119 +f 119 82 101 +f 127 169 147 +f 147 101 127 +f 155 183 169 +f 169 127 155 +f 166 199 183 +f 183 155 166 +f 171 205 199 +f 199 166 171 +f 10 24 21 +f 21 6 10 +f 18 33 24 +f 24 10 18 +f 31 47 33 +f 33 18 31 +f 45 62 47 +f 47 31 45 +f 66 82 62 +f 62 45 66 +f 85 101 82 +f 82 66 85 +f 105 127 101 +f 101 85 105 +f 125 155 127 +f 127 105 125 +f 144 166 155 +f 155 125 144 +f 151 171 166 +f 166 144 151 +f 3 10 6 +f 6 1 3 +f 12 18 10 +f 10 3 12 +f 23 31 18 +f 18 12 23 +f 41 45 31 +f 31 23 41 +f 56 66 45 +f 45 41 56 +f 77 85 66 +f 66 56 77 +f 95 105 85 +f 85 77 95 +f 117 125 105 +f 105 95 117 +f 133 144 125 +f 125 117 133 +f 140 151 144 +f 144 133 140 +f 138 132 140 +f 140 145 138 +f 122 116 132 +f 132 138 122 +f 98 94 116 +f 116 122 98 +f 80 76 94 +f 94 98 80 +f 60 55 76 +f 76 80 60 +f 42 40 55 +f 55 60 42 +f 28 22 40 +f 40 42 28 +f 13 11 22 +f 22 28 13 +f 7 2 11 +f 11 13 7 +f 4 1 2 +f 2 7 4 +f 152 138 145 +f 145 158 152 +f 136 122 138 +f 138 152 136 +f 108 98 122 +f 122 136 108 +f 89 80 98 +f 98 108 89 +f 70 60 80 +f 80 89 70 +f 52 42 60 +f 60 70 52 +f 38 28 42 +f 42 52 38 +f 26 13 28 +f 28 38 26 +f 19 7 13 +f 13 26 19 +f 15 4 7 +f 7 19 15 +f 173 152 158 +f 158 176 173 +f 162 136 152 +f 152 173 162 +f 142 108 136 +f 136 162 142 +f 111 89 108 +f 108 142 111 +f 91 70 89 +f 89 111 91 +f 73 52 70 +f 70 91 73 +f 58 38 52 +f 52 73 58 +f 48 26 38 +f 38 58 48 +f 37 19 26 +f 26 48 37 +f 35 15 19 +f 19 37 35 +f 194 173 176 +f 176 202 194 +f 184 162 173 +f 173 194 184 +f 174 142 162 +f 162 184 174 +f 156 111 142 +f 142 174 156 +f 128 91 111 +f 111 156 128 +f 106 73 91 +f 91 128 106 +f 86 58 73 +f 73 106 86 +f 78 48 58 +f 58 86 78 +f 68 37 48 +f 48 78 68 +f 67 35 37 +f 37 68 67 +f 221 194 202 +f 202 225 221 +f 216 184 194 +f 194 221 216 +f 206 174 184 +f 184 216 206 +f 192 156 174 +f 174 206 192 +f 180 128 156 +f 156 192 180 +f 164 106 128 +f 128 180 164 +f 148 86 106 +f 106 164 148 +f 130 78 86 +f 86 148 130 +f 121 68 78 +f 78 130 121 +f 115 67 68 +f 68 121 115 +f 244 221 225 +f 225 247 244 +f 240 216 221 +f 221 244 240 +f 236 206 216 +f 216 240 236 +f 233 192 206 +f 206 236 233 +f 227 180 192 +f 192 233 227 +f 215 164 180 +f 180 227 215 +f 210 148 164 +f 164 215 210 +f 203 130 148 +f 148 210 203 +f 191 121 130 +f 130 203 191 +f 188 115 121 +f 121 191 188 +f 284 244 247 +f 247 285 284 +f 279 240 244 +f 244 284 279 +f 277 236 240 +f 240 279 277 +f 273 233 236 +f 236 277 273 +f 267 227 233 +f 233 273 267 +f 263 215 227 +f 227 267 263 +f 258 210 215 +f 215 263 258 +f 253 203 210 +f 210 258 253 +f 245 191 203 +f 203 253 245 +f 242 188 191 +f 191 245 242 +f 315 284 285 +f 285 318 315 +f 312 279 284 +f 284 315 312 +f 311 277 279 +f 279 312 311 +f 309 273 277 +f 277 311 309 +f 307 267 273 +f 273 309 307 +f 305 263 267 +f 267 307 305 +f 301 258 263 +f 263 305 301 +f 297 253 258 +f 258 301 297 +f 295 245 253 +f 253 297 295 +f 293 242 245 +f 245 295 293 +f 341 315 318 +f 318 339 341 +f 343 312 315 +f 315 341 343 +f 345 311 312 +f 312 343 345 +f 347 309 311 +f 311 345 347 +f 349 307 309 +f 309 347 349 +f 351 305 307 +f 307 349 351 +f 353 301 305 +f 305 351 353 +f 355 297 301 +f 301 353 355 +f 357 295 297 +f 297 355 357 +f 359 293 295 +f 295 357 359 +f 378 341 339 +f 339 376 378 +f 384 343 341 +f 341 378 384 +f 394 345 343 +f 343 384 394 +f 403 347 345 +f 345 394 403 +f 406 349 347 +f 347 403 406 +f 415 351 349 +f 349 406 415 +f 419 353 351 +f 351 415 419 +f 423 355 353 +f 353 419 423 +f 425 357 355 +f 355 423 425 +f 427 359 357 +f 357 425 427 +f 8 3 1 +f 1 4 8 +f 14 12 3 +f 3 8 14 +f 29 23 12 +f 12 14 29 +f 43 41 23 +f 23 29 43 +f 59 56 41 +f 41 43 59 +f 81 77 56 +f 56 59 81 +f 99 95 77 +f 77 81 99 +f 123 117 95 +f 95 99 123 +f 139 133 117 +f 117 123 139 +f 145 140 133 +f 133 139 145 +f 20 8 4 +f 4 16 20 +f 27 14 8 +f 8 20 27 +f 39 29 14 +f 14 27 39 +f 51 43 29 +f 29 39 51 +f 71 59 43 +f 43 51 71 +f 88 81 59 +f 59 71 88 +f 109 99 81 +f 81 88 109 +f 137 123 99 +f 99 109 137 +f 153 139 123 +f 123 137 153 +f 159 145 139 +f 139 153 159 +f 36 20 16 +f 16 34 36 +f 49 27 20 +f 20 36 49 +f 57 39 27 +f 27 49 57 +f 72 51 39 +f 39 57 72 +f 90 71 51 +f 51 72 90 +f 110 88 71 +f 71 90 110 +f 141 109 88 +f 88 110 141 +f 163 137 109 +f 109 141 163 +f 172 153 137 +f 137 163 172 +f 176 159 153 +f 153 172 176 +f 69 36 34 +f 34 67 69 +f 79 49 36 +f 36 69 79 +f 87 57 49 +f 49 79 87 +f 107 72 57 +f 57 87 107 +f 129 90 72 +f 72 107 129 +f 157 110 90 +f 90 129 157 +f 175 141 110 +f 110 157 175 +f 185 163 141 +f 141 175 185 +f 195 172 163 +f 163 185 195 +f 202 176 172 +f 172 195 202 +f 120 69 67 +f 67 114 120 +f 131 79 69 +f 69 120 131 +f 149 87 79 +f 79 131 149 +f 165 107 87 +f 87 149 165 +f 179 129 107 +f 107 165 179 +f 193 157 129 +f 129 179 193 +f 207 175 157 +f 157 193 207 +f 217 185 175 +f 175 207 217 +f 220 195 185 +f 185 217 220 +f 224 202 195 +f 195 220 224 +f 190 120 114 +f 114 189 190 +f 204 131 120 +f 120 190 204 +f 211 149 131 +f 131 204 211 +f 214 165 149 +f 149 211 214 +f 226 179 165 +f 165 214 226 +f 232 193 179 +f 179 226 232 +f 237 207 193 +f 193 232 237 +f 241 217 207 +f 207 237 241 +f 243 220 217 +f 217 241 243 +f 248 224 220 +f 220 243 248 +f 246 190 189 +f 189 242 246 +f 254 204 190 +f 190 246 254 +f 257 211 204 +f 204 254 257 +f 264 214 211 +f 211 257 264 +f 268 226 214 +f 214 264 268 +f 274 232 226 +f 226 268 274 +f 278 237 232 +f 232 274 278 +f 280 241 237 +f 237 278 280 +f 283 243 241 +f 241 280 283 +f 285 248 243 +f 243 283 285 +f 294 246 242 +f 242 292 294 +f 296 254 246 +f 246 294 296 +f 300 257 254 +f 254 296 300 +f 304 264 257 +f 257 300 304 +f 306 268 264 +f 264 304 306 +f 308 274 268 +f 268 306 308 +f 310 278 274 +f 274 308 310 +f 313 280 278 +f 278 310 313 +f 314 283 280 +f 280 313 314 +f 317 285 283 +f 283 314 317 +f 356 294 292 +f 292 358 356 +f 354 296 294 +f 294 356 354 +f 352 300 296 +f 296 354 352 +f 350 304 300 +f 300 352 350 +f 348 306 304 +f 304 350 348 +f 346 308 306 +f 306 348 346 +f 344 310 308 +f 308 346 344 +f 342 313 310 +f 310 344 342 +f 340 314 313 +f 313 342 340 +f 338 317 314 +f 314 340 338 +f 424 356 358 +f 358 426 424 +f 422 354 356 +f 356 424 422 +f 418 352 354 +f 354 422 418 +f 414 350 352 +f 352 418 414 +f 407 348 350 +f 350 414 407 +f 402 346 348 +f 348 407 402 +f 393 344 346 +f 346 402 393 +f 383 342 344 +f 344 393 383 +f 377 340 342 +f 342 383 377 +f 375 338 340 +f 340 377 375 +f 3186 3113 3115 +f 3115 3182 3186 +f 3192 3110 3113 +f 3113 3186 3192 +f 3196 3109 3110 +f 3110 3192 3196 +f 3205 3106 3109 +f 3109 3196 3205 +f 3211 3104 3106 +f 3106 3205 3211 +f 3215 3102 3104 +f 3104 3211 3215 +f 3217 3101 3102 +f 3102 3215 3217 +f 3220 3098 3101 +f 3101 3217 3220 +f 3222 3097 3098 +f 3098 3220 3222 +f 3223 3095 3097 +f 3097 3222 3223 +f 3227 3186 3182 +f 3182 3225 3227 +f 3229 3192 3186 +f 3186 3227 3229 +f 3231 3196 3192 +f 3192 3229 3231 +f 3233 3205 3196 +f 3196 3231 3233 +f 3235 3211 3205 +f 3205 3233 3235 +f 3241 3215 3211 +f 3211 3235 3241 +f 3245 3217 3215 +f 3215 3241 3245 +f 3249 3220 3217 +f 3217 3245 3249 +f 3251 3222 3220 +f 3220 3249 3251 +f 3253 3223 3222 +f 3222 3251 3253 +f 3239 3227 3225 +f 3225 3237 3239 +f 3243 3229 3227 +f 3227 3239 3243 +f 3247 3231 3229 +f 3229 3243 3247 +f 3257 3233 3231 +f 3231 3247 3257 +f 3263 3235 3233 +f 3233 3257 3263 +f 3271 3241 3235 +f 3235 3263 3271 +f 3279 3245 3241 +f 3241 3271 3279 +f 3285 3249 3245 +f 3245 3279 3285 +f 3293 3251 3249 +f 3249 3285 3293 +f 3297 3253 3251 +f 3251 3293 3297 +f 3259 3239 3237 +f 3237 3255 3259 +f 3261 3243 3239 +f 3239 3259 3261 +f 3265 3247 3243 +f 3243 3261 3265 +f 3275 3257 3247 +f 3247 3265 3275 +f 3287 3263 3257 +f 3257 3275 3287 +f 3303 3271 3263 +f 3263 3287 3303 +f 3314 3279 3271 +f 3271 3303 3314 +f 3320 3285 3279 +f 3279 3314 3320 +f 3330 3293 3285 +f 3285 3320 3330 +f 3332 3297 3293 +f 3293 3330 3332 +f 3270 3259 3255 +f 3255 3268 3270 +f 3273 3261 3259 +f 3259 3270 3273 +f 3283 3265 3261 +f 3261 3273 3283 +f 3299 3275 3265 +f 3265 3283 3299 +f 3308 3287 3275 +f 3275 3299 3308 +f 3322 3303 3287 +f 3287 3308 3322 +f 3338 3314 3303 +f 3303 3322 3338 +f 3346 3320 3314 +f 3314 3338 3346 +f 3351 3330 3320 +f 3320 3346 3351 +f 3355 3332 3330 +f 3330 3351 3355 +f 3282 3270 3268 +f 3268 3278 3282 +f 3290 3273 3270 +f 3270 3282 3290 +f 3302 3283 3273 +f 3273 3290 3302 +f 3312 3299 3283 +f 3283 3302 3312 +f 3324 3308 3299 +f 3299 3312 3324 +f 3340 3322 3308 +f 3308 3324 3340 +f 3353 3338 3322 +f 3322 3340 3353 +f 3368 3346 3338 +f 3338 3353 3368 +f 3373 3351 3346 +f 3346 3368 3373 +f 3379 3355 3351 +f 3351 3373 3379 +f 3295 3282 3278 +f 3278 3292 3295 +f 3306 3290 3282 +f 3282 3295 3306 +f 3316 3302 3290 +f 3290 3306 3316 +f 3326 3312 3302 +f 3302 3316 3326 +f 3345 3324 3312 +f 3312 3326 3345 +f 3359 3340 3324 +f 3324 3345 3359 +f 3376 3353 3340 +f 3340 3359 3376 +f 3394 3368 3353 +f 3353 3376 3394 +f 3404 3373 3368 +f 3368 3394 3404 +f 3406 3379 3373 +f 3373 3404 3406 +f 3310 3295 3292 +f 3292 3307 3310 +f 3318 3306 3295 +f 3295 3310 3318 +f 3336 3316 3306 +f 3306 3318 3336 +f 3348 3326 3316 +f 3316 3336 3348 +f 3369 3345 3326 +f 3326 3348 3369 +f 3389 3359 3345 +f 3345 3369 3389 +f 3425 3376 3359 +f 3359 3389 3425 +f 3449 3394 3376 +f 3376 3425 3449 +f 3468 3404 3394 +f 3394 3449 3468 +f 3472 3406 3404 +f 3404 3468 3472 +f 3335 3310 3307 +f 3307 3329 3335 +f 3343 3318 3310 +f 3310 3335 3343 +f 3362 3336 3318 +f 3318 3343 3362 +f 3386 3348 3336 +f 3336 3362 3386 +f 3422 3369 3348 +f 3348 3386 3422 +f 3464 3389 3369 +f 3369 3422 3464 +f 3490 3425 3389 +f 3389 3464 3490 +f 3505 3449 3425 +f 3425 3490 3505 +f 3521 3468 3449 +f 3449 3505 3521 +f 3523 3472 3468 +f 3468 3521 3523 +f 3364 3335 3329 +f 3329 3357 3364 +f 3382 3343 3335 +f 3335 3364 3382 +f 3416 3362 3343 +f 3343 3382 3416 +f 3465 3386 3362 +f 3362 3416 3465 +f 3495 3422 3386 +f 3386 3465 3495 +f 3528 3464 3422 +f 3422 3495 3528 +f 3553 3490 3464 +f 3464 3528 3553 +f 3579 3505 3490 +f 3490 3553 3579 +f 3592 3521 3505 +f 3505 3579 3592 +f 3604 3523 3521 +f 3521 3592 3604 +f 3221 3096 3094 +f 3094 3224 3221 +f 3219 3099 3096 +f 3096 3221 3219 +f 3218 3100 3099 +f 3099 3219 3218 +f 3216 3103 3100 +f 3100 3218 3216 +f 3212 3105 3103 +f 3103 3216 3212 +f 3206 3107 3105 +f 3105 3212 3206 +f 3197 3108 3107 +f 3107 3206 3197 +f 3193 3111 3108 +f 3108 3197 3193 +f 3187 3112 3111 +f 3111 3193 3187 +f 3183 3114 3112 +f 3112 3187 3183 +f 3252 3221 3224 +f 3224 3254 3252 +f 3250 3219 3221 +f 3221 3252 3250 +f 3246 3218 3219 +f 3219 3250 3246 +f 3242 3216 3218 +f 3218 3246 3242 +f 3236 3212 3216 +f 3216 3242 3236 +f 3234 3206 3212 +f 3212 3236 3234 +f 3232 3197 3206 +f 3206 3234 3232 +f 3230 3193 3197 +f 3197 3232 3230 +f 3228 3187 3193 +f 3193 3230 3228 +f 3226 3183 3187 +f 3187 3228 3226 +f 3294 3252 3254 +f 3254 3298 3294 +f 3286 3250 3252 +f 3252 3294 3286 +f 3280 3246 3250 +f 3250 3286 3280 +f 3272 3242 3246 +f 3246 3280 3272 +f 3264 3236 3242 +f 3242 3272 3264 +f 3258 3234 3236 +f 3236 3264 3258 +f 3248 3232 3234 +f 3234 3258 3248 +f 3244 3230 3232 +f 3232 3248 3244 +f 3240 3228 3230 +f 3230 3244 3240 +f 3238 3226 3228 +f 3228 3240 3238 +f 3331 3294 3298 +f 3298 3333 3331 +f 3321 3286 3294 +f 3294 3331 3321 +f 3315 3280 3286 +f 3286 3321 3315 +f 3304 3272 3280 +f 3280 3315 3304 +f 3288 3264 3272 +f 3272 3304 3288 +f 3276 3258 3264 +f 3264 3288 3276 +f 3266 3248 3258 +f 3258 3276 3266 +f 3262 3244 3248 +f 3248 3266 3262 +f 3260 3240 3244 +f 3244 3262 3260 +f 3256 3238 3240 +f 3240 3260 3256 +f 3350 3331 3333 +f 3333 3354 3350 +f 3347 3321 3331 +f 3331 3350 3347 +f 3339 3315 3321 +f 3321 3347 3339 +f 3323 3304 3315 +f 3315 3339 3323 +f 3309 3288 3304 +f 3304 3323 3309 +f 3300 3276 3288 +f 3288 3309 3300 +f 3284 3266 3276 +f 3276 3300 3284 +f 3274 3262 3266 +f 3266 3284 3274 +f 3269 3260 3262 +f 3262 3274 3269 +f 3267 3256 3260 +f 3260 3269 3267 +f 3372 3350 3354 +f 3354 3378 3372 +f 3367 3347 3350 +f 3350 3372 3367 +f 3352 3339 3347 +f 3347 3367 3352 +f 3341 3323 3339 +f 3339 3352 3341 +f 3325 3309 3323 +f 3323 3341 3325 +f 3313 3300 3309 +f 3309 3325 3313 +f 3301 3284 3300 +f 3300 3313 3301 +f 3289 3274 3284 +f 3284 3301 3289 +f 3281 3269 3274 +f 3274 3289 3281 +f 3277 3267 3269 +f 3269 3281 3277 +f 3403 3372 3378 +f 3378 3405 3403 +f 3393 3367 3372 +f 3372 3403 3393 +f 3377 3352 3367 +f 3367 3393 3377 +f 3360 3341 3352 +f 3352 3377 3360 +f 3344 3325 3341 +f 3341 3360 3344 +f 3327 3313 3325 +f 3325 3344 3327 +f 3317 3301 3313 +f 3313 3327 3317 +f 3305 3289 3301 +f 3301 3317 3305 +f 3296 3281 3289 +f 3289 3305 3296 +f 3291 3277 3281 +f 3281 3296 3291 +f 3469 3403 3405 +f 3405 3472 3469 +f 3450 3393 3403 +f 3403 3469 3450 +f 3426 3377 3393 +f 3393 3450 3426 +f 3390 3360 3377 +f 3377 3426 3390 +f 3370 3344 3360 +f 3360 3390 3370 +f 3349 3327 3344 +f 3344 3370 3349 +f 3337 3317 3327 +f 3327 3349 3337 +f 3319 3305 3317 +f 3317 3337 3319 +f 3311 3296 3305 +f 3305 3319 3311 +f 3307 3291 3296 +f 3296 3311 3307 +f 3520 3469 3472 +f 3472 3522 3520 +f 3504 3450 3469 +f 3469 3520 3504 +f 3489 3426 3450 +f 3450 3504 3489 +f 3463 3390 3426 +f 3426 3489 3463 +f 3421 3370 3390 +f 3390 3463 3421 +f 3385 3349 3370 +f 3370 3421 3385 +f 3361 3337 3349 +f 3349 3385 3361 +f 3342 3319 3337 +f 3337 3361 3342 +f 3334 3311 3319 +f 3319 3342 3334 +f 3328 3307 3311 +f 3311 3334 3328 +f 3591 3520 3522 +f 3522 3603 3591 +f 3578 3504 3520 +f 3520 3591 3578 +f 3552 3489 3504 +f 3504 3578 3552 +f 3530 3463 3489 +f 3489 3552 3530 +f 3499 3421 3463 +f 3463 3530 3499 +f 3467 3385 3421 +f 3421 3499 3467 +f 3415 3361 3385 +f 3385 3467 3415 +f 3381 3342 3361 +f 3361 3415 3381 +f 3363 3334 3342 +f 3342 3381 3363 +f 3356 3328 3334 +f 3334 3363 3356 +f 3374 3365 3358 +f 3358 3371 3374 +f 3395 3383 3365 +f 3365 3374 3395 +f 3443 3417 3383 +f 3383 3395 3443 +f 3481 3466 3417 +f 3417 3443 3481 +f 3514 3496 3466 +f 3466 3481 3514 +f 3545 3529 3496 +f 3496 3514 3545 +f 3573 3551 3529 +f 3529 3545 3573 +f 3597 3577 3551 +f 3551 3573 3597 +f 3613 3590 3577 +f 3577 3597 3613 +f 3619 3603 3590 +f 3590 3613 3619 +f 3387 3374 3371 +f 3371 3380 3387 +f 3413 3395 3374 +f 3374 3387 3413 +f 3461 3443 3395 +f 3395 3413 3461 +f 3493 3481 3443 +f 3443 3461 3493 +f 3524 3514 3481 +f 3481 3493 3524 +f 3556 3545 3514 +f 3514 3524 3556 +f 3584 3573 3545 +f 3545 3556 3584 +f 3611 3597 3573 +f 3573 3584 3611 +f 3628 3613 3597 +f 3597 3611 3628 +f 3632 3619 3613 +f 3613 3628 3632 +f 3398 3387 3380 +f 3380 3391 3398 +f 3435 3413 3387 +f 3387 3398 3435 +f 3473 3461 3413 +f 3413 3435 3473 +f 3500 3493 3461 +f 3461 3473 3500 +f 3531 3524 3493 +f 3493 3500 3531 +f 3562 3556 3524 +f 3524 3531 3562 +f 3595 3584 3556 +f 3556 3562 3595 +f 3617 3611 3584 +f 3584 3595 3617 +f 3633 3628 3611 +f 3611 3617 3633 +f 3641 3632 3628 +f 3628 3633 3641 +f 3409 3398 3391 +f 3391 3400 3409 +f 3447 3435 3398 +f 3398 3409 3447 +f 3477 3473 3435 +f 3435 3447 3477 +f 3506 3500 3473 +f 3473 3477 3506 +f 3540 3531 3500 +f 3500 3506 3540 +f 3567 3562 3531 +f 3531 3540 3567 +f 3601 3595 3562 +f 3562 3567 3601 +f 3624 3617 3595 +f 3595 3601 3624 +f 3639 3633 3617 +f 3617 3624 3639 +f 3644 3641 3633 +f 3633 3639 3644 +f 3433 3409 3400 +f 3400 3411 3433 +f 3453 3447 3409 +f 3409 3433 3453 +f 3483 3477 3447 +f 3447 3453 3483 +f 3510 3506 3477 +f 3477 3483 3510 +f 3543 3540 3506 +f 3506 3510 3543 +f 3569 3567 3540 +f 3540 3543 3569 +f 3599 3601 3567 +f 3567 3569 3599 +f 3622 3624 3601 +f 3601 3599 3622 +f 3637 3639 3624 +f 3624 3622 3637 +f 3642 3644 3639 +f 3639 3637 3642 +f 3439 3433 3411 +f 3411 3424 3439 +f 3458 3453 3433 +f 3433 3439 3458 +f 3487 3483 3453 +f 3453 3458 3487 +f 3513 3510 3483 +f 3483 3487 3513 +f 3542 3543 3510 +f 3510 3513 3542 +f 3566 3569 3543 +f 3543 3542 3566 +f 3593 3599 3569 +f 3569 3566 3593 +f 3616 3622 3599 +f 3599 3593 3616 +f 3630 3637 3622 +f 3622 3616 3630 +f 3636 3642 3637 +f 3637 3630 3636 +f 3441 3439 3424 +f 3424 3429 3441 +f 3459 3458 3439 +f 3439 3441 3459 +f 3485 3487 3458 +f 3458 3459 3485 +f 3508 3513 3487 +f 3487 3485 3508 +f 3533 3542 3513 +f 3513 3508 3533 +f 3558 3566 3542 +f 3542 3533 3558 +f 3582 3593 3566 +f 3566 3558 3582 +f 3607 3616 3593 +f 3593 3582 3607 +f 3620 3630 3616 +f 3616 3607 3620 +f 3626 3636 3630 +f 3630 3620 3626 +f 3437 3441 3429 +f 3429 3427 3437 +f 3455 3459 3441 +f 3441 3437 3455 +f 3479 3485 3459 +f 3459 3455 3479 +f 3502 3508 3485 +f 3485 3479 3502 +f 3526 3533 3508 +f 3508 3502 3526 +f 3547 3558 3533 +f 3533 3526 3547 +f 3571 3582 3558 +f 3558 3547 3571 +f 3588 3607 3582 +f 3582 3571 3588 +f 3605 3620 3607 +f 3607 3588 3605 +f 3609 3626 3620 +f 3620 3605 3609 +f 3419 3437 3427 +f 3427 3408 3419 +f 3445 3455 3437 +f 3437 3419 3445 +f 3470 3479 3455 +f 3455 3445 3470 +f 3492 3502 3479 +f 3479 3470 3492 +f 3517 3526 3502 +f 3502 3492 3517 +f 3536 3547 3526 +f 3526 3517 3536 +f 3554 3571 3547 +f 3547 3536 3554 +f 3575 3588 3571 +f 3571 3554 3575 +f 3580 3605 3588 +f 3588 3575 3580 +f 3587 3609 3605 +f 3605 3580 3587 +f 3401 3419 3408 +f 3408 3397 3401 +f 3431 3445 3419 +f 3419 3401 3431 +f 3451 3470 3445 +f 3445 3431 3451 +f 3475 3492 3470 +f 3470 3451 3475 +f 3497 3517 3492 +f 3492 3475 3497 +f 3518 3536 3517 +f 3517 3497 3518 +f 3537 3554 3536 +f 3536 3518 3537 +f 3549 3575 3554 +f 3554 3537 3549 +f 3560 3580 3575 +f 3575 3549 3560 +f 3564 3587 3580 +f 3580 3560 3564 +f 3614 3591 3603 +f 3603 3619 3614 +f 3598 3578 3591 +f 3591 3614 3598 +f 3574 3552 3578 +f 3578 3598 3574 +f 3546 3530 3552 +f 3552 3574 3546 +f 3515 3499 3530 +f 3530 3546 3515 +f 3482 3467 3499 +f 3499 3515 3482 +f 3444 3418 3467 +f 3467 3482 3444 +f 3396 3384 3418 +f 3418 3444 3396 +f 3375 3366 3384 +f 3384 3396 3375 +f 3371 3358 3366 +f 3366 3375 3371 +f 3629 3614 3619 +f 3619 3632 3629 +f 3612 3598 3614 +f 3614 3629 3612 +f 3585 3574 3598 +f 3598 3612 3585 +f 3557 3546 3574 +f 3574 3585 3557 +f 3525 3515 3546 +f 3546 3557 3525 +f 3494 3482 3515 +f 3515 3525 3494 +f 3462 3444 3482 +f 3482 3494 3462 +f 3414 3396 3444 +f 3444 3462 3414 +f 3388 3375 3396 +f 3396 3414 3388 +f 3380 3371 3375 +f 3375 3388 3380 +f 3634 3629 3632 +f 3632 3641 3634 +f 3618 3612 3629 +f 3629 3634 3618 +f 3596 3585 3612 +f 3612 3618 3596 +f 3563 3557 3585 +f 3585 3596 3563 +f 3532 3525 3557 +f 3557 3563 3532 +f 3501 3494 3525 +f 3525 3532 3501 +f 3474 3462 3494 +f 3494 3501 3474 +f 3436 3414 3462 +f 3462 3474 3436 +f 3399 3388 3414 +f 3414 3436 3399 +f 3392 3380 3388 +f 3388 3399 3392 +f 3640 3634 3641 +f 3641 3644 3640 +f 3625 3618 3634 +f 3634 3640 3625 +f 3602 3596 3618 +f 3618 3625 3602 +f 3568 3563 3596 +f 3596 3602 3568 +f 3539 3532 3563 +f 3563 3568 3539 +f 3507 3501 3532 +f 3532 3539 3507 +f 3478 3474 3501 +f 3501 3507 3478 +f 3448 3436 3474 +f 3474 3478 3448 +f 3410 3399 3436 +f 3436 3448 3410 +f 3400 3392 3399 +f 3399 3410 3400 +f 3638 3640 3644 +f 3644 3643 3638 +f 3623 3625 3640 +f 3640 3638 3623 +f 3600 3602 3625 +f 3625 3623 3600 +f 3570 3568 3602 +f 3602 3600 3570 +f 3544 3539 3568 +f 3568 3570 3544 +f 3511 3507 3539 +f 3539 3544 3511 +f 3484 3478 3507 +f 3507 3511 3484 +f 3454 3448 3478 +f 3478 3484 3454 +f 3434 3410 3448 +f 3448 3454 3434 +f 3412 3400 3410 +f 3410 3434 3412 +f 3631 3638 3643 +f 3643 3635 3631 +f 3615 3623 3638 +f 3638 3631 3615 +f 3594 3600 3623 +f 3623 3615 3594 +f 3565 3570 3600 +f 3600 3594 3565 +f 3541 3544 3570 +f 3570 3565 3541 +f 3512 3511 3544 +f 3544 3541 3512 +f 3488 3484 3511 +f 3511 3512 3488 +f 3457 3454 3484 +f 3484 3488 3457 +f 3440 3434 3454 +f 3454 3457 3440 +f 3423 3412 3434 +f 3434 3440 3423 +f 3621 3631 3635 +f 3635 3627 3621 +f 3608 3615 3631 +f 3631 3621 3608 +f 3583 3594 3615 +f 3615 3608 3583 +f 3559 3565 3594 +f 3594 3583 3559 +f 3534 3541 3565 +f 3565 3559 3534 +f 3509 3512 3541 +f 3541 3534 3509 +f 3486 3488 3512 +f 3512 3509 3486 +f 3460 3457 3488 +f 3488 3486 3460 +f 3442 3440 3457 +f 3457 3460 3442 +f 3430 3423 3440 +f 3440 3442 3430 +f 3606 3621 3627 +f 3627 3610 3606 +f 3589 3608 3621 +f 3621 3606 3589 +f 3572 3583 3608 +f 3608 3589 3572 +f 3548 3559 3583 +f 3583 3572 3548 +f 3527 3534 3559 +f 3559 3548 3527 +f 3503 3509 3534 +f 3534 3527 3503 +f 3480 3486 3509 +f 3509 3503 3480 +f 3456 3460 3486 +f 3486 3480 3456 +f 3438 3442 3460 +f 3460 3456 3438 +f 3428 3430 3442 +f 3442 3438 3428 +f 3581 3606 3610 +f 3610 3586 3581 +f 3576 3589 3606 +f 3606 3581 3576 +f 3555 3572 3589 +f 3589 3576 3555 +f 3535 3548 3572 +f 3572 3555 3535 +f 3516 3527 3548 +f 3548 3535 3516 +f 3491 3503 3527 +f 3527 3516 3491 +f 3471 3480 3503 +f 3503 3491 3471 +f 3446 3456 3480 +f 3480 3471 3446 +f 3420 3438 3456 +f 3456 3446 3420 +f 3407 3428 3438 +f 3438 3420 3407 +f 3561 3581 3586 +f 3586 3564 3561 +f 3550 3576 3581 +f 3581 3561 3550 +f 3538 3555 3576 +f 3576 3550 3538 +f 3519 3535 3555 +f 3555 3538 3519 +f 3498 3516 3535 +f 3535 3519 3498 +f 3476 3491 3516 +f 3516 3498 3476 +f 3452 3471 3491 +f 3491 3476 3452 +f 3432 3446 3471 +f 3471 3452 3432 +f 3402 3420 3446 +f 3446 3432 3402 +f 3397 3407 3420 +f 3420 3402 3397 +f 1888 2110 2104 +f 1888 2104 2096 +f 1888 2096 2076 +f 1888 2076 2048 +f 1888 2048 2030 +f 1888 2030 2006 +f 1888 2006 1982 +f 1888 1982 1960 +f 1888 1960 1936 +f 1888 1936 1732 +f 2257 2104 2110 +f 2110 2261 2257 +f 2249 2096 2104 +f 2104 2257 2249 +f 2226 2076 2096 +f 2096 2249 2226 +f 2200 2048 2076 +f 2076 2226 2200 +f 2142 2030 2048 +f 2048 2200 2142 +f 2094 2006 2030 +f 2030 2142 2094 +f 2036 1982 2006 +f 2006 2094 2036 +f 1988 1960 1982 +f 1982 2036 1988 +f 1948 1936 1960 +f 1960 1988 1948 +f 1728 1732 1936 +f 1936 1948 1728 +f 2310 2257 2261 +f 2261 2315 2310 +f 2300 2249 2257 +f 2257 2310 2300 +f 2279 2226 2249 +f 2249 2300 2279 +f 2243 2200 2226 +f 2226 2279 2243 +f 2204 2142 2200 +f 2200 2243 2204 +f 2132 2094 2142 +f 2142 2204 2132 +f 2067 2036 2094 +f 2094 2132 2067 +f 2000 1988 2036 +f 2036 2067 2000 +f 1956 1948 1988 +f 1988 2000 1956 +f 1734 1728 1948 +f 1948 1956 1734 +f 2312 2310 2315 +f 2315 2316 2312 +f 2302 2300 2310 +f 2310 2312 2302 +f 2281 2279 2300 +f 2300 2302 2281 +f 2245 2243 2279 +f 2279 2281 2245 +f 2206 2204 2243 +f 2243 2245 2206 +f 2134 2132 2204 +f 2204 2206 2134 +f 2068 2067 2132 +f 2132 2134 2068 +f 2002 2000 2067 +f 2067 2068 2002 +f 1958 1956 2000 +f 2000 2002 1958 +f 1878 1734 1956 +f 1956 1958 1878 +f 2285 2312 2316 +f 2316 2289 2285 +f 2259 2302 2312 +f 2312 2285 2259 +f 2241 2281 2302 +f 2302 2259 2241 +f 2214 2245 2281 +f 2281 2241 2214 +f 2168 2206 2245 +f 2245 2214 2168 +f 2106 2134 2206 +f 2206 2168 2106 +f 2042 2068 2134 +f 2134 2106 2042 +f 1994 2002 2068 +f 2068 2042 1994 +f 1952 1958 2002 +f 2002 1994 1952 +f 1731 1878 1958 +f 1958 1952 1731 +f 2220 2285 2289 +f 2289 2225 2220 +f 2210 2259 2285 +f 2285 2220 2210 +f 2186 2241 2259 +f 2259 2210 2186 +f 2146 2214 2241 +f 2241 2186 2146 +f 2108 2168 2214 +f 2214 2146 2108 +f 2060 2106 2168 +f 2168 2108 2060 +f 2018 2042 2106 +f 2106 2060 2018 +f 1978 1994 2042 +f 2042 2018 1978 +f 1944 1952 1994 +f 1994 1978 1944 +f 1727 1731 1952 +f 1952 1944 1727 +f 2141 2220 2225 +f 2225 2145 2141 +f 2127 2210 2220 +f 2220 2141 2127 +f 2112 2186 2210 +f 2210 2127 2112 +f 2084 2146 2186 +f 2186 2112 2084 +f 2044 2108 2146 +f 2146 2084 2044 +f 2024 2060 2108 +f 2108 2044 2024 +f 1992 2018 2060 +f 2060 2024 1992 +f 1970 1978 2018 +f 2018 1992 1970 +f 1942 1944 1978 +f 1978 1970 1942 +f 1721 1727 1944 +f 1944 1942 1721 +f 2079 2141 2145 +f 2145 2087 2079 +f 2075 2127 2141 +f 2141 2079 2075 +f 2055 2112 2127 +f 2127 2075 2055 +f 2039 2084 2112 +f 2112 2055 2039 +f 2021 2044 2084 +f 2084 2039 2021 +f 1996 2024 2044 +f 2044 2021 1996 +f 1974 1992 2024 +f 2024 1996 1974 +f 1954 1970 1992 +f 1992 1974 1954 +f 1934 1942 1970 +f 1970 1954 1934 +f 1720 1721 1942 +f 1942 1934 1720 +f 2063 2079 2087 +f 2087 2071 2063 +f 2051 2075 2079 +f 2079 2063 2051 +f 2041 2055 2075 +f 2075 2051 2041 +f 2029 2039 2055 +f 2055 2041 2029 +f 2013 2021 2039 +f 2039 2029 2013 +f 1991 1996 2021 +f 2021 2013 1991 +f 1972 1974 1996 +f 1996 1991 1972 +f 1950 1954 1974 +f 1974 1972 1950 +f 1932 1934 1954 +f 1954 1950 1932 +f 1701 1720 1934 +f 1934 1932 1701 +f 2115 2063 2071 +f 2071 2123 2115 +f 2101 2051 2063 +f 2063 2115 2101 +f 2081 2041 2051 +f 2051 2101 2081 +f 2057 2029 2041 +f 2041 2081 2057 +f 2033 2013 2029 +f 2029 2057 2033 +f 2009 1991 2013 +f 2013 2033 2009 +f 1984 1972 1991 +f 1991 2009 1984 +f 1964 1950 1972 +f 1972 1984 1964 +f 1938 1932 1950 +f 1950 1964 1938 +f 1698 1701 1932 +f 1932 1938 1698 +f 1888 1886 1686 +f 1888 1686 1662 +f 1888 1662 1640 +f 1888 1640 1616 +f 1888 1616 1592 +f 1888 1592 1574 +f 1888 1574 1546 +f 1888 1546 1526 +f 1888 1526 1518 +f 1888 1518 1512 +f 1674 1686 1886 +f 1886 1884 1674 +f 1634 1662 1686 +f 1686 1674 1634 +f 1586 1640 1662 +f 1662 1634 1586 +f 1528 1616 1640 +f 1640 1586 1528 +f 1480 1592 1616 +f 1616 1528 1480 +f 1422 1574 1592 +f 1592 1480 1422 +f 1396 1546 1574 +f 1574 1422 1396 +f 1373 1526 1546 +f 1546 1396 1373 +f 1365 1518 1526 +f 1526 1373 1365 +f 1361 1512 1518 +f 1518 1365 1361 +f 1666 1674 1884 +f 1884 1882 1666 +f 1622 1634 1674 +f 1674 1666 1622 +f 1557 1586 1634 +f 1634 1622 1557 +f 1490 1528 1586 +f 1586 1557 1490 +f 1418 1480 1528 +f 1528 1490 1418 +f 1379 1422 1480 +f 1480 1418 1379 +f 1343 1396 1422 +f 1422 1379 1343 +f 1322 1373 1396 +f 1396 1343 1322 +f 1312 1365 1373 +f 1373 1322 1312 +f 1309 1361 1365 +f 1365 1312 1309 +f 1664 1666 1882 +f 1882 1879 1664 +f 1620 1622 1666 +f 1666 1664 1620 +f 1554 1557 1622 +f 1622 1620 1554 +f 1488 1490 1557 +f 1557 1554 1488 +f 1416 1418 1490 +f 1490 1488 1416 +f 1377 1379 1418 +f 1418 1416 1377 +f 1341 1343 1379 +f 1379 1377 1341 +f 1320 1322 1343 +f 1343 1341 1320 +f 1310 1312 1322 +f 1322 1320 1310 +f 1306 1309 1312 +f 1312 1310 1306 +f 1670 1664 1879 +f 1879 1876 1670 +f 1628 1620 1664 +f 1664 1670 1628 +f 1580 1554 1620 +f 1620 1628 1580 +f 1516 1488 1554 +f 1554 1580 1516 +f 1454 1416 1488 +f 1488 1516 1454 +f 1408 1377 1416 +f 1416 1454 1408 +f 1381 1341 1377 +f 1377 1408 1381 +f 1363 1320 1341 +f 1341 1381 1363 +f 1337 1310 1320 +f 1320 1363 1337 +f 1333 1306 1310 +f 1310 1337 1333 +f 1678 1670 1876 +f 1876 1874 1678 +f 1644 1628 1670 +f 1670 1678 1644 +f 1604 1580 1628 +f 1628 1644 1604 +f 1562 1516 1580 +f 1580 1604 1562 +f 1514 1454 1516 +f 1516 1562 1514 +f 1476 1408 1454 +f 1454 1514 1476 +f 1436 1381 1408 +f 1408 1476 1436 +f 1412 1363 1381 +f 1381 1436 1412 +f 1402 1337 1363 +f 1363 1412 1402 +f 1399 1333 1337 +f 1337 1402 1399 +f 1680 1678 1874 +f 1874 1872 1680 +f 1652 1644 1678 +f 1678 1680 1652 +f 1630 1604 1644 +f 1644 1652 1630 +f 1598 1562 1604 +f 1604 1630 1598 +f 1578 1514 1562 +f 1562 1598 1578 +f 1538 1476 1514 +f 1514 1578 1538 +f 1510 1436 1476 +f 1476 1538 1510 +f 1497 1412 1436 +f 1436 1510 1497 +f 1483 1402 1412 +f 1412 1497 1483 +f 1479 1399 1402 +f 1402 1483 1479 +f 1688 1680 1872 +f 1872 1870 1688 +f 1668 1652 1680 +f 1680 1688 1668 +f 1648 1630 1652 +f 1652 1668 1648 +f 1626 1598 1630 +f 1630 1648 1626 +f 1603 1578 1598 +f 1598 1626 1603 +f 1585 1538 1578 +f 1578 1603 1585 +f 1569 1510 1538 +f 1538 1585 1569 +f 1549 1497 1510 +f 1510 1569 1549 +f 1545 1483 1497 +f 1497 1549 1545 +f 1537 1479 1483 +f 1483 1545 1537 +f 1690 1688 1870 +f 1870 1868 1690 +f 1672 1668 1688 +f 1688 1690 1672 +f 1650 1648 1668 +f 1668 1672 1650 +f 1633 1626 1648 +f 1648 1650 1633 +f 1611 1603 1626 +f 1626 1633 1611 +f 1595 1585 1603 +f 1603 1611 1595 +f 1583 1569 1585 +f 1585 1595 1583 +f 1573 1549 1569 +f 1569 1583 1573 +f 1561 1545 1549 +f 1549 1573 1561 +f 1553 1537 1545 +f 1545 1561 1553 +f 1684 1690 1868 +f 1868 1865 1684 +f 1658 1672 1690 +f 1690 1684 1658 +f 1638 1650 1672 +f 1672 1658 1638 +f 1615 1633 1650 +f 1650 1638 1615 +f 1591 1611 1633 +f 1633 1615 1591 +f 1567 1595 1611 +f 1611 1591 1567 +f 1543 1583 1595 +f 1595 1567 1543 +f 1523 1573 1583 +f 1583 1543 1523 +f 1509 1561 1573 +f 1573 1523 1509 +f 1501 1553 1561 +f 1561 1509 1501 +f 1888 1513 1519 +f 1888 1519 1527 +f 1888 1527 1547 +f 1888 1547 1575 +f 1888 1575 1593 +f 1888 1593 1617 +f 1888 1617 1641 +f 1888 1641 1663 +f 1888 1663 1687 +f 1888 1687 1894 +f 1366 1519 1513 +f 1513 1362 1366 +f 1374 1527 1519 +f 1519 1366 1374 +f 1397 1547 1527 +f 1527 1374 1397 +f 1423 1575 1547 +f 1547 1397 1423 +f 1481 1593 1575 +f 1575 1423 1481 +f 1529 1617 1593 +f 1593 1481 1529 +f 1587 1641 1617 +f 1617 1529 1587 +f 1635 1663 1641 +f 1641 1587 1635 +f 1675 1687 1663 +f 1663 1635 1675 +f 1895 1894 1687 +f 1687 1675 1895 +f 1313 1366 1362 +f 1362 1308 1313 +f 1323 1374 1366 +f 1366 1313 1323 +f 1344 1397 1374 +f 1374 1323 1344 +f 1380 1423 1397 +f 1397 1344 1380 +f 1419 1481 1423 +f 1423 1380 1419 +f 1491 1529 1481 +f 1481 1419 1491 +f 1556 1587 1529 +f 1529 1491 1556 +f 1623 1635 1587 +f 1587 1556 1623 +f 1667 1675 1635 +f 1635 1623 1667 +f 1890 1895 1675 +f 1675 1667 1890 +f 1311 1313 1308 +f 1308 1307 1311 +f 1321 1323 1313 +f 1313 1311 1321 +f 1342 1344 1323 +f 1323 1321 1342 +f 1378 1380 1344 +f 1344 1342 1378 +f 1417 1419 1380 +f 1380 1378 1417 +f 1489 1491 1419 +f 1419 1417 1489 +f 1555 1556 1491 +f 1491 1489 1555 +f 1621 1623 1556 +f 1556 1555 1621 +f 1665 1667 1623 +f 1623 1621 1665 +f 1881 1890 1667 +f 1667 1665 1881 +f 1338 1311 1307 +f 1307 1334 1338 +f 1364 1321 1311 +f 1311 1338 1364 +f 1382 1342 1321 +f 1321 1364 1382 +f 1409 1378 1342 +f 1342 1382 1409 +f 1455 1417 1378 +f 1378 1409 1455 +f 1517 1489 1417 +f 1417 1455 1517 +f 1581 1555 1489 +f 1489 1517 1581 +f 1629 1621 1555 +f 1555 1581 1629 +f 1671 1665 1621 +f 1621 1629 1671 +f 1893 1881 1665 +f 1665 1671 1893 +f 1403 1338 1334 +f 1334 1398 1403 +f 1413 1364 1338 +f 1338 1403 1413 +f 1437 1382 1364 +f 1364 1413 1437 +f 1477 1409 1382 +f 1382 1437 1477 +f 1515 1455 1409 +f 1409 1477 1515 +f 1563 1517 1455 +f 1455 1515 1563 +f 1605 1581 1517 +f 1517 1563 1605 +f 1645 1629 1581 +f 1581 1605 1645 +f 1679 1671 1629 +f 1629 1645 1679 +f 1900 1893 1671 +f 1671 1679 1900 +f 1482 1403 1398 +f 1398 1478 1482 +f 1496 1413 1403 +f 1403 1482 1496 +f 1511 1437 1413 +f 1413 1496 1511 +f 1539 1477 1437 +f 1437 1511 1539 +f 1579 1515 1477 +f 1477 1539 1579 +f 1599 1563 1515 +f 1515 1579 1599 +f 1631 1605 1563 +f 1563 1599 1631 +f 1653 1645 1605 +f 1605 1631 1653 +f 1681 1679 1645 +f 1645 1653 1681 +f 1902 1900 1679 +f 1679 1681 1902 +f 1544 1482 1478 +f 1478 1536 1544 +f 1548 1496 1482 +f 1482 1544 1548 +f 1568 1511 1496 +f 1496 1548 1568 +f 1584 1539 1511 +f 1511 1568 1584 +f 1602 1579 1539 +f 1539 1584 1602 +f 1627 1599 1579 +f 1579 1602 1627 +f 1649 1631 1599 +f 1599 1627 1649 +f 1669 1653 1631 +f 1631 1649 1669 +f 1689 1681 1653 +f 1653 1669 1689 +f 1921 1902 1681 +f 1681 1689 1921 +f 1560 1544 1536 +f 1536 1552 1560 +f 1572 1548 1544 +f 1544 1560 1572 +f 1582 1568 1548 +f 1548 1572 1582 +f 1594 1584 1568 +f 1568 1582 1594 +f 1610 1602 1584 +f 1584 1594 1610 +f 1632 1627 1602 +f 1602 1610 1632 +f 1651 1649 1627 +f 1627 1632 1651 +f 1673 1669 1649 +f 1649 1651 1673 +f 1691 1689 1669 +f 1669 1673 1691 +f 1922 1921 1689 +f 1689 1691 1922 +f 1508 1560 1552 +f 1552 1500 1508 +f 1522 1572 1560 +f 1560 1508 1522 +f 1542 1582 1572 +f 1572 1522 1542 +f 1566 1594 1582 +f 1582 1542 1566 +f 1590 1610 1594 +f 1594 1566 1590 +f 1614 1632 1610 +f 1610 1590 1614 +f 1639 1651 1632 +f 1632 1614 1639 +f 1659 1673 1651 +f 1651 1639 1659 +f 1685 1691 1673 +f 1673 1659 1685 +f 1928 1922 1691 +f 1691 1685 1928 +f 1888 1887 1937 +f 1888 1937 1961 +f 1888 1961 1983 +f 1888 1983 2007 +f 1888 2007 2031 +f 1888 2031 2049 +f 1888 2049 2077 +f 1888 2077 2097 +f 1888 2097 2105 +f 1888 2105 2111 +f 1949 1937 1887 +f 1887 1885 1949 +f 1989 1961 1937 +f 1937 1949 1989 +f 2037 1983 1961 +f 1961 1989 2037 +f 2095 2007 1983 +f 1983 2037 2095 +f 2143 2031 2007 +f 2007 2095 2143 +f 2201 2049 2031 +f 2031 2143 2201 +f 2227 2077 2049 +f 2049 2201 2227 +f 2250 2097 2077 +f 2077 2227 2250 +f 2258 2105 2097 +f 2097 2250 2258 +f 2262 2111 2105 +f 2105 2258 2262 +f 1957 1949 1885 +f 1885 1883 1957 +f 2001 1989 1949 +f 1949 1957 2001 +f 2066 2037 1989 +f 1989 2001 2066 +f 2133 2095 2037 +f 2037 2066 2133 +f 2205 2143 2095 +f 2095 2133 2205 +f 2244 2201 2143 +f 2143 2205 2244 +f 2280 2227 2201 +f 2201 2244 2280 +f 2301 2250 2227 +f 2227 2280 2301 +f 2311 2258 2250 +f 2250 2301 2311 +f 2314 2262 2258 +f 2258 2311 2314 +f 1959 1957 1883 +f 1883 1880 1959 +f 2003 2001 1957 +f 1957 1959 2003 +f 2069 2066 2001 +f 2001 2003 2069 +f 2135 2133 2066 +f 2066 2069 2135 +f 2207 2205 2133 +f 2133 2135 2207 +f 2246 2244 2205 +f 2205 2207 2246 +f 2282 2280 2244 +f 2244 2246 2282 +f 2303 2301 2280 +f 2280 2282 2303 +f 2313 2311 2301 +f 2301 2303 2313 +f 2317 2314 2311 +f 2311 2313 2317 +f 1953 1959 1880 +f 1880 1877 1953 +f 1995 2003 1959 +f 1959 1953 1995 +f 2043 2069 2003 +f 2003 1995 2043 +f 2107 2135 2069 +f 2069 2043 2107 +f 2169 2207 2135 +f 2135 2107 2169 +f 2215 2246 2207 +f 2207 2169 2215 +f 2242 2282 2246 +f 2246 2215 2242 +f 2260 2303 2282 +f 2282 2242 2260 +f 2286 2313 2303 +f 2303 2260 2286 +f 2290 2317 2313 +f 2313 2286 2290 +f 1945 1953 1877 +f 1877 1875 1945 +f 1979 1995 1953 +f 1953 1945 1979 +f 2019 2043 1995 +f 1995 1979 2019 +f 2061 2107 2043 +f 2043 2019 2061 +f 2109 2169 2107 +f 2107 2061 2109 +f 2147 2215 2169 +f 2169 2109 2147 +f 2187 2242 2215 +f 2215 2147 2187 +f 2211 2260 2242 +f 2242 2187 2211 +f 2221 2286 2260 +f 2260 2211 2221 +f 2224 2290 2286 +f 2286 2221 2224 +f 1943 1945 1875 +f 1875 1873 1943 +f 1971 1979 1945 +f 1945 1943 1971 +f 1993 2019 1979 +f 1979 1971 1993 +f 2025 2061 2019 +f 2019 1993 2025 +f 2045 2109 2061 +f 2061 2025 2045 +f 2085 2147 2109 +f 2109 2045 2085 +f 2113 2187 2147 +f 2147 2085 2113 +f 2126 2211 2187 +f 2187 2113 2126 +f 2140 2221 2211 +f 2211 2126 2140 +f 2144 2224 2221 +f 2221 2140 2144 +f 1935 1943 1873 +f 1873 1871 1935 +f 1955 1971 1943 +f 1943 1935 1955 +f 1975 1993 1971 +f 1971 1955 1975 +f 1997 2025 1993 +f 1993 1975 1997 +f 2020 2045 2025 +f 2025 1997 2020 +f 2038 2085 2045 +f 2045 2020 2038 +f 2054 2113 2085 +f 2085 2038 2054 +f 2074 2126 2113 +f 2113 2054 2074 +f 2078 2140 2126 +f 2126 2074 2078 +f 2086 2144 2140 +f 2140 2078 2086 +f 1933 1935 1871 +f 1871 1869 1933 +f 1951 1955 1935 +f 1935 1933 1951 +f 1973 1975 1955 +f 1955 1951 1973 +f 1990 1997 1975 +f 1975 1973 1990 +f 2012 2020 1997 +f 1997 1990 2012 +f 2028 2038 2020 +f 2020 2012 2028 +f 2040 2054 2038 +f 2038 2028 2040 +f 2050 2074 2054 +f 2054 2040 2050 +f 2062 2078 2074 +f 2074 2050 2062 +f 2070 2086 2078 +f 2078 2062 2070 +f 1939 1933 1869 +f 1869 1866 1939 +f 1965 1951 1933 +f 1933 1939 1965 +f 1985 1973 1951 +f 1951 1965 1985 +f 2008 1990 1973 +f 1973 1985 2008 +f 2032 2012 1990 +f 1990 2008 2032 +f 2056 2028 2012 +f 2012 2032 2056 +f 2080 2040 2028 +f 2028 2056 2080 +f 2100 2050 2040 +f 2040 2080 2100 +f 2114 2062 2050 +f 2050 2100 2114 +f 2122 2070 2062 +f 2062 2114 2122 +f 2232 2116 2124 +f 2124 2236 2232 +f 2218 2102 2116 +f 2116 2232 2218 +f 2199 2082 2102 +f 2102 2218 2199 +f 2150 2058 2082 +f 2082 2199 2150 +f 2120 2034 2058 +f 2058 2150 2120 +f 2064 2010 2034 +f 2034 2120 2064 +f 2023 1986 2010 +f 2010 2064 2023 +f 1980 1966 1986 +f 1986 2023 1980 +f 1946 1940 1966 +f 1966 1980 1946 +f 1862 1730 1940 +f 1940 1946 1862 +f 2332 2232 2236 +f 2236 2336 2332 +f 2322 2218 2232 +f 2232 2332 2322 +f 2306 2199 2218 +f 2218 2322 2306 +f 2275 2150 2199 +f 2199 2306 2275 +f 2234 2120 2150 +f 2150 2275 2234 +f 2170 2064 2120 +f 2120 2234 2170 +f 2093 2023 2064 +f 2064 2170 2093 +f 2016 1980 2023 +f 2023 2093 2016 +f 1968 1946 1980 +f 1980 2016 1968 +f 1858 1862 1946 +f 1946 1968 1858 +f 2409 2332 2336 +f 2336 2413 2409 +f 2400 2322 2332 +f 2332 2409 2400 +f 2376 2306 2322 +f 2322 2400 2376 +f 2349 2275 2306 +f 2306 2376 2349 +f 2324 2234 2275 +f 2275 2349 2324 +f 2271 2170 2234 +f 2234 2324 2271 +f 2185 2093 2170 +f 2170 2271 2185 +f 2072 2016 2093 +f 2093 2185 2072 +f 1976 1968 2016 +f 2016 2072 1976 +f 1729 1858 1968 +f 1968 1976 1729 +f 2488 2409 2413 +f 2413 2498 2488 +f 2470 2400 2409 +f 2409 2488 2470 +f 2444 2376 2400 +f 2400 2470 2444 +f 2418 2349 2376 +f 2376 2444 2418 +f 2384 2324 2349 +f 2349 2418 2384 +f 2338 2271 2324 +f 2324 2384 2338 +f 2269 2185 2271 +f 2271 2338 2269 +f 2138 2072 2185 +f 2185 2269 2138 +f 1998 1976 2072 +f 2072 2138 1998 +f 1722 1729 1976 +f 1976 1998 1722 +f 2559 2488 2498 +f 2498 2569 2559 +f 2549 2470 2488 +f 2488 2559 2549 +f 2531 2444 2470 +f 2470 2549 2531 +f 2492 2418 2444 +f 2444 2531 2492 +f 2436 2384 2418 +f 2418 2492 2436 +f 2394 2338 2384 +f 2384 2436 2394 +f 2326 2269 2338 +f 2338 2394 2326 +f 2212 2138 2269 +f 2269 2326 2212 +f 2026 1998 2138 +f 2138 2212 2026 +f 1850 1722 1998 +f 1998 2026 1850 +f 2653 2559 2569 +f 2569 2655 2653 +f 2631 2549 2559 +f 2559 2653 2631 +f 2593 2531 2549 +f 2549 2631 2593 +f 2551 2492 2531 +f 2531 2593 2551 +f 2510 2436 2492 +f 2492 2551 2510 +f 2432 2394 2436 +f 2436 2510 2432 +f 2366 2326 2394 +f 2394 2432 2366 +f 2263 2212 2326 +f 2326 2366 2263 +f 2052 2026 2212 +f 2212 2263 2052 +f 1726 1850 2026 +f 2026 2052 1726 +f 2720 2653 2655 +f 2655 2726 2720 +f 2697 2631 2653 +f 2653 2720 2697 +f 2662 2593 2631 +f 2631 2697 2662 +f 2607 2551 2593 +f 2593 2662 2607 +f 2547 2510 2551 +f 2551 2607 2547 +f 2484 2432 2510 +f 2510 2547 2484 +f 2405 2366 2432 +f 2432 2484 2405 +f 2308 2263 2366 +f 2366 2405 2308 +f 2090 2052 2263 +f 2263 2308 2090 +f 1719 1726 2052 +f 2052 2090 1719 +f 2787 2720 2726 +f 2726 2795 2787 +f 2759 2697 2720 +f 2720 2787 2759 +f 2713 2662 2697 +f 2697 2759 2713 +f 2657 2607 2662 +f 2662 2713 2657 +f 2589 2547 2607 +f 2607 2657 2589 +f 2525 2484 2547 +f 2547 2589 2525 +f 2422 2405 2484 +f 2484 2525 2422 +f 2330 2308 2405 +f 2405 2422 2330 +f 2118 2090 2308 +f 2308 2330 2118 +f 1700 1719 2090 +f 2090 2118 1700 +f 2834 2787 2795 +f 2795 2844 2834 +f 2798 2759 2787 +f 2787 2834 2798 +f 2750 2713 2759 +f 2759 2798 2750 +f 2690 2657 2713 +f 2713 2750 2690 +f 2624 2589 2657 +f 2657 2690 2624 +f 2536 2525 2589 +f 2589 2624 2536 +f 2441 2422 2525 +f 2525 2536 2441 +f 2340 2330 2422 +f 2422 2441 2340 +f 2128 2118 2330 +f 2330 2340 2128 +f 1825 1700 2118 +f 2118 2128 1825 +f 2847 2834 2844 +f 2844 2857 2847 +f 2821 2798 2834 +f 2834 2847 2821 +f 2765 2750 2798 +f 2798 2821 2765 +f 2703 2690 2750 +f 2750 2765 2703 +f 2637 2624 2690 +f 2690 2703 2637 +f 2543 2536 2624 +f 2624 2637 2543 +f 2446 2441 2536 +f 2536 2543 2446 +f 2344 2340 2441 +f 2441 2446 2344 +f 2136 2128 2340 +f 2340 2344 2136 +f 1713 1825 2128 +f 2128 2136 1713 +f 1676 1682 1864 +f 1864 1862 1676 +f 1642 1656 1682 +f 1682 1676 1642 +f 1601 1636 1656 +f 1656 1642 1601 +f 1558 1612 1636 +f 1636 1601 1558 +f 1502 1588 1612 +f 1612 1558 1502 +f 1472 1564 1588 +f 1588 1502 1472 +f 1425 1540 1564 +f 1564 1472 1425 +f 1404 1520 1540 +f 1540 1425 1404 +f 1390 1506 1520 +f 1520 1404 1390 +f 1387 1498 1506 +f 1506 1390 1387 +f 1654 1676 1862 +f 1862 1859 1654 +f 1606 1642 1676 +f 1676 1654 1606 +f 1531 1601 1642 +f 1642 1606 1531 +f 1452 1558 1601 +f 1601 1531 1452 +f 1388 1502 1558 +f 1558 1452 1388 +f 1347 1472 1502 +f 1502 1388 1347 +f 1316 1425 1472 +f 1472 1347 1316 +f 1300 1404 1425 +f 1425 1316 1300 +f 1290 1390 1404 +f 1404 1300 1290 +f 1286 1387 1390 +f 1390 1290 1286 +f 1646 1654 1859 +f 1859 1856 1646 +f 1550 1606 1654 +f 1654 1646 1550 +f 1439 1531 1606 +f 1606 1550 1439 +f 1351 1452 1531 +f 1531 1439 1351 +f 1298 1388 1452 +f 1452 1351 1298 +f 1275 1347 1388 +f 1388 1298 1275 +f 1246 1316 1347 +f 1347 1275 1246 +f 1222 1300 1316 +f 1316 1246 1222 +f 1215 1290 1300 +f 1300 1222 1215 +f 1211 1286 1290 +f 1290 1215 1211 +f 1624 1646 1856 +f 1856 1854 1624 +f 1484 1550 1646 +f 1646 1624 1484 +f 1353 1439 1550 +f 1550 1484 1353 +f 1284 1351 1439 +f 1439 1353 1284 +f 1238 1298 1351 +f 1351 1284 1238 +f 1204 1275 1298 +f 1298 1238 1204 +f 1178 1246 1275 +f 1275 1204 1178 +f 1152 1222 1246 +f 1246 1178 1152 +f 1134 1215 1222 +f 1222 1152 1134 +f 1124 1211 1215 +f 1215 1134 1124 +f 1596 1624 1854 +f 1854 1851 1596 +f 1410 1484 1624 +f 1624 1596 1410 +f 1296 1353 1484 +f 1484 1410 1296 +f 1228 1284 1353 +f 1353 1296 1228 +f 1186 1238 1284 +f 1284 1228 1186 +f 1130 1204 1238 +f 1238 1186 1130 +f 1091 1178 1204 +f 1204 1130 1091 +f 1073 1152 1178 +f 1178 1091 1073 +f 1063 1134 1152 +f 1152 1073 1063 +f 1053 1124 1134 +f 1134 1063 1053 +f 1570 1596 1851 +f 1851 1848 1570 +f 1359 1410 1596 +f 1596 1570 1359 +f 1256 1296 1410 +f 1410 1359 1256 +f 1190 1228 1296 +f 1296 1256 1190 +f 1112 1186 1228 +f 1228 1190 1112 +f 1071 1130 1186 +f 1186 1112 1071 +f 1029 1091 1130 +f 1130 1071 1029 +f 991 1073 1091 +f 1091 1029 991 +f 969 1063 1073 +f 1073 991 969 +f 967 1053 1063 +f 1063 969 967 +f 1532 1570 1848 +f 1848 1846 1532 +f 1314 1359 1570 +f 1570 1532 1314 +f 1219 1256 1359 +f 1359 1314 1219 +f 1138 1190 1256 +f 1256 1219 1138 +f 1075 1112 1190 +f 1190 1138 1075 +f 1015 1071 1112 +f 1112 1075 1015 +f 962 1029 1071 +f 1071 1015 962 +f 925 991 1029 +f 1029 962 925 +f 904 969 991 +f 991 925 904 +f 898 967 969 +f 969 904 898 +f 1504 1532 1846 +f 1846 1832 1504 +f 1292 1314 1532 +f 1532 1504 1292 +f 1200 1219 1314 +f 1314 1292 1200 +f 1097 1138 1219 +f 1219 1200 1097 +f 1033 1075 1138 +f 1138 1097 1033 +f 965 1015 1075 +f 1075 1033 965 +f 909 962 1015 +f 1015 965 909 +f 863 925 962 +f 962 909 863 +f 835 904 925 +f 925 863 835 +f 827 898 904 +f 904 835 827 +f 1494 1504 1832 +f 1832 1824 1494 +f 1282 1292 1504 +f 1504 1494 1282 +f 1183 1200 1292 +f 1292 1282 1183 +f 1088 1097 1200 +f 1200 1183 1088 +f 1000 1033 1097 +f 1097 1088 1000 +f 934 965 1033 +f 1033 1000 934 +f 874 909 965 +f 965 934 874 +f 826 863 909 +f 909 874 826 +f 790 835 863 +f 863 826 790 +f 780 827 835 +f 835 790 780 +f 1486 1494 1824 +f 1824 1814 1486 +f 1278 1282 1494 +f 1494 1486 1278 +f 1176 1183 1282 +f 1282 1278 1176 +f 1079 1088 1183 +f 1183 1176 1079 +f 985 1000 1088 +f 1088 1079 985 +f 919 934 1000 +f 1000 985 919 +f 857 874 934 +f 934 919 857 +f 801 826 874 +f 874 857 801 +f 775 790 826 +f 826 801 775 +f 765 780 790 +f 790 775 765 +f 1391 1507 1499 +f 1499 1387 1391 +f 1405 1521 1507 +f 1507 1391 1405 +f 1424 1541 1521 +f 1521 1405 1424 +f 1473 1565 1541 +f 1541 1424 1473 +f 1503 1589 1565 +f 1565 1473 1503 +f 1559 1613 1589 +f 1589 1503 1559 +f 1600 1637 1613 +f 1613 1559 1600 +f 1643 1657 1637 +f 1637 1600 1643 +f 1677 1683 1657 +f 1657 1643 1677 +f 1863 1892 1683 +f 1683 1677 1863 +f 1291 1391 1387 +f 1387 1287 1291 +f 1301 1405 1391 +f 1391 1291 1301 +f 1317 1424 1405 +f 1405 1301 1317 +f 1348 1473 1424 +f 1424 1317 1348 +f 1389 1503 1473 +f 1473 1348 1389 +f 1453 1559 1503 +f 1503 1389 1453 +f 1530 1600 1559 +f 1559 1453 1530 +f 1607 1643 1600 +f 1600 1530 1607 +f 1655 1677 1643 +f 1643 1607 1655 +f 1861 1863 1677 +f 1677 1655 1861 +f 1214 1291 1287 +f 1287 1210 1214 +f 1223 1301 1291 +f 1291 1214 1223 +f 1247 1317 1301 +f 1301 1223 1247 +f 1274 1348 1317 +f 1317 1247 1274 +f 1299 1389 1348 +f 1348 1274 1299 +f 1352 1453 1389 +f 1389 1299 1352 +f 1438 1530 1453 +f 1453 1352 1438 +f 1551 1607 1530 +f 1530 1438 1551 +f 1647 1655 1607 +f 1607 1551 1647 +f 1891 1861 1655 +f 1655 1647 1891 +f 1135 1214 1210 +f 1210 1125 1135 +f 1153 1223 1214 +f 1214 1135 1153 +f 1179 1247 1223 +f 1223 1153 1179 +f 1205 1274 1247 +f 1247 1179 1205 +f 1239 1299 1274 +f 1274 1205 1239 +f 1285 1352 1299 +f 1299 1239 1285 +f 1354 1438 1352 +f 1352 1285 1354 +f 1485 1551 1438 +f 1438 1354 1485 +f 1625 1647 1551 +f 1551 1485 1625 +f 1901 1891 1647 +f 1647 1625 1901 +f 1064 1135 1125 +f 1125 1054 1064 +f 1074 1153 1135 +f 1135 1064 1074 +f 1092 1179 1153 +f 1153 1074 1092 +f 1131 1205 1179 +f 1179 1092 1131 +f 1187 1239 1205 +f 1205 1131 1187 +f 1229 1285 1239 +f 1239 1187 1229 +f 1297 1354 1285 +f 1285 1229 1297 +f 1411 1485 1354 +f 1354 1297 1411 +f 1597 1625 1485 +f 1485 1411 1597 +f 1853 1901 1625 +f 1625 1597 1853 +f 970 1064 1054 +f 1054 968 970 +f 992 1074 1064 +f 1064 970 992 +f 1030 1092 1074 +f 1074 992 1030 +f 1072 1131 1092 +f 1092 1030 1072 +f 1113 1187 1131 +f 1131 1072 1113 +f 1191 1229 1187 +f 1187 1113 1191 +f 1257 1297 1229 +f 1229 1191 1257 +f 1360 1411 1297 +f 1297 1257 1360 +f 1571 1597 1411 +f 1411 1360 1571 +f 1899 1853 1597 +f 1597 1571 1899 +f 903 970 968 +f 968 897 903 +f 926 992 970 +f 970 903 926 +f 961 1030 992 +f 992 926 961 +f 1016 1072 1030 +f 1030 961 1016 +f 1076 1113 1072 +f 1072 1016 1076 +f 1139 1191 1113 +f 1113 1076 1139 +f 1218 1257 1191 +f 1191 1139 1218 +f 1315 1360 1257 +f 1257 1218 1315 +f 1533 1571 1360 +f 1360 1315 1533 +f 1920 1899 1571 +f 1571 1533 1920 +f 836 903 897 +f 897 828 836 +f 864 926 903 +f 903 836 864 +f 910 961 926 +f 926 864 910 +f 966 1016 961 +f 961 910 966 +f 1034 1076 1016 +f 1016 966 1034 +f 1098 1139 1076 +f 1076 1034 1098 +f 1201 1218 1139 +f 1139 1098 1201 +f 1293 1315 1218 +f 1218 1201 1293 +f 1505 1533 1315 +f 1315 1293 1505 +f 1924 1920 1533 +f 1533 1505 1924 +f 789 836 828 +f 828 779 789 +f 825 864 836 +f 836 789 825 +f 873 910 864 +f 864 825 873 +f 933 966 910 +f 910 873 933 +f 999 1034 966 +f 966 933 999 +f 1087 1098 1034 +f 1034 999 1087 +f 1182 1201 1098 +f 1098 1087 1182 +f 1283 1293 1201 +f 1201 1182 1283 +f 1495 1505 1293 +f 1293 1283 1495 +f 1826 1924 1505 +f 1505 1495 1826 +f 776 789 779 +f 779 766 776 +f 802 825 789 +f 789 776 802 +f 858 873 825 +f 825 802 858 +f 920 933 873 +f 873 858 920 +f 986 999 933 +f 933 920 986 +f 1080 1087 999 +f 999 986 1080 +f 1177 1182 1087 +f 1087 1080 1177 +f 1279 1283 1182 +f 1182 1177 1279 +f 1487 1495 1283 +f 1283 1279 1487 +f 1914 1826 1495 +f 1495 1487 1914 +f 1947 1941 1867 +f 1867 1863 1947 +f 1981 1967 1941 +f 1941 1947 1981 +f 2022 1987 1967 +f 1967 1981 2022 +f 2065 2011 1987 +f 1987 2022 2065 +f 2121 2035 2011 +f 2011 2065 2121 +f 2151 2059 2035 +f 2035 2121 2151 +f 2198 2083 2059 +f 2059 2151 2198 +f 2219 2103 2083 +f 2083 2198 2219 +f 2233 2117 2103 +f 2103 2219 2233 +f 2236 2125 2117 +f 2117 2233 2236 +f 1969 1947 1863 +f 1863 1860 1969 +f 2017 1981 1947 +f 1947 1969 2017 +f 2092 2022 1981 +f 1981 2017 2092 +f 2171 2065 2022 +f 2022 2092 2171 +f 2235 2121 2065 +f 2065 2171 2235 +f 2276 2151 2121 +f 2121 2235 2276 +f 2307 2198 2151 +f 2151 2276 2307 +f 2323 2219 2198 +f 2198 2307 2323 +f 2333 2233 2219 +f 2219 2323 2333 +f 2337 2236 2233 +f 2233 2333 2337 +f 1977 1969 1860 +f 1860 1857 1977 +f 2073 2017 1969 +f 1969 1977 2073 +f 2184 2092 2017 +f 2017 2073 2184 +f 2272 2171 2092 +f 2092 2184 2272 +f 2325 2235 2171 +f 2171 2272 2325 +f 2348 2276 2235 +f 2235 2325 2348 +f 2377 2307 2276 +f 2276 2348 2377 +f 2401 2323 2307 +f 2307 2377 2401 +f 2408 2333 2323 +f 2323 2401 2408 +f 2412 2337 2333 +f 2333 2408 2412 +f 1999 1977 1857 +f 1857 1855 1999 +f 2139 2073 1977 +f 1977 1999 2139 +f 2270 2184 2073 +f 2073 2139 2270 +f 2339 2272 2184 +f 2184 2270 2339 +f 2385 2325 2272 +f 2272 2339 2385 +f 2419 2348 2325 +f 2325 2385 2419 +f 2445 2377 2348 +f 2348 2419 2445 +f 2471 2401 2377 +f 2377 2445 2471 +f 2489 2408 2401 +f 2401 2471 2489 +f 2499 2412 2408 +f 2408 2489 2499 +f 2027 1999 1855 +f 1855 1852 2027 +f 2213 2139 1999 +f 1999 2027 2213 +f 2327 2270 2139 +f 2139 2213 2327 +f 2395 2339 2270 +f 2270 2327 2395 +f 2437 2385 2339 +f 2339 2395 2437 +f 2493 2419 2385 +f 2385 2437 2493 +f 2532 2445 2419 +f 2419 2493 2532 +f 2550 2471 2445 +f 2445 2532 2550 +f 2560 2489 2471 +f 2471 2550 2560 +f 2570 2499 2489 +f 2489 2560 2570 +f 2053 2027 1852 +f 1852 1849 2053 +f 2264 2213 2027 +f 2027 2053 2264 +f 2367 2327 2213 +f 2213 2264 2367 +f 2433 2395 2327 +f 2327 2367 2433 +f 2511 2437 2395 +f 2395 2433 2511 +f 2552 2493 2437 +f 2437 2511 2552 +f 2594 2532 2493 +f 2493 2552 2594 +f 2632 2550 2532 +f 2532 2594 2632 +f 2654 2560 2550 +f 2550 2632 2654 +f 2656 2570 2560 +f 2560 2654 2656 +f 2091 2053 1849 +f 1849 1847 2091 +f 2309 2264 2053 +f 2053 2091 2309 +f 2404 2367 2264 +f 2264 2309 2404 +f 2485 2433 2367 +f 2367 2404 2485 +f 2548 2511 2433 +f 2433 2485 2548 +f 2608 2552 2511 +f 2511 2548 2608 +f 2661 2594 2552 +f 2552 2608 2661 +f 2698 2632 2594 +f 2594 2661 2698 +f 2719 2654 2632 +f 2632 2698 2719 +f 2725 2656 2654 +f 2654 2719 2725 +f 2119 2091 1847 +f 1847 1833 2119 +f 2331 2309 2091 +f 2091 2119 2331 +f 2423 2404 2309 +f 2309 2331 2423 +f 2526 2485 2404 +f 2404 2423 2526 +f 2590 2548 2485 +f 2485 2526 2590 +f 2658 2608 2548 +f 2548 2590 2658 +f 2714 2661 2608 +f 2608 2658 2714 +f 2760 2698 2661 +f 2661 2714 2760 +f 2788 2719 2698 +f 2698 2760 2788 +f 2796 2725 2719 +f 2719 2788 2796 +f 2129 2119 1833 +f 1833 1827 2129 +f 2341 2331 2119 +f 2119 2129 2341 +f 2440 2423 2331 +f 2331 2341 2440 +f 2535 2526 2423 +f 2423 2440 2535 +f 2623 2590 2526 +f 2526 2535 2623 +f 2689 2658 2590 +f 2590 2623 2689 +f 2749 2714 2658 +f 2658 2689 2749 +f 2797 2760 2714 +f 2714 2749 2797 +f 2833 2788 2760 +f 2760 2797 2833 +f 2843 2796 2788 +f 2788 2833 2843 +f 2137 2129 1827 +f 1827 1815 2137 +f 2345 2341 2129 +f 2129 2137 2345 +f 2447 2440 2341 +f 2341 2345 2447 +f 2544 2535 2440 +f 2440 2447 2544 +f 2638 2623 2535 +f 2535 2544 2638 +f 2704 2689 2623 +f 2623 2638 2704 +f 2766 2749 2689 +f 2689 2704 2766 +f 2822 2797 2749 +f 2749 2766 2822 +f 2848 2833 2797 +f 2797 2822 2848 +f 2858 2843 2833 +f 2833 2848 2858 +f 1735 2334 2329 +f 1735 2329 2321 +f 1735 2321 2305 +f 1735 2305 2274 +f 1735 2274 2231 +f 1735 2231 2167 +f 1735 2167 2089 +f 1735 2089 2014 +f 1735 2014 1962 +f 1735 1962 1733 +f 2515 2329 2334 +f 2334 2524 2515 +f 2495 2321 2329 +f 2329 2515 2495 +f 2456 2305 2321 +f 2321 2495 2456 +f 2429 2274 2305 +f 2305 2456 2429 +f 2399 2231 2274 +f 2274 2429 2399 +f 2347 2167 2231 +f 2231 2399 2347 +f 2292 2089 2167 +f 2167 2347 2292 +f 2148 2014 2089 +f 2089 2292 2148 +f 2004 1962 2014 +f 2014 2148 2004 +f 1739 1733 1962 +f 1962 2004 1739 +f 2647 2515 2524 +f 2524 2649 2647 +f 2621 2495 2515 +f 2515 2647 2621 +f 2584 2456 2495 +f 2495 2621 2584 +f 2541 2429 2456 +f 2456 2584 2541 +f 2502 2399 2429 +f 2429 2541 2502 +f 2426 2347 2399 +f 2399 2502 2426 +f 2352 2292 2347 +f 2347 2426 2352 +f 2255 2148 2292 +f 2292 2352 2255 +f 2046 2004 2148 +f 2148 2255 2046 +f 1702 1739 2004 +f 2004 2046 1702 +f 2746 2647 2649 +f 2649 2757 2746 +f 2721 2621 2647 +f 2647 2746 2721 +f 2681 2584 2621 +f 2621 2721 2681 +f 2639 2541 2584 +f 2584 2681 2639 +f 2557 2502 2541 +f 2541 2639 2557 +f 2505 2426 2502 +f 2502 2557 2505 +f 2415 2352 2426 +f 2426 2505 2415 +f 2318 2255 2352 +f 2352 2415 2318 +f 2098 2046 2255 +f 2255 2318 2098 +f 1745 1702 2046 +f 2046 2098 1745 +f 2840 2746 2757 +f 2757 2849 2840 +f 2808 2721 2746 +f 2746 2840 2808 +f 2756 2681 2721 +f 2721 2808 2756 +f 2696 2639 2681 +f 2681 2756 2696 +f 2626 2557 2639 +f 2639 2696 2626 +f 2538 2505 2557 +f 2557 2626 2538 +f 2443 2415 2505 +f 2505 2538 2443 +f 2342 2318 2415 +f 2415 2443 2342 +f 2131 2098 2318 +f 2318 2342 2131 +f 1904 1745 2098 +f 2098 2131 1904 +f 2906 2840 2849 +f 2849 2925 2906 +f 2867 2808 2840 +f 2840 2906 2867 +f 2818 2756 2808 +f 2808 2867 2818 +f 2736 2696 2756 +f 2756 2818 2736 +f 2667 2626 2696 +f 2696 2736 2667 +f 2565 2538 2626 +f 2626 2667 2565 +f 2475 2443 2538 +f 2538 2565 2475 +f 2356 2342 2443 +f 2443 2475 2356 +f 2156 2131 2342 +f 2342 2356 2156 +f 1704 1904 2131 +f 2131 2156 1704 +f 2976 2906 2925 +f 2925 2987 2976 +f 2914 2867 2906 +f 2906 2976 2914 +f 2852 2818 2867 +f 2867 2914 2852 +f 2772 2736 2818 +f 2818 2852 2772 +f 2688 2667 2736 +f 2736 2772 2688 +f 2592 2565 2667 +f 2667 2688 2592 +f 2497 2475 2565 +f 2565 2592 2497 +f 2372 2356 2475 +f 2475 2497 2372 +f 2176 2156 2356 +f 2356 2372 2176 +f 1752 1704 2156 +f 2156 2176 1752 +f 2993 2976 2987 +f 2987 3011 2993 +f 2952 2914 2976 +f 2976 2993 2952 +f 2874 2852 2914 +f 2914 2952 2874 +f 2794 2772 2852 +f 2852 2874 2794 +f 2702 2688 2772 +f 2772 2794 2702 +f 2604 2592 2688 +f 2688 2702 2604 +f 2509 2497 2592 +f 2592 2604 2509 +f 2380 2372 2497 +f 2497 2509 2380 +f 2182 2176 2372 +f 2372 2380 2182 +f 1723 1752 2176 +f 2176 2182 1723 +f 3000 2993 3011 +f 3011 3020 3000 +f 2967 2952 2993 +f 2993 3000 2967 +f 2879 2874 2952 +f 2952 2967 2879 +f 2799 2794 2874 +f 2874 2879 2799 +f 2707 2702 2794 +f 2794 2799 2707 +f 2605 2604 2702 +f 2702 2707 2605 +f 2512 2509 2604 +f 2604 2605 2512 +f 2382 2380 2509 +f 2509 2512 2382 +f 2188 2182 2380 +f 2380 2382 2188 +f 1699 1723 2182 +f 2182 2188 1699 +f 3006 3000 3020 +f 3020 3022 3006 +f 2972 2967 3000 +f 3000 3006 2972 +f 2888 2879 2967 +f 2967 2972 2888 +f 2804 2799 2879 +f 2879 2888 2804 +f 2710 2707 2799 +f 2799 2804 2710 +f 2613 2605 2707 +f 2707 2710 2613 +f 2520 2512 2605 +f 2605 2613 2520 +f 2388 2382 2512 +f 2512 2520 2388 +f 2192 2188 2382 +f 2382 2388 2192 +f 1760 1699 2188 +f 2188 2192 1760 +f 1735 1737 1660 +f 1735 1660 1608 +f 1735 1608 1535 +f 1735 1535 1457 +f 1735 1457 1393 +f 1735 1393 1350 +f 1735 1350 1319 +f 1735 1319 1303 +f 1735 1303 1295 +f 1735 1295 1288 +f 1618 1660 1737 +f 1737 1739 1618 +f 1474 1608 1660 +f 1660 1618 1474 +f 1332 1535 1608 +f 1608 1474 1332 +f 1277 1457 1535 +f 1535 1332 1277 +f 1225 1393 1457 +f 1457 1277 1225 +f 1195 1350 1393 +f 1393 1225 1195 +f 1166 1319 1350 +f 1350 1195 1166 +f 1129 1303 1319 +f 1319 1166 1129 +f 1109 1295 1303 +f 1303 1129 1109 +f 1099 1288 1295 +f 1295 1109 1099 +f 1576 1618 1739 +f 1739 1741 1576 +f 1367 1474 1618 +f 1618 1576 1367 +f 1270 1332 1474 +f 1474 1367 1270 +f 1196 1277 1332 +f 1332 1270 1196 +f 1120 1225 1277 +f 1277 1196 1120 +f 1081 1195 1225 +f 1225 1120 1081 +f 1040 1166 1195 +f 1195 1081 1040 +f 1001 1129 1166 +f 1166 1040 1001 +f 975 1109 1129 +f 1129 1001 975 +f 973 1099 1109 +f 1109 975 973 +f 1524 1576 1741 +f 1741 1744 1524 +f 1304 1367 1576 +f 1576 1524 1304 +f 1209 1270 1367 +f 1367 1304 1209 +f 1119 1196 1270 +f 1270 1209 1119 +f 1065 1120 1196 +f 1196 1119 1065 +f 983 1081 1120 +f 1120 1065 983 +f 941 1040 1081 +f 1081 983 941 +f 901 1001 1040 +f 1040 941 901 +f 878 975 1001 +f 1001 901 878 +f 865 973 975 +f 975 878 865 +f 1493 1524 1744 +f 1744 1747 1493 +f 1280 1304 1524 +f 1524 1493 1280 +f 1181 1209 1304 +f 1304 1280 1181 +f 1086 1119 1209 +f 1209 1181 1086 +f 998 1065 1119 +f 1119 1086 998 +f 928 983 1065 +f 1065 998 928 +f 868 941 983 +f 983 928 868 +f 816 901 941 +f 941 868 816 +f 784 878 901 +f 901 816 784 +f 773 865 878 +f 878 784 773 +f 1466 1493 1747 +f 1747 1749 1466 +f 1266 1280 1493 +f 1493 1466 1266 +f 1149 1181 1280 +f 1280 1266 1149 +f 1057 1086 1181 +f 1181 1149 1057 +f 955 998 1086 +f 1086 1057 955 +f 888 928 998 +f 998 955 888 +f 806 868 928 +f 928 888 806 +f 755 816 868 +f 868 806 755 +f 718 784 816 +f 816 755 718 +f 697 773 784 +f 784 718 697 +f 1446 1466 1749 +f 1749 1753 1446 +f 1250 1266 1466 +f 1466 1446 1250 +f 1127 1149 1266 +f 1266 1250 1127 +f 1032 1057 1149 +f 1149 1127 1032 +f 936 955 1057 +f 1057 1032 936 +f 852 888 955 +f 955 936 852 +f 772 806 888 +f 888 852 772 +f 710 755 806 +f 806 772 710 +f 648 718 755 +f 755 710 648 +f 637 697 718 +f 718 648 637 +f 1440 1446 1753 +f 1753 1755 1440 +f 1242 1250 1446 +f 1446 1440 1242 +f 1115 1127 1250 +f 1250 1242 1115 +f 1020 1032 1127 +f 1127 1115 1020 +f 922 936 1032 +f 1032 1020 922 +f 830 852 936 +f 936 922 830 +f 750 772 852 +f 852 830 750 +f 672 710 772 +f 772 750 672 +f 631 648 710 +f 710 672 631 +f 613 637 648 +f 648 631 613 +f 1434 1440 1755 +f 1755 1757 1434 +f 1240 1242 1440 +f 1440 1434 1240 +f 1110 1115 1242 +f 1242 1240 1110 +f 1017 1020 1115 +f 1115 1110 1017 +f 915 922 1020 +f 1020 1017 915 +f 823 830 922 +f 922 915 823 +f 743 750 830 +f 830 823 743 +f 655 672 750 +f 750 743 655 +f 622 631 672 +f 672 655 622 +f 602 613 631 +f 631 622 602 +f 1428 1434 1757 +f 1757 1760 1428 +f 1232 1240 1434 +f 1434 1428 1232 +f 1105 1110 1240 +f 1240 1232 1105 +f 1010 1017 1110 +f 1110 1105 1010 +f 913 915 1017 +f 1017 1010 913 +f 821 823 915 +f 915 913 821 +f 736 743 823 +f 823 821 736 +f 652 655 743 +f 743 736 652 +f 619 622 655 +f 655 652 619 +f 601 602 622 +f 622 619 601 +f 1735 1289 1294 +f 1735 1294 1302 +f 1735 1302 1318 +f 1735 1318 1349 +f 1735 1349 1392 +f 1735 1392 1456 +f 1735 1456 1534 +f 1735 1534 1609 +f 1735 1609 1661 +f 1735 1661 1889 +f 1108 1294 1289 +f 1289 1099 1108 +f 1128 1302 1294 +f 1294 1108 1128 +f 1167 1318 1302 +f 1302 1128 1167 +f 1194 1349 1318 +f 1318 1167 1194 +f 1224 1392 1349 +f 1349 1194 1224 +f 1276 1456 1392 +f 1392 1224 1276 +f 1331 1534 1456 +f 1456 1276 1331 +f 1475 1609 1534 +f 1534 1331 1475 +f 1619 1661 1609 +f 1609 1475 1619 +f 1738 1889 1661 +f 1661 1619 1738 +f 976 1108 1099 +f 1099 974 976 +f 1002 1128 1108 +f 1108 976 1002 +f 1039 1167 1128 +f 1128 1002 1039 +f 1082 1194 1167 +f 1167 1039 1082 +f 1121 1224 1194 +f 1194 1082 1121 +f 1197 1276 1224 +f 1224 1121 1197 +f 1271 1331 1276 +f 1276 1197 1271 +f 1368 1475 1331 +f 1331 1271 1368 +f 1577 1619 1475 +f 1475 1368 1577 +f 1903 1738 1619 +f 1619 1577 1903 +f 877 976 974 +f 974 866 877 +f 902 1002 976 +f 976 877 902 +f 942 1039 1002 +f 1002 902 942 +f 984 1082 1039 +f 1039 942 984 +f 1066 1121 1082 +f 1082 984 1066 +f 1118 1197 1121 +f 1121 1066 1118 +f 1208 1271 1197 +f 1197 1118 1208 +f 1305 1368 1271 +f 1271 1208 1305 +f 1525 1577 1368 +f 1368 1305 1525 +f 1742 1903 1577 +f 1577 1525 1742 +f 783 877 866 +f 866 774 783 +f 815 902 877 +f 877 783 815 +f 867 942 902 +f 902 815 867 +f 927 984 942 +f 942 867 927 +f 997 1066 984 +f 984 927 997 +f 1085 1118 1066 +f 1066 997 1085 +f 1180 1208 1118 +f 1118 1085 1180 +f 1281 1305 1208 +f 1208 1180 1281 +f 1492 1525 1305 +f 1305 1281 1492 +f 1703 1742 1525 +f 1525 1492 1703 +f 717 783 774 +f 774 698 717 +f 756 815 783 +f 783 717 756 +f 805 867 815 +f 815 756 805 +f 887 927 867 +f 867 805 887 +f 956 997 927 +f 927 887 956 +f 1058 1085 997 +f 997 956 1058 +f 1148 1180 1085 +f 1085 1058 1148 +f 1267 1281 1180 +f 1180 1148 1267 +f 1467 1492 1281 +f 1281 1267 1467 +f 1905 1703 1492 +f 1492 1467 1905 +f 647 717 698 +f 698 636 647 +f 709 756 717 +f 717 647 709 +f 771 805 756 +f 756 709 771 +f 851 887 805 +f 805 771 851 +f 935 956 887 +f 887 851 935 +f 1031 1058 956 +f 956 935 1031 +f 1126 1148 1058 +f 1058 1031 1126 +f 1251 1267 1148 +f 1148 1126 1251 +f 1447 1467 1267 +f 1267 1251 1447 +f 1751 1905 1467 +f 1467 1447 1751 +f 630 647 636 +f 636 612 630 +f 671 709 647 +f 647 630 671 +f 749 771 709 +f 709 671 749 +f 829 851 771 +f 771 749 829 +f 921 935 851 +f 851 829 921 +f 1019 1031 935 +f 935 921 1019 +f 1114 1126 1031 +f 1031 1019 1114 +f 1243 1251 1126 +f 1126 1114 1243 +f 1441 1447 1251 +f 1251 1243 1441 +f 1896 1751 1447 +f 1447 1441 1896 +f 623 630 612 +f 612 603 623 +f 656 671 630 +f 630 623 656 +f 744 749 671 +f 671 656 744 +f 824 829 749 +f 749 744 824 +f 916 921 829 +f 829 824 916 +f 1018 1019 921 +f 921 916 1018 +f 1111 1114 1019 +f 1019 1018 1111 +f 1241 1243 1114 +f 1114 1111 1241 +f 1435 1441 1243 +f 1243 1241 1435 +f 1923 1896 1441 +f 1441 1435 1923 +f 617 623 603 +f 603 601 617 +f 650 656 623 +f 623 617 650 +f 734 744 656 +f 656 650 734 +f 818 824 744 +f 744 734 818 +f 912 916 824 +f 824 818 912 +f 1009 1018 916 +f 916 912 1009 +f 1102 1111 1018 +f 1018 1009 1102 +f 1235 1241 1111 +f 1111 1102 1235 +f 1431 1435 1241 +f 1241 1235 1431 +f 1759 1923 1435 +f 1435 1431 1759 +f 1735 1736 1963 +f 1735 1963 2015 +f 1735 2015 2088 +f 1735 2088 2166 +f 1735 2166 2230 +f 1735 2230 2273 +f 1735 2273 2304 +f 1735 2304 2320 +f 1735 2320 2328 +f 1735 2328 2335 +f 2005 1963 1736 +f 1736 1738 2005 +f 2149 2015 1963 +f 1963 2005 2149 +f 2291 2088 2015 +f 2015 2149 2291 +f 2346 2166 2088 +f 2088 2291 2346 +f 2398 2230 2166 +f 2166 2346 2398 +f 2428 2273 2230 +f 2230 2398 2428 +f 2457 2304 2273 +f 2273 2428 2457 +f 2494 2320 2304 +f 2304 2457 2494 +f 2514 2328 2320 +f 2320 2494 2514 +f 2524 2335 2328 +f 2328 2514 2524 +f 2047 2005 1738 +f 1738 1740 2047 +f 2256 2149 2005 +f 2005 2047 2256 +f 2353 2291 2149 +f 2149 2256 2353 +f 2427 2346 2291 +f 2291 2353 2427 +f 2503 2398 2346 +f 2346 2427 2503 +f 2542 2428 2398 +f 2398 2503 2542 +f 2583 2457 2428 +f 2428 2542 2583 +f 2622 2494 2457 +f 2457 2583 2622 +f 2648 2514 2494 +f 2494 2622 2648 +f 2650 2524 2514 +f 2514 2648 2650 +f 2099 2047 1740 +f 1740 1743 2099 +f 2319 2256 2047 +f 2047 2099 2319 +f 2414 2353 2256 +f 2256 2319 2414 +f 2504 2427 2353 +f 2353 2414 2504 +f 2558 2503 2427 +f 2427 2504 2558 +f 2640 2542 2503 +f 2503 2558 2640 +f 2682 2583 2542 +f 2542 2640 2682 +f 2722 2622 2583 +f 2583 2682 2722 +f 2745 2648 2622 +f 2622 2722 2745 +f 2758 2650 2648 +f 2648 2745 2758 +f 2130 2099 1743 +f 1743 1746 2130 +f 2343 2319 2099 +f 2099 2130 2343 +f 2442 2414 2319 +f 2319 2343 2442 +f 2537 2504 2414 +f 2414 2442 2537 +f 2625 2558 2504 +f 2504 2537 2625 +f 2695 2640 2558 +f 2558 2625 2695 +f 2755 2682 2640 +f 2640 2695 2755 +f 2807 2722 2682 +f 2682 2755 2807 +f 2839 2745 2722 +f 2722 2807 2839 +f 2850 2758 2745 +f 2745 2839 2850 +f 2157 2130 1746 +f 1746 1748 2157 +f 2357 2343 2130 +f 2130 2157 2357 +f 2474 2442 2343 +f 2343 2357 2474 +f 2566 2537 2442 +f 2442 2474 2566 +f 2668 2625 2537 +f 2537 2566 2668 +f 2735 2695 2625 +f 2625 2668 2735 +f 2817 2755 2695 +f 2695 2735 2817 +f 2868 2807 2755 +f 2755 2817 2868 +f 2905 2839 2807 +f 2807 2868 2905 +f 2926 2850 2839 +f 2839 2905 2926 +f 2177 2157 1748 +f 1748 1750 2177 +f 2373 2357 2157 +f 2157 2177 2373 +f 2496 2474 2357 +f 2357 2373 2496 +f 2591 2566 2474 +f 2474 2496 2591 +f 2687 2668 2566 +f 2566 2591 2687 +f 2771 2735 2668 +f 2668 2687 2771 +f 2851 2817 2735 +f 2735 2771 2851 +f 2913 2868 2817 +f 2817 2851 2913 +f 2975 2905 2868 +f 2868 2913 2975 +f 2986 2926 2905 +f 2905 2975 2986 +f 2183 2177 1750 +f 1750 1754 2183 +f 2381 2373 2177 +f 2177 2183 2381 +f 2508 2496 2373 +f 2373 2381 2508 +f 2603 2591 2496 +f 2496 2508 2603 +f 2701 2687 2591 +f 2591 2603 2701 +f 2793 2771 2687 +f 2687 2701 2793 +f 2873 2851 2771 +f 2771 2793 2873 +f 2951 2913 2851 +f 2851 2873 2951 +f 2992 2975 2913 +f 2913 2951 2992 +f 3010 2986 2975 +f 2975 2992 3010 +f 2189 2183 1754 +f 1754 1756 2189 +f 2383 2381 2183 +f 2183 2189 2383 +f 2513 2508 2381 +f 2381 2383 2513 +f 2606 2603 2508 +f 2508 2513 2606 +f 2708 2701 2603 +f 2603 2606 2708 +f 2800 2793 2701 +f 2701 2708 2800 +f 2880 2873 2793 +f 2793 2800 2880 +f 2968 2951 2873 +f 2873 2880 2968 +f 3001 2992 2951 +f 2951 2968 3001 +f 3021 3010 2992 +f 2992 3001 3021 +f 2195 2189 1756 +f 1756 1759 2195 +f 2390 2383 2189 +f 2189 2195 2390 +f 2517 2513 2383 +f 2383 2390 2517 +f 2612 2606 2513 +f 2513 2517 2612 +f 2709 2708 2606 +f 2606 2612 2709 +f 2801 2800 2708 +f 2708 2709 2801 +f 2886 2880 2800 +f 2800 2801 2886 +f 2970 2968 2880 +f 2880 2886 2970 +f 3004 3001 2968 +f 2968 2970 3004 +f 3022 3021 3001 +f 3001 3004 3022 diff --git a/content/handbook_2e/examples/17 Shapes/Ex_08/Ex_08.pde b/content/handbook_2e/examples/17 Shapes/Ex_08/Ex_08.pde new file mode 100644 index 000000000..38883e5ff --- /dev/null +++ b/content/handbook_2e/examples/17 Shapes/Ex_08/Ex_08.pde @@ -0,0 +1,15 @@ +PShape pot; + +void setup() { + size(100, 100, P3D); + pot = loadShape("teapot.obj"); + pot.scale(12); +} + +void draw() { + background(0); + lights(); + translate(50, 50); + pot.rotateX(0.05); + shape(pot, 0, 0); +} diff --git a/content/handbook_2e/examples/17 Shapes/Ex_08/data/teapot-upsidedown.obj b/content/handbook_2e/examples/17 Shapes/Ex_08/data/teapot-upsidedown.obj new file mode 100644 index 000000000..1fabb3d74 --- /dev/null +++ b/content/handbook_2e/examples/17 Shapes/Ex_08/data/teapot-upsidedown.obj @@ -0,0 +1,9965 @@ +v -3.000000 1.800000 0.000000 +v -2.991600 1.800000 -0.081000 +v -2.991600 1.800000 0.081000 +v -2.989450 1.666162 0.000000 +v -2.985000 1.921950 0.000000 +v -2.985000 1.921950 0.000000 +v -2.981175 1.667844 -0.081000 +v -2.981175 1.667844 0.081000 +v -2.976687 1.920243 -0.081000 +v -2.976687 1.920243 0.081000 +v -2.968800 1.800000 -0.144000 +v -2.968800 1.800000 0.144000 +v -2.958713 1.672406 -0.144000 +v -2.958713 1.672406 0.144000 +v -2.957600 1.534800 0.000000 +v -2.957600 1.534800 0.000000 +v -2.954122 1.915609 -0.144000 +v -2.954122 1.915609 0.144000 +v -2.949693 1.537790 -0.081000 +v -2.949693 1.537790 0.081000 +v -2.940000 2.019600 0.000000 +v -2.935200 1.800000 -0.189000 +v -2.935200 1.800000 0.189000 +v -2.931958 2.016526 0.081000 +v -2.931958 2.016526 -0.081000 +v -2.928230 1.545907 -0.144000 +v -2.928230 1.545907 0.144000 +v -2.925611 1.679131 -0.189000 +v -2.925611 1.679131 0.189000 +v -2.920870 1.908779 -0.189000 +v -2.920870 1.908779 0.189000 +v -2.910131 2.008181 -0.144000 +v -2.910131 2.008181 0.144000 +v -2.904150 1.406137 0.000000 +v -2.904150 1.406137 0.000000 +v -2.896846 1.410135 0.081000 +v -2.896846 1.410135 -0.081000 +v -2.896602 1.557869 -0.189000 +v -2.896602 1.557869 0.189000 +v -2.894400 1.800000 -0.216000 +v -2.894400 1.800000 0.216000 +v -2.885416 1.687296 -0.216000 +v -2.885416 1.687296 0.216000 +v -2.880491 1.900487 -0.216000 +v -2.880491 1.900487 0.216000 +v -2.877965 1.995883 -0.189000 +v -2.877965 1.995883 0.189000 +v -2.877022 1.420985 -0.144000 +v -2.877022 1.420985 0.144000 +v -2.865000 2.095650 0.000000 +v -2.858195 1.572394 0.216000 +v -2.858195 1.572394 -0.216000 +v -2.857432 2.091511 -0.081000 +v -2.857432 2.091511 0.081000 +v -2.850000 1.800000 -0.225000 +v -2.850000 1.800000 0.225000 +v -2.847806 1.436974 0.189000 +v -2.847806 1.436974 -0.189000 +v -2.841675 1.696181 0.225000 +v -2.841675 1.696181 -0.225000 +v -2.838906 1.980950 -0.216000 +v -2.838906 1.980950 0.216000 +v -2.836889 2.080276 -0.144000 +v -2.836889 2.080276 0.144000 +v -2.836550 1.891463 -0.225000 +v -2.836550 1.891463 0.225000 +v -2.828800 1.280400 0.000000 +v -2.822326 1.285171 -0.081000 +v -2.822326 1.285171 0.081000 +v -2.816400 1.588200 -0.225000 +v -2.816400 1.588200 0.225000 +v -2.812331 1.456390 0.216000 +v -2.812331 1.456390 -0.216000 +v -2.806615 2.063720 -0.189000 +v -2.806615 2.063720 0.189000 +v -2.805600 1.800000 -0.216000 +v -2.805600 1.800000 0.216000 +v -2.804755 1.298122 -0.144000 +v -2.804755 1.298122 0.144000 +v -2.797934 1.705067 -0.216000 +v -2.797934 1.705067 0.216000 +v -2.796400 1.964700 0.225000 +v -2.796400 1.964700 -0.225000 +v -2.792609 1.882438 -0.216000 +v -2.792609 1.882438 0.216000 +v -2.778861 1.317206 -0.189000 +v -2.778861 1.317206 0.189000 +v -2.774605 1.604006 0.216000 +v -2.774605 1.604006 -0.216000 +v -2.773725 1.477519 0.225000 +v -2.773725 1.477519 -0.225000 +v -2.769854 2.043616 -0.216000 +v -2.769854 2.043616 0.216000 +v -2.764800 1.800000 -0.189000 +v -2.764800 1.800000 0.189000 +v -2.760000 2.152800 0.000000 +v -2.760000 2.152800 0.000000 +v -2.757739 1.713232 -0.189000 +v -2.757739 1.713232 0.189000 +v -2.753894 1.948450 -0.216000 +v -2.753894 1.948450 0.216000 +v -2.753123 2.147861 -0.081000 +v -2.753123 2.147861 0.081000 +v -2.752230 1.874146 -0.189000 +v -2.752230 1.874146 0.189000 +v -2.747418 1.340381 -0.216000 +v -2.747418 1.340381 0.216000 +v -2.736198 1.618531 -0.189000 +v -2.736198 1.618531 0.189000 +v -2.735119 1.498648 0.216000 +v -2.735119 1.498648 -0.216000 +v -2.734458 2.134454 -0.144000 +v -2.734458 2.134454 0.144000 +v -2.731250 1.157813 0.000000 +v -2.731250 1.157813 0.000000 +v -2.731200 1.800000 -0.144000 +v -2.731200 1.800000 0.144000 +v -2.729850 2.021737 -0.225000 +v -2.729850 2.021737 0.225000 +v -2.725825 1.163194 0.081000 +v -2.725825 1.163194 -0.081000 +v -2.724637 1.719956 -0.144000 +v -2.724637 1.719956 0.144000 +v -2.718978 1.867316 -0.144000 +v -2.718978 1.867316 0.144000 +v -2.714835 1.933517 -0.189000 +v -2.714835 1.933517 0.189000 +v -2.713200 1.365600 -0.225000 +v -2.713200 1.365600 0.225000 +v -2.711100 1.177800 -0.144000 +v -2.711100 1.177800 0.144000 +v -2.708400 1.800000 -0.081000 +v -2.708400 1.800000 0.081000 +v -2.706950 2.114698 -0.189000 +v -2.706950 2.114698 0.189000 +v -2.704570 1.630493 -0.144000 +v -2.704570 1.630493 0.144000 +v -2.702175 1.724519 -0.081000 +v -2.702175 1.724519 0.081000 +v -2.700000 1.800000 0.000000 +v -2.699644 1.518063 0.189000 +v -2.699644 1.518063 -0.189000 +v -2.696413 1.862682 -0.081000 +v -2.696413 1.862682 0.081000 +v -2.693900 1.726200 0.000000 +v -2.689846 1.999859 -0.216000 +v -2.689846 1.999859 0.216000 +v -2.689400 1.199325 -0.189000 +v -2.689400 1.199325 0.189000 +v -2.688100 1.860975 0.000000 +v -2.688100 1.860975 0.000000 +v -2.683107 1.638610 -0.081000 +v -2.683107 1.638610 0.081000 +v -2.682669 1.921219 -0.144000 +v -2.682669 1.921219 0.144000 +v -2.678982 1.390819 -0.216000 +v -2.678982 1.390819 0.216000 +v -2.675200 1.641600 0.000000 +v -2.675200 1.641600 0.000000 +v -2.673549 2.090707 -0.216000 +v -2.673549 2.090707 0.216000 +v -2.670428 1.534053 -0.144000 +v -2.670428 1.534053 0.144000 +v -2.663050 1.225463 -0.216000 +v -2.663050 1.225463 0.216000 +v -2.660842 1.912874 0.081000 +v -2.660842 1.912874 -0.081000 +v -2.653085 1.979755 -0.189000 +v -2.653085 1.979755 0.189000 +v -2.652800 1.909800 0.000000 +v -2.652800 1.909800 0.000000 +v -2.650604 1.544903 0.081000 +v -2.650604 1.544903 -0.081000 +v -2.647539 1.413994 -0.189000 +v -2.647539 1.413994 0.189000 +v -2.643300 1.548900 0.000000 +v -2.637200 2.064600 -0.225000 +v -2.637200 2.064600 0.225000 +v -2.634375 1.253906 0.225000 +v -2.634375 1.253906 -0.225000 +v -2.625000 2.193750 0.000000 +v -2.622811 1.963199 -0.144000 +v -2.622811 1.963199 0.144000 +v -2.621645 1.433078 -0.144000 +v -2.621645 1.433078 0.144000 +v -2.619050 2.188238 -0.081000 +v -2.619050 2.188238 0.081000 +v -2.611200 1.038600 0.000000 +v -2.611200 1.038600 0.000000 +v -2.607034 1.044497 0.081000 +v -2.607034 1.044497 -0.081000 +v -2.605700 1.282350 -0.216000 +v -2.605700 1.282350 0.216000 +v -2.604074 1.446029 -0.081000 +v -2.604074 1.446029 0.081000 +v -2.602900 2.173275 -0.144000 +v -2.602900 2.173275 0.144000 +v -2.602268 1.951964 -0.081000 +v -2.602268 1.951964 0.081000 +v -2.600851 2.038493 -0.216000 +v -2.600851 2.038493 0.216000 +v -2.597600 1.450800 0.000000 +v -2.595725 1.060502 -0.144000 +v -2.595725 1.060502 0.144000 +v -2.594700 1.947825 0.000000 +v -2.579350 1.308488 -0.189000 +v -2.579350 1.308488 0.189000 +v -2.579100 2.151225 -0.189000 +v -2.579100 2.151225 0.189000 +v -2.579059 1.084090 -0.189000 +v -2.579059 1.084090 0.189000 +v -2.567450 2.014502 -0.189000 +v -2.567450 2.014502 0.189000 +v -2.558822 1.112731 0.216000 +v -2.558822 1.112731 -0.216000 +v -2.557650 1.330013 -0.144000 +v -2.557650 1.330013 0.144000 +v -2.550200 2.124450 -0.216000 +v -2.550200 2.124450 0.216000 +v -2.542925 1.344619 0.081000 +v -2.542925 1.344619 -0.081000 +v -2.539942 1.994746 -0.144000 +v -2.539942 1.994746 0.144000 +v -2.537500 1.350000 0.000000 +v -2.537500 1.350000 0.000000 +v -2.536800 1.143900 0.225000 +v -2.536800 1.143900 -0.225000 +v -2.521277 1.981339 -0.081000 +v -2.521277 1.981339 0.081000 +v -2.518750 2.095312 -0.225000 +v -2.518750 2.095312 0.225000 +v -2.514778 1.175069 0.216000 +v -2.514778 1.175069 -0.216000 +v -2.514400 1.976400 0.000000 +v -2.514400 1.976400 0.000000 +v -2.494541 1.203710 -0.189000 +v -2.494541 1.203710 0.189000 +v -2.487300 2.066175 -0.216000 +v -2.487300 2.066175 0.216000 +v -2.477875 1.227298 -0.144000 +v -2.477875 1.227298 0.144000 +v -2.468350 0.922987 0.000000 +v -2.466566 1.243303 0.081000 +v -2.466566 1.243303 -0.081000 +v -2.465644 0.929375 -0.081000 +v -2.465644 0.929375 0.081000 +v -2.462400 1.249200 0.000000 +v -2.462400 1.249200 0.000000 +v -2.460000 2.221200 0.000000 +v -2.460000 2.221200 0.000000 +v -2.458400 2.039400 -0.189000 +v -2.458400 2.039400 0.189000 +v -2.458298 0.946711 -0.144000 +v -2.458298 0.946711 0.144000 +v -2.455229 2.215303 -0.081000 +v -2.455229 2.215303 0.081000 +v -2.447474 0.972260 0.189000 +v -2.447474 0.972260 -0.189000 +v -2.442278 2.199298 -0.144000 +v -2.442278 2.199298 0.144000 +v -2.434600 2.017350 -0.144000 +v -2.434600 2.017350 0.144000 +v -2.434329 1.003283 -0.216000 +v -2.434329 1.003283 0.216000 +v -2.423194 2.175710 -0.189000 +v -2.423194 2.175710 0.189000 +v -2.420025 1.037044 -0.225000 +v -2.420025 1.037044 0.225000 +v -2.418450 2.002387 -0.081000 +v -2.418450 2.002388 0.081000 +v -2.412500 1.996875 0.000000 +v -2.412500 1.996875 0.000000 +v -2.405721 1.070804 -0.216000 +v -2.405721 1.070804 0.216000 +v -2.400019 2.147069 -0.216000 +v -2.400019 2.147069 0.216000 +v -2.392576 1.101828 -0.189000 +v -2.392576 1.101828 0.189000 +v -2.381752 1.127376 -0.144000 +v -2.381752 1.127376 0.144000 +v -2.374800 2.115900 -0.225000 +v -2.374800 2.115900 0.225000 +v -2.374406 1.144713 0.081000 +v -2.374406 1.144713 -0.081000 +v -2.371700 1.151100 0.000000 +v -2.349581 2.084731 -0.216000 +v -2.349581 2.084731 0.216000 +v -2.326406 2.056090 -0.189000 +v -2.326406 2.056090 0.189000 +v -2.307322 2.032502 -0.144000 +v -2.307322 2.032502 0.144000 +v -2.302400 0.811200 0.000000 +v -2.302400 0.811200 0.000000 +v -2.301347 0.818122 0.081000 +v -2.301347 0.818122 -0.081000 +v -2.298490 0.836909 0.144000 +v -2.298490 0.836909 -0.144000 +v -2.294371 2.016497 -0.081000 +v -2.294371 2.016497 0.081000 +v -2.294278 0.864595 0.189000 +v -2.294278 0.864595 -0.189000 +v -2.289600 2.010600 0.000000 +v -2.289600 2.010600 0.000000 +v -2.289165 0.898214 0.216000 +v -2.289165 0.898214 -0.216000 +v -2.283600 0.934800 0.225000 +v -2.283600 0.934800 -0.225000 +v -2.278035 0.971386 0.216000 +v -2.278035 0.971386 -0.216000 +v -2.272922 1.005005 0.189000 +v -2.272922 1.005005 -0.189000 +v -2.268710 1.032691 -0.144000 +v -2.268710 1.032691 0.144000 +v -2.265853 1.051478 0.081000 +v -2.265853 1.051478 -0.081000 +v -2.265000 2.237850 0.000000 +v -2.264800 1.058400 0.000000 +v -2.264800 1.058400 0.000000 +v -2.261676 2.231720 -0.081000 +v -2.261676 2.231720 0.081000 +v -2.252655 2.215082 -0.144000 +v -2.252655 2.215082 0.144000 +v -2.239361 2.190562 -0.189000 +v -2.239361 2.190562 0.189000 +v -2.223218 2.160788 -0.216000 +v -2.223218 2.160788 0.216000 +v -2.205650 2.128387 0.225000 +v -2.205650 2.128388 -0.225000 +v -2.188082 2.095987 -0.216000 +v -2.188082 2.095987 0.216000 +v -2.171939 2.066213 -0.189000 +v -2.171939 2.066213 0.189000 +v -2.158645 2.041693 -0.144000 +v -2.158645 2.041693 0.144000 +v -2.149624 2.025055 -0.081000 +v -2.149624 2.025055 0.081000 +v -2.146300 2.018925 0.000000 +v -2.141100 0.973800 0.000000 +v -2.141100 0.973800 0.000000 +v -2.140315 0.966231 0.081000 +v -2.140315 0.966231 -0.081000 +v -2.138183 0.945685 0.144000 +v -2.138183 0.945685 -0.144000 +v -2.135041 0.915407 0.189000 +v -2.135041 0.915407 -0.189000 +v -2.131226 0.878641 0.216000 +v -2.131226 0.878641 -0.216000 +v -2.127075 0.838631 0.225000 +v -2.127075 0.838631 -0.225000 +v -2.122924 0.798621 0.216000 +v -2.122924 0.798621 -0.216000 +v -2.119109 0.761855 0.189000 +v -2.119109 0.761855 -0.189000 +v -2.115967 0.731578 0.144000 +v -2.115967 0.731578 -0.144000 +v -2.113835 0.711032 0.081000 +v -2.113835 0.711032 -0.081000 +v -2.113050 0.703463 0.000000 +v -2.113050 0.703463 0.000000 +v -2.040000 2.246400 0.000000 +v -2.040000 2.246400 0.000000 +v -2.038410 2.240150 -0.081000 +v -2.038410 2.240150 0.081000 +v -2.034093 2.223187 -0.144000 +v -2.034093 2.223187 0.144000 +v -2.027731 2.198189 -0.189000 +v -2.027731 2.198189 0.189000 +v -2.020006 2.167834 0.216000 +v -2.020006 2.167834 -0.216000 +v -2.011600 2.134800 0.225000 +v -2.011600 2.134800 -0.225000 +v -2.003194 2.101766 0.216000 +v -2.003194 2.101766 -0.216000 +v -2.000000 0.900000 0.000000 +v -2.000000 0.900000 0.000000 +v -2.000000 0.900000 0.000000 +v -1.997200 0.891600 0.081000 +v -1.997200 0.891600 -0.081000 +v -1.995469 2.071411 -0.189000 +v -1.995469 2.071411 0.189000 +v -1.992750 1.037175 -0.000000 +v -1.992750 1.037175 0.000000 +v -1.989600 0.868800 0.144000 +v -1.989600 0.868800 -0.144000 +v -1.989107 2.046413 0.144000 +v -1.989107 2.046413 -0.144000 +v -1.986000 0.771675 0.000000 +v -1.986000 0.771675 0.000000 +v -1.984790 2.029450 -0.081000 +v -1.984790 2.029450 0.081000 +v -1.983200 2.023200 0.000000 +v -1.983200 2.023200 0.000000 +v -1.978400 0.835200 0.189000 +v -1.978400 0.835200 -0.189000 +v -1.974240 0.900000 -0.328160 +v -1.974240 0.900000 -0.328160 +v -1.974240 0.900000 0.328160 +v -1.972000 1.178400 -0.000000 +v -1.972000 1.178400 0.000000 +v -1.967083 1.037175 -0.326970 +v -1.967083 1.037175 0.326970 +v -1.964800 0.794400 0.216000 +v -1.964800 0.794400 -0.216000 +v -1.960420 0.771675 -0.325863 +v -1.960420 0.771675 0.325863 +v -1.950000 0.750000 -0.225000 +v -1.950000 0.750000 0.225000 +v -1.948000 0.656400 0.000000 +v -1.948000 0.656400 0.000000 +v -1.946601 1.178400 -0.323566 +v -1.946601 1.178400 0.323566 +v -1.939250 1.323225 0.000000 +v -1.939250 1.323225 0.000000 +v -1.935200 0.705600 0.216000 +v -1.935200 0.705600 -0.216000 +v -1.922910 0.656400 -0.319628 +v -1.922910 0.656400 0.319628 +v -1.921600 0.664800 0.189000 +v -1.921600 0.664800 -0.189000 +v -1.914272 1.323225 -0.318192 +v -1.914272 1.323225 0.318192 +v -1.910400 0.631200 0.144000 +v -1.910400 0.631200 -0.144000 +v -1.902800 0.608400 0.081000 +v -1.902800 0.608400 -0.081000 +v -1.900000 0.600000 0.000000 +v -1.900000 0.600000 0.000000 +v -1.899520 0.900000 -0.638080 +v -1.899520 0.900000 -0.638080 +v -1.899520 0.900000 0.638080 +v -1.899520 0.900000 0.638080 +v -1.896000 1.471200 0.000000 +v -1.896000 1.471200 0.000000 +v -1.892634 1.037175 -0.635767 +v -1.892634 1.037175 0.635767 +v -1.892000 0.553725 0.000000 +v -1.892000 0.553725 0.000000 +v -1.886223 0.771675 -0.633613 +v -1.886223 0.771675 0.633613 +v -1.872927 1.178400 -0.629147 +v -1.872927 1.178400 0.629147 +v -1.871580 1.471200 -0.311096 +v -1.871580 1.471200 0.311096 +v -1.867631 0.553725 -0.310439 +v -1.867631 0.553725 0.310439 +v -1.850132 0.656400 -0.621490 +v -1.850132 0.656400 0.621490 +v -1.843750 1.621875 0.000000 +v -1.843750 1.621875 0.000000 +v -1.841822 1.323225 -0.618698 +v -1.841822 1.323225 0.618698 +v -1.824000 0.463200 -0.000000 +v -1.824000 0.463200 0.000000 +v -1.820003 1.621875 -0.302522 +v -1.820003 1.621875 0.302523 +v -1.800900 2.024775 0.000000 +v -1.800745 1.471200 -0.604900 +v -1.800745 1.471200 0.604900 +v -1.800507 0.463200 -0.299282 +v -1.800507 0.463200 0.299282 +v -1.800455 2.031069 -0.081000 +v -1.800455 2.031069 0.081000 +v -1.799246 2.048152 -0.144000 +v -1.799246 2.048152 0.144000 +v -1.797466 2.073326 -0.189000 +v -1.797466 2.073326 0.189000 +v -1.796946 0.553725 -0.603624 +v -1.796946 0.553725 0.603624 +v -1.795303 2.103896 -0.216000 +v -1.795303 2.103896 0.216000 +v -1.792950 2.137163 -0.225000 +v -1.792950 2.137163 0.225000 +v -1.790597 2.170429 -0.216000 +v -1.790597 2.170429 0.216000 +v -1.788434 2.200999 -0.189000 +v -1.788434 2.200999 0.189000 +v -1.786654 2.226173 -0.144000 +v -1.786654 2.226173 0.144000 +v -1.785445 2.243256 -0.081000 +v -1.785445 2.243256 0.081000 +v -1.785000 2.249550 0.000000 +v -1.784000 1.774800 -0.000000 +v -1.784000 1.774800 0.000000 +v -1.779680 0.900000 -0.925920 +v -1.779680 0.900000 -0.925920 +v -1.779680 0.900000 0.925920 +v -1.779680 0.900000 0.925920 +v -1.773229 1.037175 -0.922564 +v -1.773229 1.037175 0.922564 +v -1.767222 0.771675 -0.919439 +v -1.767222 0.771675 0.919439 +v -1.761022 1.774800 -0.292719 +v -1.761022 1.774800 0.292719 +v -1.754764 1.178400 -0.912957 +v -1.754764 1.178400 0.912957 +v -1.751120 1.621875 -0.588230 +v -1.751120 1.621875 0.588230 +v -1.750000 0.384375 -0.000000 +v -1.750000 0.384375 0.000000 +v -1.733408 0.656400 -0.901846 +v -1.733408 0.656400 0.901846 +v -1.732362 0.463200 -0.581929 +v -1.732362 0.463200 0.581929 +v -1.727460 0.384375 -0.287140 +v -1.727460 0.384375 0.287140 +v -1.725622 1.323225 -0.897795 +v -1.725622 1.323225 0.897795 +v -1.718250 1.929525 -0.000000 +v -1.718250 1.929525 0.000000 +v -1.696119 1.929525 -0.281930 +v -1.696119 1.929525 0.281930 +v -1.694372 1.774800 -0.569167 +v -1.694372 1.774800 0.569167 +v -1.687137 1.471200 -0.877772 +v -1.687137 1.471200 0.877772 +v -1.683577 0.553725 -0.875920 +v -1.683577 0.553725 0.875920 +v -1.676000 0.316800 0.000000 +v -1.676000 0.316800 0.000000 +v -1.662080 0.384375 -0.558320 +v -1.662080 0.384375 0.558320 +v -1.654413 0.316800 -0.274998 +v -1.654413 0.316800 0.274998 +v -1.648000 2.085600 0.000000 +v -1.648000 2.085600 0.000000 +v -1.640643 1.621875 -0.853583 +v -1.640643 1.621875 0.853583 +v -1.631925 1.929525 -0.548190 +v -1.631925 1.929525 0.548190 +v -1.626774 2.085600 -0.270404 +v -1.626774 2.085600 0.270404 +v -1.623068 0.463200 -0.844439 +v -1.623068 0.463200 0.844439 +v -1.618560 0.900000 -1.187840 +v -1.618560 0.900000 -1.187840 +v -1.618560 0.900000 1.187840 +v -1.618560 0.900000 1.187840 +v -1.612693 1.037175 -1.183534 +v -1.612693 1.037175 1.183534 +v -1.608000 0.260025 -0.000000 +v -1.608000 0.260025 0.000000 +v -1.607230 0.771675 -1.179525 +v -1.607230 0.771675 1.179525 +v -1.600000 2.025000 0.000000 +v -1.597200 2.031300 -0.081000 +v -1.597200 2.031300 0.081000 +v -1.595900 1.178400 -1.171210 +v -1.595900 1.178400 1.171210 +v -1.591798 0.316800 -0.534711 +v -1.591798 0.316800 0.534711 +v -1.589600 2.048400 -0.144000 +v -1.589600 2.048400 0.144000 +v -1.587475 1.774800 -0.825921 +v -1.587475 1.774800 0.825921 +v -1.587289 0.260025 0.263841 +v -1.587289 0.260025 -0.263841 +v -1.578400 2.073600 -0.189000 +v -1.578400 2.073600 0.189000 +v -1.576477 0.656400 -1.156956 +v -1.576477 0.656400 1.156956 +v -1.574750 2.242575 0.000000 +v -1.574750 2.242575 0.000000 +v -1.569396 1.323225 -1.151759 +v -1.569396 1.323225 1.151759 +v -1.565204 2.085600 -0.525778 +v -1.565204 2.085600 0.525778 +v -1.564800 2.104200 -0.216000 +v -1.564800 2.104200 0.216000 +v -1.557220 0.384375 -0.810180 +v -1.557220 0.384375 0.810180 +v -1.554467 2.242575 -0.258385 +v -1.554467 2.242575 0.258385 +v -1.552000 0.213600 0.000000 +v -1.552000 0.213600 0.000000 +v -1.550000 2.137500 -0.225000 +v -1.550000 2.137500 0.225000 +v -1.535200 2.170800 -0.216000 +v -1.535200 2.170800 0.216000 +v -1.534395 1.471200 -1.126072 +v -1.534395 1.471200 1.126072 +v -1.532010 0.213600 0.254652 +v -1.532010 0.213600 -0.254652 +v -1.531158 0.553725 -1.123697 +v -1.531158 0.553725 1.123697 +v -1.528968 1.929525 -0.795481 +v -1.528968 1.929525 0.795481 +v -1.527214 0.260025 -0.513016 +v -1.527214 0.260025 0.513016 +v -1.521600 2.201400 -0.189000 +v -1.521600 2.201400 0.189000 +v -1.514000 0.177075 0.000000 +v -1.514000 0.177075 0.000000 +v -1.510400 2.226600 -0.144000 +v -1.510400 2.226600 0.144000 +v -1.502800 2.243700 -0.081000 +v -1.502800 2.243700 0.081000 +v -1.500000 2.400000 0.000000 +v -1.500000 0.150000 0.000000 +v -1.500000 2.250000 0.000000 +v -1.500000 2.400000 0.000000 +v -1.500000 0.150000 0.000000 +v -1.496475 0.127575 -0.000000 +v -1.496475 0.127575 0.000000 +v -1.495635 2.242575 -0.502408 +v -1.495635 2.242575 0.502408 +v -1.494500 0.177075 0.248417 +v -1.494500 0.177075 -0.248417 +v -1.492110 1.621875 -1.095040 +v -1.492110 1.621875 1.095040 +v -1.491372 0.316800 -0.775921 +v -1.491372 0.316800 0.775921 +v -1.480800 0.105600 0.000000 +v -1.480800 0.105600 -0.000000 +v -1.480680 2.400000 -0.246120 +v -1.480680 0.150000 0.246120 +v -1.480680 2.400000 0.246120 +v -1.480680 0.150000 -0.246120 +v -1.480680 0.150000 -0.246120 +v -1.480680 0.150000 0.246120 +v -1.480325 2.435437 0.000000 +v -1.480325 2.435437 0.000000 +v -1.477200 0.127575 0.245542 +v -1.477200 0.127575 -0.245542 +v -1.476127 0.463200 -1.083310 +v -1.476127 0.463200 1.083310 +v -1.474028 0.213600 0.495150 +v -1.474028 0.213600 -0.495150 +v -1.466456 2.085600 -0.762958 +v -1.466456 2.085600 0.762958 +v -1.461727 0.105600 -0.242970 +v -1.461727 0.105600 0.242970 +v -1.461258 2.435437 -0.242892 +v -1.461258 2.435437 0.242892 +v -1.459600 2.463000 0.000000 +v -1.459600 2.463000 0.000000 +v -1.445325 0.084525 0.000000 +v -1.445325 0.084525 0.000000 +v -1.443756 1.774800 -1.059553 +v -1.443756 1.774800 1.059553 +v -1.440800 2.463000 -0.239491 +v -1.440800 2.463000 0.239491 +v -1.439025 2.482687 0.000000 +v -1.437937 0.177075 0.483027 +v -1.437937 0.177075 -0.483027 +v -1.430863 0.260025 0.744440 +v -1.430863 0.260025 -0.744440 +v -1.426709 0.084525 -0.237149 +v -1.426709 0.084525 0.237149 +v -1.424640 2.400000 -0.478560 +v -1.424640 0.150000 -0.478560 +v -1.424640 0.150000 -0.478560 +v -1.424640 0.150000 0.478560 +v -1.424640 0.150000 0.478560 +v -1.424640 2.400000 0.478560 +v -1.421292 0.127575 0.477435 +v -1.421292 0.127575 -0.477435 +v -1.420490 2.482687 -0.236115 +v -1.420490 2.482687 0.236115 +v -1.420000 0.900000 -1.420000 +v -1.420000 0.900000 -1.420000 +v -1.420000 0.900000 1.420000 +v -1.420000 0.900000 1.420000 +v -1.419800 2.494500 0.000000 +v -1.419800 2.494500 0.000000 +v -1.416240 0.384375 -1.039360 +v -1.416240 0.384375 1.039360 +v -1.414853 1.037175 -1.414853 +v -1.414853 1.037175 1.414853 +v -1.410060 0.771675 -1.410060 +v -1.410060 0.771675 1.410060 +v -1.406405 0.105600 -0.472434 +v -1.406405 0.105600 0.472434 +v -1.405953 2.435437 -0.472283 +v -1.405953 2.435437 0.472283 +v -1.403125 2.498438 0.000000 +v -1.403125 2.498438 0.000000 +v -1.401513 2.494500 -0.232961 +v -1.401513 2.494500 0.232961 +v -1.401276 2.242575 -0.729046 +v -1.401276 2.242575 0.729046 +v -1.400120 1.178400 -1.400120 +v -1.400120 1.178400 1.400120 +v -1.400000 2.400000 0.000000 +v -1.400000 2.400000 0.000000 +v -1.390545 1.929525 -1.020503 +v -1.390545 1.929525 1.020503 +v -1.390200 2.494500 0.000000 +v -1.390200 2.494500 0.000000 +v -1.386270 2.463000 -0.465671 +v -1.386270 2.463000 0.465671 +v -1.385925 2.435437 0.000000 +v -1.385925 2.435437 0.000000 +v -1.385053 2.498438 -0.230225 +v -1.385053 2.498438 0.230225 +v -1.383080 0.656400 -1.383080 +v -1.383080 0.656400 1.383080 +v -1.382400 0.064800 -0.000000 +v -1.382400 0.064800 0.000000 +v -1.382225 2.482687 -0.000000 +v -1.382225 2.482687 0.000000 +v -1.381968 2.400000 -0.229712 +v -1.381968 2.400000 0.229712 +v -1.381032 0.213600 0.718514 +v -1.381032 0.213600 -0.718514 +v -1.380400 2.463000 0.000000 +v -1.380400 2.463000 0.000000 +v -1.376868 1.323225 -1.376867 +v -1.376867 1.323225 1.376868 +v -1.372712 0.084525 -0.461116 +v -1.372712 0.084525 0.461116 +v -1.372294 2.494500 -0.228104 +v -1.372294 2.494500 0.228104 +v -1.368074 2.435437 -0.227403 +v -1.368074 2.435437 0.227403 +v -1.366728 2.482687 -0.459107 +v -1.366728 2.482687 0.459107 +v -1.364595 0.064800 -0.226824 +v -1.364595 0.064800 0.226824 +v -1.364422 2.482687 -0.226795 +v -1.364422 2.482687 0.226795 +v -1.362620 2.463000 -0.226496 +v -1.362620 2.463000 0.226496 +v -1.356353 0.316800 -0.995410 +v -1.356353 0.316800 0.995410 +v -1.348469 2.494500 -0.452973 +v -1.348469 2.494500 0.452973 +v -1.347218 0.177075 0.700921 +v -1.347218 0.177075 -0.700921 +v -1.346160 1.471200 -1.346160 +v -1.346160 1.471200 1.346160 +v -1.343320 0.553725 -1.343320 +v -1.343320 0.553725 1.343320 +v -1.334760 2.400000 -0.694440 +v -1.334760 0.150000 -0.694440 +v -1.334760 0.150000 0.694440 +v -1.334760 0.150000 0.694440 +v -1.334760 2.400000 0.694440 +v -1.334760 0.150000 -0.694440 +v -1.333693 2.085600 -0.978780 +v -1.333693 2.085600 0.978780 +v -1.332632 2.498438 -0.447653 +v -1.332632 2.498438 0.447653 +v -1.331623 0.127575 0.692808 +v -1.331623 0.127575 -0.692808 +v -1.329664 2.400000 -0.446656 +v -1.329664 2.400000 0.446656 +v -1.320356 2.494500 -0.443529 +v -1.320356 2.494500 0.443529 +v -1.317675 0.105600 -0.685551 +v -1.317675 0.105600 0.685551 +v -1.317252 2.435437 -0.685331 +v -1.317252 2.435437 0.685331 +v -1.316296 2.435437 -0.442166 +v -1.316296 2.435437 0.442166 +v -1.312948 0.064800 0.441041 +v -1.312948 0.064800 -0.441041 +v -1.312782 2.482687 -0.440985 +v -1.312782 2.482687 0.440985 +v -1.311049 2.463000 -0.440403 +v -1.311049 2.463000 0.440403 +v -1.309063 1.621875 -1.309063 +v -1.309063 1.621875 1.309063 +v -1.301322 0.260025 0.955023 +v -1.301322 0.260025 -0.955023 +v -1.300000 2.400000 0.000000 +v -1.300000 2.400000 0.000000 +v -1.298810 2.463000 -0.675736 +v -1.298810 2.463000 0.675736 +v -1.295040 0.463200 -1.295040 +v -1.295040 0.463200 1.295040 +v -1.286108 0.084525 -0.669128 +v -1.286108 0.084525 0.669128 +v -1.284375 0.046875 0.000000 +v -1.284375 0.046875 0.000000 +v -1.283256 2.400000 -0.213304 +v -1.283256 2.400000 0.213304 +v -1.280502 2.482687 -0.666211 +v -1.280502 2.482687 0.666211 +v -1.274600 2.440800 0.000000 +v -1.274600 2.440800 0.000000 +v -1.274414 2.242575 -0.935276 +v -1.274414 2.242575 0.935276 +v -1.267832 0.046875 -0.210740 +v -1.267832 0.046875 0.210740 +v -1.266640 1.774800 -1.266640 +v -1.266640 1.774800 1.266640 +v -1.263395 2.494500 -0.657311 +v -1.263395 2.494500 0.657311 +v -1.258183 2.440800 0.209136 +v -1.258183 2.440800 -0.209136 +v -1.256003 0.213600 0.921764 +v -1.256003 0.213600 -0.921764 +v -1.248557 2.498438 -0.649591 +v -1.248557 2.498438 0.649591 +v -1.245776 2.400000 -0.648144 +v -1.245776 2.400000 0.648144 +v -1.242500 0.384375 -1.242500 +v -1.242500 0.384375 1.242500 +v -1.237056 2.494500 -0.643607 +v -1.237056 2.494500 0.643607 +v -1.234688 2.400000 -0.414752 +v -1.234688 2.400000 0.414752 +v -1.233252 2.435437 -0.641628 +v -1.233252 2.435437 0.641628 +v -1.230115 0.064800 -0.639996 +v -1.230115 0.064800 0.639996 +v -1.229959 2.482687 -0.639915 +v -1.229959 2.482687 0.639915 +v -1.228335 2.463000 -0.639070 +v -1.228335 2.463000 0.639070 +v -1.225250 0.177075 0.899195 +v -1.225250 0.177075 -0.899195 +v -1.219958 1.929525 1.219958 +v -1.219958 1.929525 -1.219958 +v -1.219848 0.046875 -0.409767 +v -1.219848 0.046875 0.409767 +v -1.213920 2.400000 -0.890880 +v -1.213920 0.150000 -0.890880 +v -1.213920 0.150000 -0.890880 +v -1.213920 0.150000 0.890880 +v -1.213920 0.150000 0.890880 +v -1.213920 2.400000 0.890880 +v -1.211067 0.127575 0.888786 +v -1.211067 0.127575 -0.888786 +v -1.210564 2.440800 0.406648 +v -1.210564 2.440800 -0.406648 +v -1.204800 2.474400 0.000000 +v -1.204800 2.474400 0.000000 +v -1.198382 0.105600 -0.879477 +v -1.198382 0.105600 0.879477 +v -1.197997 2.435437 -0.879195 +v -1.197997 2.435437 0.879195 +v -1.189960 0.316800 -1.189960 +v -1.189960 0.316800 1.189960 +v -1.189282 2.474400 -0.197684 +v -1.189282 2.474400 0.197684 +v -1.187840 0.900000 -1.618560 +v -1.187840 0.900000 -1.618560 +v -1.187840 0.900000 1.618560 +v -1.187840 0.900000 1.618560 +v -1.183534 1.037175 -1.612693 +v -1.183534 1.037175 1.612693 +v -1.181225 2.463000 -0.866886 +v -1.181225 2.463000 0.866886 +v -1.179525 0.771675 -1.607230 +v -1.179525 0.771675 1.607230 +v -1.171210 1.178400 -1.595900 +v -1.171210 1.178400 1.595900 +v -1.170080 2.085600 -1.170080 +v -1.170080 2.085600 1.170080 +v -1.169673 0.084525 -0.858407 +v -1.169673 0.084525 0.858407 +v -1.164574 2.482687 -0.854666 +v -1.164574 2.482687 0.854666 +v -1.156956 0.656400 -1.576477 +v -1.156956 0.656400 1.576477 +v -1.156792 2.400000 -0.601848 +v -1.156792 2.400000 0.601848 +v -1.151759 1.323225 -1.569396 +v -1.151759 1.323225 1.569396 +v -1.149016 2.494500 -0.843248 +v -1.149016 2.494500 0.843248 +v -1.144271 2.474400 -0.384379 +v -1.144271 2.474400 0.384379 +v -1.143600 0.031200 0.000000 +v -1.143600 0.031200 0.000000 +v -1.142888 0.046875 -0.594614 +v -1.142888 0.046875 0.594614 +v -1.141680 0.260025 1.141680 +v -1.141680 0.260025 -1.141680 +v -1.135521 2.498438 -0.833344 +v -1.135521 2.498438 0.833344 +v -1.134190 2.440800 0.590089 +v -1.134190 2.440800 -0.590089 +v -1.132992 2.400000 -0.831488 +v -1.132992 2.400000 0.831488 +v -1.128870 0.031200 -0.187642 +v -1.128870 0.031200 0.187642 +v -1.126072 1.471200 -1.534395 +v -1.126072 1.471200 1.534395 +v -1.125061 2.494500 -0.825668 +v -1.125061 2.494500 0.825668 +v -1.123697 0.553725 -1.531158 +v -1.123697 0.553725 1.531158 +v -1.121601 2.435437 -0.823129 +v -1.121601 2.435437 0.823129 +v -1.118749 0.064800 -0.821035 +v -1.118749 0.064800 0.821035 +v -1.118607 2.482687 -0.820931 +v -1.118607 2.482687 0.820931 +v -1.118073 2.242575 -1.118073 +v -1.118073 2.242575 1.118073 +v -1.117130 2.463000 -0.819847 +v -1.117130 2.463000 0.819847 +v -1.101920 0.213600 1.101920 +v -1.101920 0.213600 -1.101920 +v -1.100200 2.502600 0.000000 +v -1.100200 2.502600 0.000000 +v -1.095040 1.621875 -1.492110 +v -1.095040 1.621875 1.492110 +v -1.086146 0.031200 0.364854 +v -1.086146 0.031200 -0.364854 +v -1.086029 2.502600 0.180521 +v -1.086029 2.502600 -0.180521 +v -1.083310 0.463200 -1.476127 +v -1.083310 0.463200 1.476127 +v -1.074940 0.177075 -1.074940 +v -1.074940 0.177075 1.074940 +v -1.072079 2.474400 -0.557774 +v -1.072079 2.474400 0.557774 +v -1.065000 2.400000 -1.065000 +v -1.065000 0.150000 -1.065000 +v -1.065000 0.150000 1.065000 +v -1.065000 2.400000 1.065000 +v -1.062497 0.127575 1.062497 +v -1.062497 0.127575 -1.062497 +v -1.059553 1.774800 -1.443756 +v -1.059553 1.774800 1.443756 +v -1.052064 2.400000 -0.772096 +v -1.052064 2.400000 0.772096 +v -1.051368 0.105600 -1.051368 +v -1.051368 0.105600 1.051368 +v -1.051031 2.435437 -1.051031 +v -1.051031 2.435437 1.051031 +v -1.044926 2.502600 -0.351008 +v -1.044926 2.502600 0.351008 +v -1.039419 0.046875 -0.762816 +v -1.039419 0.046875 0.762816 +v -1.039360 0.384375 -1.416240 +v -1.039360 0.384375 1.416240 +v -1.036316 2.463000 -1.036316 +v -1.036316 2.463000 1.036316 +v -1.031508 2.440800 0.757010 +v -1.031508 2.440800 -0.757010 +v -1.026181 0.084525 -1.026181 +v -1.026181 0.084525 1.026181 +v -1.021708 2.482687 -1.021708 +v -1.021708 2.482687 1.021708 +v -1.020503 1.929525 -1.390545 +v -1.020503 1.929525 1.390545 +v -1.017621 0.031200 0.529441 +v -1.017621 0.031200 -0.529441 +v -1.008058 2.494500 -1.008058 +v -1.008058 2.494500 1.008058 +v -0.996219 2.498438 -0.996219 +v -0.996219 2.498438 0.996219 +v -0.995410 0.316800 -1.356353 +v -0.995410 0.316800 1.356353 +v -0.994000 2.400000 -0.994000 +v -0.994000 2.400000 0.994000 +v -0.987042 2.494500 -0.987042 +v -0.987042 2.494500 0.987042 +v -0.984007 2.435437 -0.984007 +v -0.984007 2.435437 0.984007 +v -0.981504 0.064800 0.981504 +v -0.981504 0.064800 -0.981504 +v -0.981380 2.482687 -0.981380 +v -0.981380 2.482687 0.981380 +v -0.980084 2.463000 -0.980084 +v -0.980084 2.463000 0.980084 +v -0.979002 2.502600 0.509349 +v -0.979002 2.502600 -0.509349 +v -0.978780 2.085600 -1.333693 +v -0.978780 2.085600 1.333693 +v -0.975021 2.474400 -0.715555 +v -0.975021 2.474400 0.715555 +v -0.970400 2.527200 0.000000 +v -0.970400 2.527200 0.000000 +v -0.957901 2.527200 -0.159223 +v -0.957901 2.527200 0.159223 +v -0.955023 0.260025 1.301322 +v -0.955023 0.260025 -1.301322 +v -0.952425 0.018225 -0.000000 +v -0.952425 0.018225 0.000000 +v -0.940158 0.018225 0.156274 +v -0.940158 0.018225 -0.156274 +v -0.935276 2.242575 -1.274414 +v -0.935276 2.242575 1.274414 +v -0.925920 0.900000 -1.779680 +v -0.925920 0.900000 1.779680 +v -0.925920 0.900000 1.779680 +v -0.925920 0.900000 -1.779680 +v -0.925493 0.031200 0.679207 +v -0.925493 0.031200 -0.679207 +v -0.923000 2.400000 -0.923000 +v -0.923000 2.400000 0.923000 +v -0.922564 1.037175 1.773229 +v -0.922564 1.037175 -1.773229 +v -0.921764 0.213600 1.256003 +v -0.921764 0.213600 -1.256003 +v -0.921647 2.527200 -0.309596 +v -0.921647 2.527200 0.309596 +v -0.919439 0.771675 -1.767222 +v -0.919439 0.771675 1.767222 +v -0.912957 1.178400 -1.754764 +v -0.912957 1.178400 1.754764 +v -0.911906 0.046875 -0.911906 +v -0.911906 0.046875 0.911906 +v -0.904966 2.440800 0.904966 +v -0.904966 2.440800 -0.904966 +v -0.904575 0.018225 0.303862 +v -0.904575 0.018225 -0.303862 +v -0.901846 0.656400 -1.733408 +v -0.901846 0.656400 1.733408 +v -0.899195 0.177075 1.225250 +v -0.899195 0.177075 -1.225250 +v -0.897795 1.323225 -1.725622 +v -0.897795 1.323225 1.725622 +v -0.890880 0.150000 -1.213920 +v -0.890880 0.150000 1.213920 +v -0.890880 2.400000 -1.213920 +v -0.890880 0.150000 -1.213920 +v -0.890880 0.150000 1.213920 +v -0.890880 2.400000 1.213920 +v -0.890370 2.502600 -0.653431 +v -0.890370 2.502600 0.653431 +v -0.888786 0.127575 1.211067 +v -0.888786 0.127575 -1.211067 +v -0.879477 0.105600 -1.198382 +v -0.879477 0.105600 1.198382 +v -0.879195 2.435437 -1.197997 +v -0.879195 2.435437 1.197997 +v -0.877772 1.471200 -1.687137 +v -0.877772 1.471200 1.687137 +v -0.875920 0.553725 -1.683577 +v -0.875920 0.553725 1.683577 +v -0.866886 2.463000 -1.181225 +v -0.866886 2.463000 1.181225 +v -0.863501 2.527200 -0.449256 +v -0.863501 2.527200 0.449256 +v -0.858407 0.084525 -1.169673 +v -0.858407 0.084525 1.169673 +v -0.855408 2.474400 -0.855408 +v -0.855408 2.474400 0.855408 +v -0.854666 2.482687 -1.164574 +v -0.854666 2.482687 1.164574 +v -0.853583 1.621875 -1.640643 +v -0.853583 1.621875 1.640643 +v -0.847506 0.018225 -0.440935 +v -0.847506 0.018225 0.440935 +v -0.844439 0.463200 1.623068 +v -0.844439 0.463200 -1.623068 +v -0.843248 2.494500 -1.149016 +v -0.843248 2.494500 1.149016 +v -0.833344 2.498438 -1.135521 +v -0.833344 2.498438 1.135521 +v -0.831488 2.400000 -1.132992 +v -0.831488 2.400000 1.132992 +v -0.825921 1.774800 1.587475 +v -0.825921 1.774800 -1.587475 +v -0.825668 2.494500 -1.125061 +v -0.825668 2.494500 1.125061 +v -0.825000 2.550000 0.000000 +v -0.825000 2.550000 0.000000 +v -0.823129 2.435437 -1.121601 +v -0.823129 2.435437 1.121601 +v -0.821035 0.064800 1.118749 +v -0.821035 0.064800 -1.118749 +v -0.820931 2.482687 1.118607 +v -0.820931 2.482687 -1.118607 +v -0.819847 2.463000 -1.117130 +v -0.819847 2.463000 1.117130 +v -0.814374 2.550000 -0.135366 +v -0.814374 2.550000 0.135366 +v -0.811956 0.031200 0.811956 +v -0.811956 0.031200 -0.811956 +v -0.810180 0.384375 1.557220 +v -0.810180 0.384375 -1.557220 +v -0.795481 1.929525 1.528968 +v -0.795481 1.929525 -1.528968 +v -0.785325 2.527200 -0.576340 +v -0.785325 2.527200 0.576340 +v -0.783552 2.550000 -0.263208 +v -0.783552 2.550000 0.263208 +v -0.781142 2.502600 -0.781142 +v -0.781142 2.502600 0.781142 +v -0.775921 0.316800 -1.491372 +v -0.775921 0.316800 1.491372 +v -0.772096 2.400000 -1.052064 +v -0.772096 2.400000 1.052064 +v -0.770779 0.018225 0.565664 +v -0.770779 0.018225 -0.565664 +v -0.762958 2.085600 -1.466456 +v -0.762958 2.085600 1.466456 +v -0.762816 0.046875 -1.039419 +v -0.762816 0.046875 1.039419 +v -0.757010 2.440800 1.031508 +v -0.757010 2.440800 -1.031508 +v -0.744440 0.260025 1.430863 +v -0.744440 0.260025 -1.430863 +v -0.734118 2.550000 -0.381942 +v -0.734118 2.550000 0.381942 +v -0.729046 2.242575 -1.401276 +v -0.729046 2.242575 1.401276 +v -0.718514 0.213600 1.381032 +v -0.718514 0.213600 -1.381032 +v -0.715555 2.474400 -0.975021 +v -0.715555 2.474400 0.975021 +v -0.703200 0.008400 0.000000 +v -0.700921 0.177075 1.347218 +v -0.700921 0.177075 -1.347218 +v -0.694440 0.150000 -1.334760 +v -0.694440 0.150000 1.334760 +v -0.694440 2.400000 1.334760 +v -0.694440 0.150000 1.334760 +v -0.694440 2.400000 -1.334760 +v -0.694440 0.150000 -1.334760 +v -0.694143 0.008400 -0.115381 +v -0.694143 0.008400 0.115381 +v -0.692808 0.127575 1.331623 +v -0.692808 0.127575 -1.331623 +v -0.688984 2.527200 -0.688984 +v -0.688984 2.527200 0.688984 +v -0.685551 0.105600 -1.317675 +v -0.685551 0.105600 1.317675 +v -0.685331 2.435437 -1.317252 +v -0.685331 2.435437 1.317252 +v -0.679207 0.031200 -0.925493 +v -0.679207 0.031200 0.925493 +v -0.676222 0.018225 0.676222 +v -0.676222 0.018225 -0.676222 +v -0.675736 2.463000 -1.298810 +v -0.675736 2.463000 1.298810 +v -0.673600 2.572800 0.000000 +v -0.673600 2.572800 0.000000 +v -0.669128 0.084525 -1.286108 +v -0.669128 0.084525 1.286108 +v -0.667871 0.008400 -0.224349 +v -0.667871 0.008400 0.224349 +v -0.667656 2.550000 -0.489984 +v -0.667656 2.550000 0.489984 +v -0.666211 2.482687 1.280502 +v -0.666211 2.482687 -1.280502 +v -0.664924 2.572800 -0.110524 +v -0.664924 2.572800 0.110524 +v -0.657311 2.494500 -1.263395 +v -0.657311 2.494500 1.263395 +v -0.653431 2.502600 -0.890370 +v -0.653431 2.502600 0.890370 +v -0.649591 2.498438 -1.248557 +v -0.649591 2.498438 1.248557 +v -0.648144 2.400000 -1.245776 +v -0.648144 2.400000 1.245776 +v -0.643607 2.494500 -1.237056 +v -0.643607 2.494500 1.237056 +v -0.641628 2.435437 -1.233252 +v -0.641628 2.435437 1.233252 +v -0.639996 0.064800 -1.230115 +v -0.639996 0.064800 1.230115 +v -0.639915 2.482687 1.229959 +v -0.639915 2.482687 -1.229959 +v -0.639758 2.572800 -0.214905 +v -0.639758 2.572800 0.214905 +v -0.639070 2.463000 -1.228335 +v -0.639070 2.463000 1.228335 +v -0.638080 0.900000 -1.899520 +v -0.638080 0.900000 -1.899520 +v -0.638080 0.900000 1.899520 +v -0.638080 0.900000 1.899520 +v -0.635767 1.037175 -1.892634 +v -0.635767 1.037175 1.892634 +v -0.633613 0.771675 -1.886223 +v -0.633613 0.771675 1.886223 +v -0.629147 1.178400 -1.872927 +v -0.629147 1.178400 1.872927 +v -0.625735 0.008400 0.325553 +v -0.625735 0.008400 -0.325553 +v -0.621490 0.656400 -1.850132 +v -0.621490 0.656400 1.850132 +v -0.618698 1.323225 -1.841822 +v -0.618698 1.323225 1.841822 +v -0.604900 1.471200 -1.800745 +v -0.604900 1.471200 1.800745 +v -0.603624 0.553725 -1.796946 +v -0.603624 0.553725 1.796946 +v -0.601848 2.400000 -1.156792 +v -0.601848 2.400000 1.156792 +v -0.599396 2.572800 -0.311850 +v -0.599396 2.572800 0.311850 +v -0.594614 0.046875 -1.142888 +v -0.594614 0.046875 1.142888 +v -0.590089 2.440800 1.134190 +v -0.590089 2.440800 -1.134190 +v -0.588230 1.621875 -1.751120 +v -0.588230 1.621875 1.751120 +v -0.585750 2.550000 -0.585750 +v -0.585750 2.550000 0.585750 +v -0.581929 0.463200 -1.732362 +v -0.581929 0.463200 1.732362 +v -0.576340 2.527200 -0.785325 +v -0.576340 2.527200 0.785325 +v -0.569167 1.774800 -1.694372 +v -0.569167 1.774800 1.694372 +v -0.569086 0.008400 -0.417645 +v -0.569086 0.008400 0.417645 +v -0.565664 0.018225 0.770779 +v -0.565664 0.018225 -0.770779 +v -0.558320 0.384375 -1.662080 +v -0.558320 0.384375 1.662080 +v -0.557774 2.474400 -1.072079 +v -0.557774 2.474400 1.072079 +v -0.548190 1.929525 -1.631925 +v -0.548190 1.929525 1.631925 +v -0.545131 2.572800 -0.400065 +v -0.545131 2.572800 0.400065 +v -0.534711 0.316800 -1.591798 +v -0.534711 0.316800 1.591798 +v -0.529441 0.031200 -1.017621 +v -0.529441 0.031200 1.017621 +v -0.525800 2.597400 0.000000 +v -0.525800 2.597400 0.000000 +v -0.525778 2.085600 -1.565204 +v -0.525778 2.085600 1.565204 +v -0.519028 2.597400 0.086273 +v -0.519028 2.597400 -0.086273 +v -0.513016 0.260025 -1.527214 +v -0.513016 0.260025 1.527214 +v -0.509349 2.502600 0.979002 +v -0.509349 2.502600 -0.979002 +v -0.502408 2.242575 -1.495635 +v -0.502408 2.242575 1.495635 +v -0.499384 2.597400 -0.167751 +v -0.499384 2.597400 0.167751 +v -0.499272 0.008400 -0.499272 +v -0.499272 0.008400 0.499272 +v -0.495150 0.213600 -1.474028 +v -0.495150 0.213600 1.474028 +v -0.489984 2.550000 -0.667656 +v -0.489984 2.550000 0.667656 +v -0.483027 0.177075 -1.437937 +v -0.483027 0.177075 1.437937 +v -0.478560 0.150000 1.424640 +v -0.478560 2.400000 -1.424640 +v -0.478560 0.150000 -1.424640 +v -0.478560 0.150000 -1.424640 +v -0.478560 0.150000 1.424640 +v -0.478560 2.400000 1.424640 +v -0.478256 2.572800 -0.478256 +v -0.478256 2.572800 0.478256 +v -0.477435 0.127575 1.421292 +v -0.477435 0.127575 -1.421292 +v -0.472434 0.105600 1.406405 +v -0.472434 0.105600 -1.406405 +v -0.472283 2.435437 -1.405953 +v -0.472283 2.435437 1.405953 +v -0.467878 2.597400 -0.243424 +v -0.467878 2.597400 0.243424 +v -0.465671 2.463000 -1.386270 +v -0.465671 2.463000 1.386270 +v -0.461116 0.084525 1.372712 +v -0.461116 0.084525 -1.372712 +v -0.459107 2.482687 -1.366728 +v -0.459107 2.482687 1.366728 +v -0.452973 2.494500 -1.348469 +v -0.452973 2.494500 1.348469 +v -0.449256 2.527200 -0.863501 +v -0.449256 2.527200 0.863501 +v -0.447653 2.498438 -1.332632 +v -0.447653 2.498438 1.332632 +v -0.446656 2.400000 -1.329664 +v -0.446656 2.400000 1.329664 +v -0.443529 2.494500 -1.320356 +v -0.443529 2.494500 1.320356 +v -0.442166 2.435437 -1.316296 +v -0.442166 2.435437 1.316296 +v -0.441041 0.064800 1.312948 +v -0.441041 0.064800 -1.312948 +v -0.440985 2.482687 -1.312782 +v -0.440985 2.482687 1.312782 +v -0.440935 0.018225 0.847506 +v -0.440935 0.018225 -0.847506 +v -0.440403 2.463000 -1.311049 +v -0.440403 2.463000 1.311049 +v -0.425519 2.597400 0.312283 +v -0.425519 2.597400 -0.312283 +v -0.417645 0.008400 -0.569086 +v -0.417645 0.008400 0.569086 +v -0.414752 2.400000 -1.234688 +v -0.414752 2.400000 1.234688 +v -0.409767 0.046875 1.219848 +v -0.409767 0.046875 -1.219848 +v -0.406648 2.440800 -1.210564 +v -0.406648 2.440800 1.210564 +v -0.400065 2.572800 -0.545131 +v -0.400065 2.572800 0.545131 +v -0.391200 2.625600 0.000000 +v -0.391200 2.625600 0.000000 +v -0.388275 0.002175 -0.000000 +v -0.388275 0.002175 0.000000 +v -0.386161 2.625600 -0.064188 +v -0.386161 2.625600 0.064188 +v -0.384379 2.474400 -1.144271 +v -0.384379 2.474400 1.144271 +v -0.383274 0.002175 -0.063708 +v -0.383274 0.002175 0.063708 +v -0.381942 2.550000 -0.734118 +v -0.381942 2.550000 0.734118 +v -0.373318 2.597400 -0.373318 +v -0.373318 2.597400 0.373318 +v -0.371546 2.625600 -0.124808 +v -0.371546 2.625600 0.124808 +v -0.368768 0.002175 -0.123875 +v -0.368768 0.002175 0.123875 +v -0.364854 0.031200 1.086146 +v -0.364854 0.031200 -1.086146 +v -0.358400 3.034800 0.000000 +v -0.358400 3.034800 0.000000 +v -0.358200 3.081150 0.000000 +v -0.358200 3.081150 0.000000 +v -0.353807 3.034800 -0.059016 +v -0.353807 3.034800 0.059016 +v -0.353610 3.081150 -0.058988 +v -0.353610 3.081150 0.058988 +v -0.351008 2.502600 -1.044926 +v -0.351008 2.502600 1.044926 +v -0.348105 2.625600 -0.181110 +v -0.348105 2.625600 0.181110 +v -0.345503 0.002175 -0.179756 +v -0.345503 0.002175 0.179756 +v -0.340477 3.034800 -0.114676 +v -0.340477 3.034800 0.114676 +v -0.340289 3.081150 -0.114619 +v -0.340289 3.081150 0.114619 +v -0.328160 0.900000 -1.974240 +v -0.328160 0.900000 1.974240 +v -0.328160 0.900000 1.974240 +v -0.326970 1.037175 -1.967083 +v -0.326970 1.037175 1.967083 +v -0.325863 0.771675 -1.960420 +v -0.325863 0.771675 1.960420 +v -0.325553 0.008400 -0.625735 +v -0.325553 0.008400 0.625735 +v -0.325000 2.981250 0.000000 +v -0.325000 2.981250 0.000000 +v -0.323566 1.178400 -1.946601 +v -0.323566 1.178400 1.946601 +v -0.320834 2.981250 -0.053508 +v -0.320834 2.981250 0.053508 +v -0.319628 0.656400 -1.922910 +v -0.319628 0.656400 1.922910 +v -0.319082 3.034800 -0.166306 +v -0.319082 3.034800 0.166306 +v -0.318907 3.081150 -0.166221 +v -0.318907 3.081150 0.166221 +v -0.318192 1.323225 -1.914272 +v -0.318192 1.323225 1.914272 +v -0.316590 2.625600 -0.232342 +v -0.316590 2.625600 0.232342 +v -0.314223 0.002175 -0.230604 +v -0.314223 0.002175 0.230604 +v -0.312283 2.597400 -0.425519 +v -0.312283 2.597400 0.425519 +v -0.311850 2.572800 -0.599396 +v -0.311850 2.572800 0.599396 +v -0.311096 1.471200 -1.871580 +v -0.311096 1.471200 1.871580 +v -0.310439 0.553725 -1.867631 +v -0.310439 0.553725 1.867631 +v -0.309596 2.527200 -0.921647 +v -0.309596 2.527200 0.921647 +v -0.308800 3.117600 0.000000 +v -0.308800 3.117600 0.000000 +v -0.308744 2.981250 -0.103976 +v -0.308744 2.981250 0.103976 +v -0.304843 3.117600 -0.050855 +v -0.304843 3.117600 0.050855 +v -0.303862 0.018225 0.904575 +v -0.303862 0.018225 -0.904575 +v -0.302523 1.621875 -1.820003 +v -0.302522 1.621875 1.820003 +v -0.299282 0.463200 -1.800507 +v -0.299282 0.463200 1.800507 +v -0.293360 3.117600 -0.098814 +v -0.293360 3.117600 0.098814 +v -0.292719 1.774800 -1.761022 +v -0.292719 1.774800 1.761022 +v -0.290295 3.034800 -0.213234 +v -0.290295 3.034800 0.213234 +v -0.290138 3.081150 -0.213123 +v -0.290138 3.081150 0.213123 +v -0.289340 2.981250 -0.150793 +v -0.289340 2.981250 0.150793 +v -0.287140 0.384375 -1.727460 +v -0.287140 0.384375 1.727460 +v -0.281930 1.929525 1.696119 +v -0.281930 1.929525 -1.696119 +v -0.279400 2.659200 0.000000 +v -0.277752 2.625600 -0.277752 +v -0.277752 2.625600 0.277752 +v -0.275801 2.659200 -0.045844 +v -0.275801 2.659200 0.045844 +v -0.275675 0.002175 -0.275675 +v -0.275675 0.002175 0.275675 +v -0.274998 0.316800 -1.654413 +v -0.274998 0.316800 1.654413 +v -0.274928 3.117600 -0.143301 +v -0.274928 3.117600 0.143301 +v -0.273600 2.923200 0.000000 +v -0.273600 2.923200 0.000000 +v -0.270404 2.085600 -1.626774 +v -0.270404 2.085600 1.626774 +v -0.270092 2.923200 -0.045032 +v -0.270092 2.923200 0.045032 +v -0.265363 2.659200 -0.089140 +v -0.265363 2.659200 0.089140 +v -0.263841 0.260025 1.587289 +v -0.263841 0.260025 -1.587289 +v -0.263232 2.981250 -0.193348 +v -0.263232 2.981250 0.193348 +v -0.263208 2.550000 -0.783552 +v -0.263208 2.550000 0.783552 +v -0.259910 2.923200 -0.087511 +v -0.259910 2.923200 0.087511 +v -0.258385 2.242575 -1.554467 +v -0.258385 2.242575 1.554467 +v -0.254788 3.034800 -0.254788 +v -0.254788 3.034800 0.254788 +v -0.254653 3.081150 -0.254653 +v -0.254653 3.081150 0.254653 +v -0.254652 0.213600 -1.532010 +v -0.254652 0.213600 1.532010 +v -0.250127 3.117600 -0.183734 +v -0.250127 3.117600 0.183734 +v -0.248621 2.659200 0.129351 +v -0.248621 2.659200 -0.129351 +v -0.248417 0.177075 -1.494500 +v -0.248417 0.177075 1.494500 +v -0.246120 0.150000 1.480680 +v -0.246120 2.400000 -1.480680 +v -0.246120 0.150000 -1.480680 +v -0.246120 0.150000 -1.480680 +v -0.246120 0.150000 1.480680 +v -0.246120 2.400000 1.480680 +v -0.245542 0.127575 1.477200 +v -0.245542 0.127575 -1.477200 +v -0.243569 2.923200 -0.126920 +v -0.243569 2.923200 0.126920 +v -0.243424 2.597400 0.467878 +v -0.243424 2.597400 -0.467878 +v -0.242970 0.105600 1.461727 +v -0.242970 0.105600 -1.461727 +v -0.242892 2.435437 -1.461258 +v -0.242892 2.435437 1.461258 +v -0.239491 2.463000 -1.440800 +v -0.239491 2.463000 1.440800 +v -0.237149 0.084525 1.426709 +v -0.237149 0.084525 -1.426709 +v -0.236115 2.482687 -1.420490 +v -0.236115 2.482687 1.420490 +v -0.232961 2.494500 -1.401513 +v -0.232961 2.494500 1.401513 +v -0.232342 2.625600 -0.316590 +v -0.232342 2.625600 0.316590 +v -0.231031 2.981250 -0.231031 +v -0.231031 2.981250 0.231031 +v -0.230604 0.002175 -0.314223 +v -0.230604 0.002175 0.314223 +v -0.230225 2.498438 -1.385053 +v -0.230225 2.498438 1.385053 +v -0.229712 2.400000 -1.381968 +v -0.229712 2.400000 1.381968 +v -0.228104 2.494500 -1.372294 +v -0.228104 2.494500 1.372294 +v -0.227403 2.435437 -1.368074 +v -0.227403 2.435437 1.368074 +v -0.226824 0.064800 1.364595 +v -0.226824 0.064800 -1.364595 +v -0.226795 2.482687 1.364422 +v -0.226795 2.482687 -1.364422 +v -0.226496 2.463000 -1.362620 +v -0.226496 2.463000 1.362620 +v -0.226113 2.659200 -0.165941 +v -0.226113 2.659200 0.165941 +v -0.224349 0.008400 0.667871 +v -0.224349 0.008400 -0.667871 +v -0.221585 2.923200 -0.162745 +v -0.221585 2.923200 0.162745 +v -0.219800 2.863350 0.000000 +v -0.219800 2.863350 0.000000 +v -0.219536 3.117600 -0.219536 +v -0.219536 3.117600 0.219536 +v -0.216979 2.863350 0.036157 +v -0.216979 2.863350 -0.036157 +v -0.214905 2.572800 -0.639758 +v -0.214905 2.572800 0.639758 +v -0.213304 2.400000 -1.283256 +v -0.213304 2.400000 1.283256 +v -0.213234 3.034800 -0.290295 +v -0.213234 3.034800 0.290295 +v -0.213123 3.081150 -0.290138 +v -0.213123 3.081150 0.290138 +v -0.210740 0.046875 -1.267832 +v -0.210740 0.046875 1.267832 +v -0.209136 2.440800 -1.258183 +v -0.209136 2.440800 1.258183 +v -0.208794 2.863350 0.070270 +v -0.208794 2.863350 -0.070270 +v -0.200000 2.700000 0.000000 +v -0.200000 2.700000 0.000000 +v -0.200000 2.700000 0.000000 +v -0.200000 2.700000 0.000000 +v -0.198374 2.659200 -0.198374 +v -0.198374 2.659200 0.198374 +v -0.197684 2.474400 -1.189282 +v -0.197684 2.474400 1.189282 +v -0.197424 2.700000 -0.032816 +v -0.197424 2.700000 0.032816 +v -0.197424 2.700000 0.032816 +v -0.197424 2.700000 -0.032816 +v -0.195658 2.863350 -0.101925 +v -0.195658 2.863350 0.101925 +v -0.194600 3.141450 0.000000 +v -0.194600 3.141450 0.000000 +v -0.194472 2.923200 -0.194472 +v -0.194472 2.923200 0.194472 +v -0.193348 2.981250 -0.263232 +v -0.193348 2.981250 0.263232 +v -0.192107 3.141450 -0.032048 +v -0.192107 3.141450 0.032048 +v -0.189952 2.700000 -0.063808 +v -0.189952 2.700000 0.063808 +v -0.189952 2.700000 0.063808 +v -0.189952 2.700000 -0.063808 +v -0.187642 0.031200 1.128870 +v -0.187642 0.031200 -1.128870 +v -0.184870 3.141450 -0.062272 +v -0.184870 3.141450 0.062272 +v -0.183734 3.117600 -0.250127 +v -0.183734 3.117600 0.250127 +v -0.181110 2.625600 0.348105 +v -0.181110 2.625600 -0.348105 +v -0.180521 2.502600 -1.086029 +v -0.180521 2.502600 1.086029 +v -0.179756 0.002175 -0.345503 +v -0.179756 0.002175 0.345503 +v -0.179200 2.804400 0.000000 +v -0.179200 2.804400 0.000000 +v -0.177989 2.863350 -0.130707 +v -0.177989 2.863350 0.130707 +v -0.177968 2.700000 -0.092592 +v -0.177968 2.700000 0.092592 +v -0.177968 2.700000 0.092592 +v -0.177968 2.700000 -0.092592 +v -0.176897 2.804400 0.029450 +v -0.176897 2.804400 -0.029450 +v -0.173255 3.141450 -0.090306 +v -0.173255 3.141450 0.090306 +v -0.170215 2.804400 0.057246 +v -0.170215 2.804400 -0.057246 +v -0.167751 2.597400 -0.499384 +v -0.167751 2.597400 0.499384 +v -0.167400 2.749050 0.000000 +v -0.167400 2.749050 0.000000 +v -0.166306 3.034800 -0.319082 +v -0.166306 3.034800 0.319082 +v -0.166221 3.081150 0.318907 +v -0.166221 3.081150 -0.318907 +v -0.165941 2.659200 -0.226113 +v -0.165941 2.659200 0.226113 +v -0.165245 2.749050 0.027480 +v -0.165245 2.749050 -0.027480 +v -0.162745 2.923200 -0.221585 +v -0.162745 2.923200 0.221585 +v -0.161856 2.700000 -0.118784 +v -0.161856 2.700000 0.118784 +v -0.161856 2.700000 0.118784 +v -0.161856 2.700000 -0.118784 +v -0.159496 2.804400 0.083047 +v -0.159496 2.804400 -0.083047 +v -0.159223 2.527200 -0.957901 +v -0.159223 2.527200 0.957901 +v -0.158995 2.749050 0.053428 +v -0.158995 2.749050 -0.053428 +v -0.157626 3.141450 -0.115787 +v -0.157626 3.141450 0.115787 +v -0.156274 0.018225 0.940158 +v -0.156274 0.018225 -0.940158 +v -0.156200 2.863350 -0.156200 +v -0.156200 2.863350 0.156200 +v -0.150793 2.981250 -0.289340 +v -0.150793 2.981250 0.289340 +v -0.148969 2.749050 0.077523 +v -0.148969 2.749050 -0.077523 +v -0.145078 2.804400 0.106513 +v -0.145078 2.804400 -0.106513 +v -0.143301 3.117600 -0.274928 +v -0.143301 3.117600 0.274928 +v -0.142000 2.700000 -0.142000 +v -0.142000 2.700000 0.142000 +v -0.142000 2.700000 0.142000 +v -0.142000 2.700000 -0.142000 +v -0.138348 3.141450 -0.138348 +v -0.138348 3.141450 0.138348 +v -0.135489 2.749050 0.099446 +v -0.135489 2.749050 -0.099446 +v -0.135366 2.550000 -0.814374 +v -0.135366 2.550000 0.814374 +v -0.130707 2.863350 -0.177989 +v -0.130707 2.863350 0.177989 +v -0.129351 2.659200 0.248621 +v -0.129351 2.659200 -0.248621 +v -0.127304 2.804400 0.127304 +v -0.127304 2.804400 -0.127304 +v -0.126920 2.923200 -0.243569 +v -0.126920 2.923200 0.243569 +v -0.124808 2.625600 -0.371546 +v -0.124808 2.625600 0.371546 +v -0.123875 0.002175 0.368768 +v -0.123875 0.002175 -0.368768 +v -0.118874 2.749050 0.118874 +v -0.118874 2.749050 -0.118874 +v -0.118784 2.700000 -0.161856 +v -0.118784 2.700000 0.161856 +v -0.118784 2.700000 0.161856 +v -0.118784 2.700000 -0.161856 +v -0.115787 3.141450 -0.157626 +v -0.115787 3.141450 0.157626 +v -0.115381 0.008400 0.694143 +v -0.115381 0.008400 -0.694143 +v -0.114676 3.034800 -0.340477 +v -0.114676 3.034800 0.340477 +v -0.114619 3.081150 -0.340289 +v -0.114619 3.081150 0.340289 +v -0.110524 2.572800 -0.664924 +v -0.110524 2.572800 0.664924 +v -0.106513 2.804400 -0.145078 +v -0.106513 2.804400 0.145078 +v -0.103976 2.981250 -0.308744 +v -0.103976 2.981250 0.308744 +v -0.101925 2.863350 -0.195658 +v -0.101925 2.863350 0.195658 +v -0.099446 2.749050 0.135489 +v -0.099446 2.749050 -0.135489 +v -0.098814 3.117600 -0.293360 +v -0.098814 3.117600 0.293360 +v -0.092592 2.700000 -0.177968 +v -0.092592 2.700000 0.177968 +v -0.092592 2.700000 -0.177968 +v -0.092592 2.700000 0.177968 +v -0.090306 3.141450 -0.173255 +v -0.090306 3.141450 0.173255 +v -0.089140 2.659200 -0.265363 +v -0.089140 2.659200 0.265363 +v -0.087511 2.923200 -0.259910 +v -0.087511 2.923200 0.259910 +v -0.086273 2.597400 -0.519028 +v -0.086273 2.597400 0.519028 +v -0.083047 2.804400 -0.159496 +v -0.083047 2.804400 0.159496 +v -0.077523 2.749050 -0.148969 +v -0.077523 2.749050 0.148969 +v -0.070270 2.863350 -0.208794 +v -0.070270 2.863350 0.208794 +v -0.064188 2.625600 -0.386161 +v -0.064188 2.625600 0.386161 +v -0.063808 2.700000 -0.189952 +v -0.063808 2.700000 0.189952 +v -0.063808 2.700000 -0.189952 +v -0.063808 2.700000 0.189952 +v -0.063708 0.002175 0.383274 +v -0.063708 0.002175 -0.383274 +v -0.062272 3.141450 -0.184870 +v -0.062272 3.141450 0.184870 +v -0.059016 3.034800 -0.353807 +v -0.059016 3.034800 0.353807 +v -0.058988 3.081150 -0.353610 +v -0.058988 3.081150 0.353610 +v -0.057246 2.804400 -0.170215 +v -0.057246 2.804400 0.170215 +v -0.053508 2.981250 -0.320834 +v -0.053508 2.981250 0.320834 +v -0.053428 2.749050 -0.158995 +v -0.053428 2.749050 0.158995 +v -0.050855 3.117600 -0.304843 +v -0.050855 3.117600 0.304843 +v -0.045844 2.659200 -0.275801 +v -0.045844 2.659200 0.275801 +v -0.045032 2.923200 -0.270092 +v -0.045032 2.923200 0.270092 +v -0.036157 2.863350 -0.216979 +v -0.036157 2.863350 0.216979 +v -0.032816 2.700000 -0.197424 +v -0.032816 2.700000 0.197424 +v -0.032816 2.700000 -0.197424 +v -0.032816 2.700000 0.197424 +v -0.032048 3.141450 -0.192107 +v -0.032048 3.141450 0.192107 +v -0.029450 2.804400 -0.176897 +v -0.029450 2.804400 0.176897 +v -0.027480 2.749050 -0.165245 +v -0.027480 2.749050 0.165245 +v -0.000000 0.260025 1.608000 +v -0.000000 1.929525 1.718250 +v -0.000000 2.085600 -1.648000 +v -0.000000 0.656400 -1.948000 +v -0.000000 0.771675 -1.986000 +v -0.000000 2.482687 1.382225 +v -0.000000 2.700000 -0.200000 +v -0.000000 0.127575 1.496475 +v -0.000000 2.474400 -1.204800 +v -0.000000 2.749050 -0.167400 +v -0.000000 0.018225 0.952425 +v -0.000000 0.046875 -1.284375 +v -0.000000 0.064800 1.382400 +v -0.000000 0.384375 1.750000 +v -0.000000 0.463200 1.824000 +v -0.000000 0.553725 -1.892000 +v -0.000000 1.037175 1.992750 +v -0.000000 1.178400 1.972000 +v -0.000000 1.323225 -1.939250 +v -0.000000 1.621875 -1.843750 +v -0.000000 1.774800 1.784000 +v -0.000000 2.400000 -1.300000 +v -0.000000 2.435437 -1.480325 +v -0.000000 2.435437 -1.385925 +v -0.000000 2.463000 -1.459600 +v -0.000000 2.463000 -1.380400 +v -0.000000 2.494500 -1.390200 +v -0.000000 2.502600 -1.100200 +v -0.000000 2.804400 -0.179200 +v -0.000000 2.863350 -0.219800 +v -0.000000 2.572800 -0.673600 +v -0.000000 0.105600 1.480800 +v -0.000000 0.177075 -1.514000 +v -0.000000 2.494500 -1.419800 +v -0.000000 2.527200 -0.970400 +v -0.000000 2.923200 -0.273600 +v -0.000000 3.117600 -0.308800 +v -0.000000 2.597400 -0.525800 +v -0.000000 2.700000 -0.200000 +v -0.000000 2.981250 -0.325000 +v -0.000000 3.141450 -0.194600 +v -0.000000 0.002175 0.388275 +v -0.000000 3.081150 -0.358200 +v 0.000000 0.000000 0.000000 +v 0.000000 0.002175 -0.388275 +v 0.000000 0.002175 0.388275 +v 0.000000 0.008400 -0.703200 +v 0.000000 0.008400 0.703200 +v 0.000000 0.018225 -0.952425 +v 0.000000 0.018225 0.952425 +v 0.000000 0.031200 -1.143600 +v 0.000000 0.031200 -1.143600 +v 0.000000 0.031200 1.143600 +v 0.000000 0.031200 1.143600 +v 0.000000 0.046875 -1.284375 +v 0.000000 0.046875 1.284375 +v 0.000000 0.064800 -1.382400 +v 0.000000 0.064800 1.382400 +v 0.000000 0.084525 -1.445325 +v 0.000000 0.084525 -1.445325 +v 0.000000 0.084525 1.445325 +v 0.000000 0.084525 1.445325 +v 0.000000 0.105600 -1.480800 +v 0.000000 0.105600 1.480800 +v 0.000000 0.127575 -1.496475 +v 0.000000 0.127575 1.496475 +v 0.000000 0.150000 -1.500000 +v 0.000000 0.150000 -1.500000 +v 0.000000 0.150000 1.500000 +v 0.000000 0.150000 1.500000 +v 0.000000 0.177075 -1.514000 +v 0.000000 0.177075 1.514000 +v 0.000000 0.213600 -1.552000 +v 0.000000 0.213600 -1.552000 +v 0.000000 0.213600 1.552000 +v 0.000000 0.213600 1.552000 +v 0.000000 0.260025 -1.608000 +v 0.000000 0.260025 1.608000 +v 0.000000 0.316800 -1.676000 +v 0.000000 0.316800 -1.676000 +v 0.000000 0.316800 1.676000 +v 0.000000 0.316800 1.676000 +v 0.000000 0.384375 -1.750000 +v 0.000000 0.384375 1.750000 +v 0.000000 0.463200 -1.824000 +v 0.000000 0.463200 1.824000 +v 0.000000 0.553725 -1.892000 +v 0.000000 0.553725 1.892000 +v 0.000000 0.656400 -1.948000 +v 0.000000 0.656400 1.948000 +v 0.000000 0.771675 -1.986000 +v 0.000000 0.771675 1.986000 +v 0.000000 0.900000 -2.000000 +v 0.000000 0.900000 -2.000000 +v 0.000000 0.900000 2.000000 +v 0.000000 0.900000 2.000000 +v 0.000000 1.037175 -1.992750 +v 0.000000 1.037175 1.992750 +v 0.000000 1.178400 -1.972000 +v 0.000000 1.178400 1.972000 +v 0.000000 1.323225 -1.939250 +v 0.000000 1.323225 1.939250 +v 0.000000 1.471200 -1.896000 +v 0.000000 1.471200 -1.896000 +v 0.000000 1.471200 1.896000 +v 0.000000 1.471200 1.896000 +v 0.000000 1.621875 -1.843750 +v 0.000000 1.621875 1.843750 +v 0.000000 1.774800 -1.784000 +v 0.000000 1.774800 1.784000 +v 0.000000 1.929525 -1.718250 +v 0.000000 1.929525 1.718250 +v 0.000000 2.085600 -1.648000 +v 0.000000 2.085600 1.648000 +v 0.000000 2.242575 -1.574750 +v 0.000000 2.242575 -1.574750 +v 0.000000 2.242575 1.574750 +v 0.000000 2.242575 1.574750 +v 0.000000 2.400000 -1.500000 +v 0.000000 2.400000 -1.500000 +v 0.000000 2.400000 -1.400000 +v 0.000000 2.400000 -1.400000 +v 0.000000 2.400000 -1.300000 +v 0.000000 2.400000 1.300000 +v 0.000000 2.400000 1.400000 +v 0.000000 2.400000 1.400000 +v 0.000000 2.400000 1.500000 +v 0.000000 2.400000 1.500000 +v 0.000000 2.435437 -1.480325 +v 0.000000 2.435437 -1.385925 +v 0.000000 2.435437 1.385925 +v 0.000000 2.435437 1.480325 +v 0.000000 2.440800 -1.274600 +v 0.000000 2.440800 -1.274600 +v 0.000000 2.440800 1.274600 +v 0.000000 2.440800 1.274600 +v 0.000000 2.463000 -1.459600 +v 0.000000 2.463000 -1.380400 +v 0.000000 2.463000 1.380400 +v 0.000000 2.463000 1.459600 +v 0.000000 2.474400 -1.204800 +v 0.000000 2.474400 1.204800 +v 0.000000 2.482687 -1.439025 +v 0.000000 2.482687 -1.382225 +v 0.000000 2.482687 1.382225 +v 0.000000 2.482687 1.439025 +v 0.000000 2.494500 -1.419800 +v 0.000000 2.494500 -1.390200 +v 0.000000 2.494500 1.390200 +v 0.000000 2.494500 1.419800 +v 0.000000 2.498438 -1.403125 +v 0.000000 2.498438 -1.403125 +v 0.000000 2.498438 1.403125 +v 0.000000 2.498438 1.403125 +v 0.000000 2.502600 -1.100200 +v 0.000000 2.502600 1.100200 +v 0.000000 2.527200 -0.970400 +v 0.000000 2.527200 0.970400 +v 0.000000 2.550000 -0.825000 +v 0.000000 2.550000 -0.825000 +v 0.000000 2.550000 0.825000 +v 0.000000 2.550000 0.825000 +v 0.000000 2.572800 -0.673600 +v 0.000000 2.572800 0.673600 +v 0.000000 2.597400 -0.525800 +v 0.000000 2.597400 0.525800 +v 0.000000 2.625600 -0.391200 +v 0.000000 2.625600 -0.391200 +v 0.000000 2.625600 0.391200 +v 0.000000 2.625600 0.391200 +v 0.000000 2.659200 -0.279400 +v 0.000000 2.659200 0.279400 +v 0.000000 2.700000 -0.200000 +v 0.000000 2.700000 -0.200000 +v 0.000000 2.700000 0.200000 +v 0.000000 2.700000 0.200000 +v 0.000000 2.749050 -0.167400 +v 0.000000 2.749050 0.167400 +v 0.000000 2.804400 -0.179200 +v 0.000000 2.804400 0.179200 +v 0.000000 2.863350 -0.219800 +v 0.000000 2.863350 0.219800 +v 0.000000 2.923200 -0.273600 +v 0.000000 2.923200 0.273600 +v 0.000000 2.981250 -0.325000 +v 0.000000 2.981250 0.325000 +v 0.000000 3.034800 -0.358400 +v 0.000000 3.034800 -0.358400 +v 0.000000 3.034800 0.358400 +v 0.000000 3.034800 0.358400 +v 0.000000 3.081150 -0.358200 +v 0.000000 3.081150 0.358200 +v 0.000000 3.117600 -0.308800 +v 0.000000 3.117600 0.308800 +v 0.000000 3.141450 -0.194600 +v 0.000000 3.141450 0.194600 +v 0.000000 3.150000 0.000000 +v 0.000000 0.002175 -0.388275 +v 0.000000 3.081150 0.358200 +v 0.000000 2.597400 0.525800 +v 0.000000 2.700000 0.200000 +v 0.000000 2.981250 0.325000 +v 0.000000 3.141450 0.194600 +v 0.000000 3.117600 0.308800 +v 0.000000 0.105600 -1.480800 +v 0.000000 0.177075 1.514000 +v 0.000000 2.494500 1.419800 +v 0.000000 2.527200 0.970400 +v 0.000000 2.923200 0.273600 +v 0.000000 2.572800 0.673600 +v 0.000000 2.863350 0.219800 +v 0.000000 0.018225 -0.952425 +v 0.000000 0.046875 1.284375 +v 0.000000 0.064800 -1.382400 +v 0.000000 0.384375 -1.750000 +v 0.000000 0.463200 -1.824000 +v 0.000000 0.553725 1.892000 +v 0.000000 1.037175 -1.992750 +v 0.000000 1.178400 -1.972000 +v 0.000000 1.323225 1.939250 +v 0.000000 1.621875 1.843750 +v 0.000000 1.774800 -1.784000 +v 0.000000 2.400000 1.300000 +v 0.000000 2.435437 1.385925 +v 0.000000 2.435437 1.480325 +v 0.000000 2.463000 1.380400 +v 0.000000 2.463000 1.459600 +v 0.000000 2.494500 1.390200 +v 0.000000 2.502600 1.100200 +v 0.000000 2.804400 0.179200 +v 0.000000 2.749050 0.167400 +v 0.000000 0.127575 -1.496475 +v 0.000000 2.474400 1.204800 +v 0.000000 0.656400 1.948000 +v 0.000000 0.771675 1.986000 +v 0.000000 2.482687 -1.382225 +v 0.000000 2.700000 0.200000 +v 0.000000 0.260025 -1.608000 +v 0.000000 1.929525 -1.718250 +v 0.000000 2.085600 1.648000 +v 0.027480 2.749050 -0.165245 +v 0.027480 2.749050 0.165245 +v 0.029450 2.804400 -0.176897 +v 0.029450 2.804400 0.176897 +v 0.032048 3.141450 -0.192107 +v 0.032048 3.141450 0.192107 +v 0.032816 2.700000 -0.197424 +v 0.032816 2.700000 0.197424 +v 0.032816 2.700000 -0.197424 +v 0.032816 2.700000 0.197424 +v 0.036157 2.863350 -0.216979 +v 0.036157 2.863350 0.216979 +v 0.045032 2.923200 -0.270092 +v 0.045032 2.923200 0.270092 +v 0.045844 2.659200 -0.275801 +v 0.045844 2.659200 0.275801 +v 0.050855 3.117600 -0.304843 +v 0.050855 3.117600 0.304843 +v 0.053428 2.749050 -0.158995 +v 0.053428 2.749050 0.158995 +v 0.053508 2.981250 -0.320834 +v 0.053508 2.981250 0.320834 +v 0.057246 2.804400 -0.170215 +v 0.057246 2.804400 0.170215 +v 0.058988 3.081150 -0.353610 +v 0.058988 3.081150 0.353610 +v 0.059016 3.034800 -0.353807 +v 0.059016 3.034800 0.353807 +v 0.062272 3.141450 -0.184870 +v 0.062272 3.141450 0.184870 +v 0.063708 0.002175 0.383274 +v 0.063708 0.002175 -0.383274 +v 0.063808 2.700000 -0.189952 +v 0.063808 2.700000 0.189952 +v 0.063808 2.700000 -0.189952 +v 0.063808 2.700000 0.189952 +v 0.064188 2.625600 -0.386161 +v 0.064188 2.625600 0.386161 +v 0.070270 2.863350 -0.208794 +v 0.070270 2.863350 0.208794 +v 0.077523 2.749050 -0.148969 +v 0.077523 2.749050 0.148969 +v 0.083047 2.804400 -0.159496 +v 0.083047 2.804400 0.159496 +v 0.086273 2.597400 -0.519028 +v 0.086273 2.597400 0.519028 +v 0.087511 2.923200 -0.259910 +v 0.087511 2.923200 0.259910 +v 0.089140 2.659200 -0.265363 +v 0.089140 2.659200 0.265363 +v 0.090306 3.141450 -0.173255 +v 0.090306 3.141450 0.173255 +v 0.092592 2.700000 -0.177968 +v 0.092592 2.700000 0.177968 +v 0.092592 2.700000 -0.177968 +v 0.092592 2.700000 0.177968 +v 0.098814 3.117600 -0.293360 +v 0.098814 3.117600 0.293360 +v 0.099446 2.749050 0.135489 +v 0.099446 2.749050 -0.135489 +v 0.101925 2.863350 -0.195658 +v 0.101925 2.863350 0.195658 +v 0.103976 2.981250 -0.308744 +v 0.103976 2.981250 0.308744 +v 0.106513 2.804400 -0.145078 +v 0.106513 2.804400 0.145078 +v 0.110524 2.572800 -0.664924 +v 0.110524 2.572800 0.664924 +v 0.114619 3.081150 -0.340289 +v 0.114619 3.081150 0.340289 +v 0.114676 3.034800 -0.340477 +v 0.114676 3.034800 0.340477 +v 0.115381 0.008400 0.694143 +v 0.115381 0.008400 -0.694143 +v 0.115787 3.141450 -0.157626 +v 0.115787 3.141450 0.157626 +v 0.118784 2.700000 0.161856 +v 0.118784 2.700000 -0.161856 +v 0.118784 2.700000 -0.161856 +v 0.118784 2.700000 0.161856 +v 0.118874 2.749050 0.118874 +v 0.118874 2.749050 -0.118874 +v 0.123875 0.002175 0.368768 +v 0.123875 0.002175 -0.368768 +v 0.124808 2.625600 -0.371546 +v 0.124808 2.625600 0.371546 +v 0.126920 2.923200 -0.243569 +v 0.126920 2.923200 0.243569 +v 0.127304 2.804400 0.127304 +v 0.127304 2.804400 -0.127304 +v 0.129351 2.659200 0.248621 +v 0.129351 2.659200 -0.248621 +v 0.130707 2.863350 -0.177989 +v 0.130707 2.863350 0.177989 +v 0.135366 2.550000 -0.814374 +v 0.135366 2.550000 0.814374 +v 0.135489 2.749050 0.099446 +v 0.135489 2.749050 -0.099446 +v 0.138348 3.141450 -0.138348 +v 0.138348 3.141450 0.138348 +v 0.142000 2.700000 0.142000 +v 0.142000 2.700000 -0.142000 +v 0.142000 2.700000 -0.142000 +v 0.142000 2.700000 0.142000 +v 0.143301 3.117600 -0.274928 +v 0.143301 3.117600 0.274928 +v 0.145078 2.804400 0.106513 +v 0.145078 2.804400 -0.106513 +v 0.148969 2.749050 0.077523 +v 0.148969 2.749050 -0.077523 +v 0.150793 2.981250 -0.289340 +v 0.150793 2.981250 0.289340 +v 0.156200 2.863350 -0.156200 +v 0.156200 2.863350 0.156200 +v 0.156274 0.018225 0.940158 +v 0.156274 0.018225 -0.940158 +v 0.157626 3.141450 -0.115787 +v 0.157626 3.141450 0.115787 +v 0.158995 2.749050 0.053428 +v 0.158995 2.749050 -0.053428 +v 0.159223 2.527200 -0.957901 +v 0.159223 2.527200 0.957901 +v 0.159496 2.804400 0.083047 +v 0.159496 2.804400 -0.083047 +v 0.161856 2.700000 0.118784 +v 0.161856 2.700000 -0.118784 +v 0.161856 2.700000 -0.118784 +v 0.161856 2.700000 0.118784 +v 0.162745 2.923200 -0.221585 +v 0.162745 2.923200 0.221585 +v 0.165245 2.749050 0.027480 +v 0.165245 2.749050 -0.027480 +v 0.165941 2.659200 -0.226113 +v 0.165941 2.659200 0.226113 +v 0.166221 3.081150 0.318907 +v 0.166221 3.081150 -0.318907 +v 0.166306 3.034800 -0.319082 +v 0.166306 3.034800 0.319082 +v 0.167400 2.749050 -0.000000 +v 0.167400 2.749050 0.000000 +v 0.167751 2.597400 -0.499384 +v 0.167751 2.597400 0.499384 +v 0.170215 2.804400 0.057246 +v 0.170215 2.804400 -0.057246 +v 0.173255 3.141450 -0.090306 +v 0.173255 3.141450 0.090306 +v 0.176897 2.804400 0.029450 +v 0.176897 2.804400 -0.029450 +v 0.177968 2.700000 0.092592 +v 0.177968 2.700000 -0.092592 +v 0.177968 2.700000 -0.092592 +v 0.177968 2.700000 0.092592 +v 0.177989 2.863350 -0.130707 +v 0.177989 2.863350 0.130707 +v 0.179200 2.804400 -0.000000 +v 0.179200 2.804400 0.000000 +v 0.179756 0.002175 -0.345503 +v 0.179756 0.002175 0.345503 +v 0.180521 2.502600 -1.086029 +v 0.180521 2.502600 1.086029 +v 0.181110 2.625600 0.348105 +v 0.181110 2.625600 -0.348105 +v 0.183734 3.117600 -0.250127 +v 0.183734 3.117600 0.250127 +v 0.184870 3.141450 -0.062272 +v 0.184870 3.141450 0.062272 +v 0.187642 0.031200 1.128870 +v 0.187642 0.031200 -1.128870 +v 0.189952 2.700000 0.063808 +v 0.189952 2.700000 -0.063808 +v 0.189952 2.700000 -0.063808 +v 0.189952 2.700000 0.063808 +v 0.192107 3.141450 -0.032048 +v 0.192107 3.141450 0.032048 +v 0.193348 2.981250 -0.263232 +v 0.193348 2.981250 0.263232 +v 0.194472 2.923200 -0.194472 +v 0.194472 2.923200 0.194472 +v 0.194600 3.141450 0.000000 +v 0.194600 3.141450 -0.000000 +v 0.195658 2.863350 -0.101925 +v 0.195658 2.863350 0.101925 +v 0.197424 2.700000 0.032816 +v 0.197424 2.700000 -0.032816 +v 0.197424 2.700000 -0.032816 +v 0.197424 2.700000 0.032816 +v 0.197684 2.474400 -1.189282 +v 0.197684 2.474400 1.189282 +v 0.198374 2.659200 -0.198374 +v 0.198374 2.659200 0.198374 +v 0.200000 2.700000 -0.000000 +v 0.200000 2.700000 0.000000 +v 0.200000 2.700000 0.000000 +v 0.200000 2.700000 -0.000000 +v 0.208794 2.863350 0.070270 +v 0.208794 2.863350 -0.070270 +v 0.209136 2.440800 -1.258183 +v 0.209136 2.440800 1.258183 +v 0.210740 0.046875 -1.267832 +v 0.210740 0.046875 1.267832 +v 0.213123 3.081150 -0.290138 +v 0.213123 3.081150 0.290138 +v 0.213234 3.034800 -0.290295 +v 0.213234 3.034800 0.290295 +v 0.213304 2.400000 -1.283256 +v 0.213304 2.400000 1.283256 +v 0.214905 2.572800 -0.639758 +v 0.214905 2.572800 0.639758 +v 0.216979 2.863350 0.036157 +v 0.216979 2.863350 -0.036157 +v 0.219536 3.117600 -0.219536 +v 0.219536 3.117600 0.219536 +v 0.219800 2.863350 -0.000000 +v 0.219800 2.863350 0.000000 +v 0.221585 2.923200 -0.162745 +v 0.221585 2.923200 0.162745 +v 0.224349 0.008400 0.667871 +v 0.224349 0.008400 -0.667871 +v 0.226113 2.659200 -0.165941 +v 0.226113 2.659200 0.165941 +v 0.226496 2.463000 -1.362620 +v 0.226496 2.463000 1.362620 +v 0.226795 2.482687 1.364422 +v 0.226795 2.482687 -1.364422 +v 0.226824 0.064800 1.364595 +v 0.226824 0.064800 -1.364595 +v 0.227403 2.435437 -1.368074 +v 0.227403 2.435437 1.368074 +v 0.228104 2.494500 -1.372294 +v 0.228104 2.494500 1.372294 +v 0.229712 2.400000 -1.381968 +v 0.229712 2.400000 1.381968 +v 0.230225 2.498438 -1.385053 +v 0.230225 2.498438 1.385053 +v 0.230604 0.002175 -0.314223 +v 0.230604 0.002175 0.314223 +v 0.231031 2.981250 -0.231031 +v 0.231031 2.981250 0.231031 +v 0.232342 2.625600 -0.316590 +v 0.232342 2.625600 0.316590 +v 0.232961 2.494500 -1.401513 +v 0.232961 2.494500 1.401513 +v 0.236115 2.482687 -1.420490 +v 0.236115 2.482687 1.420490 +v 0.237149 0.084525 1.426709 +v 0.237149 0.084525 -1.426709 +v 0.239491 2.463000 -1.440800 +v 0.239491 2.463000 1.440800 +v 0.242892 2.435437 -1.461258 +v 0.242892 2.435437 1.461258 +v 0.242970 0.105600 1.461727 +v 0.242970 0.105600 -1.461727 +v 0.243424 2.597400 0.467878 +v 0.243424 2.597400 -0.467878 +v 0.243569 2.923200 -0.126920 +v 0.243569 2.923200 0.126920 +v 0.245542 0.127575 1.477200 +v 0.245542 0.127575 -1.477200 +v 0.246120 0.150000 -1.480680 +v 0.246120 2.400000 -1.480680 +v 0.246120 0.150000 1.480680 +v 0.246120 0.150000 1.480680 +v 0.246120 2.400000 1.480680 +v 0.246120 0.150000 -1.480680 +v 0.248417 0.177075 -1.494500 +v 0.248417 0.177075 1.494500 +v 0.248621 2.659200 0.129351 +v 0.248621 2.659200 -0.129351 +v 0.250127 3.117600 -0.183734 +v 0.250127 3.117600 0.183734 +v 0.254652 0.213600 -1.532010 +v 0.254652 0.213600 1.532010 +v 0.254653 3.081150 -0.254653 +v 0.254653 3.081150 0.254653 +v 0.254788 3.034800 -0.254788 +v 0.254788 3.034800 0.254788 +v 0.258385 2.242575 -1.554467 +v 0.258385 2.242575 1.554467 +v 0.259910 2.923200 -0.087511 +v 0.259910 2.923200 0.087511 +v 0.263208 2.550000 -0.783552 +v 0.263208 2.550000 0.783552 +v 0.263232 2.981250 -0.193348 +v 0.263232 2.981250 0.193348 +v 0.263841 0.260025 1.587289 +v 0.263841 0.260025 -1.587289 +v 0.265363 2.659200 -0.089140 +v 0.265363 2.659200 0.089140 +v 0.270092 2.923200 -0.045032 +v 0.270092 2.923200 0.045032 +v 0.270404 2.085600 -1.626774 +v 0.270404 2.085600 1.626774 +v 0.273600 2.923200 -0.000000 +v 0.273600 2.923200 0.000000 +v 0.274928 3.117600 -0.143301 +v 0.274928 3.117600 0.143301 +v 0.274998 0.316800 -1.654413 +v 0.274998 0.316800 1.654413 +v 0.275675 0.002175 -0.275675 +v 0.275675 0.002175 0.275675 +v 0.275801 2.659200 -0.045844 +v 0.275801 2.659200 0.045844 +v 0.277752 2.625600 -0.277752 +v 0.277752 2.625600 0.277752 +v 0.279400 2.659200 0.000000 +v 0.281930 1.929525 1.696119 +v 0.281930 1.929525 -1.696119 +v 0.287140 0.384375 -1.727460 +v 0.287140 0.384375 1.727460 +v 0.289340 2.981250 -0.150793 +v 0.289340 2.981250 0.150793 +v 0.290138 3.081150 -0.213123 +v 0.290138 3.081150 0.213123 +v 0.290295 3.034800 -0.213234 +v 0.290295 3.034800 0.213234 +v 0.292719 1.774800 -1.761022 +v 0.292719 1.774800 1.761022 +v 0.293360 3.117600 -0.098814 +v 0.293360 3.117600 0.098814 +v 0.299282 0.463200 -1.800507 +v 0.299282 0.463200 1.800507 +v 0.302522 1.621875 -1.820003 +v 0.302523 1.621875 1.820003 +v 0.303862 0.018225 0.904575 +v 0.303862 0.018225 -0.904575 +v 0.304843 3.117600 -0.050855 +v 0.304843 3.117600 0.050855 +v 0.308744 2.981250 -0.103976 +v 0.308744 2.981250 0.103976 +v 0.308800 3.117600 0.000000 +v 0.308800 3.117600 -0.000000 +v 0.309596 2.527200 -0.921647 +v 0.309596 2.527200 0.921647 +v 0.310439 0.553725 -1.867631 +v 0.310439 0.553725 1.867631 +v 0.311096 1.471200 -1.871580 +v 0.311096 1.471200 1.871580 +v 0.311850 2.572800 -0.599396 +v 0.311850 2.572800 0.599396 +v 0.312283 2.597400 -0.425519 +v 0.312283 2.597400 0.425519 +v 0.314223 0.002175 -0.230604 +v 0.314223 0.002175 0.230604 +v 0.316590 2.625600 -0.232342 +v 0.316590 2.625600 0.232342 +v 0.318192 1.323225 -1.914272 +v 0.318192 1.323225 1.914272 +v 0.318907 3.081150 -0.166221 +v 0.318907 3.081150 0.166221 +v 0.319082 3.034800 -0.166306 +v 0.319082 3.034800 0.166306 +v 0.319628 0.656400 -1.922910 +v 0.319628 0.656400 1.922910 +v 0.320834 2.981250 -0.053508 +v 0.320834 2.981250 0.053508 +v 0.323566 1.178400 -1.946601 +v 0.323566 1.178400 1.946601 +v 0.325000 2.981250 0.000000 +v 0.325000 2.981250 -0.000000 +v 0.325553 0.008400 -0.625735 +v 0.325553 0.008400 0.625735 +v 0.325863 0.771675 -1.960420 +v 0.325863 0.771675 1.960420 +v 0.326970 1.037175 -1.967083 +v 0.326970 1.037175 1.967083 +v 0.328160 0.900000 -1.974240 +v 0.328160 0.900000 -1.974240 +v 0.328160 0.900000 1.974240 +v 0.340289 3.081150 -0.114619 +v 0.340289 3.081150 0.114619 +v 0.340477 3.034800 -0.114676 +v 0.340477 3.034800 0.114676 +v 0.345503 0.002175 -0.179756 +v 0.345503 0.002175 0.179756 +v 0.348105 2.625600 -0.181110 +v 0.348105 2.625600 0.181110 +v 0.351008 2.502600 -1.044926 +v 0.351008 2.502600 1.044926 +v 0.353610 3.081150 -0.058988 +v 0.353610 3.081150 0.058988 +v 0.353807 3.034800 -0.059016 +v 0.353807 3.034800 0.059016 +v 0.358200 3.081150 -0.000000 +v 0.358200 3.081150 0.000000 +v 0.358400 3.034800 0.000000 +v 0.358400 3.034800 0.000000 +v 0.364854 0.031200 1.086146 +v 0.364854 0.031200 -1.086146 +v 0.368768 0.002175 -0.123875 +v 0.368768 0.002175 0.123875 +v 0.371546 2.625600 -0.124808 +v 0.371546 2.625600 0.124808 +v 0.373318 2.597400 -0.373318 +v 0.373318 2.597400 0.373318 +v 0.381942 2.550000 -0.734118 +v 0.381942 2.550000 0.734118 +v 0.383274 0.002175 -0.063708 +v 0.383274 0.002175 0.063708 +v 0.384379 2.474400 -1.144271 +v 0.384379 2.474400 1.144271 +v 0.386161 2.625600 -0.064188 +v 0.386161 2.625600 0.064188 +v 0.388275 0.002175 0.000000 +v 0.388275 0.002175 0.000000 +v 0.391200 2.625600 0.000000 +v 0.391200 2.625600 0.000000 +v 0.400065 2.572800 -0.545131 +v 0.400065 2.572800 0.545131 +v 0.406648 2.440800 -1.210564 +v 0.406648 2.440800 1.210564 +v 0.409767 0.046875 1.219848 +v 0.409767 0.046875 -1.219848 +v 0.414752 2.400000 -1.234688 +v 0.414752 2.400000 1.234688 +v 0.417645 0.008400 -0.569086 +v 0.417645 0.008400 0.569086 +v 0.425519 2.597400 0.312283 +v 0.425519 2.597400 -0.312283 +v 0.440403 2.463000 -1.311049 +v 0.440403 2.463000 1.311049 +v 0.440935 0.018225 0.847506 +v 0.440935 0.018225 -0.847506 +v 0.440985 2.482687 -1.312782 +v 0.440985 2.482687 1.312782 +v 0.441041 0.064800 1.312948 +v 0.441041 0.064800 -1.312948 +v 0.442166 2.435437 -1.316296 +v 0.442166 2.435437 1.316296 +v 0.443529 2.494500 -1.320356 +v 0.443529 2.494500 1.320356 +v 0.446656 2.400000 -1.329664 +v 0.446656 2.400000 1.329664 +v 0.447653 2.498438 -1.332632 +v 0.447653 2.498438 1.332632 +v 0.449256 2.527200 -0.863501 +v 0.449256 2.527200 0.863501 +v 0.452973 2.494500 -1.348469 +v 0.452973 2.494500 1.348469 +v 0.459107 2.482687 -1.366728 +v 0.459107 2.482687 1.366728 +v 0.461116 0.084525 1.372712 +v 0.461116 0.084525 -1.372712 +v 0.465671 2.463000 -1.386270 +v 0.465671 2.463000 1.386270 +v 0.467878 2.597400 -0.243424 +v 0.467878 2.597400 0.243424 +v 0.472283 2.435437 -1.405953 +v 0.472283 2.435437 1.405953 +v 0.472434 0.105600 1.406405 +v 0.472434 0.105600 -1.406405 +v 0.477435 0.127575 1.421292 +v 0.477435 0.127575 -1.421292 +v 0.478256 2.572800 -0.478256 +v 0.478256 2.572800 0.478256 +v 0.478560 0.150000 -1.424640 +v 0.478560 2.400000 -1.424640 +v 0.478560 0.150000 1.424640 +v 0.478560 0.150000 1.424640 +v 0.478560 0.150000 -1.424640 +v 0.478560 2.400000 1.424640 +v 0.483027 0.177075 -1.437937 +v 0.483027 0.177075 1.437937 +v 0.489984 2.550000 -0.667656 +v 0.489984 2.550000 0.667656 +v 0.495150 0.213600 -1.474028 +v 0.495150 0.213600 1.474028 +v 0.499272 0.008400 -0.499272 +v 0.499272 0.008400 0.499272 +v 0.499384 2.597400 -0.167751 +v 0.499384 2.597400 0.167751 +v 0.502408 2.242575 -1.495635 +v 0.502408 2.242575 1.495635 +v 0.509349 2.502600 0.979002 +v 0.509349 2.502600 -0.979002 +v 0.513016 0.260025 -1.527214 +v 0.513016 0.260025 1.527214 +v 0.519028 2.597400 0.086273 +v 0.519028 2.597400 -0.086273 +v 0.525778 2.085600 -1.565204 +v 0.525778 2.085600 1.565204 +v 0.525800 2.597400 -0.000000 +v 0.525800 2.597400 0.000000 +v 0.529441 0.031200 -1.017621 +v 0.529441 0.031200 1.017621 +v 0.534711 0.316800 -1.591798 +v 0.534711 0.316800 1.591798 +v 0.545131 2.572800 -0.400065 +v 0.545131 2.572800 0.400065 +v 0.548190 1.929525 -1.631925 +v 0.548190 1.929525 1.631925 +v 0.557774 2.474400 -1.072079 +v 0.557774 2.474400 1.072079 +v 0.558320 0.384375 -1.662080 +v 0.558320 0.384375 1.662080 +v 0.565664 0.018225 0.770779 +v 0.565664 0.018225 -0.770779 +v 0.569086 0.008400 -0.417645 +v 0.569086 0.008400 0.417645 +v 0.569167 1.774800 -1.694372 +v 0.569167 1.774800 1.694372 +v 0.576340 2.527200 -0.785325 +v 0.576340 2.527200 0.785325 +v 0.581929 0.463200 -1.732362 +v 0.581929 0.463200 1.732362 +v 0.585750 2.550000 -0.585750 +v 0.585750 2.550000 0.585750 +v 0.588230 1.621875 -1.751120 +v 0.588230 1.621875 1.751120 +v 0.590089 2.440800 1.134190 +v 0.590089 2.440800 -1.134190 +v 0.594614 0.046875 -1.142888 +v 0.594614 0.046875 1.142888 +v 0.599396 2.572800 -0.311850 +v 0.599396 2.572800 0.311850 +v 0.601848 2.400000 -1.156792 +v 0.601848 2.400000 1.156792 +v 0.603624 0.553725 -1.796946 +v 0.603624 0.553725 1.796946 +v 0.604900 1.471200 -1.800745 +v 0.604900 1.471200 1.800745 +v 0.618698 1.323225 -1.841822 +v 0.618698 1.323225 1.841822 +v 0.621490 0.656400 -1.850132 +v 0.621490 0.656400 1.850132 +v 0.625735 0.008400 0.325553 +v 0.625735 0.008400 -0.325553 +v 0.629147 1.178400 -1.872927 +v 0.629147 1.178400 1.872927 +v 0.633613 0.771675 -1.886223 +v 0.633613 0.771675 1.886223 +v 0.635767 1.037175 -1.892634 +v 0.635767 1.037175 1.892634 +v 0.638080 0.900000 -1.899520 +v 0.638080 0.900000 -1.899520 +v 0.638080 0.900000 1.899520 +v 0.638080 0.900000 1.899520 +v 0.639070 2.463000 -1.228335 +v 0.639070 2.463000 1.228335 +v 0.639758 2.572800 -0.214905 +v 0.639758 2.572800 0.214905 +v 0.639915 2.482687 1.229959 +v 0.639915 2.482687 -1.229959 +v 0.639996 0.064800 -1.230115 +v 0.639996 0.064800 1.230115 +v 0.641628 2.435437 -1.233252 +v 0.641628 2.435437 1.233252 +v 0.643607 2.494500 -1.237056 +v 0.643607 2.494500 1.237056 +v 0.648144 2.400000 -1.245776 +v 0.648144 2.400000 1.245776 +v 0.649591 2.498438 -1.248557 +v 0.649591 2.498438 1.248557 +v 0.653431 2.502600 -0.890370 +v 0.653431 2.502600 0.890370 +v 0.657311 2.494500 -1.263395 +v 0.657311 2.494500 1.263395 +v 0.664924 2.572800 -0.110524 +v 0.664924 2.572800 0.110524 +v 0.666211 2.482687 1.280502 +v 0.666211 2.482687 -1.280502 +v 0.667656 2.550000 -0.489984 +v 0.667656 2.550000 0.489984 +v 0.667871 0.008400 -0.224349 +v 0.667871 0.008400 0.224349 +v 0.669128 0.084525 -1.286108 +v 0.669128 0.084525 1.286108 +v 0.673600 2.572800 0.000000 +v 0.673600 2.572800 -0.000000 +v 0.675736 2.463000 -1.298810 +v 0.675736 2.463000 1.298810 +v 0.676222 0.018225 0.676222 +v 0.676222 0.018225 -0.676222 +v 0.679207 0.031200 -0.925493 +v 0.679207 0.031200 0.925493 +v 0.685331 2.435437 -1.317252 +v 0.685331 2.435437 1.317252 +v 0.685551 0.105600 -1.317675 +v 0.685551 0.105600 1.317675 +v 0.688984 2.527200 -0.688984 +v 0.688984 2.527200 0.688984 +v 0.692808 0.127575 1.331623 +v 0.692808 0.127575 -1.331623 +v 0.694143 0.008400 -0.115381 +v 0.694143 0.008400 0.115381 +v 0.694440 0.150000 1.334760 +v 0.694440 0.150000 -1.334760 +v 0.694440 2.400000 1.334760 +v 0.694440 0.150000 -1.334760 +v 0.694440 0.150000 1.334760 +v 0.694440 2.400000 -1.334760 +v 0.700921 0.177075 1.347218 +v 0.700921 0.177075 -1.347218 +v 0.703200 0.008400 0.000000 +v 0.715555 2.474400 -0.975021 +v 0.715555 2.474400 0.975021 +v 0.718514 0.213600 1.381032 +v 0.718514 0.213600 -1.381032 +v 0.729046 2.242575 -1.401276 +v 0.729046 2.242575 1.401276 +v 0.734118 2.550000 -0.381942 +v 0.734118 2.550000 0.381942 +v 0.744440 0.260025 1.430863 +v 0.744440 0.260025 -1.430863 +v 0.757010 2.440800 1.031508 +v 0.757010 2.440800 -1.031508 +v 0.762816 0.046875 -1.039419 +v 0.762816 0.046875 1.039419 +v 0.762958 2.085600 -1.466456 +v 0.762958 2.085600 1.466456 +v 0.770779 0.018225 0.565664 +v 0.770779 0.018225 -0.565664 +v 0.772096 2.400000 -1.052064 +v 0.772096 2.400000 1.052064 +v 0.775921 0.316800 -1.491372 +v 0.775921 0.316800 1.491372 +v 0.781142 2.502600 -0.781142 +v 0.781142 2.502600 0.781142 +v 0.783552 2.550000 -0.263208 +v 0.783552 2.550000 0.263208 +v 0.785325 2.527200 -0.576340 +v 0.785325 2.527200 0.576340 +v 0.795481 1.929525 1.528968 +v 0.795481 1.929525 -1.528968 +v 0.810180 0.384375 1.557220 +v 0.810180 0.384375 -1.557220 +v 0.811956 0.031200 0.811956 +v 0.811956 0.031200 -0.811956 +v 0.814374 2.550000 -0.135366 +v 0.814374 2.550000 0.135366 +v 0.819847 2.463000 -1.117130 +v 0.819847 2.463000 1.117130 +v 0.820931 2.482687 1.118607 +v 0.820931 2.482687 -1.118607 +v 0.821035 0.064800 1.118749 +v 0.821035 0.064800 -1.118749 +v 0.823129 2.435437 -1.121601 +v 0.823129 2.435437 1.121601 +v 0.825000 2.550000 0.000000 +v 0.825000 2.550000 0.000000 +v 0.825668 2.494500 -1.125061 +v 0.825668 2.494500 1.125061 +v 0.825921 1.774800 1.587475 +v 0.825921 1.774800 -1.587475 +v 0.831488 2.400000 -1.132992 +v 0.831488 2.400000 1.132992 +v 0.833344 2.498438 -1.135521 +v 0.833344 2.498438 1.135521 +v 0.843248 2.494500 -1.149016 +v 0.843248 2.494500 1.149016 +v 0.844439 0.463200 1.623068 +v 0.844439 0.463200 -1.623068 +v 0.847506 0.018225 -0.440935 +v 0.847506 0.018225 0.440935 +v 0.853583 1.621875 -1.640643 +v 0.853583 1.621875 1.640643 +v 0.854666 2.482687 -1.164574 +v 0.854666 2.482687 1.164574 +v 0.855408 2.474400 -0.855408 +v 0.855408 2.474400 0.855408 +v 0.858407 0.084525 -1.169673 +v 0.858407 0.084525 1.169673 +v 0.863501 2.527200 -0.449256 +v 0.863501 2.527200 0.449256 +v 0.866886 2.463000 -1.181225 +v 0.866886 2.463000 1.181225 +v 0.875920 0.553725 -1.683577 +v 0.875920 0.553725 1.683577 +v 0.877772 1.471200 -1.687137 +v 0.877772 1.471200 1.687137 +v 0.879195 2.435437 -1.197997 +v 0.879195 2.435437 1.197997 +v 0.879477 0.105600 -1.198382 +v 0.879477 0.105600 1.198382 +v 0.888786 0.127575 1.211067 +v 0.888786 0.127575 -1.211067 +v 0.890370 2.502600 -0.653431 +v 0.890370 2.502600 0.653431 +v 0.890880 0.150000 -1.213920 +v 0.890880 0.150000 1.213920 +v 0.890880 2.400000 -1.213920 +v 0.890880 0.150000 -1.213920 +v 0.890880 0.150000 1.213920 +v 0.890880 2.400000 1.213920 +v 0.897795 1.323225 -1.725622 +v 0.897795 1.323225 1.725622 +v 0.899195 0.177075 1.225250 +v 0.899195 0.177075 -1.225250 +v 0.901846 0.656400 -1.733408 +v 0.901846 0.656400 1.733408 +v 0.904575 0.018225 0.303862 +v 0.904575 0.018225 -0.303862 +v 0.904966 2.440800 0.904966 +v 0.904966 2.440800 -0.904966 +v 0.911906 0.046875 -0.911906 +v 0.911906 0.046875 0.911906 +v 0.912957 1.178400 -1.754764 +v 0.912957 1.178400 1.754764 +v 0.919439 0.771675 -1.767222 +v 0.919439 0.771675 1.767222 +v 0.921647 2.527200 -0.309596 +v 0.921647 2.527200 0.309596 +v 0.921764 0.213600 1.256003 +v 0.921764 0.213600 -1.256003 +v 0.922564 1.037175 1.773229 +v 0.922564 1.037175 -1.773229 +v 0.923000 2.400000 -0.923000 +v 0.923000 2.400000 0.923000 +v 0.925493 0.031200 0.679207 +v 0.925493 0.031200 -0.679207 +v 0.925920 0.900000 1.779680 +v 0.925920 0.900000 -1.779680 +v 0.925920 0.900000 -1.779680 +v 0.925920 0.900000 1.779680 +v 0.935276 2.242575 -1.274414 +v 0.935276 2.242575 1.274414 +v 0.940158 0.018225 0.156274 +v 0.940158 0.018225 -0.156274 +v 0.952425 0.018225 0.000000 +v 0.952425 0.018225 0.000000 +v 0.955023 0.260025 1.301322 +v 0.955023 0.260025 -1.301322 +v 0.957901 2.527200 -0.159223 +v 0.957901 2.527200 0.159223 +v 0.970400 2.527200 0.000000 +v 0.970400 2.527200 -0.000000 +v 0.975021 2.474400 -0.715555 +v 0.975021 2.474400 0.715555 +v 0.978780 2.085600 -1.333693 +v 0.978780 2.085600 1.333693 +v 0.979002 2.502600 0.509349 +v 0.979002 2.502600 -0.509349 +v 0.980084 2.463000 -0.980084 +v 0.980084 2.463000 0.980084 +v 0.981380 2.482687 -0.981380 +v 0.981380 2.482687 0.981380 +v 0.981504 0.064800 0.981504 +v 0.981504 0.064800 -0.981504 +v 0.984007 2.435437 -0.984007 +v 0.984007 2.435437 0.984007 +v 0.987042 2.494500 -0.987042 +v 0.987042 2.494500 0.987042 +v 0.994000 2.400000 -0.994000 +v 0.994000 2.400000 0.994000 +v 0.995410 0.316800 -1.356353 +v 0.995410 0.316800 1.356353 +v 0.996219 2.498438 -0.996219 +v 0.996219 2.498438 0.996219 +v 1.008058 2.494500 -1.008058 +v 1.008058 2.494500 1.008058 +v 1.017621 0.031200 0.529441 +v 1.017621 0.031200 -0.529441 +v 1.020503 1.929525 -1.390545 +v 1.020503 1.929525 1.390545 +v 1.021708 2.482687 -1.021708 +v 1.021708 2.482687 1.021708 +v 1.026181 0.084525 -1.026181 +v 1.026181 0.084525 1.026181 +v 1.031508 2.440800 0.757010 +v 1.031508 2.440800 -0.757010 +v 1.036316 2.463000 -1.036316 +v 1.036316 2.463000 1.036316 +v 1.039360 0.384375 -1.416240 +v 1.039360 0.384375 1.416240 +v 1.039419 0.046875 -0.762816 +v 1.039419 0.046875 0.762816 +v 1.044926 2.502600 -0.351008 +v 1.044926 2.502600 0.351008 +v 1.051031 2.435437 -1.051031 +v 1.051031 2.435437 1.051031 +v 1.051368 0.105600 -1.051368 +v 1.051368 0.105600 1.051368 +v 1.052064 2.400000 -0.772096 +v 1.052064 2.400000 0.772096 +v 1.059553 1.774800 -1.443756 +v 1.059553 1.774800 1.443756 +v 1.062497 0.127575 1.062497 +v 1.062497 0.127575 -1.062497 +v 1.065000 0.150000 -1.065000 +v 1.065000 0.150000 1.065000 +v 1.065000 2.400000 -1.065000 +v 1.065000 2.400000 1.065000 +v 1.072079 2.474400 -0.557774 +v 1.072079 2.474400 0.557774 +v 1.074940 0.177075 -1.074940 +v 1.074940 0.177075 1.074940 +v 1.083310 0.463200 -1.476127 +v 1.083310 0.463200 1.476127 +v 1.086029 2.502600 0.180521 +v 1.086029 2.502600 -0.180521 +v 1.086146 0.031200 0.364854 +v 1.086146 0.031200 -0.364854 +v 1.095040 1.621875 -1.492110 +v 1.095040 1.621875 1.492110 +v 1.100200 2.502600 -0.000000 +v 1.100200 2.502600 0.000000 +v 1.101920 0.213600 1.101920 +v 1.101920 0.213600 -1.101920 +v 1.117130 2.463000 -0.819847 +v 1.117130 2.463000 0.819847 +v 1.118073 2.242575 -1.118073 +v 1.118073 2.242575 1.118073 +v 1.118607 2.482687 -0.820931 +v 1.118607 2.482687 0.820931 +v 1.118749 0.064800 -0.821035 +v 1.118749 0.064800 0.821035 +v 1.121601 2.435437 -0.823129 +v 1.121601 2.435437 0.823129 +v 1.123697 0.553725 -1.531158 +v 1.123697 0.553725 1.531158 +v 1.125061 2.494500 -0.825668 +v 1.125061 2.494500 0.825668 +v 1.126072 1.471200 -1.534395 +v 1.126072 1.471200 1.534395 +v 1.128870 0.031200 -0.187642 +v 1.128870 0.031200 0.187642 +v 1.132992 2.400000 -0.831488 +v 1.132992 2.400000 0.831488 +v 1.134190 2.440800 0.590089 +v 1.134190 2.440800 -0.590089 +v 1.135521 2.498438 -0.833344 +v 1.135521 2.498438 0.833344 +v 1.141680 0.260025 1.141680 +v 1.141680 0.260025 -1.141680 +v 1.142888 0.046875 -0.594614 +v 1.142888 0.046875 0.594614 +v 1.143600 0.031200 0.000000 +v 1.143600 0.031200 0.000000 +v 1.144271 2.474400 -0.384379 +v 1.144271 2.474400 0.384379 +v 1.149016 2.494500 -0.843248 +v 1.149016 2.494500 0.843248 +v 1.151759 1.323225 -1.569396 +v 1.151759 1.323225 1.569396 +v 1.156792 2.400000 -0.601848 +v 1.156792 2.400000 0.601848 +v 1.156956 0.656400 -1.576477 +v 1.156956 0.656400 1.576477 +v 1.164574 2.482687 -0.854666 +v 1.164574 2.482687 0.854666 +v 1.169673 0.084525 -0.858407 +v 1.169673 0.084525 0.858407 +v 1.170080 2.085600 -1.170080 +v 1.170080 2.085600 1.170080 +v 1.171210 1.178400 -1.595900 +v 1.171210 1.178400 1.595900 +v 1.179525 0.771675 -1.607230 +v 1.179525 0.771675 1.607230 +v 1.181225 2.463000 -0.866886 +v 1.181225 2.463000 0.866886 +v 1.183534 1.037175 -1.612693 +v 1.183534 1.037175 1.612693 +v 1.187840 0.900000 -1.618560 +v 1.187840 0.900000 -1.618560 +v 1.187840 0.900000 1.618560 +v 1.187840 0.900000 1.618560 +v 1.189282 2.474400 -0.197684 +v 1.189282 2.474400 0.197684 +v 1.189960 0.316800 -1.189960 +v 1.189960 0.316800 1.189960 +v 1.197997 2.435437 -0.879195 +v 1.197997 2.435437 0.879195 +v 1.198382 0.105600 -0.879477 +v 1.198382 0.105600 0.879477 +v 1.204800 2.474400 0.000000 +v 1.204800 2.474400 -0.000000 +v 1.210564 2.440800 0.406648 +v 1.210564 2.440800 -0.406648 +v 1.211067 0.127575 0.888786 +v 1.211067 0.127575 -0.888786 +v 1.213920 0.150000 -0.890880 +v 1.213920 0.150000 -0.890880 +v 1.213920 0.150000 0.890880 +v 1.213920 0.150000 0.890880 +v 1.213920 2.400000 -0.890880 +v 1.213920 2.400000 0.890880 +v 1.219848 0.046875 -0.409767 +v 1.219848 0.046875 0.409767 +v 1.219958 1.929525 1.219958 +v 1.219958 1.929525 -1.219958 +v 1.225250 0.177075 0.899195 +v 1.225250 0.177075 -0.899195 +v 1.228335 2.463000 -0.639070 +v 1.228335 2.463000 0.639070 +v 1.229959 2.482687 -0.639915 +v 1.229959 2.482687 0.639915 +v 1.230115 0.064800 -0.639996 +v 1.230115 0.064800 0.639996 +v 1.233252 2.435437 -0.641628 +v 1.233252 2.435437 0.641628 +v 1.234688 2.400000 -0.414752 +v 1.234688 2.400000 0.414752 +v 1.237056 2.494500 -0.643607 +v 1.237056 2.494500 0.643607 +v 1.242500 0.384375 -1.242500 +v 1.242500 0.384375 1.242500 +v 1.245776 2.400000 -0.648144 +v 1.245776 2.400000 0.648144 +v 1.248557 2.498438 -0.649591 +v 1.248557 2.498438 0.649591 +v 1.256003 0.213600 0.921764 +v 1.256003 0.213600 -0.921764 +v 1.258183 2.440800 0.209136 +v 1.258183 2.440800 -0.209136 +v 1.263395 2.494500 -0.657311 +v 1.263395 2.494500 0.657311 +v 1.266640 1.774800 -1.266640 +v 1.266640 1.774800 1.266640 +v 1.267832 0.046875 -0.210740 +v 1.267832 0.046875 0.210740 +v 1.274414 2.242575 -0.935276 +v 1.274414 2.242575 0.935276 +v 1.274600 2.440800 0.000000 +v 1.274600 2.440800 0.000000 +v 1.280502 2.482687 -0.666211 +v 1.280502 2.482687 0.666211 +v 1.283256 2.400000 -0.213304 +v 1.283256 2.400000 0.213304 +v 1.284375 0.046875 0.000000 +v 1.284375 0.046875 -0.000000 +v 1.286108 0.084525 -0.669128 +v 1.286108 0.084525 0.669128 +v 1.295040 0.463200 -1.295040 +v 1.295040 0.463200 1.295040 +v 1.298810 2.463000 -0.675736 +v 1.298810 2.463000 0.675736 +v 1.300000 2.400000 0.000000 +v 1.300000 2.400000 -0.000000 +v 1.301322 0.260025 0.955023 +v 1.301322 0.260025 -0.955023 +v 1.309063 1.621875 -1.309063 +v 1.309063 1.621875 1.309063 +v 1.311049 2.463000 -0.440403 +v 1.311049 2.463000 0.440403 +v 1.312782 2.482687 -0.440985 +v 1.312782 2.482687 0.440985 +v 1.312948 0.064800 0.441041 +v 1.312948 0.064800 -0.441041 +v 1.316296 2.435437 -0.442166 +v 1.316296 2.435437 0.442166 +v 1.317252 2.435437 -0.685331 +v 1.317252 2.435437 0.685331 +v 1.317675 0.105600 -0.685551 +v 1.317675 0.105600 0.685551 +v 1.320356 2.494500 -0.443529 +v 1.320356 2.494500 0.443529 +v 1.329664 2.400000 -0.446656 +v 1.329664 2.400000 0.446656 +v 1.331623 0.127575 0.692808 +v 1.331623 0.127575 -0.692808 +v 1.332632 2.498438 -0.447653 +v 1.332632 2.498438 0.447653 +v 1.333693 2.085600 -0.978780 +v 1.333693 2.085600 0.978780 +v 1.334760 0.150000 0.694440 +v 1.334760 0.150000 -0.694440 +v 1.334760 0.150000 -0.694440 +v 1.334760 0.150000 0.694440 +v 1.334760 2.400000 -0.694440 +v 1.334760 2.400000 0.694440 +v 1.343320 0.553725 -1.343320 +v 1.343320 0.553725 1.343320 +v 1.346160 1.471200 -1.346160 +v 1.346160 1.471200 1.346160 +v 1.347218 0.177075 0.700921 +v 1.347218 0.177075 -0.700921 +v 1.348469 2.494500 -0.452973 +v 1.348469 2.494500 0.452973 +v 1.356353 0.316800 -0.995410 +v 1.356353 0.316800 0.995410 +v 1.362620 2.463000 -0.226496 +v 1.362620 2.463000 0.226496 +v 1.364422 2.482687 -0.226795 +v 1.364422 2.482687 0.226795 +v 1.364595 0.064800 -0.226824 +v 1.364595 0.064800 0.226824 +v 1.366728 2.482687 -0.459107 +v 1.366728 2.482687 0.459107 +v 1.368074 2.435437 -0.227403 +v 1.368074 2.435437 0.227403 +v 1.372294 2.494500 -0.228104 +v 1.372294 2.494500 0.228104 +v 1.372712 0.084525 -0.461116 +v 1.372712 0.084525 0.461116 +v 1.376867 1.323225 -1.376868 +v 1.376868 1.323225 1.376867 +v 1.380400 2.463000 0.000000 +v 1.380400 2.463000 -0.000000 +v 1.381032 0.213600 0.718514 +v 1.381032 0.213600 -0.718514 +v 1.381968 2.400000 -0.229712 +v 1.381968 2.400000 0.229712 +v 1.382225 2.482687 0.000000 +v 1.382225 2.482687 0.000000 +v 1.382400 0.064800 0.000000 +v 1.382400 0.064800 0.000000 +v 1.383080 0.656400 -1.383080 +v 1.383080 0.656400 1.383080 +v 1.385053 2.498438 -0.230225 +v 1.385053 2.498438 0.230225 +v 1.385925 2.435437 0.000000 +v 1.385925 2.435437 -0.000000 +v 1.386270 2.463000 -0.465671 +v 1.386270 2.463000 0.465671 +v 1.390200 2.494500 0.000000 +v 1.390200 2.494500 -0.000000 +v 1.390545 1.929525 -1.020503 +v 1.390545 1.929525 1.020503 +v 1.400000 2.400000 0.000000 +v 1.400000 2.400000 0.000000 +v 1.400120 1.178400 -1.400120 +v 1.400120 1.178400 1.400120 +v 1.401276 2.242575 -0.729046 +v 1.401276 2.242575 0.729046 +v 1.401513 2.494500 -0.232961 +v 1.401513 2.494500 0.232961 +v 1.403125 2.498438 0.000000 +v 1.403125 2.498438 0.000000 +v 1.405953 2.435437 -0.472283 +v 1.405953 2.435437 0.472283 +v 1.406405 0.105600 -0.472434 +v 1.406405 0.105600 0.472434 +v 1.410060 0.771675 -1.410060 +v 1.410060 0.771675 1.410060 +v 1.414853 1.037175 -1.414853 +v 1.414853 1.037175 1.414853 +v 1.416240 0.384375 -1.039360 +v 1.416240 0.384375 1.039360 +v 1.419800 2.494500 0.000000 +v 1.419800 2.494500 -0.000000 +v 1.420000 0.900000 -1.420000 +v 1.420000 0.900000 -1.420000 +v 1.420000 0.900000 1.420000 +v 1.420000 0.900000 1.420000 +v 1.420490 2.482687 -0.236115 +v 1.420490 2.482687 0.236115 +v 1.421292 0.127575 0.477435 +v 1.421292 0.127575 -0.477435 +v 1.424640 0.150000 -0.478560 +v 1.424640 0.150000 -0.478560 +v 1.424640 0.150000 0.478560 +v 1.424640 0.150000 0.478560 +v 1.424640 2.400000 -0.478560 +v 1.424640 2.400000 0.478560 +v 1.426709 0.084525 -0.237149 +v 1.426709 0.084525 0.237149 +v 1.430863 0.260025 0.744440 +v 1.430863 0.260025 -0.744440 +v 1.437937 0.177075 0.483027 +v 1.437937 0.177075 -0.483027 +v 1.439025 2.482687 0.000000 +v 1.440800 2.463000 -0.239491 +v 1.440800 2.463000 0.239491 +v 1.443756 1.774800 -1.059553 +v 1.443756 1.774800 1.059553 +v 1.445325 0.084525 0.000000 +v 1.445325 0.084525 0.000000 +v 1.459600 2.463000 0.000000 +v 1.459600 2.463000 -0.000000 +v 1.461258 2.435437 -0.242892 +v 1.461258 2.435437 0.242892 +v 1.461727 0.105600 -0.242970 +v 1.461727 0.105600 0.242970 +v 1.466456 2.085600 -0.762958 +v 1.466456 2.085600 0.762958 +v 1.474028 0.213600 0.495150 +v 1.474028 0.213600 -0.495150 +v 1.476127 0.463200 -1.083310 +v 1.476127 0.463200 1.083310 +v 1.477200 0.127575 0.245542 +v 1.477200 0.127575 -0.245542 +v 1.480325 2.435437 0.000000 +v 1.480325 2.435437 -0.000000 +v 1.480680 0.150000 -0.246120 +v 1.480680 0.150000 0.246120 +v 1.480680 0.150000 0.246120 +v 1.480680 0.150000 -0.246120 +v 1.480680 2.400000 -0.246120 +v 1.480680 2.400000 0.246120 +v 1.480800 0.105600 0.000000 +v 1.480800 0.105600 0.000000 +v 1.491372 0.316800 -0.775921 +v 1.491372 0.316800 0.775921 +v 1.492110 1.621875 -1.095040 +v 1.492110 1.621875 1.095040 +v 1.494500 0.177075 0.248417 +v 1.494500 0.177075 -0.248417 +v 1.495635 2.242575 -0.502408 +v 1.495635 2.242575 0.502408 +v 1.496475 0.127575 0.000000 +v 1.496475 0.127575 0.000000 +v 1.500000 0.150000 0.000000 +v 1.500000 0.150000 0.000000 +v 1.500000 2.400000 0.000000 +v 1.500000 2.400000 0.000000 +v 1.514000 0.177075 -0.000000 +v 1.514000 0.177075 0.000000 +v 1.527214 0.260025 -0.513016 +v 1.527214 0.260025 0.513016 +v 1.528968 1.929525 -0.795481 +v 1.528968 1.929525 0.795481 +v 1.531158 0.553725 -1.123697 +v 1.531158 0.553725 1.123697 +v 1.532010 0.213600 0.254652 +v 1.532010 0.213600 -0.254652 +v 1.534395 1.471200 -1.126072 +v 1.534395 1.471200 1.126072 +v 1.552000 0.213600 0.000000 +v 1.552000 0.213600 0.000000 +v 1.554467 2.242575 -0.258385 +v 1.554467 2.242575 0.258385 +v 1.557220 0.384375 -0.810180 +v 1.557220 0.384375 0.810180 +v 1.565204 2.085600 -0.525778 +v 1.565204 2.085600 0.525778 +v 1.569396 1.323225 -1.151759 +v 1.569396 1.323225 1.151759 +v 1.574750 2.242575 0.000000 +v 1.574750 2.242575 0.000000 +v 1.576477 0.656400 -1.156956 +v 1.576477 0.656400 1.156956 +v 1.587289 0.260025 0.263841 +v 1.587289 0.260025 -0.263841 +v 1.587475 1.774800 -0.825921 +v 1.587475 1.774800 0.825921 +v 1.591798 0.316800 -0.534711 +v 1.591798 0.316800 0.534711 +v 1.595900 1.178400 -1.171210 +v 1.595900 1.178400 1.171210 +v 1.607230 0.771675 -1.179525 +v 1.607230 0.771675 1.179525 +v 1.608000 0.260025 0.000000 +v 1.608000 0.260025 0.000000 +v 1.612693 1.037175 -1.183534 +v 1.612693 1.037175 1.183534 +v 1.618560 0.900000 -1.187840 +v 1.618560 0.900000 -1.187840 +v 1.618560 0.900000 1.187840 +v 1.618560 0.900000 1.187840 +v 1.623068 0.463200 -0.844439 +v 1.623068 0.463200 0.844439 +v 1.626774 2.085600 -0.270404 +v 1.626774 2.085600 0.270404 +v 1.631925 1.929525 -0.548190 +v 1.631925 1.929525 0.548190 +v 1.640643 1.621875 -0.853583 +v 1.640643 1.621875 0.853583 +v 1.648000 2.085600 0.000000 +v 1.648000 2.085600 -0.000000 +v 1.654413 0.316800 -0.274998 +v 1.654413 0.316800 0.274998 +v 1.662080 0.384375 -0.558320 +v 1.662080 0.384375 0.558320 +v 1.676000 0.316800 0.000000 +v 1.676000 0.316800 0.000000 +v 1.683577 0.553725 -0.875920 +v 1.683577 0.553725 0.875920 +v 1.687137 1.471200 -0.877772 +v 1.687137 1.471200 0.877772 +v 1.694372 1.774800 -0.569167 +v 1.694372 1.774800 0.569167 +v 1.696119 1.929525 -0.281930 +v 1.696119 1.929525 0.281930 +v 1.700000 0.600000 0.000000 +v 1.700000 0.600000 0.000000 +v 1.700000 0.623100 0.178200 +v 1.700000 0.623100 -0.178200 +v 1.700000 0.685800 -0.316800 +v 1.700000 0.685800 0.316800 +v 1.700000 0.778200 0.415800 +v 1.700000 0.778200 -0.415800 +v 1.700000 0.890400 -0.475200 +v 1.700000 0.890400 0.475200 +v 1.700000 1.012500 -0.495000 +v 1.700000 1.012500 0.495000 +v 1.700000 1.134600 -0.475200 +v 1.700000 1.134600 0.475200 +v 1.700000 1.246800 0.415800 +v 1.700000 1.246800 -0.415800 +v 1.700000 1.339200 -0.316800 +v 1.700000 1.339200 0.316800 +v 1.700000 1.401900 0.178200 +v 1.700000 1.401900 -0.178200 +v 1.700000 1.425000 0.000000 +v 1.700000 1.425000 0.000000 +v 1.718250 1.929525 0.000000 +v 1.718250 1.929525 0.000000 +v 1.725622 1.323225 -0.897795 +v 1.725622 1.323225 0.897795 +v 1.727460 0.384375 -0.287140 +v 1.727460 0.384375 0.287140 +v 1.732362 0.463200 -0.581929 +v 1.732362 0.463200 0.581929 +v 1.733408 0.656400 -0.901846 +v 1.733408 0.656400 0.901846 +v 1.750000 0.384375 0.000000 +v 1.750000 0.384375 0.000000 +v 1.751120 1.621875 -0.588230 +v 1.751120 1.621875 0.588230 +v 1.754764 1.178400 -0.912957 +v 1.754764 1.178400 0.912957 +v 1.761022 1.774800 -0.292719 +v 1.761022 1.774800 0.292719 +v 1.767222 0.771675 -0.919439 +v 1.767222 0.771675 0.919439 +v 1.773229 1.037175 -0.922564 +v 1.773229 1.037175 0.922564 +v 1.779680 0.900000 -0.925920 +v 1.779680 0.900000 -0.925920 +v 1.779680 0.900000 0.925920 +v 1.779680 0.900000 0.925920 +v 1.784000 1.774800 0.000000 +v 1.784000 1.774800 0.000000 +v 1.796946 0.553725 -0.603624 +v 1.796946 0.553725 0.603624 +v 1.800507 0.463200 -0.299282 +v 1.800507 0.463200 0.299282 +v 1.800745 1.471200 -0.604900 +v 1.800745 1.471200 0.604900 +v 1.820003 1.621875 -0.302523 +v 1.820003 1.621875 0.302522 +v 1.824000 0.463200 0.000000 +v 1.824000 0.463200 0.000000 +v 1.841822 1.323225 -0.618698 +v 1.841822 1.323225 0.618698 +v 1.843750 1.621875 0.000000 +v 1.843750 1.621875 -0.000000 +v 1.850132 0.656400 -0.621490 +v 1.850132 0.656400 0.621490 +v 1.867631 0.553725 -0.310439 +v 1.867631 0.553725 0.310439 +v 1.871580 1.471200 -0.311096 +v 1.871580 1.471200 0.311096 +v 1.872927 1.178400 -0.629147 +v 1.872927 1.178400 0.629147 +v 1.886223 0.771675 -0.633613 +v 1.886223 0.771675 0.633613 +v 1.892000 0.553725 0.000000 +v 1.892000 0.553725 -0.000000 +v 1.892634 1.037175 -0.635767 +v 1.892634 1.037175 0.635767 +v 1.896000 1.471200 0.000000 +v 1.896000 1.471200 0.000000 +v 1.899520 0.900000 -0.638080 +v 1.899520 0.900000 -0.638080 +v 1.899520 0.900000 0.638080 +v 1.899520 0.900000 0.638080 +v 1.914272 1.323225 -0.318192 +v 1.914272 1.323225 0.318192 +v 1.922910 0.656400 -0.319628 +v 1.922910 0.656400 0.319628 +v 1.935900 1.444200 0.000000 +v 1.935900 1.444200 0.000000 +v 1.939250 1.323225 0.000000 +v 1.939250 1.323225 -0.000000 +v 1.939394 1.423221 -0.175100 +v 1.939394 1.423221 0.175100 +v 1.946601 1.178400 -0.323566 +v 1.946601 1.178400 0.323566 +v 1.948000 0.656400 0.000000 +v 1.948000 0.656400 -0.000000 +v 1.948879 1.366278 -0.311290 +v 1.948879 1.366278 0.311290 +v 1.960420 0.771675 -0.325863 +v 1.960420 0.771675 0.325863 +v 1.962857 1.282362 -0.408568 +v 1.962857 1.282362 0.408568 +v 1.967083 1.037175 -0.326970 +v 1.967083 1.037175 0.326970 +v 1.972000 1.178400 0.000000 +v 1.972000 1.178400 0.000000 +v 1.974240 0.900000 -0.328160 +v 1.974240 0.900000 0.328160 +v 1.974240 0.900000 0.328160 +v 1.979830 1.180464 -0.466934 +v 1.979830 1.180464 0.466934 +v 1.986000 0.771675 0.000000 +v 1.986000 0.771675 -0.000000 +v 1.992750 1.037175 0.000000 +v 1.992750 1.037175 0.000000 +v 1.998300 1.069575 -0.486390 +v 1.998300 1.069575 0.486390 +v 2.000000 0.900000 0.000000 +v 2.000000 0.900000 0.000000 +v 2.016770 0.958686 -0.466934 +v 2.016770 0.958686 0.466934 +v 2.033743 0.856788 -0.408568 +v 2.033743 0.856788 0.408568 +v 2.047721 0.772872 0.311290 +v 2.047721 0.772872 -0.311290 +v 2.057206 0.715929 0.175100 +v 2.057206 0.715929 -0.175100 +v 2.060700 0.694950 0.000000 +v 2.060700 0.694950 0.000000 +v 2.111200 1.497600 0.000000 +v 2.111200 1.497600 0.000000 +v 2.116979 1.479120 -0.166687 +v 2.116979 1.479120 0.166687 +v 2.132666 1.428960 -0.296333 +v 2.132666 1.428960 0.296333 +v 2.155782 1.355040 -0.388937 +v 2.155782 1.355040 0.388937 +v 2.183853 1.265280 -0.444499 +v 2.183853 1.265280 0.444499 +v 2.214400 1.167600 -0.463020 +v 2.214400 1.167600 0.463020 +v 2.237300 1.578900 0.000000 +v 2.237300 1.578900 0.000000 +v 2.244457 1.563171 -0.154289 +v 2.244457 1.563171 0.154289 +v 2.244947 1.069920 -0.444499 +v 2.244947 1.069920 0.444499 +v 2.263882 1.520478 -0.274291 +v 2.263882 1.520478 0.274291 +v 2.273018 0.980160 -0.388937 +v 2.273018 0.980160 0.388937 +v 2.292510 1.457562 -0.360007 +v 2.292510 1.457562 0.360007 +v 2.296134 0.906240 -0.296333 +v 2.296134 0.906240 0.296333 +v 2.311821 0.856080 -0.166687 +v 2.311821 0.856080 0.166687 +v 2.317600 0.837600 0.000000 +v 2.317600 0.837600 0.000000 +v 2.325600 1.681800 0.000000 +v 2.325600 1.681800 0.000000 +v 2.327271 1.381164 -0.411437 +v 2.327271 1.381164 0.411437 +v 2.333530 1.668948 -0.139234 +v 2.333530 1.668948 0.139234 +v 2.355053 1.634064 -0.247526 +v 2.355053 1.634064 0.247526 +v 2.365100 1.298025 -0.428580 +v 2.365100 1.298025 0.428580 +v 2.386771 1.582656 -0.324878 +v 2.386771 1.582656 0.324878 +v 2.387500 1.800000 0.000000 +v 2.387500 1.800000 0.000000 +v 2.395900 1.790025 0.122850 +v 2.395900 1.790025 -0.122850 +v 2.402929 1.214886 -0.411437 +v 2.402929 1.214886 0.411437 +v 2.418700 1.762950 -0.218400 +v 2.418700 1.762950 0.218400 +v 2.425286 1.520232 -0.371290 +v 2.425286 1.520232 0.371290 +v 2.434400 1.927200 0.000000 +v 2.434400 1.927200 0.000000 +v 2.437690 1.138488 -0.360007 +v 2.437690 1.138488 0.360007 +v 2.443270 1.919976 0.106466 +v 2.443270 1.919976 -0.106466 +v 2.452300 1.723050 -0.286650 +v 2.452300 1.723050 0.286650 +v 2.466318 1.075572 -0.274291 +v 2.466318 1.075572 0.274291 +v 2.467200 1.452300 -0.386760 +v 2.467200 1.452300 0.386760 +v 2.467347 1.900368 0.189274 +v 2.467347 1.900368 -0.189274 +v 2.477700 2.057100 0.000000 +v 2.477700 2.057100 0.000000 +v 2.485743 1.032879 -0.154289 +v 2.485743 1.032879 0.154289 +v 2.487343 2.052375 -0.091411 +v 2.487343 2.052375 0.091411 +v 2.492900 1.017150 0.000000 +v 2.492900 1.017150 0.000000 +v 2.493100 1.674600 -0.327600 +v 2.493100 1.674600 0.327600 +v 2.502829 1.871472 0.248422 +v 2.502829 1.871472 -0.248422 +v 2.509114 1.384368 -0.371290 +v 2.509114 1.384368 0.371290 +v 2.513518 2.039550 0.162509 +v 2.513518 2.039550 -0.162509 +v 2.528800 2.183400 0.000000 +v 2.537500 1.621875 -0.341250 +v 2.537500 1.621875 0.341250 +v 2.539821 2.180796 -0.079013 +v 2.539821 2.180796 0.079013 +v 2.545914 1.836384 -0.283910 +v 2.545914 1.836384 0.283910 +v 2.547629 1.321944 -0.324878 +v 2.547629 1.321944 0.324878 +v 2.552090 2.020650 -0.213293 +v 2.552090 2.020650 0.213293 +v 2.569734 2.173728 -0.140467 +v 2.569734 2.173728 0.140467 +v 2.579347 1.270536 -0.247526 +v 2.579347 1.270536 0.247526 +v 2.581900 1.569150 -0.327600 +v 2.581900 1.569150 0.327600 +v 2.592800 1.798200 -0.295740 +v 2.592800 1.798200 0.295740 +v 2.598929 1.997700 -0.243763 +v 2.598929 1.997700 0.243763 +v 2.599100 2.299800 0.000000 +v 2.599100 2.299800 0.000000 +v 2.600870 1.235652 -0.139234 +v 2.600870 1.235652 0.139234 +v 2.608800 1.222800 0.000000 +v 2.608800 1.222800 0.000000 +v 2.612406 2.298813 0.070600 +v 2.612406 2.298813 -0.070600 +v 2.613818 2.163312 -0.184363 +v 2.613818 2.163312 0.184363 +v 2.622700 1.520700 -0.286650 +v 2.622700 1.520700 0.286650 +v 2.639686 1.760016 -0.283910 +v 2.639686 1.760016 0.283910 +v 2.648521 2.296134 0.125510 +v 2.648521 2.296134 -0.125510 +v 2.649900 1.972725 0.253920 +v 2.649900 1.972725 -0.253920 +v 2.656300 1.480800 -0.218400 +v 2.656300 1.480800 0.218400 +v 2.667347 2.150664 -0.210701 +v 2.667347 2.150664 0.210701 +v 2.679100 1.453725 0.122850 +v 2.679100 1.453725 -0.122850 +v 2.682771 1.724928 0.248422 +v 2.682771 1.724928 -0.248422 +v 2.687500 1.443750 0.000000 +v 2.687500 1.443750 0.000000 +v 2.700000 2.400000 0.000000 +v 2.700000 2.400000 0.000000 +v 2.700000 2.400000 0.000000 +v 2.700871 1.947750 -0.243763 +v 2.700871 1.947750 0.243763 +v 2.701743 2.292186 0.164732 +v 2.701743 2.292186 -0.164732 +v 2.716800 2.400000 0.067500 +v 2.716800 2.400000 -0.067500 +v 2.716800 2.400000 -0.067500 +v 2.716800 2.400000 0.067500 +v 2.718253 1.696032 0.189274 +v 2.718253 1.696032 -0.189274 +v 2.725600 2.136900 -0.219480 +v 2.725600 2.136900 0.219480 +v 2.729800 2.420250 0.000000 +v 2.742330 1.676424 0.106466 +v 2.742330 1.676424 -0.106466 +v 2.747407 2.420406 -0.066744 +v 2.747407 2.420406 0.066744 +v 2.747710 1.924800 -0.213293 +v 2.747710 1.924800 0.213293 +v 2.751200 1.669200 0.000000 +v 2.751200 1.669200 0.000000 +v 2.758400 2.436000 0.000000 +v 2.762400 2.400000 0.120000 +v 2.762400 2.400000 -0.120000 +v 2.762400 2.400000 -0.120000 +v 2.762400 2.400000 0.120000 +v 2.766370 2.287392 0.188266 +v 2.766370 2.287392 -0.188266 +v 2.776365 2.436302 -0.064692 +v 2.776365 2.436302 0.064692 +v 2.783853 2.123136 -0.210701 +v 2.783853 2.123136 0.210701 +v 2.784600 2.447250 0.000000 +v 2.784600 2.447250 0.000000 +v 2.786282 1.905900 0.162509 +v 2.786282 1.905900 -0.162509 +v 2.795198 2.420829 -0.118656 +v 2.795198 2.420829 0.118656 +v 2.800000 2.400000 0.000000 +v 2.802528 2.447680 -0.061668 +v 2.802528 2.447680 0.061668 +v 2.807200 2.454000 0.000000 +v 2.811200 2.400000 -0.040500 +v 2.811200 2.400000 0.040500 +v 2.812457 1.893075 0.091411 +v 2.812457 1.893075 -0.091411 +v 2.822100 1.888350 0.000000 +v 2.822100 1.888350 0.000000 +v 2.824200 2.420250 0.000000 +v 2.824200 2.420250 0.000000 +v 2.824750 2.454529 -0.057996 +v 2.824750 2.454529 0.057996 +v 2.825000 2.456250 0.000000 +v 2.825000 2.456250 0.000000 +v 2.825126 2.437123 -0.115008 +v 2.825126 2.437123 0.115008 +v 2.829600 2.400000 0.157500 +v 2.829600 2.400000 -0.157500 +v 2.829600 2.400000 -0.157500 +v 2.829600 2.400000 0.157500 +v 2.836672 2.420519 -0.041256 +v 2.836672 2.420519 0.041256 +v 2.836700 2.282175 0.196110 +v 2.836700 2.282175 -0.196110 +v 2.836800 2.454000 0.000000 +v 2.836800 2.454000 0.000000 +v 2.837382 2.110488 -0.184363 +v 2.837382 2.110488 0.184363 +v 2.837600 2.436000 0.000000 +v 2.837600 2.436000 0.000000 +v 2.841400 2.447250 0.000000 +v 2.841400 2.447250 0.000000 +v 2.841600 2.400000 -0.072000 +v 2.841600 2.400000 0.072000 +v 2.841887 2.456841 -0.054000 +v 2.841887 2.456841 0.054000 +v 2.851189 2.448847 -0.109632 +v 2.851189 2.448847 0.109632 +v 2.851331 2.436454 -0.043308 +v 2.851331 2.436454 0.043308 +v 2.852794 2.454605 -0.050004 +v 2.852794 2.454605 0.050004 +v 2.856323 2.447812 -0.046332 +v 2.856323 2.447812 0.046332 +v 2.865626 2.421453 -0.155736 +v 2.865626 2.421453 0.155736 +v 2.870524 2.421250 -0.073344 +v 2.870524 2.421250 0.073344 +v 2.872387 2.455966 -0.103104 +v 2.872387 2.455966 0.103104 +v 2.881466 2.100072 -0.140467 +v 2.881466 2.100072 0.140467 +v 2.886400 2.400000 -0.094500 +v 2.886400 2.400000 0.094500 +v 2.887725 2.458444 -0.096000 +v 2.887725 2.458444 0.096000 +v 2.888602 2.437685 -0.076992 +v 2.888602 2.437685 0.076992 +v 2.896205 2.456246 0.088896 +v 2.896205 2.456246 -0.088896 +v 2.896829 2.449338 -0.082368 +v 2.896829 2.449338 0.082368 +v 2.896986 2.438333 -0.150948 +v 2.896986 2.438333 0.150948 +v 2.907030 2.276958 0.188266 +v 2.907030 2.276958 -0.188266 +v 2.911200 2.400000 -0.180000 +v 2.911200 2.400000 -0.180000 +v 2.911200 2.400000 0.180000 +v 2.911379 2.093004 -0.079013 +v 2.911379 2.093004 0.079013 +v 2.920412 2.422328 -0.096264 +v 2.920412 2.422328 0.096264 +v 2.922400 2.090400 0.000000 +v 2.922899 2.450567 -0.143892 +v 2.922899 2.450567 0.143892 +v 2.940800 2.400000 -0.108000 +v 2.940800 2.400000 0.108000 +v 2.942589 2.458082 -0.135324 +v 2.942589 2.458082 0.135324 +v 2.943526 2.439499 -0.101052 +v 2.943526 2.439499 0.101052 +v 2.951146 2.422210 -0.177984 +v 2.951146 2.422210 0.177984 +v 2.955275 2.460806 -0.126000 +v 2.955275 2.460806 0.126000 +v 2.956523 2.451588 -0.108108 +v 2.956523 2.451588 0.108108 +v 2.960179 2.458666 -0.116676 +v 2.960179 2.458666 0.116676 +v 2.971657 2.272164 0.164732 +v 2.971657 2.272164 -0.164732 +v 2.980990 2.423636 0.110016 +v 2.980990 2.423636 -0.110016 +v 2.984243 2.439802 -0.172512 +v 2.984243 2.439802 0.172512 +v 3.000000 2.400000 -0.187500 +v 3.000000 2.400000 -0.187500 +v 3.000000 2.400000 -0.112500 +v 3.000000 2.400000 0.112500 +v 3.000000 2.400000 0.187500 +v 3.009977 2.452655 -0.164448 +v 3.009977 2.452655 0.164448 +v 3.010221 2.441702 -0.115488 +v 3.010221 2.441702 0.115488 +v 3.024879 2.268216 0.125510 +v 3.024879 2.268216 -0.125510 +v 3.027834 2.460653 -0.154656 +v 3.027834 2.460653 0.154656 +v 3.029007 2.454319 -0.123552 +v 3.029007 2.454319 0.123552 +v 3.037300 2.463675 -0.144000 +v 3.037300 2.463675 0.144000 +v 3.037862 2.461603 0.133344 +v 3.037862 2.461603 -0.133344 +v 3.044212 2.423034 -0.185400 +v 3.044212 2.423034 0.185400 +v 3.046912 2.425059 0.114600 +v 3.046912 2.425059 -0.114600 +v 3.059200 2.400000 -0.108000 +v 3.059200 2.400000 0.108000 +v 3.060994 2.265537 0.070600 +v 3.060994 2.265537 -0.070600 +v 3.074300 2.264550 0.000000 +v 3.074300 2.264550 0.000000 +v 3.079200 2.441400 -0.179700 +v 3.079200 2.441400 0.179700 +v 3.082800 2.444100 -0.120300 +v 3.082800 2.444100 0.120300 +v 3.088800 2.400000 -0.180000 +v 3.088800 2.400000 -0.180000 +v 3.088800 2.400000 0.180000 +v 3.104737 2.454928 -0.171300 +v 3.104738 2.454928 0.171300 +v 3.107887 2.457291 -0.128700 +v 3.107887 2.457291 0.128700 +v 3.112835 2.426483 0.110016 +v 3.112835 2.426483 -0.110016 +v 3.113600 2.400000 -0.094500 +v 3.113600 2.400000 0.094500 +v 3.120600 2.463450 0.161100 +v 3.120600 2.463450 -0.161100 +v 3.122400 2.464800 0.138900 +v 3.122400 2.464800 -0.138900 +v 3.126562 2.466797 -0.150000 +v 3.126562 2.466797 0.150000 +v 3.137279 2.423859 -0.177984 +v 3.137279 2.423859 0.177984 +v 3.155379 2.446498 -0.115488 +v 3.155379 2.446498 0.115488 +v 3.158400 2.400000 -0.072000 +v 3.158400 2.400000 0.072000 +v 3.170400 2.400000 -0.157500 +v 3.170400 2.400000 0.157500 +v 3.170400 2.400000 -0.157500 +v 3.173413 2.427791 -0.096264 +v 3.173413 2.427791 0.096264 +v 3.174157 2.442998 -0.172512 +v 3.174157 2.442998 0.172512 +v 3.186768 2.460263 -0.123552 +v 3.186768 2.460263 0.123552 +v 3.188800 2.400000 -0.040500 +v 3.188800 2.400000 0.040500 +v 3.199498 2.457201 -0.164448 +v 3.199498 2.457201 0.164448 +v 3.200000 2.400000 0.000000 +v 3.206938 2.467997 0.133344 +v 3.206938 2.467997 -0.133344 +v 3.213366 2.466247 -0.154656 +v 3.213366 2.466247 0.154656 +v 3.215825 2.469919 -0.144000 +v 3.215825 2.469919 0.144000 +v 3.222074 2.448701 -0.101052 +v 3.222074 2.448701 0.101052 +v 3.222799 2.424616 -0.155736 +v 3.222799 2.424616 0.155736 +v 3.223301 2.428868 -0.073344 +v 3.223301 2.428868 0.073344 +v 3.237600 2.400000 -0.120000 +v 3.237600 2.400000 0.120000 +v 3.237600 2.400000 -0.120000 +v 3.257153 2.429599 -0.041256 +v 3.257153 2.429599 0.041256 +v 3.259252 2.462994 -0.108108 +v 3.259252 2.462994 0.108108 +v 3.261414 2.444467 -0.150948 +v 3.261414 2.444467 0.150948 +v 3.269625 2.429869 0.000000 +v 3.269625 2.429869 0.000000 +v 3.276998 2.450515 -0.076992 +v 3.276998 2.450515 0.076992 +v 3.283200 2.400000 -0.067500 +v 3.283200 2.400000 0.067500 +v 3.283200 2.400000 -0.067500 +v 3.284621 2.470934 -0.116676 +v 3.284621 2.470934 0.116676 +v 3.286576 2.459289 -0.143892 +v 3.286576 2.459289 0.143892 +v 3.293227 2.425240 -0.118656 +v 3.293227 2.425240 0.118656 +v 3.297850 2.472787 -0.126000 +v 3.297850 2.472788 0.126000 +v 3.298611 2.468818 -0.135324 +v 3.298611 2.468818 0.135324 +v 3.300000 2.400000 0.000000 +v 3.300000 2.400000 0.000000 +v 3.314269 2.451746 -0.043308 +v 3.314269 2.451746 0.043308 +v 3.318946 2.465243 -0.082368 +v 3.318946 2.465243 0.082368 +v 3.328000 2.452200 0.000000 +v 3.328000 2.452200 0.000000 +v 3.333274 2.445677 -0.115008 +v 3.333274 2.445677 0.115008 +v 3.341018 2.425663 -0.066744 +v 3.341018 2.425663 0.066744 +v 3.348595 2.473354 0.088896 +v 3.348595 2.473354 -0.088896 +v 3.358286 2.461009 -0.109632 +v 3.358286 2.461009 0.109632 +v 3.358625 2.425819 0.000000 +v 3.359452 2.466769 -0.046332 +v 3.359452 2.466769 0.046332 +v 3.365400 2.475150 -0.096000 +v 3.365400 2.475150 0.096000 +v 3.368813 2.470934 -0.103104 +v 3.368813 2.470934 0.103104 +v 3.374375 2.467331 0.000000 +v 3.374375 2.467331 0.000000 +v 3.382035 2.446498 -0.064692 +v 3.382035 2.446498 0.064692 +v 3.392006 2.474995 -0.050004 +v 3.392006 2.474995 0.050004 +v 3.400000 2.446800 0.000000 +v 3.406947 2.462176 -0.061668 +v 3.406947 2.462176 0.061668 +v 3.408000 2.475600 0.000000 +v 3.408000 2.475600 0.000000 +v 3.411237 2.476753 -0.054000 +v 3.411237 2.476753 0.054000 +v 3.416450 2.472371 -0.057996 +v 3.416450 2.472371 0.057996 +v 3.424875 2.462606 0.000000 +v 3.428125 2.477344 0.000000 +v 3.428125 2.477344 0.000000 +v 3.434000 2.472900 0.000000 + +f 2909 2921 2939 +f 2939 2931 2909 +f 2869 2877 2921 +f 2921 2909 2869 +f 2819 2827 2877 +f 2877 2869 2819 +f 2737 2747 2827 +f 2827 2819 2737 +f 2669 2673 2747 +f 2747 2737 2669 +f 2567 2575 2673 +f 2673 2669 2567 +f 2476 2480 2575 +f 2575 2567 2476 +f 2358 2362 2480 +f 2480 2476 2358 +f 2158 2162 2362 +f 2362 2358 2158 +f 1715 1812 2162 +f 2162 2158 1715 +f 2901 2909 2931 +f 2931 2917 2901 +f 2863 2869 2909 +f 2909 2901 2863 +f 2813 2819 2869 +f 2869 2863 2813 +f 2729 2737 2819 +f 2819 2813 2729 +f 2663 2669 2737 +f 2737 2729 2663 +f 2561 2567 2669 +f 2669 2663 2561 +f 2468 2476 2567 +f 2567 2561 2468 +f 2350 2358 2476 +f 2476 2468 2350 +f 2152 2158 2358 +f 2358 2350 2152 +f 1717 1715 2158 +f 2158 2152 1717 +f 2903 2901 2917 +f 2917 2923 2903 +f 2865 2863 2901 +f 2901 2903 2865 +f 2815 2813 2863 +f 2863 2865 2815 +f 2733 2729 2813 +f 2813 2815 2733 +f 2665 2663 2729 +f 2729 2733 2665 +f 2564 2561 2663 +f 2663 2665 2564 +f 2473 2468 2561 +f 2561 2564 2473 +f 2354 2350 2468 +f 2468 2473 2354 +f 2155 2152 2350 +f 2350 2354 2155 +f 1927 1717 2152 +f 2152 2155 1927 +f 2911 2903 2923 +f 2923 2935 2911 +f 2875 2865 2903 +f 2903 2911 2875 +f 2823 2815 2865 +f 2865 2875 2823 +f 2741 2733 2815 +f 2815 2823 2741 +f 2671 2665 2733 +f 2733 2741 2671 +f 2571 2564 2665 +f 2665 2671 2571 +f 2478 2473 2564 +f 2564 2571 2478 +f 2360 2354 2473 +f 2473 2478 2360 +f 2160 2155 2354 +f 2354 2360 2160 +f 1718 1927 2155 +f 2155 2160 1718 +f 2929 2911 2935 +f 2935 2947 2929 +f 2881 2875 2911 +f 2911 2929 2881 +f 2829 2823 2875 +f 2875 2881 2829 +f 2751 2741 2823 +f 2823 2829 2751 +f 2677 2671 2741 +f 2741 2751 2677 +f 2577 2571 2671 +f 2671 2677 2577 +f 2482 2478 2571 +f 2571 2577 2482 +f 2364 2360 2478 +f 2478 2482 2364 +f 2164 2160 2360 +f 2360 2364 2164 +f 1842 1718 2160 +f 2160 2164 1842 +f 2945 2929 2947 +f 2947 2959 2945 +f 2897 2881 2929 +f 2929 2945 2897 +f 2835 2829 2881 +f 2881 2897 2835 +f 2761 2751 2829 +f 2829 2835 2761 +f 2679 2677 2751 +f 2751 2761 2679 +f 2579 2577 2677 +f 2677 2679 2579 +f 2486 2482 2577 +f 2577 2579 2486 +f 2368 2364 2482 +f 2482 2486 2368 +f 2172 2164 2364 +f 2364 2368 2172 +f 1725 1842 2164 +f 2164 2172 1725 +f 2965 2945 2959 +f 2959 2981 2965 +f 2907 2897 2945 +f 2945 2965 2907 +f 2845 2835 2897 +f 2897 2907 2845 +f 2769 2761 2835 +f 2835 2845 2769 +f 2685 2679 2761 +f 2761 2769 2685 +f 2587 2579 2679 +f 2679 2685 2587 +f 2491 2486 2579 +f 2579 2587 2491 +f 2370 2368 2486 +f 2486 2491 2370 +f 2174 2172 2368 +f 2368 2370 2174 +f 1834 1725 2172 +f 2172 2174 1834 +f 2982 2965 2981 +f 2981 2988 2982 +f 2933 2907 2965 +f 2965 2982 2933 +f 2855 2845 2907 +f 2907 2933 2855 +f 2779 2769 2845 +f 2845 2855 2779 +f 2691 2685 2769 +f 2769 2779 2691 +f 2595 2587 2685 +f 2685 2691 2595 +f 2500 2491 2587 +f 2587 2595 2500 +f 2374 2370 2491 +f 2491 2500 2374 +f 2178 2174 2370 +f 2370 2374 2178 +f 1716 1834 2174 +f 2174 2178 1716 +f 2990 2982 2988 +f 2988 3002 2990 +f 2949 2933 2982 +f 2982 2990 2949 +f 2871 2855 2933 +f 2933 2949 2871 +f 2791 2779 2855 +f 2855 2871 2791 +f 2699 2691 2779 +f 2779 2791 2699 +f 2601 2595 2691 +f 2691 2699 2601 +f 2506 2500 2595 +f 2595 2601 2506 +f 2378 2374 2500 +f 2500 2506 2378 +f 2180 2178 2374 +f 2374 2378 2180 +f 1714 1716 2178 +f 2178 2180 1714 +f 3008 2990 3002 +f 3002 3024 3008 +f 2973 2949 2990 +f 2990 3008 2973 +f 2889 2871 2949 +f 2949 2973 2889 +f 2805 2791 2871 +f 2871 2889 2805 +f 2711 2699 2791 +f 2791 2805 2711 +f 2611 2601 2699 +f 2699 2711 2611 +f 2521 2506 2601 +f 2601 2611 2521 +f 2387 2378 2506 +f 2506 2521 2387 +f 2191 2180 2378 +f 2378 2387 2191 +f 1810 1714 2180 +f 2180 2191 1810 +f 1464 1460 1813 +f 1813 1821 1464 +f 1264 1260 1460 +f 1460 1464 1264 +f 1146 1142 1260 +f 1260 1264 1146 +f 1055 1047 1142 +f 1142 1146 1055 +f 953 949 1047 +f 1047 1055 953 +f 885 875 949 +f 949 953 885 +f 803 795 875 +f 875 885 803 +f 753 745 795 +f 795 803 753 +f 713 701 745 +f 745 753 713 +f 691 683 701 +f 701 713 691 +f 1470 1464 1821 +f 1821 1829 1470 +f 1272 1264 1464 +f 1464 1470 1272 +f 1154 1146 1264 +f 1264 1272 1154 +f 1061 1055 1146 +f 1146 1154 1061 +f 959 953 1055 +f 1055 1061 959 +f 893 885 953 +f 953 959 893 +f 809 803 885 +f 885 893 809 +f 759 753 803 +f 803 809 759 +f 721 713 753 +f 753 759 721 +f 705 691 713 +f 713 721 705 +f 1469 1470 1829 +f 1829 1835 1469 +f 1268 1272 1470 +f 1470 1469 1268 +f 1151 1154 1272 +f 1272 1268 1151 +f 1060 1061 1154 +f 1154 1151 1060 +f 957 959 1061 +f 1061 1060 957 +f 889 893 959 +f 959 957 889 +f 807 809 893 +f 893 889 807 +f 757 759 809 +f 809 807 757 +f 719 721 759 +f 759 757 719 +f 699 705 721 +f 721 719 699 +f 1462 1469 1835 +f 1835 1839 1462 +f 1262 1268 1469 +f 1469 1462 1262 +f 1144 1151 1268 +f 1268 1262 1144 +f 1051 1060 1151 +f 1151 1144 1051 +f 951 957 1060 +f 1060 1051 951 +f 881 889 957 +f 957 951 881 +f 799 807 889 +f 889 881 799 +f 747 757 807 +f 807 799 747 +f 711 719 757 +f 757 747 711 +f 687 699 719 +f 719 711 687 +f 1458 1462 1839 +f 1839 1843 1458 +f 1258 1262 1462 +f 1462 1458 1258 +f 1140 1144 1262 +f 1262 1258 1140 +f 1045 1051 1144 +f 1144 1140 1045 +f 945 951 1051 +f 1051 1045 945 +f 871 881 951 +f 951 945 871 +f 793 799 881 +f 881 871 793 +f 741 747 799 +f 799 793 741 +f 693 711 747 +f 747 741 693 +f 675 687 711 +f 711 693 675 +f 1450 1458 1843 +f 1843 1838 1450 +f 1254 1258 1458 +f 1458 1450 1254 +f 1136 1140 1258 +f 1258 1254 1136 +f 1043 1045 1140 +f 1140 1136 1043 +f 943 945 1045 +f 1045 1043 943 +f 861 871 945 +f 945 943 861 +f 787 793 871 +f 871 861 787 +f 725 741 793 +f 793 787 725 +f 677 693 741 +f 741 725 677 +f 663 675 693 +f 693 677 663 +f 1448 1450 1838 +f 1838 1834 1448 +f 1252 1254 1450 +f 1450 1448 1252 +f 1133 1136 1254 +f 1254 1252 1133 +f 1035 1043 1136 +f 1136 1133 1035 +f 937 943 1043 +f 1043 1035 937 +f 853 861 943 +f 943 937 853 +f 777 787 861 +f 861 853 777 +f 715 725 787 +f 787 777 715 +f 657 677 725 +f 725 715 657 +f 642 663 677 +f 677 657 642 +f 1444 1448 1834 +f 1834 1828 1444 +f 1248 1252 1448 +f 1448 1444 1248 +f 1122 1133 1252 +f 1252 1248 1122 +f 1027 1035 1133 +f 1133 1122 1027 +f 931 937 1035 +f 1035 1027 931 +f 843 853 937 +f 937 931 843 +f 767 777 853 +f 853 843 767 +f 689 715 777 +f 777 767 689 +f 640 657 715 +f 715 689 640 +f 634 642 657 +f 657 640 634 +f 1442 1444 1828 +f 1828 1820 1442 +f 1244 1248 1444 +f 1444 1442 1244 +f 1116 1122 1248 +f 1248 1244 1116 +f 1021 1027 1122 +f 1122 1116 1021 +f 923 931 1027 +f 1027 1021 923 +f 831 843 931 +f 931 923 831 +f 751 767 843 +f 843 831 751 +f 673 689 767 +f 767 751 673 +f 632 640 689 +f 689 673 632 +f 620 634 640 +f 640 632 620 +f 1429 1442 1820 +f 1820 1811 1429 +f 1233 1244 1442 +f 1442 1429 1233 +f 1106 1116 1244 +f 1244 1233 1106 +f 1011 1021 1116 +f 1116 1106 1011 +f 911 923 1021 +f 1021 1011 911 +f 817 831 923 +f 923 911 817 +f 733 751 831 +f 831 817 733 +f 649 673 751 +f 751 733 649 +f 614 632 673 +f 673 649 614 +f 597 620 632 +f 632 614 597 +f 714 702 684 +f 684 692 714 +f 754 746 702 +f 702 714 754 +f 804 796 746 +f 746 754 804 +f 886 876 796 +f 796 804 886 +f 954 950 876 +f 876 886 954 +f 1056 1048 950 +f 950 954 1056 +f 1147 1143 1048 +f 1048 1056 1147 +f 1265 1261 1143 +f 1143 1147 1265 +f 1465 1461 1261 +f 1261 1265 1465 +f 1915 1817 1461 +f 1461 1465 1915 +f 722 714 692 +f 692 706 722 +f 760 754 714 +f 714 722 760 +f 810 804 754 +f 754 760 810 +f 894 886 804 +f 804 810 894 +f 960 954 886 +f 886 894 960 +f 1062 1056 954 +f 954 960 1062 +f 1155 1147 1056 +f 1056 1062 1155 +f 1273 1265 1147 +f 1147 1155 1273 +f 1471 1465 1265 +f 1265 1273 1471 +f 1917 1915 1465 +f 1465 1471 1917 +f 720 722 706 +f 706 700 720 +f 758 760 722 +f 722 720 758 +f 808 810 760 +f 760 758 808 +f 890 894 810 +f 810 808 890 +f 958 960 894 +f 894 890 958 +f 1059 1062 960 +f 960 958 1059 +f 1150 1155 1062 +f 1062 1059 1150 +f 1269 1273 1155 +f 1155 1150 1269 +f 1468 1471 1273 +f 1273 1269 1468 +f 1697 1917 1471 +f 1471 1468 1697 +f 712 720 700 +f 700 688 712 +f 748 758 720 +f 720 712 748 +f 800 808 758 +f 758 748 800 +f 882 890 808 +f 808 800 882 +f 952 958 890 +f 890 882 952 +f 1052 1059 958 +f 958 952 1052 +f 1145 1150 1059 +f 1059 1052 1145 +f 1263 1269 1150 +f 1150 1145 1263 +f 1463 1468 1269 +f 1269 1263 1463 +f 1919 1697 1468 +f 1468 1463 1919 +f 694 712 688 +f 688 676 694 +f 742 748 712 +f 712 694 742 +f 794 800 748 +f 748 742 794 +f 872 882 800 +f 800 794 872 +f 946 952 882 +f 882 872 946 +f 1046 1052 952 +f 952 946 1046 +f 1141 1145 1052 +f 1052 1046 1141 +f 1259 1263 1145 +f 1145 1141 1259 +f 1459 1463 1263 +f 1263 1259 1459 +f 1845 1919 1463 +f 1463 1459 1845 +f 678 694 676 +f 676 664 678 +f 726 742 694 +f 694 678 726 +f 788 794 742 +f 742 726 788 +f 862 872 794 +f 794 788 862 +f 944 946 872 +f 872 862 944 +f 1044 1046 946 +f 946 944 1044 +f 1137 1141 1046 +f 1046 1044 1137 +f 1255 1259 1141 +f 1141 1137 1255 +f 1451 1459 1259 +f 1259 1255 1451 +f 1898 1845 1459 +f 1459 1451 1898 +f 658 678 664 +f 664 642 658 +f 716 726 678 +f 678 658 716 +f 778 788 726 +f 726 716 778 +f 854 862 788 +f 788 778 854 +f 938 944 862 +f 862 854 938 +f 1036 1044 944 +f 944 938 1036 +f 1132 1137 1044 +f 1044 1036 1132 +f 1253 1255 1137 +f 1137 1132 1253 +f 1449 1451 1255 +f 1255 1253 1449 +f 1837 1898 1451 +f 1451 1449 1837 +f 641 658 642 +f 642 635 641 +f 690 716 658 +f 658 641 690 +f 768 778 716 +f 716 690 768 +f 844 854 778 +f 778 768 844 +f 932 938 854 +f 854 844 932 +f 1028 1036 938 +f 938 932 1028 +f 1123 1132 1036 +f 1036 1028 1123 +f 1249 1253 1132 +f 1132 1123 1249 +f 1445 1449 1253 +f 1253 1249 1445 +f 1918 1837 1449 +f 1449 1445 1918 +f 633 641 635 +f 635 621 633 +f 674 690 641 +f 641 633 674 +f 752 768 690 +f 690 674 752 +f 832 844 768 +f 768 752 832 +f 924 932 844 +f 844 832 924 +f 1022 1028 932 +f 932 924 1022 +f 1117 1123 1028 +f 1028 1022 1117 +f 1245 1249 1123 +f 1123 1117 1245 +f 1443 1445 1249 +f 1249 1245 1443 +f 1916 1918 1445 +f 1445 1443 1916 +f 616 633 621 +f 621 600 616 +f 654 674 633 +f 633 616 654 +f 737 752 674 +f 674 654 737 +f 822 832 752 +f 752 737 822 +f 914 924 832 +f 832 822 914 +f 1014 1022 924 +f 924 914 1014 +f 1104 1117 1022 +f 1022 1014 1104 +f 1237 1245 1117 +f 1117 1104 1237 +f 1433 1443 1245 +f 1245 1237 1433 +f 1819 1916 1443 +f 1443 1433 1819 +f 2159 2163 1816 +f 1816 1822 2159 +f 2359 2363 2163 +f 2163 2159 2359 +f 2477 2481 2363 +f 2363 2359 2477 +f 2568 2576 2481 +f 2481 2477 2568 +f 2670 2674 2576 +f 2576 2568 2670 +f 2738 2748 2674 +f 2674 2670 2738 +f 2820 2828 2748 +f 2748 2738 2820 +f 2870 2878 2828 +f 2828 2820 2870 +f 2910 2922 2878 +f 2878 2870 2910 +f 2932 2940 2922 +f 2922 2910 2932 +f 2153 2159 1822 +f 1822 1830 2153 +f 2351 2359 2159 +f 2159 2153 2351 +f 2469 2477 2359 +f 2359 2351 2469 +f 2562 2568 2477 +f 2477 2469 2562 +f 2664 2670 2568 +f 2568 2562 2664 +f 2730 2738 2670 +f 2670 2664 2730 +f 2814 2820 2738 +f 2738 2730 2814 +f 2864 2870 2820 +f 2820 2814 2864 +f 2902 2910 2870 +f 2870 2864 2902 +f 2918 2932 2910 +f 2910 2902 2918 +f 2154 2153 1830 +f 1830 1836 2154 +f 2355 2351 2153 +f 2153 2154 2355 +f 2472 2469 2351 +f 2351 2355 2472 +f 2563 2562 2469 +f 2469 2472 2563 +f 2666 2664 2562 +f 2562 2563 2666 +f 2734 2730 2664 +f 2664 2666 2734 +f 2816 2814 2730 +f 2730 2734 2816 +f 2866 2864 2814 +f 2814 2816 2866 +f 2904 2902 2864 +f 2864 2866 2904 +f 2924 2918 2902 +f 2902 2904 2924 +f 2161 2154 1836 +f 1836 1840 2161 +f 2361 2355 2154 +f 2154 2161 2361 +f 2479 2472 2355 +f 2355 2361 2479 +f 2572 2563 2472 +f 2472 2479 2572 +f 2672 2666 2563 +f 2563 2572 2672 +f 2742 2734 2666 +f 2666 2672 2742 +f 2824 2816 2734 +f 2734 2742 2824 +f 2876 2866 2816 +f 2816 2824 2876 +f 2912 2904 2866 +f 2866 2876 2912 +f 2936 2924 2904 +f 2904 2912 2936 +f 2165 2161 1840 +f 1840 1844 2165 +f 2365 2361 2161 +f 2161 2165 2365 +f 2483 2479 2361 +f 2361 2365 2483 +f 2578 2572 2479 +f 2479 2483 2578 +f 2678 2672 2572 +f 2572 2578 2678 +f 2752 2742 2672 +f 2672 2678 2752 +f 2830 2824 2742 +f 2742 2752 2830 +f 2882 2876 2824 +f 2824 2830 2882 +f 2930 2912 2876 +f 2876 2882 2930 +f 2948 2936 2912 +f 2912 2930 2948 +f 2173 2165 1844 +f 1844 1841 2173 +f 2369 2365 2165 +f 2165 2173 2369 +f 2487 2483 2365 +f 2365 2369 2487 +f 2580 2578 2483 +f 2483 2487 2580 +f 2680 2678 2578 +f 2578 2580 2680 +f 2762 2752 2678 +f 2678 2680 2762 +f 2836 2830 2752 +f 2752 2762 2836 +f 2898 2882 2830 +f 2830 2836 2898 +f 2946 2930 2882 +f 2882 2898 2946 +f 2960 2948 2930 +f 2930 2946 2960 +f 2175 2173 1841 +f 1841 1837 2175 +f 2371 2369 2173 +f 2173 2175 2371 +f 2490 2487 2369 +f 2369 2371 2490 +f 2588 2580 2487 +f 2487 2490 2588 +f 2686 2680 2580 +f 2580 2588 2686 +f 2770 2762 2680 +f 2680 2686 2770 +f 2846 2836 2762 +f 2762 2770 2846 +f 2908 2898 2836 +f 2836 2846 2908 +f 2966 2946 2898 +f 2898 2908 2966 +f 2981 2960 2946 +f 2946 2966 2981 +f 2179 2175 1837 +f 1837 1831 2179 +f 2375 2371 2175 +f 2175 2179 2375 +f 2501 2490 2371 +f 2371 2375 2501 +f 2596 2588 2490 +f 2490 2501 2596 +f 2692 2686 2588 +f 2588 2596 2692 +f 2780 2770 2686 +f 2686 2692 2780 +f 2856 2846 2770 +f 2770 2780 2856 +f 2934 2908 2846 +f 2846 2856 2934 +f 2983 2966 2908 +f 2908 2934 2983 +f 2989 2981 2966 +f 2966 2983 2989 +f 2181 2179 1831 +f 1831 1823 2181 +f 2379 2375 2179 +f 2179 2181 2379 +f 2507 2501 2375 +f 2375 2379 2507 +f 2602 2596 2501 +f 2501 2507 2602 +f 2700 2692 2596 +f 2596 2602 2700 +f 2792 2780 2692 +f 2692 2700 2792 +f 2872 2856 2780 +f 2780 2792 2872 +f 2950 2934 2856 +f 2856 2872 2950 +f 2991 2983 2934 +f 2934 2950 2991 +f 3003 2989 2983 +f 2983 2991 3003 +f 2194 2181 1823 +f 1823 1818 2194 +f 2391 2379 2181 +f 2181 2194 2391 +f 2518 2507 2379 +f 2379 2391 2518 +f 2614 2602 2507 +f 2507 2518 2614 +f 2712 2700 2602 +f 2602 2614 2712 +f 2806 2792 2700 +f 2700 2712 2806 +f 2890 2872 2792 +f 2792 2806 2890 +f 2974 2950 2872 +f 2872 2890 2974 +f 3009 2991 2950 +f 2950 2974 3009 +f 3025 3003 2991 +f 2991 3009 3025 +f 3040 3008 3024 +f 3024 3048 3040 +f 3018 2973 3008 +f 3008 3040 3018 +f 2943 2889 2973 +f 2973 3018 2943 +f 2841 2805 2889 +f 2889 2943 2841 +f 2731 2711 2805 +f 2805 2841 2731 +f 2645 2611 2711 +f 2711 2731 2645 +f 2529 2521 2611 +f 2611 2645 2529 +f 2402 2387 2521 +f 2521 2529 2402 +f 2208 2191 2387 +f 2387 2402 2208 +f 1806 1810 2191 +f 2191 2208 1806 +f 3072 3040 3048 +f 3048 3078 3072 +f 3044 3018 3040 +f 3040 3072 3044 +f 2994 2943 3018 +f 3018 3044 2994 +f 2883 2841 2943 +f 2943 2994 2883 +f 2773 2731 2841 +f 2841 2883 2773 +f 2659 2645 2731 +f 2731 2773 2659 +f 2539 2529 2645 +f 2645 2659 2539 +f 2410 2402 2529 +f 2529 2539 2410 +f 2222 2208 2402 +f 2402 2410 2222 +f 1694 1806 2208 +f 2208 2222 1694 +f 3092 3072 3078 +f 3078 3116 3092 +f 3074 3044 3072 +f 3072 3092 3074 +f 3030 2994 3044 +f 3044 3074 3030 +f 2937 2883 2994 +f 2994 3030 2937 +f 2810 2773 2883 +f 2883 2937 2810 +f 2683 2659 2773 +f 2773 2810 2683 +f 2554 2539 2659 +f 2659 2683 2554 +f 2420 2410 2539 +f 2539 2554 2420 +f 2238 2222 2410 +f 2410 2420 2238 +f 1930 1694 2222 +f 2222 2238 1930 +f 3132 3092 3116 +f 3116 3142 3132 +f 3090 3074 3092 +f 3092 3132 3090 +f 3054 3030 3074 +f 3074 3090 3054 +f 2984 2937 3030 +f 3030 3054 2984 +f 2837 2810 2937 +f 2937 2984 2837 +f 2705 2683 2810 +f 2810 2837 2705 +f 2574 2554 2683 +f 2683 2705 2574 +f 2430 2420 2554 +f 2554 2574 2430 +f 2247 2238 2420 +f 2420 2430 2247 +f 1913 1930 2238 +f 2238 2247 1913 +f 3150 3132 3142 +f 3142 3156 3150 +f 3128 3090 3132 +f 3132 3150 3128 +f 3076 3054 3090 +f 3090 3128 3076 +f 3014 2984 3054 +f 3054 3076 3014 +f 2861 2837 2984 +f 2984 3014 2861 +f 2723 2705 2837 +f 2837 2861 2723 +f 2585 2574 2705 +f 2705 2723 2585 +f 2438 2430 2574 +f 2574 2585 2438 +f 2253 2247 2430 +f 2430 2438 2253 +f 1711 1913 2247 +f 2247 2253 1711 +f 3162 3150 3156 +f 3156 3172 3162 +f 3148 3128 3150 +f 3150 3162 3148 +f 3088 3076 3128 +f 3128 3148 3088 +f 3036 3014 3076 +f 3076 3088 3036 +f 2893 2861 3014 +f 3014 3036 2893 +f 2743 2723 2861 +f 2861 2893 2743 +f 2599 2585 2723 +f 2723 2743 2599 +f 2450 2438 2585 +f 2585 2599 2450 +f 2267 2253 2438 +f 2438 2450 2267 +f 1794 1711 2253 +f 2253 2267 1794 +f 3178 3162 3172 +f 3172 3184 3178 +f 3154 3148 3162 +f 3162 3178 3154 +f 3118 3088 3148 +f 3148 3154 3118 +f 3046 3036 3088 +f 3088 3118 3046 +f 2915 2893 3036 +f 3036 3046 2915 +f 2763 2743 2893 +f 2893 2915 2763 +f 2615 2599 2743 +f 2743 2763 2615 +f 2452 2450 2599 +f 2599 2615 2452 +f 2277 2267 2450 +f 2450 2452 2277 +f 1710 1794 2267 +f 2267 2277 1710 +f 3188 3178 3184 +f 3184 3200 3188 +f 3164 3154 3178 +f 3178 3188 3164 +f 3130 3118 3154 +f 3154 3164 3130 +f 3058 3046 3118 +f 3118 3130 3058 +f 2941 2915 3046 +f 3046 3058 2941 +f 2775 2763 2915 +f 2915 2941 2775 +f 2627 2615 2763 +f 2763 2775 2627 +f 2458 2452 2615 +f 2615 2627 2458 +f 2287 2277 2452 +f 2452 2458 2287 +f 1910 1710 2277 +f 2277 2287 1910 +f 3198 3188 3200 +f 3200 3209 3198 +f 3170 3164 3188 +f 3188 3198 3170 +f 3136 3130 3164 +f 3164 3170 3136 +f 3064 3058 3130 +f 3130 3136 3064 +f 2955 2941 3058 +f 3058 3064 2955 +f 2781 2775 2941 +f 2941 2955 2781 +f 2636 2627 2775 +f 2775 2781 2636 +f 2462 2458 2627 +f 2627 2636 2462 +f 2295 2287 2458 +f 2458 2462 2295 +f 1909 1910 2287 +f 2287 2295 1909 +f 3202 3198 3209 +f 3209 3213 3202 +f 3174 3170 3198 +f 3198 3202 3174 +f 3138 3136 3170 +f 3170 3174 3138 +f 3066 3064 3136 +f 3136 3138 3066 +f 2961 2955 3064 +f 3064 3066 2961 +f 2783 2781 2955 +f 2955 2961 2783 +f 2642 2636 2781 +f 2781 2783 2642 +f 2464 2462 2636 +f 2636 2642 2464 +f 2297 2295 2462 +f 2462 2464 2297 +f 1784 1909 2295 +f 2295 2297 1784 +f 1414 1429 1811 +f 1811 1807 1414 +f 1220 1233 1429 +f 1429 1414 1220 +f 1093 1106 1233 +f 1233 1220 1093 +f 977 1011 1106 +f 1106 1093 977 +f 891 911 1011 +f 1011 977 891 +f 781 817 911 +f 911 891 781 +f 679 733 817 +f 817 781 679 +f 604 649 733 +f 733 679 604 +f 571 614 649 +f 649 604 571 +f 561 597 614 +f 614 571 561 +f 1400 1414 1807 +f 1807 1804 1400 +f 1212 1220 1414 +f 1414 1400 1212 +f 1083 1093 1220 +f 1220 1212 1083 +f 963 977 1093 +f 1093 1083 963 +f 849 891 977 +f 977 963 849 +f 739 781 891 +f 891 849 739 +f 628 679 781 +f 781 739 628 +f 565 604 679 +f 679 628 565 +f 530 571 604 +f 604 565 530 +f 524 561 571 +f 571 530 524 +f 1386 1400 1804 +f 1804 1802 1386 +f 1202 1212 1400 +f 1400 1386 1202 +f 1070 1083 1212 +f 1212 1202 1070 +f 939 963 1083 +f 1083 1070 939 +f 814 849 963 +f 963 939 814 +f 685 739 849 +f 849 814 685 +f 585 628 739 +f 739 685 585 +f 528 565 628 +f 628 585 528 +f 510 530 565 +f 565 528 510 +f 508 524 530 +f 530 510 508 +f 1375 1386 1802 +f 1802 1800 1375 +f 1192 1202 1386 +f 1386 1375 1192 +f 1050 1070 1202 +f 1202 1192 1050 +f 917 939 1070 +f 1070 1050 917 +f 785 814 939 +f 939 917 785 +f 638 685 814 +f 814 785 638 +f 553 585 685 +f 685 638 553 +f 512 528 585 +f 585 553 512 +f 492 510 528 +f 528 512 492 +f 482 508 510 +f 510 492 482 +f 1369 1375 1800 +f 1800 1798 1369 +f 1184 1192 1375 +f 1375 1369 1184 +f 1037 1050 1192 +f 1192 1184 1037 +f 899 917 1050 +f 1050 1037 899 +f 761 785 917 +f 917 899 761 +f 608 638 785 +f 785 761 608 +f 526 553 638 +f 638 608 526 +f 496 512 553 +f 553 526 496 +f 454 492 512 +f 512 496 454 +f 448 482 492 +f 492 454 448 +f 1355 1369 1798 +f 1798 1795 1355 +f 1172 1184 1369 +f 1369 1355 1172 +f 1023 1037 1184 +f 1184 1172 1023 +f 879 899 1037 +f 1037 1023 879 +f 729 761 899 +f 899 879 729 +f 579 608 761 +f 761 729 579 +f 514 526 608 +f 608 579 514 +f 457 496 526 +f 526 514 457 +f 442 454 496 +f 496 457 442 +f 432 448 454 +f 454 442 432 +f 1345 1355 1795 +f 1795 1792 1345 +f 1170 1172 1355 +f 1355 1345 1170 +f 1007 1023 1172 +f 1172 1170 1007 +f 859 879 1023 +f 1023 1007 859 +f 707 729 879 +f 879 859 707 +f 563 579 729 +f 729 707 563 +f 506 514 579 +f 579 563 506 +f 450 457 514 +f 514 506 450 +f 420 442 457 +f 457 450 420 +f 412 432 442 +f 442 420 412 +f 1335 1345 1792 +f 1792 1790 1335 +f 1164 1170 1345 +f 1345 1335 1164 +f 995 1007 1170 +f 1170 1164 995 +f 847 859 1007 +f 1007 995 847 +f 681 707 859 +f 859 847 681 +f 547 563 707 +f 707 681 547 +f 494 506 563 +f 563 547 494 +f 440 450 506 +f 506 494 440 +f 410 420 450 +f 450 440 410 +f 398 412 420 +f 420 410 398 +f 1327 1335 1790 +f 1790 1788 1327 +f 1160 1164 1335 +f 1335 1327 1160 +f 988 995 1164 +f 1164 1160 988 +f 841 847 995 +f 995 988 841 +f 667 681 847 +f 847 841 667 +f 538 547 681 +f 681 667 538 +f 488 494 547 +f 547 538 488 +f 434 440 494 +f 494 488 434 +f 400 410 440 +f 440 434 400 +f 381 398 410 +f 410 400 381 +f 1324 1327 1788 +f 1788 1785 1324 +f 1156 1160 1327 +f 1327 1324 1156 +f 979 988 1160 +f 1160 1156 979 +f 837 841 988 +f 988 979 837 +f 659 667 841 +f 841 837 659 +f 534 538 667 +f 667 659 534 +f 484 488 538 +f 538 534 484 +f 428 434 488 +f 488 484 428 +f 395 400 434 +f 434 428 395 +f 374 381 400 +f 400 395 374 +f 572 616 600 +f 600 562 572 +f 605 654 616 +f 616 572 605 +f 680 737 654 +f 654 605 680 +f 782 822 737 +f 737 680 782 +f 892 914 822 +f 822 782 892 +f 978 1014 914 +f 914 892 978 +f 1094 1104 1014 +f 1014 978 1094 +f 1221 1237 1104 +f 1104 1094 1221 +f 1415 1433 1237 +f 1237 1221 1415 +f 1809 1819 1433 +f 1433 1415 1809 +f 531 572 562 +f 562 525 531 +f 566 605 572 +f 572 531 566 +f 629 680 605 +f 605 566 629 +f 740 782 680 +f 680 629 740 +f 850 892 782 +f 782 740 850 +f 964 978 892 +f 892 850 964 +f 1084 1094 978 +f 978 964 1084 +f 1213 1221 1094 +f 1094 1084 1213 +f 1401 1415 1221 +f 1221 1213 1401 +f 1931 1809 1415 +f 1415 1401 1931 +f 511 531 525 +f 525 509 511 +f 529 566 531 +f 531 511 529 +f 586 629 566 +f 566 529 586 +f 686 740 629 +f 629 586 686 +f 813 850 740 +f 740 686 813 +f 940 964 850 +f 850 813 940 +f 1069 1084 964 +f 964 940 1069 +f 1203 1213 1084 +f 1084 1069 1203 +f 1385 1401 1213 +f 1213 1203 1385 +f 1693 1931 1401 +f 1401 1385 1693 +f 493 511 509 +f 509 483 493 +f 513 529 511 +f 511 493 513 +f 554 586 529 +f 529 513 554 +f 639 686 586 +f 586 554 639 +f 786 813 686 +f 686 639 786 +f 918 940 813 +f 813 786 918 +f 1049 1069 940 +f 940 918 1049 +f 1193 1203 1069 +f 1069 1049 1193 +f 1376 1385 1203 +f 1203 1193 1376 +f 1712 1693 1385 +f 1385 1376 1712 +f 455 493 483 +f 483 449 455 +f 497 513 493 +f 493 455 497 +f 527 554 513 +f 513 497 527 +f 609 639 554 +f 554 527 609 +f 762 786 639 +f 639 609 762 +f 900 918 786 +f 786 762 900 +f 1038 1049 918 +f 918 900 1038 +f 1185 1193 1049 +f 1049 1038 1185 +f 1370 1376 1193 +f 1193 1185 1370 +f 1912 1712 1376 +f 1376 1370 1912 +f 443 455 449 +f 449 433 443 +f 458 497 455 +f 455 443 458 +f 515 527 497 +f 497 458 515 +f 580 609 527 +f 527 515 580 +f 730 762 609 +f 609 580 730 +f 880 900 762 +f 762 730 880 +f 1024 1038 900 +f 900 880 1024 +f 1173 1185 1038 +f 1038 1024 1173 +f 1356 1370 1185 +f 1185 1173 1356 +f 1797 1912 1370 +f 1370 1356 1797 +f 421 443 433 +f 433 413 421 +f 451 458 443 +f 443 421 451 +f 507 515 458 +f 458 451 507 +f 564 580 515 +f 515 507 564 +f 708 730 580 +f 580 564 708 +f 860 880 730 +f 730 708 860 +f 1008 1024 880 +f 880 860 1008 +f 1171 1173 1024 +f 1024 1008 1171 +f 1346 1356 1173 +f 1173 1171 1346 +f 1911 1797 1356 +f 1356 1346 1911 +f 411 421 413 +f 413 399 411 +f 441 451 421 +f 421 411 441 +f 495 507 451 +f 451 441 495 +f 548 564 507 +f 507 495 548 +f 682 708 564 +f 564 548 682 +f 848 860 708 +f 708 682 848 +f 996 1008 860 +f 860 848 996 +f 1165 1171 1008 +f 1008 996 1165 +f 1336 1346 1171 +f 1171 1165 1336 +f 1709 1911 1346 +f 1346 1336 1709 +f 401 411 399 +f 399 382 401 +f 435 441 411 +f 411 401 435 +f 489 495 441 +f 441 435 489 +f 539 548 495 +f 495 489 539 +f 668 682 548 +f 548 539 668 +f 842 848 682 +f 682 668 842 +f 987 996 848 +f 848 842 987 +f 1161 1165 996 +f 996 987 1161 +f 1328 1336 1165 +f 1165 1161 1328 +f 1708 1709 1336 +f 1336 1328 1708 +f 397 401 382 +f 382 376 397 +f 431 435 401 +f 401 397 431 +f 487 489 435 +f 435 431 487 +f 537 539 489 +f 489 487 537 +f 662 668 539 +f 539 537 662 +f 840 842 668 +f 668 662 840 +f 981 987 842 +f 842 840 981 +f 1159 1161 987 +f 987 981 1159 +f 1326 1328 1161 +f 1161 1159 1326 +f 1787 1708 1328 +f 1328 1326 1787 +f 2209 2194 1818 +f 1818 1808 2209 +f 2403 2391 2194 +f 2194 2209 2403 +f 2530 2518 2391 +f 2391 2403 2530 +f 2646 2614 2518 +f 2518 2530 2646 +f 2732 2712 2614 +f 2614 2646 2732 +f 2842 2806 2712 +f 2712 2732 2842 +f 2944 2890 2806 +f 2806 2842 2944 +f 3019 2974 2890 +f 2890 2944 3019 +f 3041 3009 2974 +f 2974 3019 3041 +f 3049 3025 3009 +f 3009 3041 3049 +f 2223 2209 1808 +f 1808 1805 2223 +f 2411 2403 2209 +f 2209 2223 2411 +f 2540 2530 2403 +f 2403 2411 2540 +f 2660 2646 2530 +f 2530 2540 2660 +f 2774 2732 2646 +f 2646 2660 2774 +f 2884 2842 2732 +f 2732 2774 2884 +f 2995 2944 2842 +f 2842 2884 2995 +f 3045 3019 2944 +f 2944 2995 3045 +f 3073 3041 3019 +f 3019 3045 3073 +f 3079 3049 3041 +f 3041 3073 3079 +f 2237 2223 1805 +f 1805 1803 2237 +f 2421 2411 2223 +f 2223 2237 2421 +f 2553 2540 2411 +f 2411 2421 2553 +f 2684 2660 2540 +f 2540 2553 2684 +f 2809 2774 2660 +f 2660 2684 2809 +f 2938 2884 2774 +f 2774 2809 2938 +f 3031 2995 2884 +f 2884 2938 3031 +f 3075 3045 2995 +f 2995 3031 3075 +f 3093 3073 3045 +f 3045 3075 3093 +f 3117 3079 3073 +f 3073 3093 3117 +f 2248 2237 1803 +f 1803 1801 2248 +f 2431 2421 2237 +f 2237 2248 2431 +f 2573 2553 2421 +f 2421 2431 2573 +f 2706 2684 2553 +f 2553 2573 2706 +f 2838 2809 2684 +f 2684 2706 2838 +f 2985 2938 2809 +f 2809 2838 2985 +f 3055 3031 2938 +f 2938 2985 3055 +f 3091 3075 3031 +f 3031 3055 3091 +f 3133 3093 3075 +f 3075 3091 3133 +f 3143 3117 3093 +f 3093 3133 3143 +f 2254 2248 1801 +f 1801 1799 2254 +f 2439 2431 2248 +f 2248 2254 2439 +f 2586 2573 2431 +f 2431 2439 2586 +f 2724 2706 2573 +f 2573 2586 2724 +f 2862 2838 2706 +f 2706 2724 2862 +f 3015 2985 2838 +f 2838 2862 3015 +f 3077 3055 2985 +f 2985 3015 3077 +f 3129 3091 3055 +f 3055 3077 3129 +f 3151 3133 3091 +f 3091 3129 3151 +f 3157 3143 3133 +f 3133 3151 3157 +f 2268 2254 1799 +f 1799 1796 2268 +f 2451 2439 2254 +f 2254 2268 2451 +f 2600 2586 2439 +f 2439 2451 2600 +f 2744 2724 2586 +f 2586 2600 2744 +f 2894 2862 2724 +f 2724 2744 2894 +f 3037 3015 2862 +f 2862 2894 3037 +f 3089 3077 3015 +f 3015 3037 3089 +f 3149 3129 3077 +f 3077 3089 3149 +f 3163 3151 3129 +f 3129 3149 3163 +f 3173 3157 3151 +f 3151 3163 3173 +f 2278 2268 1796 +f 1796 1793 2278 +f 2453 2451 2268 +f 2268 2278 2453 +f 2616 2600 2451 +f 2451 2453 2616 +f 2764 2744 2600 +f 2600 2616 2764 +f 2916 2894 2744 +f 2744 2764 2916 +f 3047 3037 2894 +f 2894 2916 3047 +f 3119 3089 3037 +f 3037 3047 3119 +f 3155 3149 3089 +f 3089 3119 3155 +f 3179 3163 3149 +f 3149 3155 3179 +f 3185 3173 3163 +f 3163 3179 3185 +f 2288 2278 1793 +f 1793 1791 2288 +f 2459 2453 2278 +f 2278 2288 2459 +f 2628 2616 2453 +f 2453 2459 2628 +f 2776 2764 2616 +f 2616 2628 2776 +f 2942 2916 2764 +f 2764 2776 2942 +f 3059 3047 2916 +f 2916 2942 3059 +f 3131 3119 3047 +f 3047 3059 3131 +f 3165 3155 3119 +f 3119 3131 3165 +f 3189 3179 3155 +f 3155 3165 3189 +f 3201 3185 3179 +f 3179 3189 3201 +f 2296 2288 1791 +f 1791 1789 2296 +f 2463 2459 2288 +f 2288 2296 2463 +f 2635 2628 2459 +f 2459 2463 2635 +f 2782 2776 2628 +f 2628 2635 2782 +f 2956 2942 2776 +f 2776 2782 2956 +f 3065 3059 2942 +f 2942 2956 3065 +f 3137 3131 3059 +f 3059 3065 3137 +f 3171 3165 3131 +f 3131 3137 3171 +f 3199 3189 3165 +f 3165 3171 3199 +f 3210 3201 3189 +f 3189 3199 3210 +f 2299 2296 1789 +f 1789 1786 2299 +f 2467 2463 2296 +f 2296 2299 2467 +f 2644 2635 2463 +f 2463 2467 2644 +f 2786 2782 2635 +f 2635 2644 2786 +f 2964 2956 2782 +f 2782 2786 2964 +f 3069 3065 2956 +f 2956 2964 3069 +f 3141 3137 3065 +f 3065 3069 3141 +f 3177 3171 3137 +f 3137 3141 3177 +f 3204 3199 3171 +f 3171 3177 3204 +f 3214 3210 3199 +f 3199 3204 3214 +f 3194 3202 3213 +f 3213 3207 3194 +f 3166 3175 3202 +f 3202 3194 3166 +f 3134 3139 3175 +f 3175 3166 3134 +f 3060 3067 3139 +f 3139 3134 3060 +f 2953 2962 3067 +f 3067 3060 2953 +f 2777 2784 2962 +f 2962 2953 2777 +f 2629 2643 2784 +f 2784 2777 2629 +f 2460 2465 2643 +f 2643 2629 2460 +f 2293 2298 2465 +f 2465 2460 2293 +f 1696 1785 2298 +f 2298 2293 1696 +f 3180 3194 3207 +f 3207 3190 3180 +f 3158 3166 3194 +f 3194 3180 3158 +f 3124 3134 3166 +f 3166 3158 3124 +f 3050 3060 3134 +f 3134 3124 3050 +f 2927 2953 3060 +f 3060 3050 2927 +f 2767 2777 2953 +f 2953 2927 2767 +f 2619 2629 2777 +f 2777 2767 2619 +f 2454 2460 2629 +f 2629 2619 2454 +f 2283 2293 2460 +f 2460 2454 2283 +f 1695 1696 2293 +f 2293 2283 1695 +f 3160 3180 3190 +f 3190 3168 3160 +f 3144 3158 3180 +f 3180 3160 3144 +f 3086 3124 3158 +f 3158 3144 3086 +f 3032 3050 3124 +f 3124 3086 3032 +f 2891 2927 3050 +f 3050 3032 2891 +f 2739 2767 2927 +f 2927 2891 2739 +f 2597 2619 2767 +f 2767 2739 2597 +f 2448 2454 2619 +f 2619 2597 2448 +f 2265 2283 2454 +f 2454 2448 2265 +f 1707 1695 2283 +f 2283 2265 1707 +f 3146 3160 3168 +f 3168 3152 3146 +f 3122 3144 3160 +f 3160 3146 3122 +f 3070 3086 3144 +f 3144 3122 3070 +f 2998 3032 3086 +f 3086 3070 2998 +f 2853 2891 3032 +f 3032 2998 2853 +f 2717 2739 2891 +f 2891 2853 2717 +f 2582 2597 2739 +f 2739 2717 2582 +f 2434 2448 2597 +f 2597 2582 2434 +f 2251 2265 2448 +f 2448 2434 2251 +f 1907 1707 2265 +f 2265 2251 1907 +f 3120 3146 3152 +f 3152 3126 3120 +f 3082 3122 3146 +f 3146 3120 3082 +f 3042 3070 3122 +f 3122 3082 3042 +f 2957 2998 3070 +f 3070 3042 2957 +f 2825 2853 2998 +f 2998 2957 2825 +f 2693 2717 2853 +f 2853 2825 2693 +f 2556 2582 2717 +f 2717 2693 2556 +f 2424 2434 2582 +f 2582 2556 2424 +f 2239 2251 2434 +f 2434 2424 2239 +f 1906 1907 2251 +f 2251 2239 1906 +f 3080 3120 3126 +f 3126 3084 3080 +f 3056 3082 3120 +f 3120 3080 3056 +f 3012 3042 3082 +f 3082 3056 3012 +f 2899 2957 3042 +f 3042 3012 2899 +f 2789 2825 2957 +f 2957 2899 2789 +f 2675 2693 2825 +f 2825 2789 2675 +f 2545 2556 2693 +f 2693 2675 2545 +f 2416 2424 2556 +f 2556 2545 2416 +f 2228 2239 2424 +f 2424 2416 2228 +f 1770 1906 2239 +f 2239 2228 1770 +f 3053 3080 3084 +f 3084 3062 3053 +f 3028 3056 3080 +f 3080 3053 3028 +f 2978 3012 3056 +f 3056 3028 2978 +f 2860 2899 3012 +f 3012 2978 2860 +f 2754 2789 2899 +f 2899 2860 2754 +f 2652 2675 2789 +f 2789 2754 2652 +f 2534 2545 2675 +f 2675 2652 2534 +f 2406 2416 2545 +f 2545 2534 2406 +f 2217 2228 2416 +f 2416 2406 2217 +f 1929 1770 2228 +f 2228 2217 1929 +f 3035 3053 3062 +f 3062 3039 3035 +f 2997 3028 3053 +f 3053 3035 2997 +f 2920 2978 3028 +f 3028 2997 2920 +f 2832 2860 2978 +f 2978 2920 2832 +f 2728 2754 2860 +f 2860 2832 2728 +f 2634 2652 2754 +f 2754 2728 2634 +f 2528 2534 2652 +f 2652 2634 2528 +f 2396 2406 2534 +f 2534 2528 2396 +f 2202 2217 2406 +f 2406 2396 2202 +f 1765 1929 2217 +f 2217 2202 1765 +f 3017 3035 3039 +f 3039 3027 3017 +f 2980 2997 3035 +f 3035 3017 2980 +f 2896 2920 2997 +f 2997 2980 2896 +f 2812 2832 2920 +f 2920 2896 2812 +f 2715 2728 2832 +f 2832 2812 2715 +f 2618 2634 2728 +f 2728 2715 2618 +f 2523 2528 2634 +f 2634 2618 2523 +f 2392 2396 2528 +f 2528 2523 2392 +f 2196 2202 2396 +f 2396 2392 2196 +f 1724 1765 2202 +f 2202 2196 1724 +f 3007 3017 3027 +f 3027 3023 3007 +f 2969 2980 3017 +f 3017 3007 2969 +f 2887 2896 2980 +f 2980 2969 2887 +f 2802 2812 2896 +f 2896 2887 2802 +f 2709 2715 2812 +f 2812 2802 2709 +f 2609 2618 2715 +f 2715 2709 2609 +f 2519 2523 2618 +f 2618 2609 2519 +f 2386 2392 2523 +f 2523 2519 2386 +f 2190 2196 2392 +f 2392 2386 2190 +f 1759 1724 2196 +f 2196 2190 1759 +f 1329 1324 1785 +f 1785 1782 1329 +f 1162 1157 1324 +f 1324 1329 1162 +f 993 982 1157 +f 1157 1162 993 +f 845 838 982 +f 982 993 845 +f 669 660 838 +f 838 845 669 +f 542 535 660 +f 660 669 542 +f 490 485 535 +f 535 542 490 +f 438 429 485 +f 485 490 438 +f 404 396 429 +f 429 438 404 +f 387 376 396 +f 396 404 387 +f 1339 1329 1782 +f 1782 1780 1339 +f 1168 1162 1329 +f 1329 1339 1168 +f 1003 993 1162 +f 1162 1168 1003 +f 855 845 993 +f 993 1003 855 +f 695 669 845 +f 845 855 695 +f 559 542 669 +f 669 695 559 +f 500 490 542 +f 542 559 500 +f 446 438 490 +f 490 500 446 +f 416 404 438 +f 438 446 416 +f 408 387 404 +f 404 416 408 +f 1357 1339 1780 +f 1780 1778 1357 +f 1174 1168 1339 +f 1339 1357 1174 +f 1025 1003 1168 +f 1168 1174 1025 +f 883 855 1003 +f 1003 1025 883 +f 731 695 855 +f 855 883 731 +f 583 559 695 +f 695 731 583 +f 516 500 559 +f 559 583 516 +f 467 446 500 +f 500 516 467 +f 444 416 446 +f 446 467 444 +f 436 408 416 +f 416 444 436 +f 1371 1357 1778 +f 1778 1776 1371 +f 1188 1174 1357 +f 1357 1371 1188 +f 1042 1025 1174 +f 1174 1188 1042 +f 905 883 1025 +f 1025 1042 905 +f 769 731 883 +f 883 905 769 +f 624 583 731 +f 731 769 624 +f 532 516 583 +f 583 624 532 +f 502 467 516 +f 516 532 502 +f 459 444 467 +f 467 502 459 +f 452 436 444 +f 444 459 452 +f 1383 1371 1776 +f 1776 1774 1383 +f 1198 1188 1371 +f 1371 1383 1198 +f 1068 1042 1188 +f 1188 1198 1068 +f 929 905 1042 +f 1042 1068 929 +f 797 769 905 +f 905 929 797 +f 665 624 769 +f 769 797 665 +f 569 532 624 +f 624 665 569 +f 520 502 532 +f 532 569 520 +f 504 459 502 +f 502 520 504 +f 498 452 459 +f 459 504 498 +f 1394 1383 1774 +f 1774 1771 1394 +f 1206 1198 1383 +f 1383 1394 1206 +f 1077 1068 1198 +f 1198 1206 1077 +f 947 929 1068 +f 1068 1077 947 +f 833 797 929 +f 929 947 833 +f 723 665 797 +f 797 833 723 +f 610 569 665 +f 665 723 610 +f 549 520 569 +f 569 610 549 +f 522 504 520 +f 520 549 522 +f 518 498 504 +f 504 522 518 +f 1407 1394 1771 +f 1771 1768 1407 +f 1216 1206 1394 +f 1394 1407 1216 +f 1090 1077 1206 +f 1206 1216 1090 +f 972 947 1077 +f 1077 1090 972 +f 870 833 947 +f 947 972 870 +f 764 723 833 +f 833 870 764 +f 646 610 723 +f 723 764 646 +f 587 549 610 +f 610 646 587 +f 556 522 549 +f 549 587 556 +f 540 518 522 +f 522 556 540 +f 1420 1407 1768 +f 1768 1764 1420 +f 1226 1216 1407 +f 1407 1420 1226 +f 1096 1090 1216 +f 1216 1226 1096 +f 990 972 1090 +f 1090 1096 990 +f 896 870 972 +f 972 990 896 +f 792 764 870 +f 870 896 792 +f 704 646 764 +f 764 792 704 +f 627 587 646 +f 646 704 627 +f 582 556 587 +f 587 627 582 +f 574 540 556 +f 556 582 574 +f 1426 1420 1764 +f 1764 1762 1426 +f 1230 1226 1420 +f 1420 1426 1230 +f 1101 1096 1226 +f 1226 1230 1101 +f 1006 990 1096 +f 1096 1101 1006 +f 907 896 990 +f 990 1006 907 +f 812 792 896 +f 896 907 812 +f 728 704 792 +f 792 812 728 +f 644 627 704 +f 704 728 644 +f 607 582 627 +f 627 644 607 +f 592 574 582 +f 582 607 592 +f 1430 1426 1762 +f 1762 1758 1430 +f 1234 1230 1426 +f 1426 1430 1234 +f 1107 1101 1230 +f 1230 1234 1107 +f 1012 1006 1101 +f 1101 1107 1012 +f 912 907 1006 +f 1006 1012 912 +f 819 812 907 +f 907 912 819 +f 738 728 812 +f 812 819 738 +f 651 644 728 +f 728 738 651 +f 618 607 644 +f 644 651 618 +f 601 592 607 +f 607 618 601 +f 405 397 376 +f 376 388 405 +f 439 430 397 +f 397 405 439 +f 491 486 430 +f 430 439 491 +f 543 536 486 +f 486 491 543 +f 670 661 536 +f 536 543 670 +f 846 839 661 +f 661 670 846 +f 994 980 839 +f 839 846 994 +f 1163 1158 980 +f 980 994 1163 +f 1330 1325 1158 +f 1158 1163 1330 +f 1926 1786 1325 +f 1325 1330 1926 +f 417 405 388 +f 388 409 417 +f 447 439 405 +f 405 417 447 +f 501 491 439 +f 439 447 501 +f 560 543 491 +f 491 501 560 +f 696 670 543 +f 543 560 696 +f 856 846 670 +f 670 696 856 +f 1004 994 846 +f 846 856 1004 +f 1169 1163 994 +f 994 1004 1169 +f 1340 1330 1163 +f 1163 1169 1340 +f 1925 1926 1330 +f 1330 1340 1925 +f 445 417 409 +f 409 437 445 +f 468 447 417 +f 417 445 468 +f 517 501 447 +f 447 468 517 +f 584 560 501 +f 501 517 584 +f 732 696 560 +f 560 584 732 +f 884 856 696 +f 696 732 884 +f 1026 1004 856 +f 856 884 1026 +f 1175 1169 1004 +f 1004 1026 1175 +f 1358 1340 1169 +f 1169 1175 1358 +f 1908 1925 1340 +f 1340 1358 1908 +f 460 445 437 +f 437 453 460 +f 503 468 445 +f 445 460 503 +f 533 517 468 +f 468 503 533 +f 625 584 517 +f 517 533 625 +f 770 732 584 +f 584 625 770 +f 906 884 732 +f 732 770 906 +f 1041 1026 884 +f 884 906 1041 +f 1189 1175 1026 +f 1026 1041 1189 +f 1372 1358 1175 +f 1175 1189 1372 +f 1706 1908 1358 +f 1358 1372 1706 +f 505 460 453 +f 453 499 505 +f 521 503 460 +f 460 505 521 +f 570 533 503 +f 503 521 570 +f 666 625 533 +f 533 570 666 +f 798 770 625 +f 625 666 798 +f 930 906 770 +f 770 798 930 +f 1067 1041 906 +f 906 930 1067 +f 1199 1189 1041 +f 1041 1067 1199 +f 1384 1372 1189 +f 1189 1199 1384 +f 1705 1706 1372 +f 1372 1384 1705 +f 523 505 499 +f 499 519 523 +f 550 521 505 +f 505 523 550 +f 611 570 521 +f 521 550 611 +f 724 666 570 +f 570 611 724 +f 834 798 666 +f 666 724 834 +f 948 930 798 +f 798 834 948 +f 1078 1067 930 +f 930 948 1078 +f 1207 1199 1067 +f 1067 1078 1207 +f 1395 1384 1199 +f 1199 1207 1395 +f 1773 1705 1384 +f 1384 1395 1773 +f 555 523 519 +f 519 541 555 +f 588 550 523 +f 523 555 588 +f 645 611 550 +f 550 588 645 +f 763 724 611 +f 611 645 763 +f 869 834 724 +f 724 763 869 +f 971 948 834 +f 834 869 971 +f 1089 1078 948 +f 948 971 1089 +f 1217 1207 1078 +f 1078 1089 1217 +f 1406 1395 1207 +f 1207 1217 1406 +f 1692 1773 1395 +f 1395 1406 1692 +f 581 555 541 +f 541 573 581 +f 626 588 555 +f 555 581 626 +f 703 645 588 +f 588 626 703 +f 791 763 645 +f 645 703 791 +f 895 869 763 +f 763 791 895 +f 989 971 869 +f 869 895 989 +f 1095 1089 971 +f 971 989 1095 +f 1227 1217 1089 +f 1089 1095 1227 +f 1421 1406 1217 +f 1217 1227 1421 +f 1766 1692 1406 +f 1406 1421 1766 +f 606 581 573 +f 573 591 606 +f 643 626 581 +f 581 606 643 +f 727 703 626 +f 626 643 727 +f 811 791 703 +f 703 727 811 +f 908 895 791 +f 791 811 908 +f 1005 989 895 +f 895 908 1005 +f 1100 1095 989 +f 989 1005 1100 +f 1231 1227 1095 +f 1095 1100 1231 +f 1427 1421 1227 +f 1227 1231 1427 +f 1897 1766 1421 +f 1421 1427 1897 +f 615 606 591 +f 591 598 615 +f 653 643 606 +f 606 615 653 +f 735 727 643 +f 643 653 735 +f 820 811 727 +f 727 735 820 +f 913 908 811 +f 811 820 913 +f 1013 1005 908 +f 908 913 1013 +f 1103 1100 1005 +f 1005 1013 1103 +f 1236 1231 1100 +f 1100 1103 1236 +f 1432 1427 1231 +f 1231 1236 1432 +f 1760 1897 1427 +f 1427 1432 1760 +f 2294 2299 1786 +f 1786 1783 2294 +f 2461 2466 2299 +f 2299 2294 2461 +f 2630 2641 2466 +f 2466 2461 2630 +f 2778 2785 2641 +f 2641 2630 2778 +f 2954 2963 2785 +f 2785 2778 2954 +f 3061 3068 2963 +f 2963 2954 3061 +f 3135 3140 3068 +f 3068 3061 3135 +f 3167 3176 3140 +f 3140 3135 3167 +f 3195 3203 3176 +f 3176 3167 3195 +f 3208 3213 3203 +f 3203 3195 3208 +f 2284 2294 1783 +f 1783 1781 2284 +f 2455 2461 2294 +f 2294 2284 2455 +f 2620 2630 2461 +f 2461 2455 2620 +f 2768 2778 2630 +f 2630 2620 2768 +f 2928 2954 2778 +f 2778 2768 2928 +f 3051 3061 2954 +f 2954 2928 3051 +f 3125 3135 3061 +f 3061 3051 3125 +f 3159 3167 3135 +f 3135 3125 3159 +f 3181 3195 3167 +f 3167 3159 3181 +f 3191 3208 3195 +f 3195 3181 3191 +f 2266 2284 1781 +f 1781 1779 2266 +f 2449 2455 2284 +f 2284 2266 2449 +f 2598 2620 2455 +f 2455 2449 2598 +f 2740 2768 2620 +f 2620 2598 2740 +f 2892 2928 2768 +f 2768 2740 2892 +f 3033 3051 2928 +f 2928 2892 3033 +f 3087 3125 3051 +f 3051 3033 3087 +f 3145 3159 3125 +f 3125 3087 3145 +f 3161 3181 3159 +f 3159 3145 3161 +f 3169 3191 3181 +f 3181 3161 3169 +f 2252 2266 1779 +f 1779 1777 2252 +f 2435 2449 2266 +f 2266 2252 2435 +f 2581 2598 2449 +f 2449 2435 2581 +f 2718 2740 2598 +f 2598 2581 2718 +f 2854 2892 2740 +f 2740 2718 2854 +f 2999 3033 2892 +f 2892 2854 2999 +f 3071 3087 3033 +f 3033 2999 3071 +f 3123 3145 3087 +f 3087 3071 3123 +f 3147 3161 3145 +f 3145 3123 3147 +f 3153 3169 3161 +f 3161 3147 3153 +f 2240 2252 1777 +f 1777 1775 2240 +f 2425 2435 2252 +f 2252 2240 2425 +f 2555 2581 2435 +f 2435 2425 2555 +f 2694 2718 2581 +f 2581 2555 2694 +f 2826 2854 2718 +f 2718 2694 2826 +f 2958 2999 2854 +f 2854 2826 2958 +f 3043 3071 2999 +f 2999 2958 3043 +f 3083 3123 3071 +f 3071 3043 3083 +f 3121 3147 3123 +f 3123 3083 3121 +f 3127 3153 3147 +f 3147 3121 3127 +f 2229 2240 1775 +f 1775 1772 2229 +f 2417 2425 2240 +f 2240 2229 2417 +f 2546 2555 2425 +f 2425 2417 2546 +f 2676 2694 2555 +f 2555 2546 2676 +f 2790 2826 2694 +f 2694 2676 2790 +f 2900 2958 2826 +f 2826 2790 2900 +f 3013 3043 2958 +f 2958 2900 3013 +f 3057 3083 3043 +f 3043 3013 3057 +f 3081 3121 3083 +f 3083 3057 3081 +f 3085 3127 3121 +f 3121 3081 3085 +f 2216 2229 1772 +f 1772 1769 2216 +f 2407 2417 2229 +f 2229 2216 2407 +f 2533 2546 2417 +f 2417 2407 2533 +f 2651 2676 2546 +f 2546 2533 2651 +f 2753 2790 2676 +f 2676 2651 2753 +f 2859 2900 2790 +f 2790 2753 2859 +f 2977 3013 2900 +f 2900 2859 2977 +f 3029 3057 3013 +f 3013 2977 3029 +f 3052 3081 3057 +f 3057 3029 3052 +f 3063 3085 3081 +f 3081 3052 3063 +f 2203 2216 1769 +f 1769 1767 2203 +f 2397 2407 2216 +f 2216 2203 2397 +f 2527 2533 2407 +f 2407 2397 2527 +f 2633 2651 2533 +f 2533 2527 2633 +f 2727 2753 2651 +f 2651 2633 2727 +f 2831 2859 2753 +f 2753 2727 2831 +f 2919 2977 2859 +f 2859 2831 2919 +f 2996 3029 2977 +f 2977 2919 2996 +f 3034 3052 3029 +f 3029 2996 3034 +f 3038 3063 3052 +f 3052 3034 3038 +f 2197 2203 1767 +f 1767 1763 2197 +f 2393 2397 2203 +f 2203 2197 2393 +f 2522 2527 2397 +f 2397 2393 2522 +f 2617 2633 2527 +f 2527 2522 2617 +f 2716 2727 2633 +f 2633 2617 2716 +f 2811 2831 2727 +f 2727 2716 2811 +f 2895 2919 2831 +f 2831 2811 2895 +f 2979 2996 2919 +f 2919 2895 2979 +f 3016 3034 2996 +f 2996 2979 3016 +f 3026 3038 3034 +f 3034 3016 3026 +f 2193 2197 1763 +f 1763 1761 2193 +f 2389 2393 2197 +f 2197 2193 2389 +f 2516 2522 2393 +f 2393 2389 2516 +f 2610 2617 2522 +f 2522 2516 2610 +f 2710 2716 2617 +f 2617 2610 2710 +f 2803 2811 2716 +f 2716 2710 2803 +f 2885 2895 2811 +f 2811 2803 2885 +f 2971 2979 2895 +f 2895 2885 2971 +f 3005 3016 2979 +f 2979 2971 3005 +f 3022 3026 3016 +f 3016 3005 3022 +f 461 545 544 +f 544 456 461 +f 463 551 545 +f 545 461 463 +f 465 557 551 +f 551 463 465 +f 469 567 557 +f 557 465 469 +f 471 575 567 +f 567 469 471 +f 473 577 575 +f 575 471 473 +f 475 589 577 +f 577 473 475 +f 477 593 589 +f 589 475 477 +f 479 595 593 +f 593 477 479 +f 481 599 595 +f 595 479 481 +f 389 461 456 +f 456 392 389 +f 386 463 461 +f 461 389 386 +f 379 465 463 +f 463 386 379 +f 373 469 465 +f 465 379 373 +f 371 471 469 +f 469 373 371 +f 369 473 471 +f 471 371 369 +f 366 475 473 +f 473 369 366 +f 364 477 475 +f 475 366 364 +f 362 479 477 +f 477 364 362 +f 361 481 479 +f 479 362 361 +f 335 389 392 +f 392 337 335 +f 333 386 389 +f 389 335 333 +f 331 379 386 +f 386 333 331 +f 329 373 379 +f 379 331 329 +f 328 371 373 +f 373 329 328 +f 325 369 371 +f 371 328 325 +f 323 366 369 +f 369 325 323 +f 321 364 366 +f 366 323 321 +f 319 362 364 +f 364 321 319 +f 316 361 362 +f 362 319 316 +f 298 335 337 +f 337 302 298 +f 290 333 335 +f 335 298 290 +f 288 331 333 +f 333 290 288 +f 286 329 331 +f 331 288 286 +f 281 328 329 +f 329 286 281 +f 275 325 328 +f 328 281 275 +f 265 323 325 +f 325 275 265 +f 259 321 323 +f 323 265 259 +f 255 319 321 +f 321 259 255 +f 249 316 319 +f 319 255 249 +f 269 298 302 +f 302 271 269 +f 261 290 298 +f 298 269 261 +f 251 288 290 +f 290 261 251 +f 238 286 288 +f 288 251 238 +f 230 281 286 +f 286 238 230 +f 218 275 281 +f 281 230 218 +f 208 265 275 +f 275 218 208 +f 196 259 265 +f 265 208 196 +f 186 255 259 +f 259 196 186 +f 181 249 255 +f 255 186 181 +f 228 269 271 +f 271 234 228 +f 222 261 269 +f 269 228 222 +f 212 251 261 +f 261 222 212 +f 200 238 251 +f 251 212 200 +f 177 230 238 +f 238 200 177 +f 160 218 230 +f 230 177 160 +f 134 208 218 +f 218 160 134 +f 112 196 208 +f 208 134 112 +f 102 186 196 +f 196 112 102 +f 96 181 186 +f 186 102 96 +f 198 228 234 +f 234 205 198 +f 182 222 228 +f 228 198 182 +f 168 212 222 +f 222 182 168 +f 146 200 212 +f 212 168 146 +f 118 177 200 +f 200 146 118 +f 92 160 177 +f 177 118 92 +f 74 134 160 +f 160 92 74 +f 63 112 134 +f 134 74 63 +f 53 102 112 +f 112 63 53 +f 50 96 102 +f 102 53 50 +f 167 198 205 +f 205 170 167 +f 154 182 198 +f 198 167 154 +f 126 168 182 +f 182 154 126 +f 100 146 168 +f 168 126 100 +f 83 118 146 +f 146 100 83 +f 61 92 118 +f 118 83 61 +f 46 74 92 +f 92 61 46 +f 32 63 74 +f 74 46 32 +f 25 53 63 +f 63 32 25 +f 21 50 53 +f 53 25 21 +f 143 167 170 +f 170 150 143 +f 124 154 167 +f 167 143 124 +f 104 126 154 +f 154 124 104 +f 84 100 126 +f 126 104 84 +f 65 83 100 +f 100 84 65 +f 44 61 83 +f 83 65 44 +f 30 46 61 +f 61 44 30 +f 17 32 46 +f 46 30 17 +f 9 25 32 +f 32 17 9 +f 5 21 25 +f 25 9 5 +f 132 143 150 +f 150 140 132 +f 116 124 143 +f 143 132 116 +f 94 104 124 +f 124 116 94 +f 76 84 104 +f 104 94 76 +f 55 65 84 +f 84 76 55 +f 40 44 65 +f 65 55 40 +f 22 30 44 +f 44 40 22 +f 11 17 30 +f 30 22 11 +f 2 9 17 +f 17 11 2 +f 1 5 9 +f 9 2 1 +f 480 596 599 +f 599 481 480 +f 478 594 596 +f 596 480 478 +f 476 590 594 +f 594 478 476 +f 474 578 590 +f 590 476 474 +f 472 576 578 +f 578 474 472 +f 470 568 576 +f 576 472 470 +f 466 558 568 +f 568 470 466 +f 464 552 558 +f 558 466 464 +f 462 546 552 +f 552 464 462 +f 456 544 546 +f 546 462 456 +f 363 480 481 +f 481 360 363 +f 365 478 480 +f 480 363 365 +f 367 476 478 +f 478 365 367 +f 368 474 476 +f 476 367 368 +f 370 472 474 +f 474 368 370 +f 372 470 472 +f 472 370 372 +f 380 466 470 +f 470 372 380 +f 385 464 466 +f 466 380 385 +f 390 462 464 +f 464 385 390 +f 391 456 462 +f 462 390 391 +f 320 363 360 +f 360 316 320 +f 322 365 363 +f 363 320 322 +f 324 367 365 +f 365 322 324 +f 326 368 367 +f 367 324 326 +f 327 370 368 +f 368 326 327 +f 330 372 370 +f 370 327 330 +f 332 380 372 +f 372 330 332 +f 334 385 380 +f 380 332 334 +f 336 390 385 +f 385 334 336 +f 337 391 390 +f 390 336 337 +f 256 320 316 +f 316 250 256 +f 260 322 320 +f 320 256 260 +f 266 324 322 +f 322 260 266 +f 276 326 324 +f 324 266 276 +f 282 327 326 +f 326 276 282 +f 287 330 327 +f 327 282 287 +f 289 332 330 +f 330 287 289 +f 291 334 332 +f 332 289 291 +f 299 336 334 +f 334 291 299 +f 303 337 336 +f 336 299 303 +f 187 256 250 +f 250 181 187 +f 197 260 256 +f 256 187 197 +f 209 266 260 +f 260 197 209 +f 219 276 266 +f 266 209 219 +f 231 282 276 +f 276 219 231 +f 239 287 282 +f 282 231 239 +f 252 289 287 +f 287 239 252 +f 262 291 289 +f 289 252 262 +f 270 299 291 +f 291 262 270 +f 272 303 299 +f 299 270 272 +f 103 187 181 +f 181 97 103 +f 113 197 187 +f 187 103 113 +f 135 209 197 +f 197 113 135 +f 161 219 209 +f 209 135 161 +f 178 231 219 +f 219 161 178 +f 201 239 231 +f 231 178 201 +f 213 252 239 +f 239 201 213 +f 223 262 252 +f 252 213 223 +f 229 270 262 +f 262 223 229 +f 235 272 270 +f 270 229 235 +f 54 103 97 +f 97 50 54 +f 64 113 103 +f 103 54 64 +f 75 135 113 +f 113 64 75 +f 93 161 135 +f 135 75 93 +f 119 178 161 +f 161 93 119 +f 147 201 178 +f 178 119 147 +f 169 213 201 +f 201 147 169 +f 183 223 213 +f 213 169 183 +f 199 229 223 +f 223 183 199 +f 205 235 229 +f 229 199 205 +f 24 54 50 +f 50 21 24 +f 33 64 54 +f 54 24 33 +f 47 75 64 +f 64 33 47 +f 62 93 75 +f 75 47 62 +f 82 119 93 +f 93 62 82 +f 101 147 119 +f 119 82 101 +f 127 169 147 +f 147 101 127 +f 155 183 169 +f 169 127 155 +f 166 199 183 +f 183 155 166 +f 171 205 199 +f 199 166 171 +f 10 24 21 +f 21 6 10 +f 18 33 24 +f 24 10 18 +f 31 47 33 +f 33 18 31 +f 45 62 47 +f 47 31 45 +f 66 82 62 +f 62 45 66 +f 85 101 82 +f 82 66 85 +f 105 127 101 +f 101 85 105 +f 125 155 127 +f 127 105 125 +f 144 166 155 +f 155 125 144 +f 151 171 166 +f 166 144 151 +f 3 10 6 +f 6 1 3 +f 12 18 10 +f 10 3 12 +f 23 31 18 +f 18 12 23 +f 41 45 31 +f 31 23 41 +f 56 66 45 +f 45 41 56 +f 77 85 66 +f 66 56 77 +f 95 105 85 +f 85 77 95 +f 117 125 105 +f 105 95 117 +f 133 144 125 +f 125 117 133 +f 140 151 144 +f 144 133 140 +f 138 132 140 +f 140 145 138 +f 122 116 132 +f 132 138 122 +f 98 94 116 +f 116 122 98 +f 80 76 94 +f 94 98 80 +f 60 55 76 +f 76 80 60 +f 42 40 55 +f 55 60 42 +f 28 22 40 +f 40 42 28 +f 13 11 22 +f 22 28 13 +f 7 2 11 +f 11 13 7 +f 4 1 2 +f 2 7 4 +f 152 138 145 +f 145 158 152 +f 136 122 138 +f 138 152 136 +f 108 98 122 +f 122 136 108 +f 89 80 98 +f 98 108 89 +f 70 60 80 +f 80 89 70 +f 52 42 60 +f 60 70 52 +f 38 28 42 +f 42 52 38 +f 26 13 28 +f 28 38 26 +f 19 7 13 +f 13 26 19 +f 15 4 7 +f 7 19 15 +f 173 152 158 +f 158 176 173 +f 162 136 152 +f 152 173 162 +f 142 108 136 +f 136 162 142 +f 111 89 108 +f 108 142 111 +f 91 70 89 +f 89 111 91 +f 73 52 70 +f 70 91 73 +f 58 38 52 +f 52 73 58 +f 48 26 38 +f 38 58 48 +f 37 19 26 +f 26 48 37 +f 35 15 19 +f 19 37 35 +f 194 173 176 +f 176 202 194 +f 184 162 173 +f 173 194 184 +f 174 142 162 +f 162 184 174 +f 156 111 142 +f 142 174 156 +f 128 91 111 +f 111 156 128 +f 106 73 91 +f 91 128 106 +f 86 58 73 +f 73 106 86 +f 78 48 58 +f 58 86 78 +f 68 37 48 +f 48 78 68 +f 67 35 37 +f 37 68 67 +f 221 194 202 +f 202 225 221 +f 216 184 194 +f 194 221 216 +f 206 174 184 +f 184 216 206 +f 192 156 174 +f 174 206 192 +f 180 128 156 +f 156 192 180 +f 164 106 128 +f 128 180 164 +f 148 86 106 +f 106 164 148 +f 130 78 86 +f 86 148 130 +f 121 68 78 +f 78 130 121 +f 115 67 68 +f 68 121 115 +f 244 221 225 +f 225 247 244 +f 240 216 221 +f 221 244 240 +f 236 206 216 +f 216 240 236 +f 233 192 206 +f 206 236 233 +f 227 180 192 +f 192 233 227 +f 215 164 180 +f 180 227 215 +f 210 148 164 +f 164 215 210 +f 203 130 148 +f 148 210 203 +f 191 121 130 +f 130 203 191 +f 188 115 121 +f 121 191 188 +f 284 244 247 +f 247 285 284 +f 279 240 244 +f 244 284 279 +f 277 236 240 +f 240 279 277 +f 273 233 236 +f 236 277 273 +f 267 227 233 +f 233 273 267 +f 263 215 227 +f 227 267 263 +f 258 210 215 +f 215 263 258 +f 253 203 210 +f 210 258 253 +f 245 191 203 +f 203 253 245 +f 242 188 191 +f 191 245 242 +f 315 284 285 +f 285 318 315 +f 312 279 284 +f 284 315 312 +f 311 277 279 +f 279 312 311 +f 309 273 277 +f 277 311 309 +f 307 267 273 +f 273 309 307 +f 305 263 267 +f 267 307 305 +f 301 258 263 +f 263 305 301 +f 297 253 258 +f 258 301 297 +f 295 245 253 +f 253 297 295 +f 293 242 245 +f 245 295 293 +f 341 315 318 +f 318 339 341 +f 343 312 315 +f 315 341 343 +f 345 311 312 +f 312 343 345 +f 347 309 311 +f 311 345 347 +f 349 307 309 +f 309 347 349 +f 351 305 307 +f 307 349 351 +f 353 301 305 +f 305 351 353 +f 355 297 301 +f 301 353 355 +f 357 295 297 +f 297 355 357 +f 359 293 295 +f 295 357 359 +f 378 341 339 +f 339 376 378 +f 384 343 341 +f 341 378 384 +f 394 345 343 +f 343 384 394 +f 403 347 345 +f 345 394 403 +f 406 349 347 +f 347 403 406 +f 415 351 349 +f 349 406 415 +f 419 353 351 +f 351 415 419 +f 423 355 353 +f 353 419 423 +f 425 357 355 +f 355 423 425 +f 427 359 357 +f 357 425 427 +f 8 3 1 +f 1 4 8 +f 14 12 3 +f 3 8 14 +f 29 23 12 +f 12 14 29 +f 43 41 23 +f 23 29 43 +f 59 56 41 +f 41 43 59 +f 81 77 56 +f 56 59 81 +f 99 95 77 +f 77 81 99 +f 123 117 95 +f 95 99 123 +f 139 133 117 +f 117 123 139 +f 145 140 133 +f 133 139 145 +f 20 8 4 +f 4 16 20 +f 27 14 8 +f 8 20 27 +f 39 29 14 +f 14 27 39 +f 51 43 29 +f 29 39 51 +f 71 59 43 +f 43 51 71 +f 88 81 59 +f 59 71 88 +f 109 99 81 +f 81 88 109 +f 137 123 99 +f 99 109 137 +f 153 139 123 +f 123 137 153 +f 159 145 139 +f 139 153 159 +f 36 20 16 +f 16 34 36 +f 49 27 20 +f 20 36 49 +f 57 39 27 +f 27 49 57 +f 72 51 39 +f 39 57 72 +f 90 71 51 +f 51 72 90 +f 110 88 71 +f 71 90 110 +f 141 109 88 +f 88 110 141 +f 163 137 109 +f 109 141 163 +f 172 153 137 +f 137 163 172 +f 176 159 153 +f 153 172 176 +f 69 36 34 +f 34 67 69 +f 79 49 36 +f 36 69 79 +f 87 57 49 +f 49 79 87 +f 107 72 57 +f 57 87 107 +f 129 90 72 +f 72 107 129 +f 157 110 90 +f 90 129 157 +f 175 141 110 +f 110 157 175 +f 185 163 141 +f 141 175 185 +f 195 172 163 +f 163 185 195 +f 202 176 172 +f 172 195 202 +f 120 69 67 +f 67 114 120 +f 131 79 69 +f 69 120 131 +f 149 87 79 +f 79 131 149 +f 165 107 87 +f 87 149 165 +f 179 129 107 +f 107 165 179 +f 193 157 129 +f 129 179 193 +f 207 175 157 +f 157 193 207 +f 217 185 175 +f 175 207 217 +f 220 195 185 +f 185 217 220 +f 224 202 195 +f 195 220 224 +f 190 120 114 +f 114 189 190 +f 204 131 120 +f 120 190 204 +f 211 149 131 +f 131 204 211 +f 214 165 149 +f 149 211 214 +f 226 179 165 +f 165 214 226 +f 232 193 179 +f 179 226 232 +f 237 207 193 +f 193 232 237 +f 241 217 207 +f 207 237 241 +f 243 220 217 +f 217 241 243 +f 248 224 220 +f 220 243 248 +f 246 190 189 +f 189 242 246 +f 254 204 190 +f 190 246 254 +f 257 211 204 +f 204 254 257 +f 264 214 211 +f 211 257 264 +f 268 226 214 +f 214 264 268 +f 274 232 226 +f 226 268 274 +f 278 237 232 +f 232 274 278 +f 280 241 237 +f 237 278 280 +f 283 243 241 +f 241 280 283 +f 285 248 243 +f 243 283 285 +f 294 246 242 +f 242 292 294 +f 296 254 246 +f 246 294 296 +f 300 257 254 +f 254 296 300 +f 304 264 257 +f 257 300 304 +f 306 268 264 +f 264 304 306 +f 308 274 268 +f 268 306 308 +f 310 278 274 +f 274 308 310 +f 313 280 278 +f 278 310 313 +f 314 283 280 +f 280 313 314 +f 317 285 283 +f 283 314 317 +f 356 294 292 +f 292 358 356 +f 354 296 294 +f 294 356 354 +f 352 300 296 +f 296 354 352 +f 350 304 300 +f 300 352 350 +f 348 306 304 +f 304 350 348 +f 346 308 306 +f 306 348 346 +f 344 310 308 +f 308 346 344 +f 342 313 310 +f 310 344 342 +f 340 314 313 +f 313 342 340 +f 338 317 314 +f 314 340 338 +f 424 356 358 +f 358 426 424 +f 422 354 356 +f 356 424 422 +f 418 352 354 +f 354 422 418 +f 414 350 352 +f 352 418 414 +f 407 348 350 +f 350 414 407 +f 402 346 348 +f 348 407 402 +f 393 344 346 +f 346 402 393 +f 383 342 344 +f 344 393 383 +f 377 340 342 +f 342 383 377 +f 375 338 340 +f 340 377 375 +f 3186 3113 3115 +f 3115 3182 3186 +f 3192 3110 3113 +f 3113 3186 3192 +f 3196 3109 3110 +f 3110 3192 3196 +f 3205 3106 3109 +f 3109 3196 3205 +f 3211 3104 3106 +f 3106 3205 3211 +f 3215 3102 3104 +f 3104 3211 3215 +f 3217 3101 3102 +f 3102 3215 3217 +f 3220 3098 3101 +f 3101 3217 3220 +f 3222 3097 3098 +f 3098 3220 3222 +f 3223 3095 3097 +f 3097 3222 3223 +f 3227 3186 3182 +f 3182 3225 3227 +f 3229 3192 3186 +f 3186 3227 3229 +f 3231 3196 3192 +f 3192 3229 3231 +f 3233 3205 3196 +f 3196 3231 3233 +f 3235 3211 3205 +f 3205 3233 3235 +f 3241 3215 3211 +f 3211 3235 3241 +f 3245 3217 3215 +f 3215 3241 3245 +f 3249 3220 3217 +f 3217 3245 3249 +f 3251 3222 3220 +f 3220 3249 3251 +f 3253 3223 3222 +f 3222 3251 3253 +f 3239 3227 3225 +f 3225 3237 3239 +f 3243 3229 3227 +f 3227 3239 3243 +f 3247 3231 3229 +f 3229 3243 3247 +f 3257 3233 3231 +f 3231 3247 3257 +f 3263 3235 3233 +f 3233 3257 3263 +f 3271 3241 3235 +f 3235 3263 3271 +f 3279 3245 3241 +f 3241 3271 3279 +f 3285 3249 3245 +f 3245 3279 3285 +f 3293 3251 3249 +f 3249 3285 3293 +f 3297 3253 3251 +f 3251 3293 3297 +f 3259 3239 3237 +f 3237 3255 3259 +f 3261 3243 3239 +f 3239 3259 3261 +f 3265 3247 3243 +f 3243 3261 3265 +f 3275 3257 3247 +f 3247 3265 3275 +f 3287 3263 3257 +f 3257 3275 3287 +f 3303 3271 3263 +f 3263 3287 3303 +f 3314 3279 3271 +f 3271 3303 3314 +f 3320 3285 3279 +f 3279 3314 3320 +f 3330 3293 3285 +f 3285 3320 3330 +f 3332 3297 3293 +f 3293 3330 3332 +f 3270 3259 3255 +f 3255 3268 3270 +f 3273 3261 3259 +f 3259 3270 3273 +f 3283 3265 3261 +f 3261 3273 3283 +f 3299 3275 3265 +f 3265 3283 3299 +f 3308 3287 3275 +f 3275 3299 3308 +f 3322 3303 3287 +f 3287 3308 3322 +f 3338 3314 3303 +f 3303 3322 3338 +f 3346 3320 3314 +f 3314 3338 3346 +f 3351 3330 3320 +f 3320 3346 3351 +f 3355 3332 3330 +f 3330 3351 3355 +f 3282 3270 3268 +f 3268 3278 3282 +f 3290 3273 3270 +f 3270 3282 3290 +f 3302 3283 3273 +f 3273 3290 3302 +f 3312 3299 3283 +f 3283 3302 3312 +f 3324 3308 3299 +f 3299 3312 3324 +f 3340 3322 3308 +f 3308 3324 3340 +f 3353 3338 3322 +f 3322 3340 3353 +f 3368 3346 3338 +f 3338 3353 3368 +f 3373 3351 3346 +f 3346 3368 3373 +f 3379 3355 3351 +f 3351 3373 3379 +f 3295 3282 3278 +f 3278 3292 3295 +f 3306 3290 3282 +f 3282 3295 3306 +f 3316 3302 3290 +f 3290 3306 3316 +f 3326 3312 3302 +f 3302 3316 3326 +f 3345 3324 3312 +f 3312 3326 3345 +f 3359 3340 3324 +f 3324 3345 3359 +f 3376 3353 3340 +f 3340 3359 3376 +f 3394 3368 3353 +f 3353 3376 3394 +f 3404 3373 3368 +f 3368 3394 3404 +f 3406 3379 3373 +f 3373 3404 3406 +f 3310 3295 3292 +f 3292 3307 3310 +f 3318 3306 3295 +f 3295 3310 3318 +f 3336 3316 3306 +f 3306 3318 3336 +f 3348 3326 3316 +f 3316 3336 3348 +f 3369 3345 3326 +f 3326 3348 3369 +f 3389 3359 3345 +f 3345 3369 3389 +f 3425 3376 3359 +f 3359 3389 3425 +f 3449 3394 3376 +f 3376 3425 3449 +f 3468 3404 3394 +f 3394 3449 3468 +f 3472 3406 3404 +f 3404 3468 3472 +f 3335 3310 3307 +f 3307 3329 3335 +f 3343 3318 3310 +f 3310 3335 3343 +f 3362 3336 3318 +f 3318 3343 3362 +f 3386 3348 3336 +f 3336 3362 3386 +f 3422 3369 3348 +f 3348 3386 3422 +f 3464 3389 3369 +f 3369 3422 3464 +f 3490 3425 3389 +f 3389 3464 3490 +f 3505 3449 3425 +f 3425 3490 3505 +f 3521 3468 3449 +f 3449 3505 3521 +f 3523 3472 3468 +f 3468 3521 3523 +f 3364 3335 3329 +f 3329 3357 3364 +f 3382 3343 3335 +f 3335 3364 3382 +f 3416 3362 3343 +f 3343 3382 3416 +f 3465 3386 3362 +f 3362 3416 3465 +f 3495 3422 3386 +f 3386 3465 3495 +f 3528 3464 3422 +f 3422 3495 3528 +f 3553 3490 3464 +f 3464 3528 3553 +f 3579 3505 3490 +f 3490 3553 3579 +f 3592 3521 3505 +f 3505 3579 3592 +f 3604 3523 3521 +f 3521 3592 3604 +f 3221 3096 3094 +f 3094 3224 3221 +f 3219 3099 3096 +f 3096 3221 3219 +f 3218 3100 3099 +f 3099 3219 3218 +f 3216 3103 3100 +f 3100 3218 3216 +f 3212 3105 3103 +f 3103 3216 3212 +f 3206 3107 3105 +f 3105 3212 3206 +f 3197 3108 3107 +f 3107 3206 3197 +f 3193 3111 3108 +f 3108 3197 3193 +f 3187 3112 3111 +f 3111 3193 3187 +f 3183 3114 3112 +f 3112 3187 3183 +f 3252 3221 3224 +f 3224 3254 3252 +f 3250 3219 3221 +f 3221 3252 3250 +f 3246 3218 3219 +f 3219 3250 3246 +f 3242 3216 3218 +f 3218 3246 3242 +f 3236 3212 3216 +f 3216 3242 3236 +f 3234 3206 3212 +f 3212 3236 3234 +f 3232 3197 3206 +f 3206 3234 3232 +f 3230 3193 3197 +f 3197 3232 3230 +f 3228 3187 3193 +f 3193 3230 3228 +f 3226 3183 3187 +f 3187 3228 3226 +f 3294 3252 3254 +f 3254 3298 3294 +f 3286 3250 3252 +f 3252 3294 3286 +f 3280 3246 3250 +f 3250 3286 3280 +f 3272 3242 3246 +f 3246 3280 3272 +f 3264 3236 3242 +f 3242 3272 3264 +f 3258 3234 3236 +f 3236 3264 3258 +f 3248 3232 3234 +f 3234 3258 3248 +f 3244 3230 3232 +f 3232 3248 3244 +f 3240 3228 3230 +f 3230 3244 3240 +f 3238 3226 3228 +f 3228 3240 3238 +f 3331 3294 3298 +f 3298 3333 3331 +f 3321 3286 3294 +f 3294 3331 3321 +f 3315 3280 3286 +f 3286 3321 3315 +f 3304 3272 3280 +f 3280 3315 3304 +f 3288 3264 3272 +f 3272 3304 3288 +f 3276 3258 3264 +f 3264 3288 3276 +f 3266 3248 3258 +f 3258 3276 3266 +f 3262 3244 3248 +f 3248 3266 3262 +f 3260 3240 3244 +f 3244 3262 3260 +f 3256 3238 3240 +f 3240 3260 3256 +f 3350 3331 3333 +f 3333 3354 3350 +f 3347 3321 3331 +f 3331 3350 3347 +f 3339 3315 3321 +f 3321 3347 3339 +f 3323 3304 3315 +f 3315 3339 3323 +f 3309 3288 3304 +f 3304 3323 3309 +f 3300 3276 3288 +f 3288 3309 3300 +f 3284 3266 3276 +f 3276 3300 3284 +f 3274 3262 3266 +f 3266 3284 3274 +f 3269 3260 3262 +f 3262 3274 3269 +f 3267 3256 3260 +f 3260 3269 3267 +f 3372 3350 3354 +f 3354 3378 3372 +f 3367 3347 3350 +f 3350 3372 3367 +f 3352 3339 3347 +f 3347 3367 3352 +f 3341 3323 3339 +f 3339 3352 3341 +f 3325 3309 3323 +f 3323 3341 3325 +f 3313 3300 3309 +f 3309 3325 3313 +f 3301 3284 3300 +f 3300 3313 3301 +f 3289 3274 3284 +f 3284 3301 3289 +f 3281 3269 3274 +f 3274 3289 3281 +f 3277 3267 3269 +f 3269 3281 3277 +f 3403 3372 3378 +f 3378 3405 3403 +f 3393 3367 3372 +f 3372 3403 3393 +f 3377 3352 3367 +f 3367 3393 3377 +f 3360 3341 3352 +f 3352 3377 3360 +f 3344 3325 3341 +f 3341 3360 3344 +f 3327 3313 3325 +f 3325 3344 3327 +f 3317 3301 3313 +f 3313 3327 3317 +f 3305 3289 3301 +f 3301 3317 3305 +f 3296 3281 3289 +f 3289 3305 3296 +f 3291 3277 3281 +f 3281 3296 3291 +f 3469 3403 3405 +f 3405 3472 3469 +f 3450 3393 3403 +f 3403 3469 3450 +f 3426 3377 3393 +f 3393 3450 3426 +f 3390 3360 3377 +f 3377 3426 3390 +f 3370 3344 3360 +f 3360 3390 3370 +f 3349 3327 3344 +f 3344 3370 3349 +f 3337 3317 3327 +f 3327 3349 3337 +f 3319 3305 3317 +f 3317 3337 3319 +f 3311 3296 3305 +f 3305 3319 3311 +f 3307 3291 3296 +f 3296 3311 3307 +f 3520 3469 3472 +f 3472 3522 3520 +f 3504 3450 3469 +f 3469 3520 3504 +f 3489 3426 3450 +f 3450 3504 3489 +f 3463 3390 3426 +f 3426 3489 3463 +f 3421 3370 3390 +f 3390 3463 3421 +f 3385 3349 3370 +f 3370 3421 3385 +f 3361 3337 3349 +f 3349 3385 3361 +f 3342 3319 3337 +f 3337 3361 3342 +f 3334 3311 3319 +f 3319 3342 3334 +f 3328 3307 3311 +f 3311 3334 3328 +f 3591 3520 3522 +f 3522 3603 3591 +f 3578 3504 3520 +f 3520 3591 3578 +f 3552 3489 3504 +f 3504 3578 3552 +f 3530 3463 3489 +f 3489 3552 3530 +f 3499 3421 3463 +f 3463 3530 3499 +f 3467 3385 3421 +f 3421 3499 3467 +f 3415 3361 3385 +f 3385 3467 3415 +f 3381 3342 3361 +f 3361 3415 3381 +f 3363 3334 3342 +f 3342 3381 3363 +f 3356 3328 3334 +f 3334 3363 3356 +f 3374 3365 3358 +f 3358 3371 3374 +f 3395 3383 3365 +f 3365 3374 3395 +f 3443 3417 3383 +f 3383 3395 3443 +f 3481 3466 3417 +f 3417 3443 3481 +f 3514 3496 3466 +f 3466 3481 3514 +f 3545 3529 3496 +f 3496 3514 3545 +f 3573 3551 3529 +f 3529 3545 3573 +f 3597 3577 3551 +f 3551 3573 3597 +f 3613 3590 3577 +f 3577 3597 3613 +f 3619 3603 3590 +f 3590 3613 3619 +f 3387 3374 3371 +f 3371 3380 3387 +f 3413 3395 3374 +f 3374 3387 3413 +f 3461 3443 3395 +f 3395 3413 3461 +f 3493 3481 3443 +f 3443 3461 3493 +f 3524 3514 3481 +f 3481 3493 3524 +f 3556 3545 3514 +f 3514 3524 3556 +f 3584 3573 3545 +f 3545 3556 3584 +f 3611 3597 3573 +f 3573 3584 3611 +f 3628 3613 3597 +f 3597 3611 3628 +f 3632 3619 3613 +f 3613 3628 3632 +f 3398 3387 3380 +f 3380 3391 3398 +f 3435 3413 3387 +f 3387 3398 3435 +f 3473 3461 3413 +f 3413 3435 3473 +f 3500 3493 3461 +f 3461 3473 3500 +f 3531 3524 3493 +f 3493 3500 3531 +f 3562 3556 3524 +f 3524 3531 3562 +f 3595 3584 3556 +f 3556 3562 3595 +f 3617 3611 3584 +f 3584 3595 3617 +f 3633 3628 3611 +f 3611 3617 3633 +f 3641 3632 3628 +f 3628 3633 3641 +f 3409 3398 3391 +f 3391 3400 3409 +f 3447 3435 3398 +f 3398 3409 3447 +f 3477 3473 3435 +f 3435 3447 3477 +f 3506 3500 3473 +f 3473 3477 3506 +f 3540 3531 3500 +f 3500 3506 3540 +f 3567 3562 3531 +f 3531 3540 3567 +f 3601 3595 3562 +f 3562 3567 3601 +f 3624 3617 3595 +f 3595 3601 3624 +f 3639 3633 3617 +f 3617 3624 3639 +f 3644 3641 3633 +f 3633 3639 3644 +f 3433 3409 3400 +f 3400 3411 3433 +f 3453 3447 3409 +f 3409 3433 3453 +f 3483 3477 3447 +f 3447 3453 3483 +f 3510 3506 3477 +f 3477 3483 3510 +f 3543 3540 3506 +f 3506 3510 3543 +f 3569 3567 3540 +f 3540 3543 3569 +f 3599 3601 3567 +f 3567 3569 3599 +f 3622 3624 3601 +f 3601 3599 3622 +f 3637 3639 3624 +f 3624 3622 3637 +f 3642 3644 3639 +f 3639 3637 3642 +f 3439 3433 3411 +f 3411 3424 3439 +f 3458 3453 3433 +f 3433 3439 3458 +f 3487 3483 3453 +f 3453 3458 3487 +f 3513 3510 3483 +f 3483 3487 3513 +f 3542 3543 3510 +f 3510 3513 3542 +f 3566 3569 3543 +f 3543 3542 3566 +f 3593 3599 3569 +f 3569 3566 3593 +f 3616 3622 3599 +f 3599 3593 3616 +f 3630 3637 3622 +f 3622 3616 3630 +f 3636 3642 3637 +f 3637 3630 3636 +f 3441 3439 3424 +f 3424 3429 3441 +f 3459 3458 3439 +f 3439 3441 3459 +f 3485 3487 3458 +f 3458 3459 3485 +f 3508 3513 3487 +f 3487 3485 3508 +f 3533 3542 3513 +f 3513 3508 3533 +f 3558 3566 3542 +f 3542 3533 3558 +f 3582 3593 3566 +f 3566 3558 3582 +f 3607 3616 3593 +f 3593 3582 3607 +f 3620 3630 3616 +f 3616 3607 3620 +f 3626 3636 3630 +f 3630 3620 3626 +f 3437 3441 3429 +f 3429 3427 3437 +f 3455 3459 3441 +f 3441 3437 3455 +f 3479 3485 3459 +f 3459 3455 3479 +f 3502 3508 3485 +f 3485 3479 3502 +f 3526 3533 3508 +f 3508 3502 3526 +f 3547 3558 3533 +f 3533 3526 3547 +f 3571 3582 3558 +f 3558 3547 3571 +f 3588 3607 3582 +f 3582 3571 3588 +f 3605 3620 3607 +f 3607 3588 3605 +f 3609 3626 3620 +f 3620 3605 3609 +f 3419 3437 3427 +f 3427 3408 3419 +f 3445 3455 3437 +f 3437 3419 3445 +f 3470 3479 3455 +f 3455 3445 3470 +f 3492 3502 3479 +f 3479 3470 3492 +f 3517 3526 3502 +f 3502 3492 3517 +f 3536 3547 3526 +f 3526 3517 3536 +f 3554 3571 3547 +f 3547 3536 3554 +f 3575 3588 3571 +f 3571 3554 3575 +f 3580 3605 3588 +f 3588 3575 3580 +f 3587 3609 3605 +f 3605 3580 3587 +f 3401 3419 3408 +f 3408 3397 3401 +f 3431 3445 3419 +f 3419 3401 3431 +f 3451 3470 3445 +f 3445 3431 3451 +f 3475 3492 3470 +f 3470 3451 3475 +f 3497 3517 3492 +f 3492 3475 3497 +f 3518 3536 3517 +f 3517 3497 3518 +f 3537 3554 3536 +f 3536 3518 3537 +f 3549 3575 3554 +f 3554 3537 3549 +f 3560 3580 3575 +f 3575 3549 3560 +f 3564 3587 3580 +f 3580 3560 3564 +f 3614 3591 3603 +f 3603 3619 3614 +f 3598 3578 3591 +f 3591 3614 3598 +f 3574 3552 3578 +f 3578 3598 3574 +f 3546 3530 3552 +f 3552 3574 3546 +f 3515 3499 3530 +f 3530 3546 3515 +f 3482 3467 3499 +f 3499 3515 3482 +f 3444 3418 3467 +f 3467 3482 3444 +f 3396 3384 3418 +f 3418 3444 3396 +f 3375 3366 3384 +f 3384 3396 3375 +f 3371 3358 3366 +f 3366 3375 3371 +f 3629 3614 3619 +f 3619 3632 3629 +f 3612 3598 3614 +f 3614 3629 3612 +f 3585 3574 3598 +f 3598 3612 3585 +f 3557 3546 3574 +f 3574 3585 3557 +f 3525 3515 3546 +f 3546 3557 3525 +f 3494 3482 3515 +f 3515 3525 3494 +f 3462 3444 3482 +f 3482 3494 3462 +f 3414 3396 3444 +f 3444 3462 3414 +f 3388 3375 3396 +f 3396 3414 3388 +f 3380 3371 3375 +f 3375 3388 3380 +f 3634 3629 3632 +f 3632 3641 3634 +f 3618 3612 3629 +f 3629 3634 3618 +f 3596 3585 3612 +f 3612 3618 3596 +f 3563 3557 3585 +f 3585 3596 3563 +f 3532 3525 3557 +f 3557 3563 3532 +f 3501 3494 3525 +f 3525 3532 3501 +f 3474 3462 3494 +f 3494 3501 3474 +f 3436 3414 3462 +f 3462 3474 3436 +f 3399 3388 3414 +f 3414 3436 3399 +f 3392 3380 3388 +f 3388 3399 3392 +f 3640 3634 3641 +f 3641 3644 3640 +f 3625 3618 3634 +f 3634 3640 3625 +f 3602 3596 3618 +f 3618 3625 3602 +f 3568 3563 3596 +f 3596 3602 3568 +f 3539 3532 3563 +f 3563 3568 3539 +f 3507 3501 3532 +f 3532 3539 3507 +f 3478 3474 3501 +f 3501 3507 3478 +f 3448 3436 3474 +f 3474 3478 3448 +f 3410 3399 3436 +f 3436 3448 3410 +f 3400 3392 3399 +f 3399 3410 3400 +f 3638 3640 3644 +f 3644 3643 3638 +f 3623 3625 3640 +f 3640 3638 3623 +f 3600 3602 3625 +f 3625 3623 3600 +f 3570 3568 3602 +f 3602 3600 3570 +f 3544 3539 3568 +f 3568 3570 3544 +f 3511 3507 3539 +f 3539 3544 3511 +f 3484 3478 3507 +f 3507 3511 3484 +f 3454 3448 3478 +f 3478 3484 3454 +f 3434 3410 3448 +f 3448 3454 3434 +f 3412 3400 3410 +f 3410 3434 3412 +f 3631 3638 3643 +f 3643 3635 3631 +f 3615 3623 3638 +f 3638 3631 3615 +f 3594 3600 3623 +f 3623 3615 3594 +f 3565 3570 3600 +f 3600 3594 3565 +f 3541 3544 3570 +f 3570 3565 3541 +f 3512 3511 3544 +f 3544 3541 3512 +f 3488 3484 3511 +f 3511 3512 3488 +f 3457 3454 3484 +f 3484 3488 3457 +f 3440 3434 3454 +f 3454 3457 3440 +f 3423 3412 3434 +f 3434 3440 3423 +f 3621 3631 3635 +f 3635 3627 3621 +f 3608 3615 3631 +f 3631 3621 3608 +f 3583 3594 3615 +f 3615 3608 3583 +f 3559 3565 3594 +f 3594 3583 3559 +f 3534 3541 3565 +f 3565 3559 3534 +f 3509 3512 3541 +f 3541 3534 3509 +f 3486 3488 3512 +f 3512 3509 3486 +f 3460 3457 3488 +f 3488 3486 3460 +f 3442 3440 3457 +f 3457 3460 3442 +f 3430 3423 3440 +f 3440 3442 3430 +f 3606 3621 3627 +f 3627 3610 3606 +f 3589 3608 3621 +f 3621 3606 3589 +f 3572 3583 3608 +f 3608 3589 3572 +f 3548 3559 3583 +f 3583 3572 3548 +f 3527 3534 3559 +f 3559 3548 3527 +f 3503 3509 3534 +f 3534 3527 3503 +f 3480 3486 3509 +f 3509 3503 3480 +f 3456 3460 3486 +f 3486 3480 3456 +f 3438 3442 3460 +f 3460 3456 3438 +f 3428 3430 3442 +f 3442 3438 3428 +f 3581 3606 3610 +f 3610 3586 3581 +f 3576 3589 3606 +f 3606 3581 3576 +f 3555 3572 3589 +f 3589 3576 3555 +f 3535 3548 3572 +f 3572 3555 3535 +f 3516 3527 3548 +f 3548 3535 3516 +f 3491 3503 3527 +f 3527 3516 3491 +f 3471 3480 3503 +f 3503 3491 3471 +f 3446 3456 3480 +f 3480 3471 3446 +f 3420 3438 3456 +f 3456 3446 3420 +f 3407 3428 3438 +f 3438 3420 3407 +f 3561 3581 3586 +f 3586 3564 3561 +f 3550 3576 3581 +f 3581 3561 3550 +f 3538 3555 3576 +f 3576 3550 3538 +f 3519 3535 3555 +f 3555 3538 3519 +f 3498 3516 3535 +f 3535 3519 3498 +f 3476 3491 3516 +f 3516 3498 3476 +f 3452 3471 3491 +f 3491 3476 3452 +f 3432 3446 3471 +f 3471 3452 3432 +f 3402 3420 3446 +f 3446 3432 3402 +f 3397 3407 3420 +f 3420 3402 3397 +f 1888 2110 2104 +f 1888 2104 2096 +f 1888 2096 2076 +f 1888 2076 2048 +f 1888 2048 2030 +f 1888 2030 2006 +f 1888 2006 1982 +f 1888 1982 1960 +f 1888 1960 1936 +f 1888 1936 1732 +f 2257 2104 2110 +f 2110 2261 2257 +f 2249 2096 2104 +f 2104 2257 2249 +f 2226 2076 2096 +f 2096 2249 2226 +f 2200 2048 2076 +f 2076 2226 2200 +f 2142 2030 2048 +f 2048 2200 2142 +f 2094 2006 2030 +f 2030 2142 2094 +f 2036 1982 2006 +f 2006 2094 2036 +f 1988 1960 1982 +f 1982 2036 1988 +f 1948 1936 1960 +f 1960 1988 1948 +f 1728 1732 1936 +f 1936 1948 1728 +f 2310 2257 2261 +f 2261 2315 2310 +f 2300 2249 2257 +f 2257 2310 2300 +f 2279 2226 2249 +f 2249 2300 2279 +f 2243 2200 2226 +f 2226 2279 2243 +f 2204 2142 2200 +f 2200 2243 2204 +f 2132 2094 2142 +f 2142 2204 2132 +f 2067 2036 2094 +f 2094 2132 2067 +f 2000 1988 2036 +f 2036 2067 2000 +f 1956 1948 1988 +f 1988 2000 1956 +f 1734 1728 1948 +f 1948 1956 1734 +f 2312 2310 2315 +f 2315 2316 2312 +f 2302 2300 2310 +f 2310 2312 2302 +f 2281 2279 2300 +f 2300 2302 2281 +f 2245 2243 2279 +f 2279 2281 2245 +f 2206 2204 2243 +f 2243 2245 2206 +f 2134 2132 2204 +f 2204 2206 2134 +f 2068 2067 2132 +f 2132 2134 2068 +f 2002 2000 2067 +f 2067 2068 2002 +f 1958 1956 2000 +f 2000 2002 1958 +f 1878 1734 1956 +f 1956 1958 1878 +f 2285 2312 2316 +f 2316 2289 2285 +f 2259 2302 2312 +f 2312 2285 2259 +f 2241 2281 2302 +f 2302 2259 2241 +f 2214 2245 2281 +f 2281 2241 2214 +f 2168 2206 2245 +f 2245 2214 2168 +f 2106 2134 2206 +f 2206 2168 2106 +f 2042 2068 2134 +f 2134 2106 2042 +f 1994 2002 2068 +f 2068 2042 1994 +f 1952 1958 2002 +f 2002 1994 1952 +f 1731 1878 1958 +f 1958 1952 1731 +f 2220 2285 2289 +f 2289 2225 2220 +f 2210 2259 2285 +f 2285 2220 2210 +f 2186 2241 2259 +f 2259 2210 2186 +f 2146 2214 2241 +f 2241 2186 2146 +f 2108 2168 2214 +f 2214 2146 2108 +f 2060 2106 2168 +f 2168 2108 2060 +f 2018 2042 2106 +f 2106 2060 2018 +f 1978 1994 2042 +f 2042 2018 1978 +f 1944 1952 1994 +f 1994 1978 1944 +f 1727 1731 1952 +f 1952 1944 1727 +f 2141 2220 2225 +f 2225 2145 2141 +f 2127 2210 2220 +f 2220 2141 2127 +f 2112 2186 2210 +f 2210 2127 2112 +f 2084 2146 2186 +f 2186 2112 2084 +f 2044 2108 2146 +f 2146 2084 2044 +f 2024 2060 2108 +f 2108 2044 2024 +f 1992 2018 2060 +f 2060 2024 1992 +f 1970 1978 2018 +f 2018 1992 1970 +f 1942 1944 1978 +f 1978 1970 1942 +f 1721 1727 1944 +f 1944 1942 1721 +f 2079 2141 2145 +f 2145 2087 2079 +f 2075 2127 2141 +f 2141 2079 2075 +f 2055 2112 2127 +f 2127 2075 2055 +f 2039 2084 2112 +f 2112 2055 2039 +f 2021 2044 2084 +f 2084 2039 2021 +f 1996 2024 2044 +f 2044 2021 1996 +f 1974 1992 2024 +f 2024 1996 1974 +f 1954 1970 1992 +f 1992 1974 1954 +f 1934 1942 1970 +f 1970 1954 1934 +f 1720 1721 1942 +f 1942 1934 1720 +f 2063 2079 2087 +f 2087 2071 2063 +f 2051 2075 2079 +f 2079 2063 2051 +f 2041 2055 2075 +f 2075 2051 2041 +f 2029 2039 2055 +f 2055 2041 2029 +f 2013 2021 2039 +f 2039 2029 2013 +f 1991 1996 2021 +f 2021 2013 1991 +f 1972 1974 1996 +f 1996 1991 1972 +f 1950 1954 1974 +f 1974 1972 1950 +f 1932 1934 1954 +f 1954 1950 1932 +f 1701 1720 1934 +f 1934 1932 1701 +f 2115 2063 2071 +f 2071 2123 2115 +f 2101 2051 2063 +f 2063 2115 2101 +f 2081 2041 2051 +f 2051 2101 2081 +f 2057 2029 2041 +f 2041 2081 2057 +f 2033 2013 2029 +f 2029 2057 2033 +f 2009 1991 2013 +f 2013 2033 2009 +f 1984 1972 1991 +f 1991 2009 1984 +f 1964 1950 1972 +f 1972 1984 1964 +f 1938 1932 1950 +f 1950 1964 1938 +f 1698 1701 1932 +f 1932 1938 1698 +f 1888 1886 1686 +f 1888 1686 1662 +f 1888 1662 1640 +f 1888 1640 1616 +f 1888 1616 1592 +f 1888 1592 1574 +f 1888 1574 1546 +f 1888 1546 1526 +f 1888 1526 1518 +f 1888 1518 1512 +f 1674 1686 1886 +f 1886 1884 1674 +f 1634 1662 1686 +f 1686 1674 1634 +f 1586 1640 1662 +f 1662 1634 1586 +f 1528 1616 1640 +f 1640 1586 1528 +f 1480 1592 1616 +f 1616 1528 1480 +f 1422 1574 1592 +f 1592 1480 1422 +f 1396 1546 1574 +f 1574 1422 1396 +f 1373 1526 1546 +f 1546 1396 1373 +f 1365 1518 1526 +f 1526 1373 1365 +f 1361 1512 1518 +f 1518 1365 1361 +f 1666 1674 1884 +f 1884 1882 1666 +f 1622 1634 1674 +f 1674 1666 1622 +f 1557 1586 1634 +f 1634 1622 1557 +f 1490 1528 1586 +f 1586 1557 1490 +f 1418 1480 1528 +f 1528 1490 1418 +f 1379 1422 1480 +f 1480 1418 1379 +f 1343 1396 1422 +f 1422 1379 1343 +f 1322 1373 1396 +f 1396 1343 1322 +f 1312 1365 1373 +f 1373 1322 1312 +f 1309 1361 1365 +f 1365 1312 1309 +f 1664 1666 1882 +f 1882 1879 1664 +f 1620 1622 1666 +f 1666 1664 1620 +f 1554 1557 1622 +f 1622 1620 1554 +f 1488 1490 1557 +f 1557 1554 1488 +f 1416 1418 1490 +f 1490 1488 1416 +f 1377 1379 1418 +f 1418 1416 1377 +f 1341 1343 1379 +f 1379 1377 1341 +f 1320 1322 1343 +f 1343 1341 1320 +f 1310 1312 1322 +f 1322 1320 1310 +f 1306 1309 1312 +f 1312 1310 1306 +f 1670 1664 1879 +f 1879 1876 1670 +f 1628 1620 1664 +f 1664 1670 1628 +f 1580 1554 1620 +f 1620 1628 1580 +f 1516 1488 1554 +f 1554 1580 1516 +f 1454 1416 1488 +f 1488 1516 1454 +f 1408 1377 1416 +f 1416 1454 1408 +f 1381 1341 1377 +f 1377 1408 1381 +f 1363 1320 1341 +f 1341 1381 1363 +f 1337 1310 1320 +f 1320 1363 1337 +f 1333 1306 1310 +f 1310 1337 1333 +f 1678 1670 1876 +f 1876 1874 1678 +f 1644 1628 1670 +f 1670 1678 1644 +f 1604 1580 1628 +f 1628 1644 1604 +f 1562 1516 1580 +f 1580 1604 1562 +f 1514 1454 1516 +f 1516 1562 1514 +f 1476 1408 1454 +f 1454 1514 1476 +f 1436 1381 1408 +f 1408 1476 1436 +f 1412 1363 1381 +f 1381 1436 1412 +f 1402 1337 1363 +f 1363 1412 1402 +f 1399 1333 1337 +f 1337 1402 1399 +f 1680 1678 1874 +f 1874 1872 1680 +f 1652 1644 1678 +f 1678 1680 1652 +f 1630 1604 1644 +f 1644 1652 1630 +f 1598 1562 1604 +f 1604 1630 1598 +f 1578 1514 1562 +f 1562 1598 1578 +f 1538 1476 1514 +f 1514 1578 1538 +f 1510 1436 1476 +f 1476 1538 1510 +f 1497 1412 1436 +f 1436 1510 1497 +f 1483 1402 1412 +f 1412 1497 1483 +f 1479 1399 1402 +f 1402 1483 1479 +f 1688 1680 1872 +f 1872 1870 1688 +f 1668 1652 1680 +f 1680 1688 1668 +f 1648 1630 1652 +f 1652 1668 1648 +f 1626 1598 1630 +f 1630 1648 1626 +f 1603 1578 1598 +f 1598 1626 1603 +f 1585 1538 1578 +f 1578 1603 1585 +f 1569 1510 1538 +f 1538 1585 1569 +f 1549 1497 1510 +f 1510 1569 1549 +f 1545 1483 1497 +f 1497 1549 1545 +f 1537 1479 1483 +f 1483 1545 1537 +f 1690 1688 1870 +f 1870 1868 1690 +f 1672 1668 1688 +f 1688 1690 1672 +f 1650 1648 1668 +f 1668 1672 1650 +f 1633 1626 1648 +f 1648 1650 1633 +f 1611 1603 1626 +f 1626 1633 1611 +f 1595 1585 1603 +f 1603 1611 1595 +f 1583 1569 1585 +f 1585 1595 1583 +f 1573 1549 1569 +f 1569 1583 1573 +f 1561 1545 1549 +f 1549 1573 1561 +f 1553 1537 1545 +f 1545 1561 1553 +f 1684 1690 1868 +f 1868 1865 1684 +f 1658 1672 1690 +f 1690 1684 1658 +f 1638 1650 1672 +f 1672 1658 1638 +f 1615 1633 1650 +f 1650 1638 1615 +f 1591 1611 1633 +f 1633 1615 1591 +f 1567 1595 1611 +f 1611 1591 1567 +f 1543 1583 1595 +f 1595 1567 1543 +f 1523 1573 1583 +f 1583 1543 1523 +f 1509 1561 1573 +f 1573 1523 1509 +f 1501 1553 1561 +f 1561 1509 1501 +f 1888 1513 1519 +f 1888 1519 1527 +f 1888 1527 1547 +f 1888 1547 1575 +f 1888 1575 1593 +f 1888 1593 1617 +f 1888 1617 1641 +f 1888 1641 1663 +f 1888 1663 1687 +f 1888 1687 1894 +f 1366 1519 1513 +f 1513 1362 1366 +f 1374 1527 1519 +f 1519 1366 1374 +f 1397 1547 1527 +f 1527 1374 1397 +f 1423 1575 1547 +f 1547 1397 1423 +f 1481 1593 1575 +f 1575 1423 1481 +f 1529 1617 1593 +f 1593 1481 1529 +f 1587 1641 1617 +f 1617 1529 1587 +f 1635 1663 1641 +f 1641 1587 1635 +f 1675 1687 1663 +f 1663 1635 1675 +f 1895 1894 1687 +f 1687 1675 1895 +f 1313 1366 1362 +f 1362 1308 1313 +f 1323 1374 1366 +f 1366 1313 1323 +f 1344 1397 1374 +f 1374 1323 1344 +f 1380 1423 1397 +f 1397 1344 1380 +f 1419 1481 1423 +f 1423 1380 1419 +f 1491 1529 1481 +f 1481 1419 1491 +f 1556 1587 1529 +f 1529 1491 1556 +f 1623 1635 1587 +f 1587 1556 1623 +f 1667 1675 1635 +f 1635 1623 1667 +f 1890 1895 1675 +f 1675 1667 1890 +f 1311 1313 1308 +f 1308 1307 1311 +f 1321 1323 1313 +f 1313 1311 1321 +f 1342 1344 1323 +f 1323 1321 1342 +f 1378 1380 1344 +f 1344 1342 1378 +f 1417 1419 1380 +f 1380 1378 1417 +f 1489 1491 1419 +f 1419 1417 1489 +f 1555 1556 1491 +f 1491 1489 1555 +f 1621 1623 1556 +f 1556 1555 1621 +f 1665 1667 1623 +f 1623 1621 1665 +f 1881 1890 1667 +f 1667 1665 1881 +f 1338 1311 1307 +f 1307 1334 1338 +f 1364 1321 1311 +f 1311 1338 1364 +f 1382 1342 1321 +f 1321 1364 1382 +f 1409 1378 1342 +f 1342 1382 1409 +f 1455 1417 1378 +f 1378 1409 1455 +f 1517 1489 1417 +f 1417 1455 1517 +f 1581 1555 1489 +f 1489 1517 1581 +f 1629 1621 1555 +f 1555 1581 1629 +f 1671 1665 1621 +f 1621 1629 1671 +f 1893 1881 1665 +f 1665 1671 1893 +f 1403 1338 1334 +f 1334 1398 1403 +f 1413 1364 1338 +f 1338 1403 1413 +f 1437 1382 1364 +f 1364 1413 1437 +f 1477 1409 1382 +f 1382 1437 1477 +f 1515 1455 1409 +f 1409 1477 1515 +f 1563 1517 1455 +f 1455 1515 1563 +f 1605 1581 1517 +f 1517 1563 1605 +f 1645 1629 1581 +f 1581 1605 1645 +f 1679 1671 1629 +f 1629 1645 1679 +f 1900 1893 1671 +f 1671 1679 1900 +f 1482 1403 1398 +f 1398 1478 1482 +f 1496 1413 1403 +f 1403 1482 1496 +f 1511 1437 1413 +f 1413 1496 1511 +f 1539 1477 1437 +f 1437 1511 1539 +f 1579 1515 1477 +f 1477 1539 1579 +f 1599 1563 1515 +f 1515 1579 1599 +f 1631 1605 1563 +f 1563 1599 1631 +f 1653 1645 1605 +f 1605 1631 1653 +f 1681 1679 1645 +f 1645 1653 1681 +f 1902 1900 1679 +f 1679 1681 1902 +f 1544 1482 1478 +f 1478 1536 1544 +f 1548 1496 1482 +f 1482 1544 1548 +f 1568 1511 1496 +f 1496 1548 1568 +f 1584 1539 1511 +f 1511 1568 1584 +f 1602 1579 1539 +f 1539 1584 1602 +f 1627 1599 1579 +f 1579 1602 1627 +f 1649 1631 1599 +f 1599 1627 1649 +f 1669 1653 1631 +f 1631 1649 1669 +f 1689 1681 1653 +f 1653 1669 1689 +f 1921 1902 1681 +f 1681 1689 1921 +f 1560 1544 1536 +f 1536 1552 1560 +f 1572 1548 1544 +f 1544 1560 1572 +f 1582 1568 1548 +f 1548 1572 1582 +f 1594 1584 1568 +f 1568 1582 1594 +f 1610 1602 1584 +f 1584 1594 1610 +f 1632 1627 1602 +f 1602 1610 1632 +f 1651 1649 1627 +f 1627 1632 1651 +f 1673 1669 1649 +f 1649 1651 1673 +f 1691 1689 1669 +f 1669 1673 1691 +f 1922 1921 1689 +f 1689 1691 1922 +f 1508 1560 1552 +f 1552 1500 1508 +f 1522 1572 1560 +f 1560 1508 1522 +f 1542 1582 1572 +f 1572 1522 1542 +f 1566 1594 1582 +f 1582 1542 1566 +f 1590 1610 1594 +f 1594 1566 1590 +f 1614 1632 1610 +f 1610 1590 1614 +f 1639 1651 1632 +f 1632 1614 1639 +f 1659 1673 1651 +f 1651 1639 1659 +f 1685 1691 1673 +f 1673 1659 1685 +f 1928 1922 1691 +f 1691 1685 1928 +f 1888 1887 1937 +f 1888 1937 1961 +f 1888 1961 1983 +f 1888 1983 2007 +f 1888 2007 2031 +f 1888 2031 2049 +f 1888 2049 2077 +f 1888 2077 2097 +f 1888 2097 2105 +f 1888 2105 2111 +f 1949 1937 1887 +f 1887 1885 1949 +f 1989 1961 1937 +f 1937 1949 1989 +f 2037 1983 1961 +f 1961 1989 2037 +f 2095 2007 1983 +f 1983 2037 2095 +f 2143 2031 2007 +f 2007 2095 2143 +f 2201 2049 2031 +f 2031 2143 2201 +f 2227 2077 2049 +f 2049 2201 2227 +f 2250 2097 2077 +f 2077 2227 2250 +f 2258 2105 2097 +f 2097 2250 2258 +f 2262 2111 2105 +f 2105 2258 2262 +f 1957 1949 1885 +f 1885 1883 1957 +f 2001 1989 1949 +f 1949 1957 2001 +f 2066 2037 1989 +f 1989 2001 2066 +f 2133 2095 2037 +f 2037 2066 2133 +f 2205 2143 2095 +f 2095 2133 2205 +f 2244 2201 2143 +f 2143 2205 2244 +f 2280 2227 2201 +f 2201 2244 2280 +f 2301 2250 2227 +f 2227 2280 2301 +f 2311 2258 2250 +f 2250 2301 2311 +f 2314 2262 2258 +f 2258 2311 2314 +f 1959 1957 1883 +f 1883 1880 1959 +f 2003 2001 1957 +f 1957 1959 2003 +f 2069 2066 2001 +f 2001 2003 2069 +f 2135 2133 2066 +f 2066 2069 2135 +f 2207 2205 2133 +f 2133 2135 2207 +f 2246 2244 2205 +f 2205 2207 2246 +f 2282 2280 2244 +f 2244 2246 2282 +f 2303 2301 2280 +f 2280 2282 2303 +f 2313 2311 2301 +f 2301 2303 2313 +f 2317 2314 2311 +f 2311 2313 2317 +f 1953 1959 1880 +f 1880 1877 1953 +f 1995 2003 1959 +f 1959 1953 1995 +f 2043 2069 2003 +f 2003 1995 2043 +f 2107 2135 2069 +f 2069 2043 2107 +f 2169 2207 2135 +f 2135 2107 2169 +f 2215 2246 2207 +f 2207 2169 2215 +f 2242 2282 2246 +f 2246 2215 2242 +f 2260 2303 2282 +f 2282 2242 2260 +f 2286 2313 2303 +f 2303 2260 2286 +f 2290 2317 2313 +f 2313 2286 2290 +f 1945 1953 1877 +f 1877 1875 1945 +f 1979 1995 1953 +f 1953 1945 1979 +f 2019 2043 1995 +f 1995 1979 2019 +f 2061 2107 2043 +f 2043 2019 2061 +f 2109 2169 2107 +f 2107 2061 2109 +f 2147 2215 2169 +f 2169 2109 2147 +f 2187 2242 2215 +f 2215 2147 2187 +f 2211 2260 2242 +f 2242 2187 2211 +f 2221 2286 2260 +f 2260 2211 2221 +f 2224 2290 2286 +f 2286 2221 2224 +f 1943 1945 1875 +f 1875 1873 1943 +f 1971 1979 1945 +f 1945 1943 1971 +f 1993 2019 1979 +f 1979 1971 1993 +f 2025 2061 2019 +f 2019 1993 2025 +f 2045 2109 2061 +f 2061 2025 2045 +f 2085 2147 2109 +f 2109 2045 2085 +f 2113 2187 2147 +f 2147 2085 2113 +f 2126 2211 2187 +f 2187 2113 2126 +f 2140 2221 2211 +f 2211 2126 2140 +f 2144 2224 2221 +f 2221 2140 2144 +f 1935 1943 1873 +f 1873 1871 1935 +f 1955 1971 1943 +f 1943 1935 1955 +f 1975 1993 1971 +f 1971 1955 1975 +f 1997 2025 1993 +f 1993 1975 1997 +f 2020 2045 2025 +f 2025 1997 2020 +f 2038 2085 2045 +f 2045 2020 2038 +f 2054 2113 2085 +f 2085 2038 2054 +f 2074 2126 2113 +f 2113 2054 2074 +f 2078 2140 2126 +f 2126 2074 2078 +f 2086 2144 2140 +f 2140 2078 2086 +f 1933 1935 1871 +f 1871 1869 1933 +f 1951 1955 1935 +f 1935 1933 1951 +f 1973 1975 1955 +f 1955 1951 1973 +f 1990 1997 1975 +f 1975 1973 1990 +f 2012 2020 1997 +f 1997 1990 2012 +f 2028 2038 2020 +f 2020 2012 2028 +f 2040 2054 2038 +f 2038 2028 2040 +f 2050 2074 2054 +f 2054 2040 2050 +f 2062 2078 2074 +f 2074 2050 2062 +f 2070 2086 2078 +f 2078 2062 2070 +f 1939 1933 1869 +f 1869 1866 1939 +f 1965 1951 1933 +f 1933 1939 1965 +f 1985 1973 1951 +f 1951 1965 1985 +f 2008 1990 1973 +f 1973 1985 2008 +f 2032 2012 1990 +f 1990 2008 2032 +f 2056 2028 2012 +f 2012 2032 2056 +f 2080 2040 2028 +f 2028 2056 2080 +f 2100 2050 2040 +f 2040 2080 2100 +f 2114 2062 2050 +f 2050 2100 2114 +f 2122 2070 2062 +f 2062 2114 2122 +f 2232 2116 2124 +f 2124 2236 2232 +f 2218 2102 2116 +f 2116 2232 2218 +f 2199 2082 2102 +f 2102 2218 2199 +f 2150 2058 2082 +f 2082 2199 2150 +f 2120 2034 2058 +f 2058 2150 2120 +f 2064 2010 2034 +f 2034 2120 2064 +f 2023 1986 2010 +f 2010 2064 2023 +f 1980 1966 1986 +f 1986 2023 1980 +f 1946 1940 1966 +f 1966 1980 1946 +f 1862 1730 1940 +f 1940 1946 1862 +f 2332 2232 2236 +f 2236 2336 2332 +f 2322 2218 2232 +f 2232 2332 2322 +f 2306 2199 2218 +f 2218 2322 2306 +f 2275 2150 2199 +f 2199 2306 2275 +f 2234 2120 2150 +f 2150 2275 2234 +f 2170 2064 2120 +f 2120 2234 2170 +f 2093 2023 2064 +f 2064 2170 2093 +f 2016 1980 2023 +f 2023 2093 2016 +f 1968 1946 1980 +f 1980 2016 1968 +f 1858 1862 1946 +f 1946 1968 1858 +f 2409 2332 2336 +f 2336 2413 2409 +f 2400 2322 2332 +f 2332 2409 2400 +f 2376 2306 2322 +f 2322 2400 2376 +f 2349 2275 2306 +f 2306 2376 2349 +f 2324 2234 2275 +f 2275 2349 2324 +f 2271 2170 2234 +f 2234 2324 2271 +f 2185 2093 2170 +f 2170 2271 2185 +f 2072 2016 2093 +f 2093 2185 2072 +f 1976 1968 2016 +f 2016 2072 1976 +f 1729 1858 1968 +f 1968 1976 1729 +f 2488 2409 2413 +f 2413 2498 2488 +f 2470 2400 2409 +f 2409 2488 2470 +f 2444 2376 2400 +f 2400 2470 2444 +f 2418 2349 2376 +f 2376 2444 2418 +f 2384 2324 2349 +f 2349 2418 2384 +f 2338 2271 2324 +f 2324 2384 2338 +f 2269 2185 2271 +f 2271 2338 2269 +f 2138 2072 2185 +f 2185 2269 2138 +f 1998 1976 2072 +f 2072 2138 1998 +f 1722 1729 1976 +f 1976 1998 1722 +f 2559 2488 2498 +f 2498 2569 2559 +f 2549 2470 2488 +f 2488 2559 2549 +f 2531 2444 2470 +f 2470 2549 2531 +f 2492 2418 2444 +f 2444 2531 2492 +f 2436 2384 2418 +f 2418 2492 2436 +f 2394 2338 2384 +f 2384 2436 2394 +f 2326 2269 2338 +f 2338 2394 2326 +f 2212 2138 2269 +f 2269 2326 2212 +f 2026 1998 2138 +f 2138 2212 2026 +f 1850 1722 1998 +f 1998 2026 1850 +f 2653 2559 2569 +f 2569 2655 2653 +f 2631 2549 2559 +f 2559 2653 2631 +f 2593 2531 2549 +f 2549 2631 2593 +f 2551 2492 2531 +f 2531 2593 2551 +f 2510 2436 2492 +f 2492 2551 2510 +f 2432 2394 2436 +f 2436 2510 2432 +f 2366 2326 2394 +f 2394 2432 2366 +f 2263 2212 2326 +f 2326 2366 2263 +f 2052 2026 2212 +f 2212 2263 2052 +f 1726 1850 2026 +f 2026 2052 1726 +f 2720 2653 2655 +f 2655 2726 2720 +f 2697 2631 2653 +f 2653 2720 2697 +f 2662 2593 2631 +f 2631 2697 2662 +f 2607 2551 2593 +f 2593 2662 2607 +f 2547 2510 2551 +f 2551 2607 2547 +f 2484 2432 2510 +f 2510 2547 2484 +f 2405 2366 2432 +f 2432 2484 2405 +f 2308 2263 2366 +f 2366 2405 2308 +f 2090 2052 2263 +f 2263 2308 2090 +f 1719 1726 2052 +f 2052 2090 1719 +f 2787 2720 2726 +f 2726 2795 2787 +f 2759 2697 2720 +f 2720 2787 2759 +f 2713 2662 2697 +f 2697 2759 2713 +f 2657 2607 2662 +f 2662 2713 2657 +f 2589 2547 2607 +f 2607 2657 2589 +f 2525 2484 2547 +f 2547 2589 2525 +f 2422 2405 2484 +f 2484 2525 2422 +f 2330 2308 2405 +f 2405 2422 2330 +f 2118 2090 2308 +f 2308 2330 2118 +f 1700 1719 2090 +f 2090 2118 1700 +f 2834 2787 2795 +f 2795 2844 2834 +f 2798 2759 2787 +f 2787 2834 2798 +f 2750 2713 2759 +f 2759 2798 2750 +f 2690 2657 2713 +f 2713 2750 2690 +f 2624 2589 2657 +f 2657 2690 2624 +f 2536 2525 2589 +f 2589 2624 2536 +f 2441 2422 2525 +f 2525 2536 2441 +f 2340 2330 2422 +f 2422 2441 2340 +f 2128 2118 2330 +f 2330 2340 2128 +f 1825 1700 2118 +f 2118 2128 1825 +f 2847 2834 2844 +f 2844 2857 2847 +f 2821 2798 2834 +f 2834 2847 2821 +f 2765 2750 2798 +f 2798 2821 2765 +f 2703 2690 2750 +f 2750 2765 2703 +f 2637 2624 2690 +f 2690 2703 2637 +f 2543 2536 2624 +f 2624 2637 2543 +f 2446 2441 2536 +f 2536 2543 2446 +f 2344 2340 2441 +f 2441 2446 2344 +f 2136 2128 2340 +f 2340 2344 2136 +f 1713 1825 2128 +f 2128 2136 1713 +f 1676 1682 1864 +f 1864 1862 1676 +f 1642 1656 1682 +f 1682 1676 1642 +f 1601 1636 1656 +f 1656 1642 1601 +f 1558 1612 1636 +f 1636 1601 1558 +f 1502 1588 1612 +f 1612 1558 1502 +f 1472 1564 1588 +f 1588 1502 1472 +f 1425 1540 1564 +f 1564 1472 1425 +f 1404 1520 1540 +f 1540 1425 1404 +f 1390 1506 1520 +f 1520 1404 1390 +f 1387 1498 1506 +f 1506 1390 1387 +f 1654 1676 1862 +f 1862 1859 1654 +f 1606 1642 1676 +f 1676 1654 1606 +f 1531 1601 1642 +f 1642 1606 1531 +f 1452 1558 1601 +f 1601 1531 1452 +f 1388 1502 1558 +f 1558 1452 1388 +f 1347 1472 1502 +f 1502 1388 1347 +f 1316 1425 1472 +f 1472 1347 1316 +f 1300 1404 1425 +f 1425 1316 1300 +f 1290 1390 1404 +f 1404 1300 1290 +f 1286 1387 1390 +f 1390 1290 1286 +f 1646 1654 1859 +f 1859 1856 1646 +f 1550 1606 1654 +f 1654 1646 1550 +f 1439 1531 1606 +f 1606 1550 1439 +f 1351 1452 1531 +f 1531 1439 1351 +f 1298 1388 1452 +f 1452 1351 1298 +f 1275 1347 1388 +f 1388 1298 1275 +f 1246 1316 1347 +f 1347 1275 1246 +f 1222 1300 1316 +f 1316 1246 1222 +f 1215 1290 1300 +f 1300 1222 1215 +f 1211 1286 1290 +f 1290 1215 1211 +f 1624 1646 1856 +f 1856 1854 1624 +f 1484 1550 1646 +f 1646 1624 1484 +f 1353 1439 1550 +f 1550 1484 1353 +f 1284 1351 1439 +f 1439 1353 1284 +f 1238 1298 1351 +f 1351 1284 1238 +f 1204 1275 1298 +f 1298 1238 1204 +f 1178 1246 1275 +f 1275 1204 1178 +f 1152 1222 1246 +f 1246 1178 1152 +f 1134 1215 1222 +f 1222 1152 1134 +f 1124 1211 1215 +f 1215 1134 1124 +f 1596 1624 1854 +f 1854 1851 1596 +f 1410 1484 1624 +f 1624 1596 1410 +f 1296 1353 1484 +f 1484 1410 1296 +f 1228 1284 1353 +f 1353 1296 1228 +f 1186 1238 1284 +f 1284 1228 1186 +f 1130 1204 1238 +f 1238 1186 1130 +f 1091 1178 1204 +f 1204 1130 1091 +f 1073 1152 1178 +f 1178 1091 1073 +f 1063 1134 1152 +f 1152 1073 1063 +f 1053 1124 1134 +f 1134 1063 1053 +f 1570 1596 1851 +f 1851 1848 1570 +f 1359 1410 1596 +f 1596 1570 1359 +f 1256 1296 1410 +f 1410 1359 1256 +f 1190 1228 1296 +f 1296 1256 1190 +f 1112 1186 1228 +f 1228 1190 1112 +f 1071 1130 1186 +f 1186 1112 1071 +f 1029 1091 1130 +f 1130 1071 1029 +f 991 1073 1091 +f 1091 1029 991 +f 969 1063 1073 +f 1073 991 969 +f 967 1053 1063 +f 1063 969 967 +f 1532 1570 1848 +f 1848 1846 1532 +f 1314 1359 1570 +f 1570 1532 1314 +f 1219 1256 1359 +f 1359 1314 1219 +f 1138 1190 1256 +f 1256 1219 1138 +f 1075 1112 1190 +f 1190 1138 1075 +f 1015 1071 1112 +f 1112 1075 1015 +f 962 1029 1071 +f 1071 1015 962 +f 925 991 1029 +f 1029 962 925 +f 904 969 991 +f 991 925 904 +f 898 967 969 +f 969 904 898 +f 1504 1532 1846 +f 1846 1832 1504 +f 1292 1314 1532 +f 1532 1504 1292 +f 1200 1219 1314 +f 1314 1292 1200 +f 1097 1138 1219 +f 1219 1200 1097 +f 1033 1075 1138 +f 1138 1097 1033 +f 965 1015 1075 +f 1075 1033 965 +f 909 962 1015 +f 1015 965 909 +f 863 925 962 +f 962 909 863 +f 835 904 925 +f 925 863 835 +f 827 898 904 +f 904 835 827 +f 1494 1504 1832 +f 1832 1824 1494 +f 1282 1292 1504 +f 1504 1494 1282 +f 1183 1200 1292 +f 1292 1282 1183 +f 1088 1097 1200 +f 1200 1183 1088 +f 1000 1033 1097 +f 1097 1088 1000 +f 934 965 1033 +f 1033 1000 934 +f 874 909 965 +f 965 934 874 +f 826 863 909 +f 909 874 826 +f 790 835 863 +f 863 826 790 +f 780 827 835 +f 835 790 780 +f 1486 1494 1824 +f 1824 1814 1486 +f 1278 1282 1494 +f 1494 1486 1278 +f 1176 1183 1282 +f 1282 1278 1176 +f 1079 1088 1183 +f 1183 1176 1079 +f 985 1000 1088 +f 1088 1079 985 +f 919 934 1000 +f 1000 985 919 +f 857 874 934 +f 934 919 857 +f 801 826 874 +f 874 857 801 +f 775 790 826 +f 826 801 775 +f 765 780 790 +f 790 775 765 +f 1391 1507 1499 +f 1499 1387 1391 +f 1405 1521 1507 +f 1507 1391 1405 +f 1424 1541 1521 +f 1521 1405 1424 +f 1473 1565 1541 +f 1541 1424 1473 +f 1503 1589 1565 +f 1565 1473 1503 +f 1559 1613 1589 +f 1589 1503 1559 +f 1600 1637 1613 +f 1613 1559 1600 +f 1643 1657 1637 +f 1637 1600 1643 +f 1677 1683 1657 +f 1657 1643 1677 +f 1863 1892 1683 +f 1683 1677 1863 +f 1291 1391 1387 +f 1387 1287 1291 +f 1301 1405 1391 +f 1391 1291 1301 +f 1317 1424 1405 +f 1405 1301 1317 +f 1348 1473 1424 +f 1424 1317 1348 +f 1389 1503 1473 +f 1473 1348 1389 +f 1453 1559 1503 +f 1503 1389 1453 +f 1530 1600 1559 +f 1559 1453 1530 +f 1607 1643 1600 +f 1600 1530 1607 +f 1655 1677 1643 +f 1643 1607 1655 +f 1861 1863 1677 +f 1677 1655 1861 +f 1214 1291 1287 +f 1287 1210 1214 +f 1223 1301 1291 +f 1291 1214 1223 +f 1247 1317 1301 +f 1301 1223 1247 +f 1274 1348 1317 +f 1317 1247 1274 +f 1299 1389 1348 +f 1348 1274 1299 +f 1352 1453 1389 +f 1389 1299 1352 +f 1438 1530 1453 +f 1453 1352 1438 +f 1551 1607 1530 +f 1530 1438 1551 +f 1647 1655 1607 +f 1607 1551 1647 +f 1891 1861 1655 +f 1655 1647 1891 +f 1135 1214 1210 +f 1210 1125 1135 +f 1153 1223 1214 +f 1214 1135 1153 +f 1179 1247 1223 +f 1223 1153 1179 +f 1205 1274 1247 +f 1247 1179 1205 +f 1239 1299 1274 +f 1274 1205 1239 +f 1285 1352 1299 +f 1299 1239 1285 +f 1354 1438 1352 +f 1352 1285 1354 +f 1485 1551 1438 +f 1438 1354 1485 +f 1625 1647 1551 +f 1551 1485 1625 +f 1901 1891 1647 +f 1647 1625 1901 +f 1064 1135 1125 +f 1125 1054 1064 +f 1074 1153 1135 +f 1135 1064 1074 +f 1092 1179 1153 +f 1153 1074 1092 +f 1131 1205 1179 +f 1179 1092 1131 +f 1187 1239 1205 +f 1205 1131 1187 +f 1229 1285 1239 +f 1239 1187 1229 +f 1297 1354 1285 +f 1285 1229 1297 +f 1411 1485 1354 +f 1354 1297 1411 +f 1597 1625 1485 +f 1485 1411 1597 +f 1853 1901 1625 +f 1625 1597 1853 +f 970 1064 1054 +f 1054 968 970 +f 992 1074 1064 +f 1064 970 992 +f 1030 1092 1074 +f 1074 992 1030 +f 1072 1131 1092 +f 1092 1030 1072 +f 1113 1187 1131 +f 1131 1072 1113 +f 1191 1229 1187 +f 1187 1113 1191 +f 1257 1297 1229 +f 1229 1191 1257 +f 1360 1411 1297 +f 1297 1257 1360 +f 1571 1597 1411 +f 1411 1360 1571 +f 1899 1853 1597 +f 1597 1571 1899 +f 903 970 968 +f 968 897 903 +f 926 992 970 +f 970 903 926 +f 961 1030 992 +f 992 926 961 +f 1016 1072 1030 +f 1030 961 1016 +f 1076 1113 1072 +f 1072 1016 1076 +f 1139 1191 1113 +f 1113 1076 1139 +f 1218 1257 1191 +f 1191 1139 1218 +f 1315 1360 1257 +f 1257 1218 1315 +f 1533 1571 1360 +f 1360 1315 1533 +f 1920 1899 1571 +f 1571 1533 1920 +f 836 903 897 +f 897 828 836 +f 864 926 903 +f 903 836 864 +f 910 961 926 +f 926 864 910 +f 966 1016 961 +f 961 910 966 +f 1034 1076 1016 +f 1016 966 1034 +f 1098 1139 1076 +f 1076 1034 1098 +f 1201 1218 1139 +f 1139 1098 1201 +f 1293 1315 1218 +f 1218 1201 1293 +f 1505 1533 1315 +f 1315 1293 1505 +f 1924 1920 1533 +f 1533 1505 1924 +f 789 836 828 +f 828 779 789 +f 825 864 836 +f 836 789 825 +f 873 910 864 +f 864 825 873 +f 933 966 910 +f 910 873 933 +f 999 1034 966 +f 966 933 999 +f 1087 1098 1034 +f 1034 999 1087 +f 1182 1201 1098 +f 1098 1087 1182 +f 1283 1293 1201 +f 1201 1182 1283 +f 1495 1505 1293 +f 1293 1283 1495 +f 1826 1924 1505 +f 1505 1495 1826 +f 776 789 779 +f 779 766 776 +f 802 825 789 +f 789 776 802 +f 858 873 825 +f 825 802 858 +f 920 933 873 +f 873 858 920 +f 986 999 933 +f 933 920 986 +f 1080 1087 999 +f 999 986 1080 +f 1177 1182 1087 +f 1087 1080 1177 +f 1279 1283 1182 +f 1182 1177 1279 +f 1487 1495 1283 +f 1283 1279 1487 +f 1914 1826 1495 +f 1495 1487 1914 +f 1947 1941 1867 +f 1867 1863 1947 +f 1981 1967 1941 +f 1941 1947 1981 +f 2022 1987 1967 +f 1967 1981 2022 +f 2065 2011 1987 +f 1987 2022 2065 +f 2121 2035 2011 +f 2011 2065 2121 +f 2151 2059 2035 +f 2035 2121 2151 +f 2198 2083 2059 +f 2059 2151 2198 +f 2219 2103 2083 +f 2083 2198 2219 +f 2233 2117 2103 +f 2103 2219 2233 +f 2236 2125 2117 +f 2117 2233 2236 +f 1969 1947 1863 +f 1863 1860 1969 +f 2017 1981 1947 +f 1947 1969 2017 +f 2092 2022 1981 +f 1981 2017 2092 +f 2171 2065 2022 +f 2022 2092 2171 +f 2235 2121 2065 +f 2065 2171 2235 +f 2276 2151 2121 +f 2121 2235 2276 +f 2307 2198 2151 +f 2151 2276 2307 +f 2323 2219 2198 +f 2198 2307 2323 +f 2333 2233 2219 +f 2219 2323 2333 +f 2337 2236 2233 +f 2233 2333 2337 +f 1977 1969 1860 +f 1860 1857 1977 +f 2073 2017 1969 +f 1969 1977 2073 +f 2184 2092 2017 +f 2017 2073 2184 +f 2272 2171 2092 +f 2092 2184 2272 +f 2325 2235 2171 +f 2171 2272 2325 +f 2348 2276 2235 +f 2235 2325 2348 +f 2377 2307 2276 +f 2276 2348 2377 +f 2401 2323 2307 +f 2307 2377 2401 +f 2408 2333 2323 +f 2323 2401 2408 +f 2412 2337 2333 +f 2333 2408 2412 +f 1999 1977 1857 +f 1857 1855 1999 +f 2139 2073 1977 +f 1977 1999 2139 +f 2270 2184 2073 +f 2073 2139 2270 +f 2339 2272 2184 +f 2184 2270 2339 +f 2385 2325 2272 +f 2272 2339 2385 +f 2419 2348 2325 +f 2325 2385 2419 +f 2445 2377 2348 +f 2348 2419 2445 +f 2471 2401 2377 +f 2377 2445 2471 +f 2489 2408 2401 +f 2401 2471 2489 +f 2499 2412 2408 +f 2408 2489 2499 +f 2027 1999 1855 +f 1855 1852 2027 +f 2213 2139 1999 +f 1999 2027 2213 +f 2327 2270 2139 +f 2139 2213 2327 +f 2395 2339 2270 +f 2270 2327 2395 +f 2437 2385 2339 +f 2339 2395 2437 +f 2493 2419 2385 +f 2385 2437 2493 +f 2532 2445 2419 +f 2419 2493 2532 +f 2550 2471 2445 +f 2445 2532 2550 +f 2560 2489 2471 +f 2471 2550 2560 +f 2570 2499 2489 +f 2489 2560 2570 +f 2053 2027 1852 +f 1852 1849 2053 +f 2264 2213 2027 +f 2027 2053 2264 +f 2367 2327 2213 +f 2213 2264 2367 +f 2433 2395 2327 +f 2327 2367 2433 +f 2511 2437 2395 +f 2395 2433 2511 +f 2552 2493 2437 +f 2437 2511 2552 +f 2594 2532 2493 +f 2493 2552 2594 +f 2632 2550 2532 +f 2532 2594 2632 +f 2654 2560 2550 +f 2550 2632 2654 +f 2656 2570 2560 +f 2560 2654 2656 +f 2091 2053 1849 +f 1849 1847 2091 +f 2309 2264 2053 +f 2053 2091 2309 +f 2404 2367 2264 +f 2264 2309 2404 +f 2485 2433 2367 +f 2367 2404 2485 +f 2548 2511 2433 +f 2433 2485 2548 +f 2608 2552 2511 +f 2511 2548 2608 +f 2661 2594 2552 +f 2552 2608 2661 +f 2698 2632 2594 +f 2594 2661 2698 +f 2719 2654 2632 +f 2632 2698 2719 +f 2725 2656 2654 +f 2654 2719 2725 +f 2119 2091 1847 +f 1847 1833 2119 +f 2331 2309 2091 +f 2091 2119 2331 +f 2423 2404 2309 +f 2309 2331 2423 +f 2526 2485 2404 +f 2404 2423 2526 +f 2590 2548 2485 +f 2485 2526 2590 +f 2658 2608 2548 +f 2548 2590 2658 +f 2714 2661 2608 +f 2608 2658 2714 +f 2760 2698 2661 +f 2661 2714 2760 +f 2788 2719 2698 +f 2698 2760 2788 +f 2796 2725 2719 +f 2719 2788 2796 +f 2129 2119 1833 +f 1833 1827 2129 +f 2341 2331 2119 +f 2119 2129 2341 +f 2440 2423 2331 +f 2331 2341 2440 +f 2535 2526 2423 +f 2423 2440 2535 +f 2623 2590 2526 +f 2526 2535 2623 +f 2689 2658 2590 +f 2590 2623 2689 +f 2749 2714 2658 +f 2658 2689 2749 +f 2797 2760 2714 +f 2714 2749 2797 +f 2833 2788 2760 +f 2760 2797 2833 +f 2843 2796 2788 +f 2788 2833 2843 +f 2137 2129 1827 +f 1827 1815 2137 +f 2345 2341 2129 +f 2129 2137 2345 +f 2447 2440 2341 +f 2341 2345 2447 +f 2544 2535 2440 +f 2440 2447 2544 +f 2638 2623 2535 +f 2535 2544 2638 +f 2704 2689 2623 +f 2623 2638 2704 +f 2766 2749 2689 +f 2689 2704 2766 +f 2822 2797 2749 +f 2749 2766 2822 +f 2848 2833 2797 +f 2797 2822 2848 +f 2858 2843 2833 +f 2833 2848 2858 +f 1735 2334 2329 +f 1735 2329 2321 +f 1735 2321 2305 +f 1735 2305 2274 +f 1735 2274 2231 +f 1735 2231 2167 +f 1735 2167 2089 +f 1735 2089 2014 +f 1735 2014 1962 +f 1735 1962 1733 +f 2515 2329 2334 +f 2334 2524 2515 +f 2495 2321 2329 +f 2329 2515 2495 +f 2456 2305 2321 +f 2321 2495 2456 +f 2429 2274 2305 +f 2305 2456 2429 +f 2399 2231 2274 +f 2274 2429 2399 +f 2347 2167 2231 +f 2231 2399 2347 +f 2292 2089 2167 +f 2167 2347 2292 +f 2148 2014 2089 +f 2089 2292 2148 +f 2004 1962 2014 +f 2014 2148 2004 +f 1739 1733 1962 +f 1962 2004 1739 +f 2647 2515 2524 +f 2524 2649 2647 +f 2621 2495 2515 +f 2515 2647 2621 +f 2584 2456 2495 +f 2495 2621 2584 +f 2541 2429 2456 +f 2456 2584 2541 +f 2502 2399 2429 +f 2429 2541 2502 +f 2426 2347 2399 +f 2399 2502 2426 +f 2352 2292 2347 +f 2347 2426 2352 +f 2255 2148 2292 +f 2292 2352 2255 +f 2046 2004 2148 +f 2148 2255 2046 +f 1702 1739 2004 +f 2004 2046 1702 +f 2746 2647 2649 +f 2649 2757 2746 +f 2721 2621 2647 +f 2647 2746 2721 +f 2681 2584 2621 +f 2621 2721 2681 +f 2639 2541 2584 +f 2584 2681 2639 +f 2557 2502 2541 +f 2541 2639 2557 +f 2505 2426 2502 +f 2502 2557 2505 +f 2415 2352 2426 +f 2426 2505 2415 +f 2318 2255 2352 +f 2352 2415 2318 +f 2098 2046 2255 +f 2255 2318 2098 +f 1745 1702 2046 +f 2046 2098 1745 +f 2840 2746 2757 +f 2757 2849 2840 +f 2808 2721 2746 +f 2746 2840 2808 +f 2756 2681 2721 +f 2721 2808 2756 +f 2696 2639 2681 +f 2681 2756 2696 +f 2626 2557 2639 +f 2639 2696 2626 +f 2538 2505 2557 +f 2557 2626 2538 +f 2443 2415 2505 +f 2505 2538 2443 +f 2342 2318 2415 +f 2415 2443 2342 +f 2131 2098 2318 +f 2318 2342 2131 +f 1904 1745 2098 +f 2098 2131 1904 +f 2906 2840 2849 +f 2849 2925 2906 +f 2867 2808 2840 +f 2840 2906 2867 +f 2818 2756 2808 +f 2808 2867 2818 +f 2736 2696 2756 +f 2756 2818 2736 +f 2667 2626 2696 +f 2696 2736 2667 +f 2565 2538 2626 +f 2626 2667 2565 +f 2475 2443 2538 +f 2538 2565 2475 +f 2356 2342 2443 +f 2443 2475 2356 +f 2156 2131 2342 +f 2342 2356 2156 +f 1704 1904 2131 +f 2131 2156 1704 +f 2976 2906 2925 +f 2925 2987 2976 +f 2914 2867 2906 +f 2906 2976 2914 +f 2852 2818 2867 +f 2867 2914 2852 +f 2772 2736 2818 +f 2818 2852 2772 +f 2688 2667 2736 +f 2736 2772 2688 +f 2592 2565 2667 +f 2667 2688 2592 +f 2497 2475 2565 +f 2565 2592 2497 +f 2372 2356 2475 +f 2475 2497 2372 +f 2176 2156 2356 +f 2356 2372 2176 +f 1752 1704 2156 +f 2156 2176 1752 +f 2993 2976 2987 +f 2987 3011 2993 +f 2952 2914 2976 +f 2976 2993 2952 +f 2874 2852 2914 +f 2914 2952 2874 +f 2794 2772 2852 +f 2852 2874 2794 +f 2702 2688 2772 +f 2772 2794 2702 +f 2604 2592 2688 +f 2688 2702 2604 +f 2509 2497 2592 +f 2592 2604 2509 +f 2380 2372 2497 +f 2497 2509 2380 +f 2182 2176 2372 +f 2372 2380 2182 +f 1723 1752 2176 +f 2176 2182 1723 +f 3000 2993 3011 +f 3011 3020 3000 +f 2967 2952 2993 +f 2993 3000 2967 +f 2879 2874 2952 +f 2952 2967 2879 +f 2799 2794 2874 +f 2874 2879 2799 +f 2707 2702 2794 +f 2794 2799 2707 +f 2605 2604 2702 +f 2702 2707 2605 +f 2512 2509 2604 +f 2604 2605 2512 +f 2382 2380 2509 +f 2509 2512 2382 +f 2188 2182 2380 +f 2380 2382 2188 +f 1699 1723 2182 +f 2182 2188 1699 +f 3006 3000 3020 +f 3020 3022 3006 +f 2972 2967 3000 +f 3000 3006 2972 +f 2888 2879 2967 +f 2967 2972 2888 +f 2804 2799 2879 +f 2879 2888 2804 +f 2710 2707 2799 +f 2799 2804 2710 +f 2613 2605 2707 +f 2707 2710 2613 +f 2520 2512 2605 +f 2605 2613 2520 +f 2388 2382 2512 +f 2512 2520 2388 +f 2192 2188 2382 +f 2382 2388 2192 +f 1760 1699 2188 +f 2188 2192 1760 +f 1735 1737 1660 +f 1735 1660 1608 +f 1735 1608 1535 +f 1735 1535 1457 +f 1735 1457 1393 +f 1735 1393 1350 +f 1735 1350 1319 +f 1735 1319 1303 +f 1735 1303 1295 +f 1735 1295 1288 +f 1618 1660 1737 +f 1737 1739 1618 +f 1474 1608 1660 +f 1660 1618 1474 +f 1332 1535 1608 +f 1608 1474 1332 +f 1277 1457 1535 +f 1535 1332 1277 +f 1225 1393 1457 +f 1457 1277 1225 +f 1195 1350 1393 +f 1393 1225 1195 +f 1166 1319 1350 +f 1350 1195 1166 +f 1129 1303 1319 +f 1319 1166 1129 +f 1109 1295 1303 +f 1303 1129 1109 +f 1099 1288 1295 +f 1295 1109 1099 +f 1576 1618 1739 +f 1739 1741 1576 +f 1367 1474 1618 +f 1618 1576 1367 +f 1270 1332 1474 +f 1474 1367 1270 +f 1196 1277 1332 +f 1332 1270 1196 +f 1120 1225 1277 +f 1277 1196 1120 +f 1081 1195 1225 +f 1225 1120 1081 +f 1040 1166 1195 +f 1195 1081 1040 +f 1001 1129 1166 +f 1166 1040 1001 +f 975 1109 1129 +f 1129 1001 975 +f 973 1099 1109 +f 1109 975 973 +f 1524 1576 1741 +f 1741 1744 1524 +f 1304 1367 1576 +f 1576 1524 1304 +f 1209 1270 1367 +f 1367 1304 1209 +f 1119 1196 1270 +f 1270 1209 1119 +f 1065 1120 1196 +f 1196 1119 1065 +f 983 1081 1120 +f 1120 1065 983 +f 941 1040 1081 +f 1081 983 941 +f 901 1001 1040 +f 1040 941 901 +f 878 975 1001 +f 1001 901 878 +f 865 973 975 +f 975 878 865 +f 1493 1524 1744 +f 1744 1747 1493 +f 1280 1304 1524 +f 1524 1493 1280 +f 1181 1209 1304 +f 1304 1280 1181 +f 1086 1119 1209 +f 1209 1181 1086 +f 998 1065 1119 +f 1119 1086 998 +f 928 983 1065 +f 1065 998 928 +f 868 941 983 +f 983 928 868 +f 816 901 941 +f 941 868 816 +f 784 878 901 +f 901 816 784 +f 773 865 878 +f 878 784 773 +f 1466 1493 1747 +f 1747 1749 1466 +f 1266 1280 1493 +f 1493 1466 1266 +f 1149 1181 1280 +f 1280 1266 1149 +f 1057 1086 1181 +f 1181 1149 1057 +f 955 998 1086 +f 1086 1057 955 +f 888 928 998 +f 998 955 888 +f 806 868 928 +f 928 888 806 +f 755 816 868 +f 868 806 755 +f 718 784 816 +f 816 755 718 +f 697 773 784 +f 784 718 697 +f 1446 1466 1749 +f 1749 1753 1446 +f 1250 1266 1466 +f 1466 1446 1250 +f 1127 1149 1266 +f 1266 1250 1127 +f 1032 1057 1149 +f 1149 1127 1032 +f 936 955 1057 +f 1057 1032 936 +f 852 888 955 +f 955 936 852 +f 772 806 888 +f 888 852 772 +f 710 755 806 +f 806 772 710 +f 648 718 755 +f 755 710 648 +f 637 697 718 +f 718 648 637 +f 1440 1446 1753 +f 1753 1755 1440 +f 1242 1250 1446 +f 1446 1440 1242 +f 1115 1127 1250 +f 1250 1242 1115 +f 1020 1032 1127 +f 1127 1115 1020 +f 922 936 1032 +f 1032 1020 922 +f 830 852 936 +f 936 922 830 +f 750 772 852 +f 852 830 750 +f 672 710 772 +f 772 750 672 +f 631 648 710 +f 710 672 631 +f 613 637 648 +f 648 631 613 +f 1434 1440 1755 +f 1755 1757 1434 +f 1240 1242 1440 +f 1440 1434 1240 +f 1110 1115 1242 +f 1242 1240 1110 +f 1017 1020 1115 +f 1115 1110 1017 +f 915 922 1020 +f 1020 1017 915 +f 823 830 922 +f 922 915 823 +f 743 750 830 +f 830 823 743 +f 655 672 750 +f 750 743 655 +f 622 631 672 +f 672 655 622 +f 602 613 631 +f 631 622 602 +f 1428 1434 1757 +f 1757 1760 1428 +f 1232 1240 1434 +f 1434 1428 1232 +f 1105 1110 1240 +f 1240 1232 1105 +f 1010 1017 1110 +f 1110 1105 1010 +f 913 915 1017 +f 1017 1010 913 +f 821 823 915 +f 915 913 821 +f 736 743 823 +f 823 821 736 +f 652 655 743 +f 743 736 652 +f 619 622 655 +f 655 652 619 +f 601 602 622 +f 622 619 601 +f 1735 1289 1294 +f 1735 1294 1302 +f 1735 1302 1318 +f 1735 1318 1349 +f 1735 1349 1392 +f 1735 1392 1456 +f 1735 1456 1534 +f 1735 1534 1609 +f 1735 1609 1661 +f 1735 1661 1889 +f 1108 1294 1289 +f 1289 1099 1108 +f 1128 1302 1294 +f 1294 1108 1128 +f 1167 1318 1302 +f 1302 1128 1167 +f 1194 1349 1318 +f 1318 1167 1194 +f 1224 1392 1349 +f 1349 1194 1224 +f 1276 1456 1392 +f 1392 1224 1276 +f 1331 1534 1456 +f 1456 1276 1331 +f 1475 1609 1534 +f 1534 1331 1475 +f 1619 1661 1609 +f 1609 1475 1619 +f 1738 1889 1661 +f 1661 1619 1738 +f 976 1108 1099 +f 1099 974 976 +f 1002 1128 1108 +f 1108 976 1002 +f 1039 1167 1128 +f 1128 1002 1039 +f 1082 1194 1167 +f 1167 1039 1082 +f 1121 1224 1194 +f 1194 1082 1121 +f 1197 1276 1224 +f 1224 1121 1197 +f 1271 1331 1276 +f 1276 1197 1271 +f 1368 1475 1331 +f 1331 1271 1368 +f 1577 1619 1475 +f 1475 1368 1577 +f 1903 1738 1619 +f 1619 1577 1903 +f 877 976 974 +f 974 866 877 +f 902 1002 976 +f 976 877 902 +f 942 1039 1002 +f 1002 902 942 +f 984 1082 1039 +f 1039 942 984 +f 1066 1121 1082 +f 1082 984 1066 +f 1118 1197 1121 +f 1121 1066 1118 +f 1208 1271 1197 +f 1197 1118 1208 +f 1305 1368 1271 +f 1271 1208 1305 +f 1525 1577 1368 +f 1368 1305 1525 +f 1742 1903 1577 +f 1577 1525 1742 +f 783 877 866 +f 866 774 783 +f 815 902 877 +f 877 783 815 +f 867 942 902 +f 902 815 867 +f 927 984 942 +f 942 867 927 +f 997 1066 984 +f 984 927 997 +f 1085 1118 1066 +f 1066 997 1085 +f 1180 1208 1118 +f 1118 1085 1180 +f 1281 1305 1208 +f 1208 1180 1281 +f 1492 1525 1305 +f 1305 1281 1492 +f 1703 1742 1525 +f 1525 1492 1703 +f 717 783 774 +f 774 698 717 +f 756 815 783 +f 783 717 756 +f 805 867 815 +f 815 756 805 +f 887 927 867 +f 867 805 887 +f 956 997 927 +f 927 887 956 +f 1058 1085 997 +f 997 956 1058 +f 1148 1180 1085 +f 1085 1058 1148 +f 1267 1281 1180 +f 1180 1148 1267 +f 1467 1492 1281 +f 1281 1267 1467 +f 1905 1703 1492 +f 1492 1467 1905 +f 647 717 698 +f 698 636 647 +f 709 756 717 +f 717 647 709 +f 771 805 756 +f 756 709 771 +f 851 887 805 +f 805 771 851 +f 935 956 887 +f 887 851 935 +f 1031 1058 956 +f 956 935 1031 +f 1126 1148 1058 +f 1058 1031 1126 +f 1251 1267 1148 +f 1148 1126 1251 +f 1447 1467 1267 +f 1267 1251 1447 +f 1751 1905 1467 +f 1467 1447 1751 +f 630 647 636 +f 636 612 630 +f 671 709 647 +f 647 630 671 +f 749 771 709 +f 709 671 749 +f 829 851 771 +f 771 749 829 +f 921 935 851 +f 851 829 921 +f 1019 1031 935 +f 935 921 1019 +f 1114 1126 1031 +f 1031 1019 1114 +f 1243 1251 1126 +f 1126 1114 1243 +f 1441 1447 1251 +f 1251 1243 1441 +f 1896 1751 1447 +f 1447 1441 1896 +f 623 630 612 +f 612 603 623 +f 656 671 630 +f 630 623 656 +f 744 749 671 +f 671 656 744 +f 824 829 749 +f 749 744 824 +f 916 921 829 +f 829 824 916 +f 1018 1019 921 +f 921 916 1018 +f 1111 1114 1019 +f 1019 1018 1111 +f 1241 1243 1114 +f 1114 1111 1241 +f 1435 1441 1243 +f 1243 1241 1435 +f 1923 1896 1441 +f 1441 1435 1923 +f 617 623 603 +f 603 601 617 +f 650 656 623 +f 623 617 650 +f 734 744 656 +f 656 650 734 +f 818 824 744 +f 744 734 818 +f 912 916 824 +f 824 818 912 +f 1009 1018 916 +f 916 912 1009 +f 1102 1111 1018 +f 1018 1009 1102 +f 1235 1241 1111 +f 1111 1102 1235 +f 1431 1435 1241 +f 1241 1235 1431 +f 1759 1923 1435 +f 1435 1431 1759 +f 1735 1736 1963 +f 1735 1963 2015 +f 1735 2015 2088 +f 1735 2088 2166 +f 1735 2166 2230 +f 1735 2230 2273 +f 1735 2273 2304 +f 1735 2304 2320 +f 1735 2320 2328 +f 1735 2328 2335 +f 2005 1963 1736 +f 1736 1738 2005 +f 2149 2015 1963 +f 1963 2005 2149 +f 2291 2088 2015 +f 2015 2149 2291 +f 2346 2166 2088 +f 2088 2291 2346 +f 2398 2230 2166 +f 2166 2346 2398 +f 2428 2273 2230 +f 2230 2398 2428 +f 2457 2304 2273 +f 2273 2428 2457 +f 2494 2320 2304 +f 2304 2457 2494 +f 2514 2328 2320 +f 2320 2494 2514 +f 2524 2335 2328 +f 2328 2514 2524 +f 2047 2005 1738 +f 1738 1740 2047 +f 2256 2149 2005 +f 2005 2047 2256 +f 2353 2291 2149 +f 2149 2256 2353 +f 2427 2346 2291 +f 2291 2353 2427 +f 2503 2398 2346 +f 2346 2427 2503 +f 2542 2428 2398 +f 2398 2503 2542 +f 2583 2457 2428 +f 2428 2542 2583 +f 2622 2494 2457 +f 2457 2583 2622 +f 2648 2514 2494 +f 2494 2622 2648 +f 2650 2524 2514 +f 2514 2648 2650 +f 2099 2047 1740 +f 1740 1743 2099 +f 2319 2256 2047 +f 2047 2099 2319 +f 2414 2353 2256 +f 2256 2319 2414 +f 2504 2427 2353 +f 2353 2414 2504 +f 2558 2503 2427 +f 2427 2504 2558 +f 2640 2542 2503 +f 2503 2558 2640 +f 2682 2583 2542 +f 2542 2640 2682 +f 2722 2622 2583 +f 2583 2682 2722 +f 2745 2648 2622 +f 2622 2722 2745 +f 2758 2650 2648 +f 2648 2745 2758 +f 2130 2099 1743 +f 1743 1746 2130 +f 2343 2319 2099 +f 2099 2130 2343 +f 2442 2414 2319 +f 2319 2343 2442 +f 2537 2504 2414 +f 2414 2442 2537 +f 2625 2558 2504 +f 2504 2537 2625 +f 2695 2640 2558 +f 2558 2625 2695 +f 2755 2682 2640 +f 2640 2695 2755 +f 2807 2722 2682 +f 2682 2755 2807 +f 2839 2745 2722 +f 2722 2807 2839 +f 2850 2758 2745 +f 2745 2839 2850 +f 2157 2130 1746 +f 1746 1748 2157 +f 2357 2343 2130 +f 2130 2157 2357 +f 2474 2442 2343 +f 2343 2357 2474 +f 2566 2537 2442 +f 2442 2474 2566 +f 2668 2625 2537 +f 2537 2566 2668 +f 2735 2695 2625 +f 2625 2668 2735 +f 2817 2755 2695 +f 2695 2735 2817 +f 2868 2807 2755 +f 2755 2817 2868 +f 2905 2839 2807 +f 2807 2868 2905 +f 2926 2850 2839 +f 2839 2905 2926 +f 2177 2157 1748 +f 1748 1750 2177 +f 2373 2357 2157 +f 2157 2177 2373 +f 2496 2474 2357 +f 2357 2373 2496 +f 2591 2566 2474 +f 2474 2496 2591 +f 2687 2668 2566 +f 2566 2591 2687 +f 2771 2735 2668 +f 2668 2687 2771 +f 2851 2817 2735 +f 2735 2771 2851 +f 2913 2868 2817 +f 2817 2851 2913 +f 2975 2905 2868 +f 2868 2913 2975 +f 2986 2926 2905 +f 2905 2975 2986 +f 2183 2177 1750 +f 1750 1754 2183 +f 2381 2373 2177 +f 2177 2183 2381 +f 2508 2496 2373 +f 2373 2381 2508 +f 2603 2591 2496 +f 2496 2508 2603 +f 2701 2687 2591 +f 2591 2603 2701 +f 2793 2771 2687 +f 2687 2701 2793 +f 2873 2851 2771 +f 2771 2793 2873 +f 2951 2913 2851 +f 2851 2873 2951 +f 2992 2975 2913 +f 2913 2951 2992 +f 3010 2986 2975 +f 2975 2992 3010 +f 2189 2183 1754 +f 1754 1756 2189 +f 2383 2381 2183 +f 2183 2189 2383 +f 2513 2508 2381 +f 2381 2383 2513 +f 2606 2603 2508 +f 2508 2513 2606 +f 2708 2701 2603 +f 2603 2606 2708 +f 2800 2793 2701 +f 2701 2708 2800 +f 2880 2873 2793 +f 2793 2800 2880 +f 2968 2951 2873 +f 2873 2880 2968 +f 3001 2992 2951 +f 2951 2968 3001 +f 3021 3010 2992 +f 2992 3001 3021 +f 2195 2189 1756 +f 1756 1759 2195 +f 2390 2383 2189 +f 2189 2195 2390 +f 2517 2513 2383 +f 2383 2390 2517 +f 2612 2606 2513 +f 2513 2517 2612 +f 2709 2708 2606 +f 2606 2612 2709 +f 2801 2800 2708 +f 2708 2709 2801 +f 2886 2880 2800 +f 2800 2801 2886 +f 2970 2968 2880 +f 2880 2886 2970 +f 3004 3001 2968 +f 2968 2970 3004 +f 3022 3021 3001 +f 3001 3004 3022 \ No newline at end of file diff --git a/content/handbook_2e/examples/17 Shapes/Ex_08/data/teapot.obj b/content/handbook_2e/examples/17 Shapes/Ex_08/data/teapot.obj new file mode 100644 index 000000000..f1ac38adc --- /dev/null +++ b/content/handbook_2e/examples/17 Shapes/Ex_08/data/teapot.obj @@ -0,0 +1,9965 @@ +v -3.000000 -1.8 0.000000 +v -2.991600 -1.8 -0.081000 +v -2.991600 -1.8 0.081000 +v -2.989450 -1.666162 0.000000 +v -2.985000 -1.92195 0.000000 +v -2.985000 -1.92195 0.000000 +v -2.981175 -1.667844 -0.081000 +v -2.981175 -1.667844 0.081000 +v -2.976687 -1.920243 -0.081000 +v -2.976687 -1.920243 0.081000 +v -2.968800 -1.8 -0.144000 +v -2.968800 -1.8 0.144000 +v -2.958713 -1.672406 -0.144000 +v -2.958713 -1.672406 0.144000 +v -2.957600 -1.5348 0.000000 +v -2.957600 -1.5348 0.000000 +v -2.954122 -1.915609 -0.144000 +v -2.954122 -1.915609 0.144000 +v -2.949693 -1.53779 -0.081000 +v -2.949693 -1.53779 0.081000 +v -2.940000 -2.0196 0.000000 +v -2.935200 -1.8 -0.189000 +v -2.935200 -1.8 0.189000 +v -2.931958 -2.016526 0.081000 +v -2.931958 -2.016526 -0.081000 +v -2.928230 -1.545907 -0.144000 +v -2.928230 -1.545907 0.144000 +v -2.925611 -1.679131 -0.189000 +v -2.925611 -1.679131 0.189000 +v -2.920870 -1.908779 -0.189000 +v -2.920870 -1.908779 0.189000 +v -2.910131 -2.008181 -0.144000 +v -2.910131 -2.008181 0.144000 +v -2.904150 -1.406137 0.000000 +v -2.904150 -1.406137 0.000000 +v -2.896846 -1.410135 0.081000 +v -2.896846 -1.410135 -0.081000 +v -2.896602 -1.557869 -0.189000 +v -2.896602 -1.557869 0.189000 +v -2.894400 -1.8 -0.216000 +v -2.894400 -1.8 0.216000 +v -2.885416 -1.687296 -0.216000 +v -2.885416 -1.687296 0.216000 +v -2.880491 -1.900487 -0.216000 +v -2.880491 -1.900487 0.216000 +v -2.877965 -1.995883 -0.189000 +v -2.877965 -1.995883 0.189000 +v -2.877022 -1.420985 -0.144000 +v -2.877022 -1.420985 0.144000 +v -2.865000 -2.09565 0.000000 +v -2.858195 -1.572394 0.216000 +v -2.858195 -1.572394 -0.216000 +v -2.857432 -2.091511 -0.081000 +v -2.857432 -2.091511 0.081000 +v -2.850000 -1.8 -0.225000 +v -2.850000 -1.8 0.225000 +v -2.847806 -1.436974 0.189000 +v -2.847806 -1.436974 -0.189000 +v -2.841675 -1.696181 0.225000 +v -2.841675 -1.696181 -0.225000 +v -2.838906 -1.98095 -0.216000 +v -2.838906 -1.98095 0.216000 +v -2.836889 -2.080276 -0.144000 +v -2.836889 -2.080276 0.144000 +v -2.836550 -1.891463 -0.225000 +v -2.836550 -1.891463 0.225000 +v -2.828800 -1.2804 0.000000 +v -2.822326 -1.285171 -0.081000 +v -2.822326 -1.285171 0.081000 +v -2.816400 -1.5882 -0.225000 +v -2.816400 -1.5882 0.225000 +v -2.812331 -1.45639 0.216000 +v -2.812331 -1.45639 -0.216000 +v -2.806615 -2.06372 -0.189000 +v -2.806615 -2.06372 0.189000 +v -2.805600 -1.8 -0.216000 +v -2.805600 -1.8 0.216000 +v -2.804755 -1.298122 -0.144000 +v -2.804755 -1.298122 0.144000 +v -2.797934 -1.705067 -0.216000 +v -2.797934 -1.705067 0.216000 +v -2.796400 -1.9647 0.225000 +v -2.796400 -1.9647 -0.225000 +v -2.792609 -1.882438 -0.216000 +v -2.792609 -1.882438 0.216000 +v -2.778861 -1.317206 -0.189000 +v -2.778861 -1.317206 0.189000 +v -2.774605 -1.604006 0.216000 +v -2.774605 -1.604006 -0.216000 +v -2.773725 -1.477519 0.225000 +v -2.773725 -1.477519 -0.225000 +v -2.769854 -2.043616 -0.216000 +v -2.769854 -2.043616 0.216000 +v -2.764800 -1.8 -0.189000 +v -2.764800 -1.8 0.189000 +v -2.760000 -2.1528 0.000000 +v -2.760000 -2.1528 0.000000 +v -2.757739 -1.713232 -0.189000 +v -2.757739 -1.713232 0.189000 +v -2.753894 -1.94845 -0.216000 +v -2.753894 -1.94845 0.216000 +v -2.753123 -2.147861 -0.081000 +v -2.753123 -2.147861 0.081000 +v -2.752230 -1.874146 -0.189000 +v -2.752230 -1.874146 0.189000 +v -2.747418 -1.340381 -0.216000 +v -2.747418 -1.340381 0.216000 +v -2.736198 -1.618531 -0.189000 +v -2.736198 -1.618531 0.189000 +v -2.735119 -1.498648 0.216000 +v -2.735119 -1.498648 -0.216000 +v -2.734458 -2.134454 -0.144000 +v -2.734458 -2.134454 0.144000 +v -2.731250 -1.157813 0.000000 +v -2.731250 -1.157813 0.000000 +v -2.731200 -1.8 -0.144000 +v -2.731200 -1.8 0.144000 +v -2.729850 -2.021737 -0.225000 +v -2.729850 -2.021737 0.225000 +v -2.725825 -1.163194 0.081000 +v -2.725825 -1.163194 -0.081000 +v -2.724637 -1.719956 -0.144000 +v -2.724637 -1.719956 0.144000 +v -2.718978 -1.867316 -0.144000 +v -2.718978 -1.867316 0.144000 +v -2.714835 -1.933517 -0.189000 +v -2.714835 -1.933517 0.189000 +v -2.713200 -1.3656 -0.225000 +v -2.713200 -1.3656 0.225000 +v -2.711100 -1.1778 -0.144000 +v -2.711100 -1.1778 0.144000 +v -2.708400 -1.8 -0.081000 +v -2.708400 -1.8 0.081000 +v -2.706950 -2.114698 -0.189000 +v -2.706950 -2.114698 0.189000 +v -2.704570 -1.630493 -0.144000 +v -2.704570 -1.630493 0.144000 +v -2.702175 -1.724519 -0.081000 +v -2.702175 -1.724519 0.081000 +v -2.700000 -1.8 0.000000 +v -2.699644 -1.518063 0.189000 +v -2.699644 -1.518063 -0.189000 +v -2.696413 -1.862682 -0.081000 +v -2.696413 -1.862682 0.081000 +v -2.693900 -1.7262 0.000000 +v -2.689846 -1.999859 -0.216000 +v -2.689846 -1.999859 0.216000 +v -2.689400 -1.199325 -0.189000 +v -2.689400 -1.199325 0.189000 +v -2.688100 -1.860975 0.000000 +v -2.688100 -1.860975 0.000000 +v -2.683107 -1.63861 -0.081000 +v -2.683107 -1.63861 0.081000 +v -2.682669 -1.921219 -0.144000 +v -2.682669 -1.921219 0.144000 +v -2.678982 -1.390819 -0.216000 +v -2.678982 -1.390819 0.216000 +v -2.675200 -1.6416 0.000000 +v -2.675200 -1.6416 0.000000 +v -2.673549 -2.090707 -0.216000 +v -2.673549 -2.090707 0.216000 +v -2.670428 -1.534053 -0.144000 +v -2.670428 -1.534053 0.144000 +v -2.663050 -1.225463 -0.216000 +v -2.663050 -1.225463 0.216000 +v -2.660842 -1.912874 0.081000 +v -2.660842 -1.912874 -0.081000 +v -2.653085 -1.979755 -0.189000 +v -2.653085 -1.979755 0.189000 +v -2.652800 -1.9098 0.000000 +v -2.652800 -1.9098 0.000000 +v -2.650604 -1.544903 0.081000 +v -2.650604 -1.544903 -0.081000 +v -2.647539 -1.413994 -0.189000 +v -2.647539 -1.413994 0.189000 +v -2.643300 -1.5489 0.000000 +v -2.637200 -2.0646 -0.225000 +v -2.637200 -2.0646 0.225000 +v -2.634375 -1.253906 0.225000 +v -2.634375 -1.253906 -0.225000 +v -2.625000 -2.19375 0.000000 +v -2.622811 -1.963199 -0.144000 +v -2.622811 -1.963199 0.144000 +v -2.621645 -1.433078 -0.144000 +v -2.621645 -1.433078 0.144000 +v -2.619050 -2.188238 -0.081000 +v -2.619050 -2.188238 0.081000 +v -2.611200 -1.0386 0.000000 +v -2.611200 -1.0386 0.000000 +v -2.607034 -1.044497 0.081000 +v -2.607034 -1.044497 -0.081000 +v -2.605700 -1.28235 -0.216000 +v -2.605700 -1.28235 0.216000 +v -2.604074 -1.446029 -0.081000 +v -2.604074 -1.446029 0.081000 +v -2.602900 -2.173275 -0.144000 +v -2.602900 -2.173275 0.144000 +v -2.602268 -1.951964 -0.081000 +v -2.602268 -1.951964 0.081000 +v -2.600851 -2.038493 -0.216000 +v -2.600851 -2.038493 0.216000 +v -2.597600 -1.4508 0.000000 +v -2.595725 -1.060502 -0.144000 +v -2.595725 -1.060502 0.144000 +v -2.594700 -1.947825 0.000000 +v -2.579350 -1.308488 -0.189000 +v -2.579350 -1.308488 0.189000 +v -2.579100 -2.151225 -0.189000 +v -2.579100 -2.151225 0.189000 +v -2.579059 -1.08409 -0.189000 +v -2.579059 -1.08409 0.189000 +v -2.567450 -2.014502 -0.189000 +v -2.567450 -2.014502 0.189000 +v -2.558822 -1.112731 0.216000 +v -2.558822 -1.112731 -0.216000 +v -2.557650 -1.330013 -0.144000 +v -2.557650 -1.330013 0.144000 +v -2.550200 -2.12445 -0.216000 +v -2.550200 -2.12445 0.216000 +v -2.542925 -1.344619 0.081000 +v -2.542925 -1.344619 -0.081000 +v -2.539942 -1.994746 -0.144000 +v -2.539942 -1.994746 0.144000 +v -2.537500 -1.35 0.000000 +v -2.537500 -1.35 0.000000 +v -2.536800 -1.1439 0.225000 +v -2.536800 -1.1439 -0.225000 +v -2.521277 -1.981339 -0.081000 +v -2.521277 -1.981339 0.081000 +v -2.518750 -2.095312 -0.225000 +v -2.518750 -2.095312 0.225000 +v -2.514778 -1.175069 0.216000 +v -2.514778 -1.175069 -0.216000 +v -2.514400 -1.9764 0.000000 +v -2.514400 -1.9764 0.000000 +v -2.494541 -1.20371 -0.189000 +v -2.494541 -1.20371 0.189000 +v -2.487300 -2.066175 -0.216000 +v -2.487300 -2.066175 0.216000 +v -2.477875 -1.227298 -0.144000 +v -2.477875 -1.227298 0.144000 +v -2.468350 -0.922987 0.000000 +v -2.466566 -1.243303 0.081000 +v -2.466566 -1.243303 -0.081000 +v -2.465644 -0.929375 -0.081000 +v -2.465644 -0.929375 0.081000 +v -2.462400 -1.2492 0.000000 +v -2.462400 -1.2492 0.000000 +v -2.460000 -2.2212 0.000000 +v -2.460000 -2.2212 0.000000 +v -2.458400 -2.0394 -0.189000 +v -2.458400 -2.0394 0.189000 +v -2.458298 -0.946711 -0.144000 +v -2.458298 -0.946711 0.144000 +v -2.455229 -2.215303 -0.081000 +v -2.455229 -2.215303 0.081000 +v -2.447474 -0.97226 0.189000 +v -2.447474 -0.97226 -0.189000 +v -2.442278 -2.199298 -0.144000 +v -2.442278 -2.199298 0.144000 +v -2.434600 -2.01735 -0.144000 +v -2.434600 -2.01735 0.144000 +v -2.434329 -1.003283 -0.216000 +v -2.434329 -1.003283 0.216000 +v -2.423194 -2.17571 -0.189000 +v -2.423194 -2.17571 0.189000 +v -2.420025 -1.037044 -0.225000 +v -2.420025 -1.037044 0.225000 +v -2.418450 -2.002387 -0.081000 +v -2.418450 -2.002388 0.081000 +v -2.412500 -1.996875 0.000000 +v -2.412500 -1.996875 0.000000 +v -2.405721 -1.070804 -0.216000 +v -2.405721 -1.070804 0.216000 +v -2.400019 -2.147069 -0.216000 +v -2.400019 -2.147069 0.216000 +v -2.392576 -1.101828 -0.189000 +v -2.392576 -1.101828 0.189000 +v -2.381752 -1.127376 -0.144000 +v -2.381752 -1.127376 0.144000 +v -2.374800 -2.1159 -0.225000 +v -2.374800 -2.1159 0.225000 +v -2.374406 -1.144713 0.081000 +v -2.374406 -1.144713 -0.081000 +v -2.371700 -1.1511 0.000000 +v -2.349581 -2.084731 -0.216000 +v -2.349581 -2.084731 0.216000 +v -2.326406 -2.05609 -0.189000 +v -2.326406 -2.05609 0.189000 +v -2.307322 -2.032502 -0.144000 +v -2.307322 -2.032502 0.144000 +v -2.302400 -0.8112 0.000000 +v -2.302400 -0.8112 0.000000 +v -2.301347 -0.818122 0.081000 +v -2.301347 -0.818122 -0.081000 +v -2.298490 -0.836909 0.144000 +v -2.298490 -0.836909 -0.144000 +v -2.294371 -2.016497 -0.081000 +v -2.294371 -2.016497 0.081000 +v -2.294278 -0.864595 0.189000 +v -2.294278 -0.864595 -0.189000 +v -2.289600 -2.0106 0.000000 +v -2.289600 -2.0106 0.000000 +v -2.289165 -0.898214 0.216000 +v -2.289165 -0.898214 -0.216000 +v -2.283600 -0.9348 0.225000 +v -2.283600 -0.9348 -0.225000 +v -2.278035 -0.971386 0.216000 +v -2.278035 -0.971386 -0.216000 +v -2.272922 -1.005005 0.189000 +v -2.272922 -1.005005 -0.189000 +v -2.268710 -1.032691 -0.144000 +v -2.268710 -1.032691 0.144000 +v -2.265853 -1.051478 0.081000 +v -2.265853 -1.051478 -0.081000 +v -2.265000 -2.23785 0.000000 +v -2.264800 -1.0584 0.000000 +v -2.264800 -1.0584 0.000000 +v -2.261676 -2.23172 -0.081000 +v -2.261676 -2.23172 0.081000 +v -2.252655 -2.215082 -0.144000 +v -2.252655 -2.215082 0.144000 +v -2.239361 -2.190562 -0.189000 +v -2.239361 -2.190562 0.189000 +v -2.223218 -2.160788 -0.216000 +v -2.223218 -2.160788 0.216000 +v -2.205650 -2.128387 0.225000 +v -2.205650 -2.128388 -0.225000 +v -2.188082 -2.095987 -0.216000 +v -2.188082 -2.095987 0.216000 +v -2.171939 -2.066213 -0.189000 +v -2.171939 -2.066213 0.189000 +v -2.158645 -2.041693 -0.144000 +v -2.158645 -2.041693 0.144000 +v -2.149624 -2.025055 -0.081000 +v -2.149624 -2.025055 0.081000 +v -2.146300 -2.018925 0.000000 +v -2.141100 -0.9738 0.000000 +v -2.141100 -0.9738 0.000000 +v -2.140315 -0.966231 0.081000 +v -2.140315 -0.966231 -0.081000 +v -2.138183 -0.945685 0.144000 +v -2.138183 -0.945685 -0.144000 +v -2.135041 -0.915407 0.189000 +v -2.135041 -0.915407 -0.189000 +v -2.131226 -0.878641 0.216000 +v -2.131226 -0.878641 -0.216000 +v -2.127075 -0.838631 0.225000 +v -2.127075 -0.838631 -0.225000 +v -2.122924 -0.798621 0.216000 +v -2.122924 -0.798621 -0.216000 +v -2.119109 -0.761855 0.189000 +v -2.119109 -0.761855 -0.189000 +v -2.115967 -0.731578 0.144000 +v -2.115967 -0.731578 -0.144000 +v -2.113835 -0.711032 0.081000 +v -2.113835 -0.711032 -0.081000 +v -2.113050 -0.703463 0.000000 +v -2.113050 -0.703463 0.000000 +v -2.040000 -2.2464 0.000000 +v -2.040000 -2.2464 0.000000 +v -2.038410 -2.24015 -0.081000 +v -2.038410 -2.24015 0.081000 +v -2.034093 -2.223187 -0.144000 +v -2.034093 -2.223187 0.144000 +v -2.027731 -2.198189 -0.189000 +v -2.027731 -2.198189 0.189000 +v -2.020006 -2.167834 0.216000 +v -2.020006 -2.167834 -0.216000 +v -2.011600 -2.1348 0.225000 +v -2.011600 -2.1348 -0.225000 +v -2.003194 -2.101766 0.216000 +v -2.003194 -2.101766 -0.216000 +v -2.000000 -0.9 0.000000 +v -2.000000 -0.9 0.000000 +v -2.000000 -0.9 0.000000 +v -1.997200 -0.8916 0.081000 +v -1.997200 -0.8916 -0.081000 +v -1.995469 -2.071411 -0.189000 +v -1.995469 -2.071411 0.189000 +v -1.992750 -1.037175 -0.000000 +v -1.992750 -1.037175 0.000000 +v -1.989600 -0.8688 0.144000 +v -1.989600 -0.8688 -0.144000 +v -1.989107 -2.046413 0.144000 +v -1.989107 -2.046413 -0.144000 +v -1.986000 -0.771675 0.000000 +v -1.986000 -0.771675 0.000000 +v -1.984790 -2.02945 -0.081000 +v -1.984790 -2.02945 0.081000 +v -1.983200 -2.0232 0.000000 +v -1.983200 -2.0232 0.000000 +v -1.978400 -0.8352 0.189000 +v -1.978400 -0.8352 -0.189000 +v -1.974240 -0.9 -0.328160 +v -1.974240 -0.9 -0.328160 +v -1.974240 -0.9 0.328160 +v -1.972000 -1.1784 -0.000000 +v -1.972000 -1.1784 0.000000 +v -1.967083 -1.037175 -0.326970 +v -1.967083 -1.037175 0.326970 +v -1.964800 -0.7944 0.216000 +v -1.964800 -0.7944 -0.216000 +v -1.960420 -0.771675 -0.325863 +v -1.960420 -0.771675 0.325863 +v -1.950000 -0.75 -0.225000 +v -1.950000 -0.75 0.225000 +v -1.948000 -0.6564 0.000000 +v -1.948000 -0.6564 0.000000 +v -1.946601 -1.1784 -0.323566 +v -1.946601 -1.1784 0.323566 +v -1.939250 -1.323225 0.000000 +v -1.939250 -1.323225 0.000000 +v -1.935200 -0.7056 0.216000 +v -1.935200 -0.7056 -0.216000 +v -1.922910 -0.6564 -0.319628 +v -1.922910 -0.6564 0.319628 +v -1.921600 -0.6648 0.189000 +v -1.921600 -0.6648 -0.189000 +v -1.914272 -1.323225 -0.318192 +v -1.914272 -1.323225 0.318192 +v -1.910400 -0.6312 0.144000 +v -1.910400 -0.6312 -0.144000 +v -1.902800 -0.6084 0.081000 +v -1.902800 -0.6084 -0.081000 +v -1.900000 -0.6 0.000000 +v -1.900000 -0.6 0.000000 +v -1.899520 -0.9 -0.638080 +v -1.899520 -0.9 -0.638080 +v -1.899520 -0.9 0.638080 +v -1.899520 -0.9 0.638080 +v -1.896000 -1.4712 0.000000 +v -1.896000 -1.4712 0.000000 +v -1.892634 -1.037175 -0.635767 +v -1.892634 -1.037175 0.635767 +v -1.892000 -0.553725 0.000000 +v -1.892000 -0.553725 0.000000 +v -1.886223 -0.771675 -0.633613 +v -1.886223 -0.771675 0.633613 +v -1.872927 -1.1784 -0.629147 +v -1.872927 -1.1784 0.629147 +v -1.871580 -1.4712 -0.311096 +v -1.871580 -1.4712 0.311096 +v -1.867631 -0.553725 -0.310439 +v -1.867631 -0.553725 0.310439 +v -1.850132 -0.6564 -0.621490 +v -1.850132 -0.6564 0.621490 +v -1.843750 -1.621875 0.000000 +v -1.843750 -1.621875 0.000000 +v -1.841822 -1.323225 -0.618698 +v -1.841822 -1.323225 0.618698 +v -1.824000 -0.4632 -0.000000 +v -1.824000 -0.4632 0.000000 +v -1.820003 -1.621875 -0.302522 +v -1.820003 -1.621875 0.302523 +v -1.800900 -2.024775 0.000000 +v -1.800745 -1.4712 -0.604900 +v -1.800745 -1.4712 0.604900 +v -1.800507 -0.4632 -0.299282 +v -1.800507 -0.4632 0.299282 +v -1.800455 -2.031069 -0.081000 +v -1.800455 -2.031069 0.081000 +v -1.799246 -2.048152 -0.144000 +v -1.799246 -2.048152 0.144000 +v -1.797466 -2.073326 -0.189000 +v -1.797466 -2.073326 0.189000 +v -1.796946 -0.553725 -0.603624 +v -1.796946 -0.553725 0.603624 +v -1.795303 -2.103896 -0.216000 +v -1.795303 -2.103896 0.216000 +v -1.792950 -2.137163 -0.225000 +v -1.792950 -2.137163 0.225000 +v -1.790597 -2.170429 -0.216000 +v -1.790597 -2.170429 0.216000 +v -1.788434 -2.200999 -0.189000 +v -1.788434 -2.200999 0.189000 +v -1.786654 -2.226173 -0.144000 +v -1.786654 -2.226173 0.144000 +v -1.785445 -2.243256 -0.081000 +v -1.785445 -2.243256 0.081000 +v -1.785000 -2.24955 0.000000 +v -1.784000 -1.7748 -0.000000 +v -1.784000 -1.7748 0.000000 +v -1.779680 -0.9 -0.925920 +v -1.779680 -0.9 -0.925920 +v -1.779680 -0.9 0.925920 +v -1.779680 -0.9 0.925920 +v -1.773229 -1.037175 -0.922564 +v -1.773229 -1.037175 0.922564 +v -1.767222 -0.771675 -0.919439 +v -1.767222 -0.771675 0.919439 +v -1.761022 -1.7748 -0.292719 +v -1.761022 -1.7748 0.292719 +v -1.754764 -1.1784 -0.912957 +v -1.754764 -1.1784 0.912957 +v -1.751120 -1.621875 -0.588230 +v -1.751120 -1.621875 0.588230 +v -1.750000 -0.384375 -0.000000 +v -1.750000 -0.384375 0.000000 +v -1.733408 -0.6564 -0.901846 +v -1.733408 -0.6564 0.901846 +v -1.732362 -0.4632 -0.581929 +v -1.732362 -0.4632 0.581929 +v -1.727460 -0.384375 -0.287140 +v -1.727460 -0.384375 0.287140 +v -1.725622 -1.323225 -0.897795 +v -1.725622 -1.323225 0.897795 +v -1.718250 -1.929525 -0.000000 +v -1.718250 -1.929525 0.000000 +v -1.696119 -1.929525 -0.281930 +v -1.696119 -1.929525 0.281930 +v -1.694372 -1.7748 -0.569167 +v -1.694372 -1.7748 0.569167 +v -1.687137 -1.4712 -0.877772 +v -1.687137 -1.4712 0.877772 +v -1.683577 -0.553725 -0.875920 +v -1.683577 -0.553725 0.875920 +v -1.676000 -0.3168 0.000000 +v -1.676000 -0.3168 0.000000 +v -1.662080 -0.384375 -0.558320 +v -1.662080 -0.384375 0.558320 +v -1.654413 -0.3168 -0.274998 +v -1.654413 -0.3168 0.274998 +v -1.648000 -2.0856 0.000000 +v -1.648000 -2.0856 0.000000 +v -1.640643 -1.621875 -0.853583 +v -1.640643 -1.621875 0.853583 +v -1.631925 -1.929525 -0.548190 +v -1.631925 -1.929525 0.548190 +v -1.626774 -2.0856 -0.270404 +v -1.626774 -2.0856 0.270404 +v -1.623068 -0.4632 -0.844439 +v -1.623068 -0.4632 0.844439 +v -1.618560 -0.9 -1.187840 +v -1.618560 -0.9 -1.187840 +v -1.618560 -0.9 1.187840 +v -1.618560 -0.9 1.187840 +v -1.612693 -1.037175 -1.183534 +v -1.612693 -1.037175 1.183534 +v -1.608000 -0.260025 -0.000000 +v -1.608000 -0.260025 0.000000 +v -1.607230 -0.771675 -1.179525 +v -1.607230 -0.771675 1.179525 +v -1.600000 -2.025 0.000000 +v -1.597200 -2.0313 -0.081000 +v -1.597200 -2.0313 0.081000 +v -1.595900 -1.1784 -1.171210 +v -1.595900 -1.1784 1.171210 +v -1.591798 -0.3168 -0.534711 +v -1.591798 -0.3168 0.534711 +v -1.589600 -2.0484 -0.144000 +v -1.589600 -2.0484 0.144000 +v -1.587475 -1.7748 -0.825921 +v -1.587475 -1.7748 0.825921 +v -1.587289 -0.260025 0.263841 +v -1.587289 -0.260025 -0.263841 +v -1.578400 -2.0736 -0.189000 +v -1.578400 -2.0736 0.189000 +v -1.576477 -0.6564 -1.156956 +v -1.576477 -0.6564 1.156956 +v -1.574750 -2.242575 0.000000 +v -1.574750 -2.242575 0.000000 +v -1.569396 -1.323225 -1.151759 +v -1.569396 -1.323225 1.151759 +v -1.565204 -2.0856 -0.525778 +v -1.565204 -2.0856 0.525778 +v -1.564800 -2.1042 -0.216000 +v -1.564800 -2.1042 0.216000 +v -1.557220 -0.384375 -0.810180 +v -1.557220 -0.384375 0.810180 +v -1.554467 -2.242575 -0.258385 +v -1.554467 -2.242575 0.258385 +v -1.552000 -0.2136 0.000000 +v -1.552000 -0.2136 0.000000 +v -1.550000 -2.1375 -0.225000 +v -1.550000 -2.1375 0.225000 +v -1.535200 -2.1708 -0.216000 +v -1.535200 -2.1708 0.216000 +v -1.534395 -1.4712 -1.126072 +v -1.534395 -1.4712 1.126072 +v -1.532010 -0.2136 0.254652 +v -1.532010 -0.2136 -0.254652 +v -1.531158 -0.553725 -1.123697 +v -1.531158 -0.553725 1.123697 +v -1.528968 -1.929525 -0.795481 +v -1.528968 -1.929525 0.795481 +v -1.527214 -0.260025 -0.513016 +v -1.527214 -0.260025 0.513016 +v -1.521600 -2.2014 -0.189000 +v -1.521600 -2.2014 0.189000 +v -1.514000 -0.177075 0.000000 +v -1.514000 -0.177075 0.000000 +v -1.510400 -2.2266 -0.144000 +v -1.510400 -2.2266 0.144000 +v -1.502800 -2.2437 -0.081000 +v -1.502800 -2.2437 0.081000 +v -1.500000 -2.4 0.000000 +v -1.500000 -0.15 0.000000 +v -1.500000 -2.25 0.000000 +v -1.500000 -2.4 0.000000 +v -1.500000 -0.15 0.000000 +v -1.496475 -0.127575 -0.000000 +v -1.496475 -0.127575 0.000000 +v -1.495635 -2.242575 -0.502408 +v -1.495635 -2.242575 0.502408 +v -1.494500 -0.177075 0.248417 +v -1.494500 -0.177075 -0.248417 +v -1.492110 -1.621875 -1.095040 +v -1.492110 -1.621875 1.095040 +v -1.491372 -0.3168 -0.775921 +v -1.491372 -0.3168 0.775921 +v -1.480800 -0.1056 0.000000 +v -1.480800 -0.1056 -0.000000 +v -1.480680 -2.4 -0.246120 +v -1.480680 -0.15 0.246120 +v -1.480680 -2.4 0.246120 +v -1.480680 -0.15 -0.246120 +v -1.480680 -0.15 -0.246120 +v -1.480680 -0.15 0.246120 +v -1.480325 -2.435437 0.000000 +v -1.480325 -2.435437 0.000000 +v -1.477200 -0.127575 0.245542 +v -1.477200 -0.127575 -0.245542 +v -1.476127 -0.4632 -1.083310 +v -1.476127 -0.4632 1.083310 +v -1.474028 -0.2136 0.495150 +v -1.474028 -0.2136 -0.495150 +v -1.466456 -2.0856 -0.762958 +v -1.466456 -2.0856 0.762958 +v -1.461727 -0.1056 -0.242970 +v -1.461727 -0.1056 0.242970 +v -1.461258 -2.435437 -0.242892 +v -1.461258 -2.435437 0.242892 +v -1.459600 -2.463 0.000000 +v -1.459600 -2.463 0.000000 +v -1.445325 -0.084525 0.000000 +v -1.445325 -0.084525 0.000000 +v -1.443756 -1.7748 -1.059553 +v -1.443756 -1.7748 1.059553 +v -1.440800 -2.463 -0.239491 +v -1.440800 -2.463 0.239491 +v -1.439025 -2.482687 0.000000 +v -1.437937 -0.177075 0.483027 +v -1.437937 -0.177075 -0.483027 +v -1.430863 -0.260025 0.744440 +v -1.430863 -0.260025 -0.744440 +v -1.426709 -0.084525 -0.237149 +v -1.426709 -0.084525 0.237149 +v -1.424640 -2.4 -0.478560 +v -1.424640 -0.15 -0.478560 +v -1.424640 -0.15 -0.478560 +v -1.424640 -0.15 0.478560 +v -1.424640 -0.15 0.478560 +v -1.424640 -2.4 0.478560 +v -1.421292 -0.127575 0.477435 +v -1.421292 -0.127575 -0.477435 +v -1.420490 -2.482687 -0.236115 +v -1.420490 -2.482687 0.236115 +v -1.420000 -0.9 -1.420000 +v -1.420000 -0.9 -1.420000 +v -1.420000 -0.9 1.420000 +v -1.420000 -0.9 1.420000 +v -1.419800 -2.4945 0.000000 +v -1.419800 -2.4945 0.000000 +v -1.416240 -0.384375 -1.039360 +v -1.416240 -0.384375 1.039360 +v -1.414853 -1.037175 -1.414853 +v -1.414853 -1.037175 1.414853 +v -1.410060 -0.771675 -1.410060 +v -1.410060 -0.771675 1.410060 +v -1.406405 -0.1056 -0.472434 +v -1.406405 -0.1056 0.472434 +v -1.405953 -2.435437 -0.472283 +v -1.405953 -2.435437 0.472283 +v -1.403125 -2.498438 0.000000 +v -1.403125 -2.498438 0.000000 +v -1.401513 -2.4945 -0.232961 +v -1.401513 -2.4945 0.232961 +v -1.401276 -2.242575 -0.729046 +v -1.401276 -2.242575 0.729046 +v -1.400120 -1.1784 -1.400120 +v -1.400120 -1.1784 1.400120 +v -1.400000 -2.4 0.000000 +v -1.400000 -2.4 0.000000 +v -1.390545 -1.929525 -1.020503 +v -1.390545 -1.929525 1.020503 +v -1.390200 -2.4945 0.000000 +v -1.390200 -2.4945 0.000000 +v -1.386270 -2.463 -0.465671 +v -1.386270 -2.463 0.465671 +v -1.385925 -2.435437 0.000000 +v -1.385925 -2.435437 0.000000 +v -1.385053 -2.498438 -0.230225 +v -1.385053 -2.498438 0.230225 +v -1.383080 -0.6564 -1.383080 +v -1.383080 -0.6564 1.383080 +v -1.382400 -0.0648 -0.000000 +v -1.382400 -0.0648 0.000000 +v -1.382225 -2.482687 -0.000000 +v -1.382225 -2.482687 0.000000 +v -1.381968 -2.4 -0.229712 +v -1.381968 -2.4 0.229712 +v -1.381032 -0.2136 0.718514 +v -1.381032 -0.2136 -0.718514 +v -1.380400 -2.463 0.000000 +v -1.380400 -2.463 0.000000 +v -1.376868 -1.323225 -1.376867 +v -1.376867 -1.323225 1.376868 +v -1.372712 -0.084525 -0.461116 +v -1.372712 -0.084525 0.461116 +v -1.372294 -2.4945 -0.228104 +v -1.372294 -2.4945 0.228104 +v -1.368074 -2.435437 -0.227403 +v -1.368074 -2.435437 0.227403 +v -1.366728 -2.482687 -0.459107 +v -1.366728 -2.482687 0.459107 +v -1.364595 -0.0648 -0.226824 +v -1.364595 -0.0648 0.226824 +v -1.364422 -2.482687 -0.226795 +v -1.364422 -2.482687 0.226795 +v -1.362620 -2.463 -0.226496 +v -1.362620 -2.463 0.226496 +v -1.356353 -0.3168 -0.995410 +v -1.356353 -0.3168 0.995410 +v -1.348469 -2.4945 -0.452973 +v -1.348469 -2.4945 0.452973 +v -1.347218 -0.177075 0.700921 +v -1.347218 -0.177075 -0.700921 +v -1.346160 -1.4712 -1.346160 +v -1.346160 -1.4712 1.346160 +v -1.343320 -0.553725 -1.343320 +v -1.343320 -0.553725 1.343320 +v -1.334760 -2.4 -0.694440 +v -1.334760 -0.15 -0.694440 +v -1.334760 -0.15 0.694440 +v -1.334760 -0.15 0.694440 +v -1.334760 -2.4 0.694440 +v -1.334760 -0.15 -0.694440 +v -1.333693 -2.0856 -0.978780 +v -1.333693 -2.0856 0.978780 +v -1.332632 -2.498438 -0.447653 +v -1.332632 -2.498438 0.447653 +v -1.331623 -0.127575 0.692808 +v -1.331623 -0.127575 -0.692808 +v -1.329664 -2.4 -0.446656 +v -1.329664 -2.4 0.446656 +v -1.320356 -2.4945 -0.443529 +v -1.320356 -2.4945 0.443529 +v -1.317675 -0.1056 -0.685551 +v -1.317675 -0.1056 0.685551 +v -1.317252 -2.435437 -0.685331 +v -1.317252 -2.435437 0.685331 +v -1.316296 -2.435437 -0.442166 +v -1.316296 -2.435437 0.442166 +v -1.312948 -0.0648 0.441041 +v -1.312948 -0.0648 -0.441041 +v -1.312782 -2.482687 -0.440985 +v -1.312782 -2.482687 0.440985 +v -1.311049 -2.463 -0.440403 +v -1.311049 -2.463 0.440403 +v -1.309063 -1.621875 -1.309063 +v -1.309063 -1.621875 1.309063 +v -1.301322 -0.260025 0.955023 +v -1.301322 -0.260025 -0.955023 +v -1.300000 -2.4 0.000000 +v -1.300000 -2.4 0.000000 +v -1.298810 -2.463 -0.675736 +v -1.298810 -2.463 0.675736 +v -1.295040 -0.4632 -1.295040 +v -1.295040 -0.4632 1.295040 +v -1.286108 -0.084525 -0.669128 +v -1.286108 -0.084525 0.669128 +v -1.284375 -0.046875 0.000000 +v -1.284375 -0.046875 0.000000 +v -1.283256 -2.4 -0.213304 +v -1.283256 -2.4 0.213304 +v -1.280502 -2.482687 -0.666211 +v -1.280502 -2.482687 0.666211 +v -1.274600 -2.4408 0.000000 +v -1.274600 -2.4408 0.000000 +v -1.274414 -2.242575 -0.935276 +v -1.274414 -2.242575 0.935276 +v -1.267832 -0.046875 -0.210740 +v -1.267832 -0.046875 0.210740 +v -1.266640 -1.7748 -1.266640 +v -1.266640 -1.7748 1.266640 +v -1.263395 -2.4945 -0.657311 +v -1.263395 -2.4945 0.657311 +v -1.258183 -2.4408 0.209136 +v -1.258183 -2.4408 -0.209136 +v -1.256003 -0.2136 0.921764 +v -1.256003 -0.2136 -0.921764 +v -1.248557 -2.498438 -0.649591 +v -1.248557 -2.498438 0.649591 +v -1.245776 -2.4 -0.648144 +v -1.245776 -2.4 0.648144 +v -1.242500 -0.384375 -1.242500 +v -1.242500 -0.384375 1.242500 +v -1.237056 -2.4945 -0.643607 +v -1.237056 -2.4945 0.643607 +v -1.234688 -2.4 -0.414752 +v -1.234688 -2.4 0.414752 +v -1.233252 -2.435437 -0.641628 +v -1.233252 -2.435437 0.641628 +v -1.230115 -0.0648 -0.639996 +v -1.230115 -0.0648 0.639996 +v -1.229959 -2.482687 -0.639915 +v -1.229959 -2.482687 0.639915 +v -1.228335 -2.463 -0.639070 +v -1.228335 -2.463 0.639070 +v -1.225250 -0.177075 0.899195 +v -1.225250 -0.177075 -0.899195 +v -1.219958 -1.929525 1.219958 +v -1.219958 -1.929525 -1.219958 +v -1.219848 -0.046875 -0.409767 +v -1.219848 -0.046875 0.409767 +v -1.213920 -2.4 -0.890880 +v -1.213920 -0.15 -0.890880 +v -1.213920 -0.15 -0.890880 +v -1.213920 -0.15 0.890880 +v -1.213920 -0.15 0.890880 +v -1.213920 -2.4 0.890880 +v -1.211067 -0.127575 0.888786 +v -1.211067 -0.127575 -0.888786 +v -1.210564 -2.4408 0.406648 +v -1.210564 -2.4408 -0.406648 +v -1.204800 -2.4744 0.000000 +v -1.204800 -2.4744 0.000000 +v -1.198382 -0.1056 -0.879477 +v -1.198382 -0.1056 0.879477 +v -1.197997 -2.435437 -0.879195 +v -1.197997 -2.435437 0.879195 +v -1.189960 -0.3168 -1.189960 +v -1.189960 -0.3168 1.189960 +v -1.189282 -2.4744 -0.197684 +v -1.189282 -2.4744 0.197684 +v -1.187840 -0.9 -1.618560 +v -1.187840 -0.9 -1.618560 +v -1.187840 -0.9 1.618560 +v -1.187840 -0.9 1.618560 +v -1.183534 -1.037175 -1.612693 +v -1.183534 -1.037175 1.612693 +v -1.181225 -2.463 -0.866886 +v -1.181225 -2.463 0.866886 +v -1.179525 -0.771675 -1.607230 +v -1.179525 -0.771675 1.607230 +v -1.171210 -1.1784 -1.595900 +v -1.171210 -1.1784 1.595900 +v -1.170080 -2.0856 -1.170080 +v -1.170080 -2.0856 1.170080 +v -1.169673 -0.084525 -0.858407 +v -1.169673 -0.084525 0.858407 +v -1.164574 -2.482687 -0.854666 +v -1.164574 -2.482687 0.854666 +v -1.156956 -0.6564 -1.576477 +v -1.156956 -0.6564 1.576477 +v -1.156792 -2.4 -0.601848 +v -1.156792 -2.4 0.601848 +v -1.151759 -1.323225 -1.569396 +v -1.151759 -1.323225 1.569396 +v -1.149016 -2.4945 -0.843248 +v -1.149016 -2.4945 0.843248 +v -1.144271 -2.4744 -0.384379 +v -1.144271 -2.4744 0.384379 +v -1.143600 -0.0312 0.000000 +v -1.143600 -0.0312 0.000000 +v -1.142888 -0.046875 -0.594614 +v -1.142888 -0.046875 0.594614 +v -1.141680 -0.260025 1.141680 +v -1.141680 -0.260025 -1.141680 +v -1.135521 -2.498438 -0.833344 +v -1.135521 -2.498438 0.833344 +v -1.134190 -2.4408 0.590089 +v -1.134190 -2.4408 -0.590089 +v -1.132992 -2.4 -0.831488 +v -1.132992 -2.4 0.831488 +v -1.128870 -0.0312 -0.187642 +v -1.128870 -0.0312 0.187642 +v -1.126072 -1.4712 -1.534395 +v -1.126072 -1.4712 1.534395 +v -1.125061 -2.4945 -0.825668 +v -1.125061 -2.4945 0.825668 +v -1.123697 -0.553725 -1.531158 +v -1.123697 -0.553725 1.531158 +v -1.121601 -2.435437 -0.823129 +v -1.121601 -2.435437 0.823129 +v -1.118749 -0.0648 -0.821035 +v -1.118749 -0.0648 0.821035 +v -1.118607 -2.482687 -0.820931 +v -1.118607 -2.482687 0.820931 +v -1.118073 -2.242575 -1.118073 +v -1.118073 -2.242575 1.118073 +v -1.117130 -2.463 -0.819847 +v -1.117130 -2.463 0.819847 +v -1.101920 -0.2136 1.101920 +v -1.101920 -0.2136 -1.101920 +v -1.100200 -2.5026 0.000000 +v -1.100200 -2.5026 0.000000 +v -1.095040 -1.621875 -1.492110 +v -1.095040 -1.621875 1.492110 +v -1.086146 -0.0312 0.364854 +v -1.086146 -0.0312 -0.364854 +v -1.086029 -2.5026 0.180521 +v -1.086029 -2.5026 -0.180521 +v -1.083310 -0.4632 -1.476127 +v -1.083310 -0.4632 1.476127 +v -1.074940 -0.177075 -1.074940 +v -1.074940 -0.177075 1.074940 +v -1.072079 -2.4744 -0.557774 +v -1.072079 -2.4744 0.557774 +v -1.065000 -2.4 -1.065000 +v -1.065000 -0.15 -1.065000 +v -1.065000 -0.15 1.065000 +v -1.065000 -2.4 1.065000 +v -1.062497 -0.127575 1.062497 +v -1.062497 -0.127575 -1.062497 +v -1.059553 -1.7748 -1.443756 +v -1.059553 -1.7748 1.443756 +v -1.052064 -2.4 -0.772096 +v -1.052064 -2.4 0.772096 +v -1.051368 -0.1056 -1.051368 +v -1.051368 -0.1056 1.051368 +v -1.051031 -2.435437 -1.051031 +v -1.051031 -2.435437 1.051031 +v -1.044926 -2.5026 -0.351008 +v -1.044926 -2.5026 0.351008 +v -1.039419 -0.046875 -0.762816 +v -1.039419 -0.046875 0.762816 +v -1.039360 -0.384375 -1.416240 +v -1.039360 -0.384375 1.416240 +v -1.036316 -2.463 -1.036316 +v -1.036316 -2.463 1.036316 +v -1.031508 -2.4408 0.757010 +v -1.031508 -2.4408 -0.757010 +v -1.026181 -0.084525 -1.026181 +v -1.026181 -0.084525 1.026181 +v -1.021708 -2.482687 -1.021708 +v -1.021708 -2.482687 1.021708 +v -1.020503 -1.929525 -1.390545 +v -1.020503 -1.929525 1.390545 +v -1.017621 -0.0312 0.529441 +v -1.017621 -0.0312 -0.529441 +v -1.008058 -2.4945 -1.008058 +v -1.008058 -2.4945 1.008058 +v -0.996219 -2.498438 -0.996219 +v -0.996219 -2.498438 0.996219 +v -0.995410 -0.3168 -1.356353 +v -0.995410 -0.3168 1.356353 +v -0.994000 -2.4 -0.994000 +v -0.994000 -2.4 0.994000 +v -0.987042 -2.4945 -0.987042 +v -0.987042 -2.4945 0.987042 +v -0.984007 -2.435437 -0.984007 +v -0.984007 -2.435437 0.984007 +v -0.981504 -0.0648 0.981504 +v -0.981504 -0.0648 -0.981504 +v -0.981380 -2.482687 -0.981380 +v -0.981380 -2.482687 0.981380 +v -0.980084 -2.463 -0.980084 +v -0.980084 -2.463 0.980084 +v -0.979002 -2.5026 0.509349 +v -0.979002 -2.5026 -0.509349 +v -0.978780 -2.0856 -1.333693 +v -0.978780 -2.0856 1.333693 +v -0.975021 -2.4744 -0.715555 +v -0.975021 -2.4744 0.715555 +v -0.970400 -2.5272 0.000000 +v -0.970400 -2.5272 0.000000 +v -0.957901 -2.5272 -0.159223 +v -0.957901 -2.5272 0.159223 +v -0.955023 -0.260025 1.301322 +v -0.955023 -0.260025 -1.301322 +v -0.952425 -0.018225 -0.000000 +v -0.952425 -0.018225 0.000000 +v -0.940158 -0.018225 0.156274 +v -0.940158 -0.018225 -0.156274 +v -0.935276 -2.242575 -1.274414 +v -0.935276 -2.242575 1.274414 +v -0.925920 -0.9 -1.779680 +v -0.925920 -0.9 1.779680 +v -0.925920 -0.9 1.779680 +v -0.925920 -0.9 -1.779680 +v -0.925493 -0.0312 0.679207 +v -0.925493 -0.0312 -0.679207 +v -0.923000 -2.4 -0.923000 +v -0.923000 -2.4 0.923000 +v -0.922564 -1.037175 1.773229 +v -0.922564 -1.037175 -1.773229 +v -0.921764 -0.2136 1.256003 +v -0.921764 -0.2136 -1.256003 +v -0.921647 -2.5272 -0.309596 +v -0.921647 -2.5272 0.309596 +v -0.919439 -0.771675 -1.767222 +v -0.919439 -0.771675 1.767222 +v -0.912957 -1.1784 -1.754764 +v -0.912957 -1.1784 1.754764 +v -0.911906 -0.046875 -0.911906 +v -0.911906 -0.046875 0.911906 +v -0.904966 -2.4408 0.904966 +v -0.904966 -2.4408 -0.904966 +v -0.904575 -0.018225 0.303862 +v -0.904575 -0.018225 -0.303862 +v -0.901846 -0.6564 -1.733408 +v -0.901846 -0.6564 1.733408 +v -0.899195 -0.177075 1.225250 +v -0.899195 -0.177075 -1.225250 +v -0.897795 -1.323225 -1.725622 +v -0.897795 -1.323225 1.725622 +v -0.890880 -0.15 -1.213920 +v -0.890880 -0.15 1.213920 +v -0.890880 -2.4 -1.213920 +v -0.890880 -0.15 -1.213920 +v -0.890880 -0.15 1.213920 +v -0.890880 -2.4 1.213920 +v -0.890370 -2.5026 -0.653431 +v -0.890370 -2.5026 0.653431 +v -0.888786 -0.127575 1.211067 +v -0.888786 -0.127575 -1.211067 +v -0.879477 -0.1056 -1.198382 +v -0.879477 -0.1056 1.198382 +v -0.879195 -2.435437 -1.197997 +v -0.879195 -2.435437 1.197997 +v -0.877772 -1.4712 -1.687137 +v -0.877772 -1.4712 1.687137 +v -0.875920 -0.553725 -1.683577 +v -0.875920 -0.553725 1.683577 +v -0.866886 -2.463 -1.181225 +v -0.866886 -2.463 1.181225 +v -0.863501 -2.5272 -0.449256 +v -0.863501 -2.5272 0.449256 +v -0.858407 -0.084525 -1.169673 +v -0.858407 -0.084525 1.169673 +v -0.855408 -2.4744 -0.855408 +v -0.855408 -2.4744 0.855408 +v -0.854666 -2.482687 -1.164574 +v -0.854666 -2.482687 1.164574 +v -0.853583 -1.621875 -1.640643 +v -0.853583 -1.621875 1.640643 +v -0.847506 -0.018225 -0.440935 +v -0.847506 -0.018225 0.440935 +v -0.844439 -0.4632 1.623068 +v -0.844439 -0.4632 -1.623068 +v -0.843248 -2.4945 -1.149016 +v -0.843248 -2.4945 1.149016 +v -0.833344 -2.498438 -1.135521 +v -0.833344 -2.498438 1.135521 +v -0.831488 -2.4 -1.132992 +v -0.831488 -2.4 1.132992 +v -0.825921 -1.7748 1.587475 +v -0.825921 -1.7748 -1.587475 +v -0.825668 -2.4945 -1.125061 +v -0.825668 -2.4945 1.125061 +v -0.825000 -2.55 0.000000 +v -0.825000 -2.55 0.000000 +v -0.823129 -2.435437 -1.121601 +v -0.823129 -2.435437 1.121601 +v -0.821035 -0.0648 1.118749 +v -0.821035 -0.0648 -1.118749 +v -0.820931 -2.482687 1.118607 +v -0.820931 -2.482687 -1.118607 +v -0.819847 -2.463 -1.117130 +v -0.819847 -2.463 1.117130 +v -0.814374 -2.55 -0.135366 +v -0.814374 -2.55 0.135366 +v -0.811956 -0.0312 0.811956 +v -0.811956 -0.0312 -0.811956 +v -0.810180 -0.384375 1.557220 +v -0.810180 -0.384375 -1.557220 +v -0.795481 -1.929525 1.528968 +v -0.795481 -1.929525 -1.528968 +v -0.785325 -2.5272 -0.576340 +v -0.785325 -2.5272 0.576340 +v -0.783552 -2.55 -0.263208 +v -0.783552 -2.55 0.263208 +v -0.781142 -2.5026 -0.781142 +v -0.781142 -2.5026 0.781142 +v -0.775921 -0.3168 -1.491372 +v -0.775921 -0.3168 1.491372 +v -0.772096 -2.4 -1.052064 +v -0.772096 -2.4 1.052064 +v -0.770779 -0.018225 0.565664 +v -0.770779 -0.018225 -0.565664 +v -0.762958 -2.0856 -1.466456 +v -0.762958 -2.0856 1.466456 +v -0.762816 -0.046875 -1.039419 +v -0.762816 -0.046875 1.039419 +v -0.757010 -2.4408 1.031508 +v -0.757010 -2.4408 -1.031508 +v -0.744440 -0.260025 1.430863 +v -0.744440 -0.260025 -1.430863 +v -0.734118 -2.55 -0.381942 +v -0.734118 -2.55 0.381942 +v -0.729046 -2.242575 -1.401276 +v -0.729046 -2.242575 1.401276 +v -0.718514 -0.2136 1.381032 +v -0.718514 -0.2136 -1.381032 +v -0.715555 -2.4744 -0.975021 +v -0.715555 -2.4744 0.975021 +v -0.703200 -0.0084 0.000000 +v -0.700921 -0.177075 1.347218 +v -0.700921 -0.177075 -1.347218 +v -0.694440 -0.15 -1.334760 +v -0.694440 -0.15 1.334760 +v -0.694440 -2.4 1.334760 +v -0.694440 -0.15 1.334760 +v -0.694440 -2.4 -1.334760 +v -0.694440 -0.15 -1.334760 +v -0.694143 -0.0084 -0.115381 +v -0.694143 -0.0084 0.115381 +v -0.692808 -0.127575 1.331623 +v -0.692808 -0.127575 -1.331623 +v -0.688984 -2.5272 -0.688984 +v -0.688984 -2.5272 0.688984 +v -0.685551 -0.1056 -1.317675 +v -0.685551 -0.1056 1.317675 +v -0.685331 -2.435437 -1.317252 +v -0.685331 -2.435437 1.317252 +v -0.679207 -0.0312 -0.925493 +v -0.679207 -0.0312 0.925493 +v -0.676222 -0.018225 0.676222 +v -0.676222 -0.018225 -0.676222 +v -0.675736 -2.463 -1.298810 +v -0.675736 -2.463 1.298810 +v -0.673600 -2.5728 0.000000 +v -0.673600 -2.5728 0.000000 +v -0.669128 -0.084525 -1.286108 +v -0.669128 -0.084525 1.286108 +v -0.667871 -0.0084 -0.224349 +v -0.667871 -0.0084 0.224349 +v -0.667656 -2.55 -0.489984 +v -0.667656 -2.55 0.489984 +v -0.666211 -2.482687 1.280502 +v -0.666211 -2.482687 -1.280502 +v -0.664924 -2.5728 -0.110524 +v -0.664924 -2.5728 0.110524 +v -0.657311 -2.4945 -1.263395 +v -0.657311 -2.4945 1.263395 +v -0.653431 -2.5026 -0.890370 +v -0.653431 -2.5026 0.890370 +v -0.649591 -2.498438 -1.248557 +v -0.649591 -2.498438 1.248557 +v -0.648144 -2.4 -1.245776 +v -0.648144 -2.4 1.245776 +v -0.643607 -2.4945 -1.237056 +v -0.643607 -2.4945 1.237056 +v -0.641628 -2.435437 -1.233252 +v -0.641628 -2.435437 1.233252 +v -0.639996 -0.0648 -1.230115 +v -0.639996 -0.0648 1.230115 +v -0.639915 -2.482687 1.229959 +v -0.639915 -2.482687 -1.229959 +v -0.639758 -2.5728 -0.214905 +v -0.639758 -2.5728 0.214905 +v -0.639070 -2.463 -1.228335 +v -0.639070 -2.463 1.228335 +v -0.638080 -0.9 -1.899520 +v -0.638080 -0.9 -1.899520 +v -0.638080 -0.9 1.899520 +v -0.638080 -0.9 1.899520 +v -0.635767 -1.037175 -1.892634 +v -0.635767 -1.037175 1.892634 +v -0.633613 -0.771675 -1.886223 +v -0.633613 -0.771675 1.886223 +v -0.629147 -1.1784 -1.872927 +v -0.629147 -1.1784 1.872927 +v -0.625735 -0.0084 0.325553 +v -0.625735 -0.0084 -0.325553 +v -0.621490 -0.6564 -1.850132 +v -0.621490 -0.6564 1.850132 +v -0.618698 -1.323225 -1.841822 +v -0.618698 -1.323225 1.841822 +v -0.604900 -1.4712 -1.800745 +v -0.604900 -1.4712 1.800745 +v -0.603624 -0.553725 -1.796946 +v -0.603624 -0.553725 1.796946 +v -0.601848 -2.4 -1.156792 +v -0.601848 -2.4 1.156792 +v -0.599396 -2.5728 -0.311850 +v -0.599396 -2.5728 0.311850 +v -0.594614 -0.046875 -1.142888 +v -0.594614 -0.046875 1.142888 +v -0.590089 -2.4408 1.134190 +v -0.590089 -2.4408 -1.134190 +v -0.588230 -1.621875 -1.751120 +v -0.588230 -1.621875 1.751120 +v -0.585750 -2.55 -0.585750 +v -0.585750 -2.55 0.585750 +v -0.581929 -0.4632 -1.732362 +v -0.581929 -0.4632 1.732362 +v -0.576340 -2.5272 -0.785325 +v -0.576340 -2.5272 0.785325 +v -0.569167 -1.7748 -1.694372 +v -0.569167 -1.7748 1.694372 +v -0.569086 -0.0084 -0.417645 +v -0.569086 -0.0084 0.417645 +v -0.565664 -0.018225 0.770779 +v -0.565664 -0.018225 -0.770779 +v -0.558320 -0.384375 -1.662080 +v -0.558320 -0.384375 1.662080 +v -0.557774 -2.4744 -1.072079 +v -0.557774 -2.4744 1.072079 +v -0.548190 -1.929525 -1.631925 +v -0.548190 -1.929525 1.631925 +v -0.545131 -2.5728 -0.400065 +v -0.545131 -2.5728 0.400065 +v -0.534711 -0.3168 -1.591798 +v -0.534711 -0.3168 1.591798 +v -0.529441 -0.0312 -1.017621 +v -0.529441 -0.0312 1.017621 +v -0.525800 -2.5974 0.000000 +v -0.525800 -2.5974 0.000000 +v -0.525778 -2.0856 -1.565204 +v -0.525778 -2.0856 1.565204 +v -0.519028 -2.5974 0.086273 +v -0.519028 -2.5974 -0.086273 +v -0.513016 -0.260025 -1.527214 +v -0.513016 -0.260025 1.527214 +v -0.509349 -2.5026 0.979002 +v -0.509349 -2.5026 -0.979002 +v -0.502408 -2.242575 -1.495635 +v -0.502408 -2.242575 1.495635 +v -0.499384 -2.5974 -0.167751 +v -0.499384 -2.5974 0.167751 +v -0.499272 -0.0084 -0.499272 +v -0.499272 -0.0084 0.499272 +v -0.495150 -0.2136 -1.474028 +v -0.495150 -0.2136 1.474028 +v -0.489984 -2.55 -0.667656 +v -0.489984 -2.55 0.667656 +v -0.483027 -0.177075 -1.437937 +v -0.483027 -0.177075 1.437937 +v -0.478560 -0.15 1.424640 +v -0.478560 -2.4 -1.424640 +v -0.478560 -0.15 -1.424640 +v -0.478560 -0.15 -1.424640 +v -0.478560 -0.15 1.424640 +v -0.478560 -2.4 1.424640 +v -0.478256 -2.5728 -0.478256 +v -0.478256 -2.5728 0.478256 +v -0.477435 -0.127575 1.421292 +v -0.477435 -0.127575 -1.421292 +v -0.472434 -0.1056 1.406405 +v -0.472434 -0.1056 -1.406405 +v -0.472283 -2.435437 -1.405953 +v -0.472283 -2.435437 1.405953 +v -0.467878 -2.5974 -0.243424 +v -0.467878 -2.5974 0.243424 +v -0.465671 -2.463 -1.386270 +v -0.465671 -2.463 1.386270 +v -0.461116 -0.084525 1.372712 +v -0.461116 -0.084525 -1.372712 +v -0.459107 -2.482687 -1.366728 +v -0.459107 -2.482687 1.366728 +v -0.452973 -2.4945 -1.348469 +v -0.452973 -2.4945 1.348469 +v -0.449256 -2.5272 -0.863501 +v -0.449256 -2.5272 0.863501 +v -0.447653 -2.498438 -1.332632 +v -0.447653 -2.498438 1.332632 +v -0.446656 -2.4 -1.329664 +v -0.446656 -2.4 1.329664 +v -0.443529 -2.4945 -1.320356 +v -0.443529 -2.4945 1.320356 +v -0.442166 -2.435437 -1.316296 +v -0.442166 -2.435437 1.316296 +v -0.441041 -0.0648 1.312948 +v -0.441041 -0.0648 -1.312948 +v -0.440985 -2.482687 -1.312782 +v -0.440985 -2.482687 1.312782 +v -0.440935 -0.018225 0.847506 +v -0.440935 -0.018225 -0.847506 +v -0.440403 -2.463 -1.311049 +v -0.440403 -2.463 1.311049 +v -0.425519 -2.5974 0.312283 +v -0.425519 -2.5974 -0.312283 +v -0.417645 -0.0084 -0.569086 +v -0.417645 -0.0084 0.569086 +v -0.414752 -2.4 -1.234688 +v -0.414752 -2.4 1.234688 +v -0.409767 -0.046875 1.219848 +v -0.409767 -0.046875 -1.219848 +v -0.406648 -2.4408 -1.210564 +v -0.406648 -2.4408 1.210564 +v -0.400065 -2.5728 -0.545131 +v -0.400065 -2.5728 0.545131 +v -0.391200 -2.6256 0.000000 +v -0.391200 -2.6256 0.000000 +v -0.388275 -0.002175 -0.000000 +v -0.388275 -0.002175 0.000000 +v -0.386161 -2.6256 -0.064188 +v -0.386161 -2.6256 0.064188 +v -0.384379 -2.4744 -1.144271 +v -0.384379 -2.4744 1.144271 +v -0.383274 -0.002175 -0.063708 +v -0.383274 -0.002175 0.063708 +v -0.381942 -2.55 -0.734118 +v -0.381942 -2.55 0.734118 +v -0.373318 -2.5974 -0.373318 +v -0.373318 -2.5974 0.373318 +v -0.371546 -2.6256 -0.124808 +v -0.371546 -2.6256 0.124808 +v -0.368768 -0.002175 -0.123875 +v -0.368768 -0.002175 0.123875 +v -0.364854 -0.0312 1.086146 +v -0.364854 -0.0312 -1.086146 +v -0.358400 -3.0348 0.000000 +v -0.358400 -3.0348 0.000000 +v -0.358200 -3.08115 0.000000 +v -0.358200 -3.08115 0.000000 +v -0.353807 -3.0348 -0.059016 +v -0.353807 -3.0348 0.059016 +v -0.353610 -3.08115 -0.058988 +v -0.353610 -3.08115 0.058988 +v -0.351008 -2.5026 -1.044926 +v -0.351008 -2.5026 1.044926 +v -0.348105 -2.6256 -0.181110 +v -0.348105 -2.6256 0.181110 +v -0.345503 -0.002175 -0.179756 +v -0.345503 -0.002175 0.179756 +v -0.340477 -3.0348 -0.114676 +v -0.340477 -3.0348 0.114676 +v -0.340289 -3.08115 -0.114619 +v -0.340289 -3.08115 0.114619 +v -0.328160 -0.9 -1.974240 +v -0.328160 -0.9 1.974240 +v -0.328160 -0.9 1.974240 +v -0.326970 -1.037175 -1.967083 +v -0.326970 -1.037175 1.967083 +v -0.325863 -0.771675 -1.960420 +v -0.325863 -0.771675 1.960420 +v -0.325553 -0.0084 -0.625735 +v -0.325553 -0.0084 0.625735 +v -0.325000 -2.98125 0.000000 +v -0.325000 -2.98125 0.000000 +v -0.323566 -1.1784 -1.946601 +v -0.323566 -1.1784 1.946601 +v -0.320834 -2.98125 -0.053508 +v -0.320834 -2.98125 0.053508 +v -0.319628 -0.6564 -1.922910 +v -0.319628 -0.6564 1.922910 +v -0.319082 -3.0348 -0.166306 +v -0.319082 -3.0348 0.166306 +v -0.318907 -3.08115 -0.166221 +v -0.318907 -3.08115 0.166221 +v -0.318192 -1.323225 -1.914272 +v -0.318192 -1.323225 1.914272 +v -0.316590 -2.6256 -0.232342 +v -0.316590 -2.6256 0.232342 +v -0.314223 -0.002175 -0.230604 +v -0.314223 -0.002175 0.230604 +v -0.312283 -2.5974 -0.425519 +v -0.312283 -2.5974 0.425519 +v -0.311850 -2.5728 -0.599396 +v -0.311850 -2.5728 0.599396 +v -0.311096 -1.4712 -1.871580 +v -0.311096 -1.4712 1.871580 +v -0.310439 -0.553725 -1.867631 +v -0.310439 -0.553725 1.867631 +v -0.309596 -2.5272 -0.921647 +v -0.309596 -2.5272 0.921647 +v -0.308800 -3.1176 0.000000 +v -0.308800 -3.1176 0.000000 +v -0.308744 -2.98125 -0.103976 +v -0.308744 -2.98125 0.103976 +v -0.304843 -3.1176 -0.050855 +v -0.304843 -3.1176 0.050855 +v -0.303862 -0.018225 0.904575 +v -0.303862 -0.018225 -0.904575 +v -0.302523 -1.621875 -1.820003 +v -0.302522 -1.621875 1.820003 +v -0.299282 -0.4632 -1.800507 +v -0.299282 -0.4632 1.800507 +v -0.293360 -3.1176 -0.098814 +v -0.293360 -3.1176 0.098814 +v -0.292719 -1.7748 -1.761022 +v -0.292719 -1.7748 1.761022 +v -0.290295 -3.0348 -0.213234 +v -0.290295 -3.0348 0.213234 +v -0.290138 -3.08115 -0.213123 +v -0.290138 -3.08115 0.213123 +v -0.289340 -2.98125 -0.150793 +v -0.289340 -2.98125 0.150793 +v -0.287140 -0.384375 -1.727460 +v -0.287140 -0.384375 1.727460 +v -0.281930 -1.929525 1.696119 +v -0.281930 -1.929525 -1.696119 +v -0.279400 -2.6592 0.000000 +v -0.277752 -2.6256 -0.277752 +v -0.277752 -2.6256 0.277752 +v -0.275801 -2.6592 -0.045844 +v -0.275801 -2.6592 0.045844 +v -0.275675 -0.002175 -0.275675 +v -0.275675 -0.002175 0.275675 +v -0.274998 -0.3168 -1.654413 +v -0.274998 -0.3168 1.654413 +v -0.274928 -3.1176 -0.143301 +v -0.274928 -3.1176 0.143301 +v -0.273600 -2.9232 0.000000 +v -0.273600 -2.9232 0.000000 +v -0.270404 -2.0856 -1.626774 +v -0.270404 -2.0856 1.626774 +v -0.270092 -2.9232 -0.045032 +v -0.270092 -2.9232 0.045032 +v -0.265363 -2.6592 -0.089140 +v -0.265363 -2.6592 0.089140 +v -0.263841 -0.260025 1.587289 +v -0.263841 -0.260025 -1.587289 +v -0.263232 -2.98125 -0.193348 +v -0.263232 -2.98125 0.193348 +v -0.263208 -2.55 -0.783552 +v -0.263208 -2.55 0.783552 +v -0.259910 -2.9232 -0.087511 +v -0.259910 -2.9232 0.087511 +v -0.258385 -2.242575 -1.554467 +v -0.258385 -2.242575 1.554467 +v -0.254788 -3.0348 -0.254788 +v -0.254788 -3.0348 0.254788 +v -0.254653 -3.08115 -0.254653 +v -0.254653 -3.08115 0.254653 +v -0.254652 -0.2136 -1.532010 +v -0.254652 -0.2136 1.532010 +v -0.250127 -3.1176 -0.183734 +v -0.250127 -3.1176 0.183734 +v -0.248621 -2.6592 0.129351 +v -0.248621 -2.6592 -0.129351 +v -0.248417 -0.177075 -1.494500 +v -0.248417 -0.177075 1.494500 +v -0.246120 -0.15 1.480680 +v -0.246120 -2.4 -1.480680 +v -0.246120 -0.15 -1.480680 +v -0.246120 -0.15 -1.480680 +v -0.246120 -0.15 1.480680 +v -0.246120 -2.4 1.480680 +v -0.245542 -0.127575 1.477200 +v -0.245542 -0.127575 -1.477200 +v -0.243569 -2.9232 -0.126920 +v -0.243569 -2.9232 0.126920 +v -0.243424 -2.5974 0.467878 +v -0.243424 -2.5974 -0.467878 +v -0.242970 -0.1056 1.461727 +v -0.242970 -0.1056 -1.461727 +v -0.242892 -2.435437 -1.461258 +v -0.242892 -2.435437 1.461258 +v -0.239491 -2.463 -1.440800 +v -0.239491 -2.463 1.440800 +v -0.237149 -0.084525 1.426709 +v -0.237149 -0.084525 -1.426709 +v -0.236115 -2.482687 -1.420490 +v -0.236115 -2.482687 1.420490 +v -0.232961 -2.4945 -1.401513 +v -0.232961 -2.4945 1.401513 +v -0.232342 -2.6256 -0.316590 +v -0.232342 -2.6256 0.316590 +v -0.231031 -2.98125 -0.231031 +v -0.231031 -2.98125 0.231031 +v -0.230604 -0.002175 -0.314223 +v -0.230604 -0.002175 0.314223 +v -0.230225 -2.498438 -1.385053 +v -0.230225 -2.498438 1.385053 +v -0.229712 -2.4 -1.381968 +v -0.229712 -2.4 1.381968 +v -0.228104 -2.4945 -1.372294 +v -0.228104 -2.4945 1.372294 +v -0.227403 -2.435437 -1.368074 +v -0.227403 -2.435437 1.368074 +v -0.226824 -0.0648 1.364595 +v -0.226824 -0.0648 -1.364595 +v -0.226795 -2.482687 1.364422 +v -0.226795 -2.482687 -1.364422 +v -0.226496 -2.463 -1.362620 +v -0.226496 -2.463 1.362620 +v -0.226113 -2.6592 -0.165941 +v -0.226113 -2.6592 0.165941 +v -0.224349 -0.0084 0.667871 +v -0.224349 -0.0084 -0.667871 +v -0.221585 -2.9232 -0.162745 +v -0.221585 -2.9232 0.162745 +v -0.219800 -2.86335 0.000000 +v -0.219800 -2.86335 0.000000 +v -0.219536 -3.1176 -0.219536 +v -0.219536 -3.1176 0.219536 +v -0.216979 -2.86335 0.036157 +v -0.216979 -2.86335 -0.036157 +v -0.214905 -2.5728 -0.639758 +v -0.214905 -2.5728 0.639758 +v -0.213304 -2.4 -1.283256 +v -0.213304 -2.4 1.283256 +v -0.213234 -3.0348 -0.290295 +v -0.213234 -3.0348 0.290295 +v -0.213123 -3.08115 -0.290138 +v -0.213123 -3.08115 0.290138 +v -0.210740 -0.046875 -1.267832 +v -0.210740 -0.046875 1.267832 +v -0.209136 -2.4408 -1.258183 +v -0.209136 -2.4408 1.258183 +v -0.208794 -2.86335 0.070270 +v -0.208794 -2.86335 -0.070270 +v -0.200000 -2.7 0.000000 +v -0.200000 -2.7 0.000000 +v -0.200000 -2.7 0.000000 +v -0.200000 -2.7 0.000000 +v -0.198374 -2.6592 -0.198374 +v -0.198374 -2.6592 0.198374 +v -0.197684 -2.4744 -1.189282 +v -0.197684 -2.4744 1.189282 +v -0.197424 -2.7 -0.032816 +v -0.197424 -2.7 0.032816 +v -0.197424 -2.7 0.032816 +v -0.197424 -2.7 -0.032816 +v -0.195658 -2.86335 -0.101925 +v -0.195658 -2.86335 0.101925 +v -0.194600 -3.14145 0.000000 +v -0.194600 -3.14145 0.000000 +v -0.194472 -2.9232 -0.194472 +v -0.194472 -2.9232 0.194472 +v -0.193348 -2.98125 -0.263232 +v -0.193348 -2.98125 0.263232 +v -0.192107 -3.14145 -0.032048 +v -0.192107 -3.14145 0.032048 +v -0.189952 -2.7 -0.063808 +v -0.189952 -2.7 0.063808 +v -0.189952 -2.7 0.063808 +v -0.189952 -2.7 -0.063808 +v -0.187642 -0.0312 1.128870 +v -0.187642 -0.0312 -1.128870 +v -0.184870 -3.14145 -0.062272 +v -0.184870 -3.14145 0.062272 +v -0.183734 -3.1176 -0.250127 +v -0.183734 -3.1176 0.250127 +v -0.181110 -2.6256 0.348105 +v -0.181110 -2.6256 -0.348105 +v -0.180521 -2.5026 -1.086029 +v -0.180521 -2.5026 1.086029 +v -0.179756 -0.002175 -0.345503 +v -0.179756 -0.002175 0.345503 +v -0.179200 -2.8044 0.000000 +v -0.179200 -2.8044 0.000000 +v -0.177989 -2.86335 -0.130707 +v -0.177989 -2.86335 0.130707 +v -0.177968 -2.7 -0.092592 +v -0.177968 -2.7 0.092592 +v -0.177968 -2.7 0.092592 +v -0.177968 -2.7 -0.092592 +v -0.176897 -2.8044 0.029450 +v -0.176897 -2.8044 -0.029450 +v -0.173255 -3.14145 -0.090306 +v -0.173255 -3.14145 0.090306 +v -0.170215 -2.8044 0.057246 +v -0.170215 -2.8044 -0.057246 +v -0.167751 -2.5974 -0.499384 +v -0.167751 -2.5974 0.499384 +v -0.167400 -2.74905 0.000000 +v -0.167400 -2.74905 0.000000 +v -0.166306 -3.0348 -0.319082 +v -0.166306 -3.0348 0.319082 +v -0.166221 -3.08115 0.318907 +v -0.166221 -3.08115 -0.318907 +v -0.165941 -2.6592 -0.226113 +v -0.165941 -2.6592 0.226113 +v -0.165245 -2.74905 0.027480 +v -0.165245 -2.74905 -0.027480 +v -0.162745 -2.9232 -0.221585 +v -0.162745 -2.9232 0.221585 +v -0.161856 -2.7 -0.118784 +v -0.161856 -2.7 0.118784 +v -0.161856 -2.7 0.118784 +v -0.161856 -2.7 -0.118784 +v -0.159496 -2.8044 0.083047 +v -0.159496 -2.8044 -0.083047 +v -0.159223 -2.5272 -0.957901 +v -0.159223 -2.5272 0.957901 +v -0.158995 -2.74905 0.053428 +v -0.158995 -2.74905 -0.053428 +v -0.157626 -3.14145 -0.115787 +v -0.157626 -3.14145 0.115787 +v -0.156274 -0.018225 0.940158 +v -0.156274 -0.018225 -0.940158 +v -0.156200 -2.86335 -0.156200 +v -0.156200 -2.86335 0.156200 +v -0.150793 -2.98125 -0.289340 +v -0.150793 -2.98125 0.289340 +v -0.148969 -2.74905 0.077523 +v -0.148969 -2.74905 -0.077523 +v -0.145078 -2.8044 0.106513 +v -0.145078 -2.8044 -0.106513 +v -0.143301 -3.1176 -0.274928 +v -0.143301 -3.1176 0.274928 +v -0.142000 -2.7 -0.142000 +v -0.142000 -2.7 0.142000 +v -0.142000 -2.7 0.142000 +v -0.142000 -2.7 -0.142000 +v -0.138348 -3.14145 -0.138348 +v -0.138348 -3.14145 0.138348 +v -0.135489 -2.74905 0.099446 +v -0.135489 -2.74905 -0.099446 +v -0.135366 -2.55 -0.814374 +v -0.135366 -2.55 0.814374 +v -0.130707 -2.86335 -0.177989 +v -0.130707 -2.86335 0.177989 +v -0.129351 -2.6592 0.248621 +v -0.129351 -2.6592 -0.248621 +v -0.127304 -2.8044 0.127304 +v -0.127304 -2.8044 -0.127304 +v -0.126920 -2.9232 -0.243569 +v -0.126920 -2.9232 0.243569 +v -0.124808 -2.6256 -0.371546 +v -0.124808 -2.6256 0.371546 +v -0.123875 -0.002175 0.368768 +v -0.123875 -0.002175 -0.368768 +v -0.118874 -2.74905 0.118874 +v -0.118874 -2.74905 -0.118874 +v -0.118784 -2.7 -0.161856 +v -0.118784 -2.7 0.161856 +v -0.118784 -2.7 0.161856 +v -0.118784 -2.7 -0.161856 +v -0.115787 -3.14145 -0.157626 +v -0.115787 -3.14145 0.157626 +v -0.115381 -0.0084 0.694143 +v -0.115381 -0.0084 -0.694143 +v -0.114676 -3.0348 -0.340477 +v -0.114676 -3.0348 0.340477 +v -0.114619 -3.08115 -0.340289 +v -0.114619 -3.08115 0.340289 +v -0.110524 -2.5728 -0.664924 +v -0.110524 -2.5728 0.664924 +v -0.106513 -2.8044 -0.145078 +v -0.106513 -2.8044 0.145078 +v -0.103976 -2.98125 -0.308744 +v -0.103976 -2.98125 0.308744 +v -0.101925 -2.86335 -0.195658 +v -0.101925 -2.86335 0.195658 +v -0.099446 -2.74905 0.135489 +v -0.099446 -2.74905 -0.135489 +v -0.098814 -3.1176 -0.293360 +v -0.098814 -3.1176 0.293360 +v -0.092592 -2.7 -0.177968 +v -0.092592 -2.7 0.177968 +v -0.092592 -2.7 -0.177968 +v -0.092592 -2.7 0.177968 +v -0.090306 -3.14145 -0.173255 +v -0.090306 -3.14145 0.173255 +v -0.089140 -2.6592 -0.265363 +v -0.089140 -2.6592 0.265363 +v -0.087511 -2.9232 -0.259910 +v -0.087511 -2.9232 0.259910 +v -0.086273 -2.5974 -0.519028 +v -0.086273 -2.5974 0.519028 +v -0.083047 -2.8044 -0.159496 +v -0.083047 -2.8044 0.159496 +v -0.077523 -2.74905 -0.148969 +v -0.077523 -2.74905 0.148969 +v -0.070270 -2.86335 -0.208794 +v -0.070270 -2.86335 0.208794 +v -0.064188 -2.6256 -0.386161 +v -0.064188 -2.6256 0.386161 +v -0.063808 -2.7 -0.189952 +v -0.063808 -2.7 0.189952 +v -0.063808 -2.7 -0.189952 +v -0.063808 -2.7 0.189952 +v -0.063708 -0.002175 0.383274 +v -0.063708 -0.002175 -0.383274 +v -0.062272 -3.14145 -0.184870 +v -0.062272 -3.14145 0.184870 +v -0.059016 -3.0348 -0.353807 +v -0.059016 -3.0348 0.353807 +v -0.058988 -3.08115 -0.353610 +v -0.058988 -3.08115 0.353610 +v -0.057246 -2.8044 -0.170215 +v -0.057246 -2.8044 0.170215 +v -0.053508 -2.98125 -0.320834 +v -0.053508 -2.98125 0.320834 +v -0.053428 -2.74905 -0.158995 +v -0.053428 -2.74905 0.158995 +v -0.050855 -3.1176 -0.304843 +v -0.050855 -3.1176 0.304843 +v -0.045844 -2.6592 -0.275801 +v -0.045844 -2.6592 0.275801 +v -0.045032 -2.9232 -0.270092 +v -0.045032 -2.9232 0.270092 +v -0.036157 -2.86335 -0.216979 +v -0.036157 -2.86335 0.216979 +v -0.032816 -2.7 -0.197424 +v -0.032816 -2.7 0.197424 +v -0.032816 -2.7 -0.197424 +v -0.032816 -2.7 0.197424 +v -0.032048 -3.14145 -0.192107 +v -0.032048 -3.14145 0.192107 +v -0.029450 -2.8044 -0.176897 +v -0.029450 -2.8044 0.176897 +v -0.027480 -2.74905 -0.165245 +v -0.027480 -2.74905 0.165245 +v -0.000000 -0.260025 1.608000 +v -0.000000 -1.929525 1.718250 +v -0.000000 -2.0856 -1.648000 +v -0.000000 -0.6564 -1.948000 +v -0.000000 -0.771675 -1.986000 +v -0.000000 -2.482687 1.382225 +v -0.000000 -2.7 -0.200000 +v -0.000000 -0.127575 1.496475 +v -0.000000 -2.4744 -1.204800 +v -0.000000 -2.74905 -0.167400 +v -0.000000 -0.018225 0.952425 +v -0.000000 -0.046875 -1.284375 +v -0.000000 -0.0648 1.382400 +v -0.000000 -0.384375 1.750000 +v -0.000000 -0.4632 1.824000 +v -0.000000 -0.553725 -1.892000 +v -0.000000 -1.037175 1.992750 +v -0.000000 -1.1784 1.972000 +v -0.000000 -1.323225 -1.939250 +v -0.000000 -1.621875 -1.843750 +v -0.000000 -1.7748 1.784000 +v -0.000000 -2.4 -1.300000 +v -0.000000 -2.435437 -1.480325 +v -0.000000 -2.435437 -1.385925 +v -0.000000 -2.463 -1.459600 +v -0.000000 -2.463 -1.380400 +v -0.000000 -2.4945 -1.390200 +v -0.000000 -2.5026 -1.100200 +v -0.000000 -2.8044 -0.179200 +v -0.000000 -2.86335 -0.219800 +v -0.000000 -2.5728 -0.673600 +v -0.000000 -0.1056 1.480800 +v -0.000000 -0.177075 -1.514000 +v -0.000000 -2.4945 -1.419800 +v -0.000000 -2.5272 -0.970400 +v -0.000000 -2.9232 -0.273600 +v -0.000000 -3.1176 -0.308800 +v -0.000000 -2.5974 -0.525800 +v -0.000000 -2.7 -0.200000 +v -0.000000 -2.98125 -0.325000 +v -0.000000 -3.14145 -0.194600 +v -0.000000 -0.002175 0.388275 +v -0.000000 -3.08115 -0.358200 +v 0.000000 -0.0 0.000000 +v 0.000000 -0.002175 -0.388275 +v 0.000000 -0.002175 0.388275 +v 0.000000 -0.0084 -0.703200 +v 0.000000 -0.0084 0.703200 +v 0.000000 -0.018225 -0.952425 +v 0.000000 -0.018225 0.952425 +v 0.000000 -0.0312 -1.143600 +v 0.000000 -0.0312 -1.143600 +v 0.000000 -0.0312 1.143600 +v 0.000000 -0.0312 1.143600 +v 0.000000 -0.046875 -1.284375 +v 0.000000 -0.046875 1.284375 +v 0.000000 -0.0648 -1.382400 +v 0.000000 -0.0648 1.382400 +v 0.000000 -0.084525 -1.445325 +v 0.000000 -0.084525 -1.445325 +v 0.000000 -0.084525 1.445325 +v 0.000000 -0.084525 1.445325 +v 0.000000 -0.1056 -1.480800 +v 0.000000 -0.1056 1.480800 +v 0.000000 -0.127575 -1.496475 +v 0.000000 -0.127575 1.496475 +v 0.000000 -0.15 -1.500000 +v 0.000000 -0.15 -1.500000 +v 0.000000 -0.15 1.500000 +v 0.000000 -0.15 1.500000 +v 0.000000 -0.177075 -1.514000 +v 0.000000 -0.177075 1.514000 +v 0.000000 -0.2136 -1.552000 +v 0.000000 -0.2136 -1.552000 +v 0.000000 -0.2136 1.552000 +v 0.000000 -0.2136 1.552000 +v 0.000000 -0.260025 -1.608000 +v 0.000000 -0.260025 1.608000 +v 0.000000 -0.3168 -1.676000 +v 0.000000 -0.3168 -1.676000 +v 0.000000 -0.3168 1.676000 +v 0.000000 -0.3168 1.676000 +v 0.000000 -0.384375 -1.750000 +v 0.000000 -0.384375 1.750000 +v 0.000000 -0.4632 -1.824000 +v 0.000000 -0.4632 1.824000 +v 0.000000 -0.553725 -1.892000 +v 0.000000 -0.553725 1.892000 +v 0.000000 -0.6564 -1.948000 +v 0.000000 -0.6564 1.948000 +v 0.000000 -0.771675 -1.986000 +v 0.000000 -0.771675 1.986000 +v 0.000000 -0.9 -2.000000 +v 0.000000 -0.9 -2.000000 +v 0.000000 -0.9 2.000000 +v 0.000000 -0.9 2.000000 +v 0.000000 -1.037175 -1.992750 +v 0.000000 -1.037175 1.992750 +v 0.000000 -1.1784 -1.972000 +v 0.000000 -1.1784 1.972000 +v 0.000000 -1.323225 -1.939250 +v 0.000000 -1.323225 1.939250 +v 0.000000 -1.4712 -1.896000 +v 0.000000 -1.4712 -1.896000 +v 0.000000 -1.4712 1.896000 +v 0.000000 -1.4712 1.896000 +v 0.000000 -1.621875 -1.843750 +v 0.000000 -1.621875 1.843750 +v 0.000000 -1.7748 -1.784000 +v 0.000000 -1.7748 1.784000 +v 0.000000 -1.929525 -1.718250 +v 0.000000 -1.929525 1.718250 +v 0.000000 -2.0856 -1.648000 +v 0.000000 -2.0856 1.648000 +v 0.000000 -2.242575 -1.574750 +v 0.000000 -2.242575 -1.574750 +v 0.000000 -2.242575 1.574750 +v 0.000000 -2.242575 1.574750 +v 0.000000 -2.4 -1.500000 +v 0.000000 -2.4 -1.500000 +v 0.000000 -2.4 -1.400000 +v 0.000000 -2.4 -1.400000 +v 0.000000 -2.4 -1.300000 +v 0.000000 -2.4 1.300000 +v 0.000000 -2.4 1.400000 +v 0.000000 -2.4 1.400000 +v 0.000000 -2.4 1.500000 +v 0.000000 -2.4 1.500000 +v 0.000000 -2.435437 -1.480325 +v 0.000000 -2.435437 -1.385925 +v 0.000000 -2.435437 1.385925 +v 0.000000 -2.435437 1.480325 +v 0.000000 -2.4408 -1.274600 +v 0.000000 -2.4408 -1.274600 +v 0.000000 -2.4408 1.274600 +v 0.000000 -2.4408 1.274600 +v 0.000000 -2.463 -1.459600 +v 0.000000 -2.463 -1.380400 +v 0.000000 -2.463 1.380400 +v 0.000000 -2.463 1.459600 +v 0.000000 -2.4744 -1.204800 +v 0.000000 -2.4744 1.204800 +v 0.000000 -2.482687 -1.439025 +v 0.000000 -2.482687 -1.382225 +v 0.000000 -2.482687 1.382225 +v 0.000000 -2.482687 1.439025 +v 0.000000 -2.4945 -1.419800 +v 0.000000 -2.4945 -1.390200 +v 0.000000 -2.4945 1.390200 +v 0.000000 -2.4945 1.419800 +v 0.000000 -2.498438 -1.403125 +v 0.000000 -2.498438 -1.403125 +v 0.000000 -2.498438 1.403125 +v 0.000000 -2.498438 1.403125 +v 0.000000 -2.5026 -1.100200 +v 0.000000 -2.5026 1.100200 +v 0.000000 -2.5272 -0.970400 +v 0.000000 -2.5272 0.970400 +v 0.000000 -2.55 -0.825000 +v 0.000000 -2.55 -0.825000 +v 0.000000 -2.55 0.825000 +v 0.000000 -2.55 0.825000 +v 0.000000 -2.5728 -0.673600 +v 0.000000 -2.5728 0.673600 +v 0.000000 -2.5974 -0.525800 +v 0.000000 -2.5974 0.525800 +v 0.000000 -2.6256 -0.391200 +v 0.000000 -2.6256 -0.391200 +v 0.000000 -2.6256 0.391200 +v 0.000000 -2.6256 0.391200 +v 0.000000 -2.6592 -0.279400 +v 0.000000 -2.6592 0.279400 +v 0.000000 -2.7 -0.200000 +v 0.000000 -2.7 -0.200000 +v 0.000000 -2.7 0.200000 +v 0.000000 -2.7 0.200000 +v 0.000000 -2.74905 -0.167400 +v 0.000000 -2.74905 0.167400 +v 0.000000 -2.8044 -0.179200 +v 0.000000 -2.8044 0.179200 +v 0.000000 -2.86335 -0.219800 +v 0.000000 -2.86335 0.219800 +v 0.000000 -2.9232 -0.273600 +v 0.000000 -2.9232 0.273600 +v 0.000000 -2.98125 -0.325000 +v 0.000000 -2.98125 0.325000 +v 0.000000 -3.0348 -0.358400 +v 0.000000 -3.0348 -0.358400 +v 0.000000 -3.0348 0.358400 +v 0.000000 -3.0348 0.358400 +v 0.000000 -3.08115 -0.358200 +v 0.000000 -3.08115 0.358200 +v 0.000000 -3.1176 -0.308800 +v 0.000000 -3.1176 0.308800 +v 0.000000 -3.14145 -0.194600 +v 0.000000 -3.14145 0.194600 +v 0.000000 -3.15 0.000000 +v 0.000000 -0.002175 -0.388275 +v 0.000000 -3.08115 0.358200 +v 0.000000 -2.5974 0.525800 +v 0.000000 -2.7 0.200000 +v 0.000000 -2.98125 0.325000 +v 0.000000 -3.14145 0.194600 +v 0.000000 -3.1176 0.308800 +v 0.000000 -0.1056 -1.480800 +v 0.000000 -0.177075 1.514000 +v 0.000000 -2.4945 1.419800 +v 0.000000 -2.5272 0.970400 +v 0.000000 -2.9232 0.273600 +v 0.000000 -2.5728 0.673600 +v 0.000000 -2.86335 0.219800 +v 0.000000 -0.018225 -0.952425 +v 0.000000 -0.046875 1.284375 +v 0.000000 -0.0648 -1.382400 +v 0.000000 -0.384375 -1.750000 +v 0.000000 -0.4632 -1.824000 +v 0.000000 -0.553725 1.892000 +v 0.000000 -1.037175 -1.992750 +v 0.000000 -1.1784 -1.972000 +v 0.000000 -1.323225 1.939250 +v 0.000000 -1.621875 1.843750 +v 0.000000 -1.7748 -1.784000 +v 0.000000 -2.4 1.300000 +v 0.000000 -2.435437 1.385925 +v 0.000000 -2.435437 1.480325 +v 0.000000 -2.463 1.380400 +v 0.000000 -2.463 1.459600 +v 0.000000 -2.4945 1.390200 +v 0.000000 -2.5026 1.100200 +v 0.000000 -2.8044 0.179200 +v 0.000000 -2.74905 0.167400 +v 0.000000 -0.127575 -1.496475 +v 0.000000 -2.4744 1.204800 +v 0.000000 -0.6564 1.948000 +v 0.000000 -0.771675 1.986000 +v 0.000000 -2.482687 -1.382225 +v 0.000000 -2.7 0.200000 +v 0.000000 -0.260025 -1.608000 +v 0.000000 -1.929525 -1.718250 +v 0.000000 -2.0856 1.648000 +v 0.027480 -2.74905 -0.165245 +v 0.027480 -2.74905 0.165245 +v 0.029450 -2.8044 -0.176897 +v 0.029450 -2.8044 0.176897 +v 0.032048 -3.14145 -0.192107 +v 0.032048 -3.14145 0.192107 +v 0.032816 -2.7 -0.197424 +v 0.032816 -2.7 0.197424 +v 0.032816 -2.7 -0.197424 +v 0.032816 -2.7 0.197424 +v 0.036157 -2.86335 -0.216979 +v 0.036157 -2.86335 0.216979 +v 0.045032 -2.9232 -0.270092 +v 0.045032 -2.9232 0.270092 +v 0.045844 -2.6592 -0.275801 +v 0.045844 -2.6592 0.275801 +v 0.050855 -3.1176 -0.304843 +v 0.050855 -3.1176 0.304843 +v 0.053428 -2.74905 -0.158995 +v 0.053428 -2.74905 0.158995 +v 0.053508 -2.98125 -0.320834 +v 0.053508 -2.98125 0.320834 +v 0.057246 -2.8044 -0.170215 +v 0.057246 -2.8044 0.170215 +v 0.058988 -3.08115 -0.353610 +v 0.058988 -3.08115 0.353610 +v 0.059016 -3.0348 -0.353807 +v 0.059016 -3.0348 0.353807 +v 0.062272 -3.14145 -0.184870 +v 0.062272 -3.14145 0.184870 +v 0.063708 -0.002175 0.383274 +v 0.063708 -0.002175 -0.383274 +v 0.063808 -2.7 -0.189952 +v 0.063808 -2.7 0.189952 +v 0.063808 -2.7 -0.189952 +v 0.063808 -2.7 0.189952 +v 0.064188 -2.6256 -0.386161 +v 0.064188 -2.6256 0.386161 +v 0.070270 -2.86335 -0.208794 +v 0.070270 -2.86335 0.208794 +v 0.077523 -2.74905 -0.148969 +v 0.077523 -2.74905 0.148969 +v 0.083047 -2.8044 -0.159496 +v 0.083047 -2.8044 0.159496 +v 0.086273 -2.5974 -0.519028 +v 0.086273 -2.5974 0.519028 +v 0.087511 -2.9232 -0.259910 +v 0.087511 -2.9232 0.259910 +v 0.089140 -2.6592 -0.265363 +v 0.089140 -2.6592 0.265363 +v 0.090306 -3.14145 -0.173255 +v 0.090306 -3.14145 0.173255 +v 0.092592 -2.7 -0.177968 +v 0.092592 -2.7 0.177968 +v 0.092592 -2.7 -0.177968 +v 0.092592 -2.7 0.177968 +v 0.098814 -3.1176 -0.293360 +v 0.098814 -3.1176 0.293360 +v 0.099446 -2.74905 0.135489 +v 0.099446 -2.74905 -0.135489 +v 0.101925 -2.86335 -0.195658 +v 0.101925 -2.86335 0.195658 +v 0.103976 -2.98125 -0.308744 +v 0.103976 -2.98125 0.308744 +v 0.106513 -2.8044 -0.145078 +v 0.106513 -2.8044 0.145078 +v 0.110524 -2.5728 -0.664924 +v 0.110524 -2.5728 0.664924 +v 0.114619 -3.08115 -0.340289 +v 0.114619 -3.08115 0.340289 +v 0.114676 -3.0348 -0.340477 +v 0.114676 -3.0348 0.340477 +v 0.115381 -0.0084 0.694143 +v 0.115381 -0.0084 -0.694143 +v 0.115787 -3.14145 -0.157626 +v 0.115787 -3.14145 0.157626 +v 0.118784 -2.7 0.161856 +v 0.118784 -2.7 -0.161856 +v 0.118784 -2.7 -0.161856 +v 0.118784 -2.7 0.161856 +v 0.118874 -2.74905 0.118874 +v 0.118874 -2.74905 -0.118874 +v 0.123875 -0.002175 0.368768 +v 0.123875 -0.002175 -0.368768 +v 0.124808 -2.6256 -0.371546 +v 0.124808 -2.6256 0.371546 +v 0.126920 -2.9232 -0.243569 +v 0.126920 -2.9232 0.243569 +v 0.127304 -2.8044 0.127304 +v 0.127304 -2.8044 -0.127304 +v 0.129351 -2.6592 0.248621 +v 0.129351 -2.6592 -0.248621 +v 0.130707 -2.86335 -0.177989 +v 0.130707 -2.86335 0.177989 +v 0.135366 -2.55 -0.814374 +v 0.135366 -2.55 0.814374 +v 0.135489 -2.74905 0.099446 +v 0.135489 -2.74905 -0.099446 +v 0.138348 -3.14145 -0.138348 +v 0.138348 -3.14145 0.138348 +v 0.142000 -2.7 0.142000 +v 0.142000 -2.7 -0.142000 +v 0.142000 -2.7 -0.142000 +v 0.142000 -2.7 0.142000 +v 0.143301 -3.1176 -0.274928 +v 0.143301 -3.1176 0.274928 +v 0.145078 -2.8044 0.106513 +v 0.145078 -2.8044 -0.106513 +v 0.148969 -2.74905 0.077523 +v 0.148969 -2.74905 -0.077523 +v 0.150793 -2.98125 -0.289340 +v 0.150793 -2.98125 0.289340 +v 0.156200 -2.86335 -0.156200 +v 0.156200 -2.86335 0.156200 +v 0.156274 -0.018225 0.940158 +v 0.156274 -0.018225 -0.940158 +v 0.157626 -3.14145 -0.115787 +v 0.157626 -3.14145 0.115787 +v 0.158995 -2.74905 0.053428 +v 0.158995 -2.74905 -0.053428 +v 0.159223 -2.5272 -0.957901 +v 0.159223 -2.5272 0.957901 +v 0.159496 -2.8044 0.083047 +v 0.159496 -2.8044 -0.083047 +v 0.161856 -2.7 0.118784 +v 0.161856 -2.7 -0.118784 +v 0.161856 -2.7 -0.118784 +v 0.161856 -2.7 0.118784 +v 0.162745 -2.9232 -0.221585 +v 0.162745 -2.9232 0.221585 +v 0.165245 -2.74905 0.027480 +v 0.165245 -2.74905 -0.027480 +v 0.165941 -2.6592 -0.226113 +v 0.165941 -2.6592 0.226113 +v 0.166221 -3.08115 0.318907 +v 0.166221 -3.08115 -0.318907 +v 0.166306 -3.0348 -0.319082 +v 0.166306 -3.0348 0.319082 +v 0.167400 -2.74905 -0.000000 +v 0.167400 -2.74905 0.000000 +v 0.167751 -2.5974 -0.499384 +v 0.167751 -2.5974 0.499384 +v 0.170215 -2.8044 0.057246 +v 0.170215 -2.8044 -0.057246 +v 0.173255 -3.14145 -0.090306 +v 0.173255 -3.14145 0.090306 +v 0.176897 -2.8044 0.029450 +v 0.176897 -2.8044 -0.029450 +v 0.177968 -2.7 0.092592 +v 0.177968 -2.7 -0.092592 +v 0.177968 -2.7 -0.092592 +v 0.177968 -2.7 0.092592 +v 0.177989 -2.86335 -0.130707 +v 0.177989 -2.86335 0.130707 +v 0.179200 -2.8044 -0.000000 +v 0.179200 -2.8044 0.000000 +v 0.179756 -0.002175 -0.345503 +v 0.179756 -0.002175 0.345503 +v 0.180521 -2.5026 -1.086029 +v 0.180521 -2.5026 1.086029 +v 0.181110 -2.6256 0.348105 +v 0.181110 -2.6256 -0.348105 +v 0.183734 -3.1176 -0.250127 +v 0.183734 -3.1176 0.250127 +v 0.184870 -3.14145 -0.062272 +v 0.184870 -3.14145 0.062272 +v 0.187642 -0.0312 1.128870 +v 0.187642 -0.0312 -1.128870 +v 0.189952 -2.7 0.063808 +v 0.189952 -2.7 -0.063808 +v 0.189952 -2.7 -0.063808 +v 0.189952 -2.7 0.063808 +v 0.192107 -3.14145 -0.032048 +v 0.192107 -3.14145 0.032048 +v 0.193348 -2.98125 -0.263232 +v 0.193348 -2.98125 0.263232 +v 0.194472 -2.9232 -0.194472 +v 0.194472 -2.9232 0.194472 +v 0.194600 -3.14145 0.000000 +v 0.194600 -3.14145 -0.000000 +v 0.195658 -2.86335 -0.101925 +v 0.195658 -2.86335 0.101925 +v 0.197424 -2.7 0.032816 +v 0.197424 -2.7 -0.032816 +v 0.197424 -2.7 -0.032816 +v 0.197424 -2.7 0.032816 +v 0.197684 -2.4744 -1.189282 +v 0.197684 -2.4744 1.189282 +v 0.198374 -2.6592 -0.198374 +v 0.198374 -2.6592 0.198374 +v 0.200000 -2.7 -0.000000 +v 0.200000 -2.7 0.000000 +v 0.200000 -2.7 0.000000 +v 0.200000 -2.7 -0.000000 +v 0.208794 -2.86335 0.070270 +v 0.208794 -2.86335 -0.070270 +v 0.209136 -2.4408 -1.258183 +v 0.209136 -2.4408 1.258183 +v 0.210740 -0.046875 -1.267832 +v 0.210740 -0.046875 1.267832 +v 0.213123 -3.08115 -0.290138 +v 0.213123 -3.08115 0.290138 +v 0.213234 -3.0348 -0.290295 +v 0.213234 -3.0348 0.290295 +v 0.213304 -2.4 -1.283256 +v 0.213304 -2.4 1.283256 +v 0.214905 -2.5728 -0.639758 +v 0.214905 -2.5728 0.639758 +v 0.216979 -2.86335 0.036157 +v 0.216979 -2.86335 -0.036157 +v 0.219536 -3.1176 -0.219536 +v 0.219536 -3.1176 0.219536 +v 0.219800 -2.86335 -0.000000 +v 0.219800 -2.86335 0.000000 +v 0.221585 -2.9232 -0.162745 +v 0.221585 -2.9232 0.162745 +v 0.224349 -0.0084 0.667871 +v 0.224349 -0.0084 -0.667871 +v 0.226113 -2.6592 -0.165941 +v 0.226113 -2.6592 0.165941 +v 0.226496 -2.463 -1.362620 +v 0.226496 -2.463 1.362620 +v 0.226795 -2.482687 1.364422 +v 0.226795 -2.482687 -1.364422 +v 0.226824 -0.0648 1.364595 +v 0.226824 -0.0648 -1.364595 +v 0.227403 -2.435437 -1.368074 +v 0.227403 -2.435437 1.368074 +v 0.228104 -2.4945 -1.372294 +v 0.228104 -2.4945 1.372294 +v 0.229712 -2.4 -1.381968 +v 0.229712 -2.4 1.381968 +v 0.230225 -2.498438 -1.385053 +v 0.230225 -2.498438 1.385053 +v 0.230604 -0.002175 -0.314223 +v 0.230604 -0.002175 0.314223 +v 0.231031 -2.98125 -0.231031 +v 0.231031 -2.98125 0.231031 +v 0.232342 -2.6256 -0.316590 +v 0.232342 -2.6256 0.316590 +v 0.232961 -2.4945 -1.401513 +v 0.232961 -2.4945 1.401513 +v 0.236115 -2.482687 -1.420490 +v 0.236115 -2.482687 1.420490 +v 0.237149 -0.084525 1.426709 +v 0.237149 -0.084525 -1.426709 +v 0.239491 -2.463 -1.440800 +v 0.239491 -2.463 1.440800 +v 0.242892 -2.435437 -1.461258 +v 0.242892 -2.435437 1.461258 +v 0.242970 -0.1056 1.461727 +v 0.242970 -0.1056 -1.461727 +v 0.243424 -2.5974 0.467878 +v 0.243424 -2.5974 -0.467878 +v 0.243569 -2.9232 -0.126920 +v 0.243569 -2.9232 0.126920 +v 0.245542 -0.127575 1.477200 +v 0.245542 -0.127575 -1.477200 +v 0.246120 -0.15 -1.480680 +v 0.246120 -2.4 -1.480680 +v 0.246120 -0.15 1.480680 +v 0.246120 -0.15 1.480680 +v 0.246120 -2.4 1.480680 +v 0.246120 -0.15 -1.480680 +v 0.248417 -0.177075 -1.494500 +v 0.248417 -0.177075 1.494500 +v 0.248621 -2.6592 0.129351 +v 0.248621 -2.6592 -0.129351 +v 0.250127 -3.1176 -0.183734 +v 0.250127 -3.1176 0.183734 +v 0.254652 -0.2136 -1.532010 +v 0.254652 -0.2136 1.532010 +v 0.254653 -3.08115 -0.254653 +v 0.254653 -3.08115 0.254653 +v 0.254788 -3.0348 -0.254788 +v 0.254788 -3.0348 0.254788 +v 0.258385 -2.242575 -1.554467 +v 0.258385 -2.242575 1.554467 +v 0.259910 -2.9232 -0.087511 +v 0.259910 -2.9232 0.087511 +v 0.263208 -2.55 -0.783552 +v 0.263208 -2.55 0.783552 +v 0.263232 -2.98125 -0.193348 +v 0.263232 -2.98125 0.193348 +v 0.263841 -0.260025 1.587289 +v 0.263841 -0.260025 -1.587289 +v 0.265363 -2.6592 -0.089140 +v 0.265363 -2.6592 0.089140 +v 0.270092 -2.9232 -0.045032 +v 0.270092 -2.9232 0.045032 +v 0.270404 -2.0856 -1.626774 +v 0.270404 -2.0856 1.626774 +v 0.273600 -2.9232 -0.000000 +v 0.273600 -2.9232 0.000000 +v 0.274928 -3.1176 -0.143301 +v 0.274928 -3.1176 0.143301 +v 0.274998 -0.3168 -1.654413 +v 0.274998 -0.3168 1.654413 +v 0.275675 -0.002175 -0.275675 +v 0.275675 -0.002175 0.275675 +v 0.275801 -2.6592 -0.045844 +v 0.275801 -2.6592 0.045844 +v 0.277752 -2.6256 -0.277752 +v 0.277752 -2.6256 0.277752 +v 0.279400 -2.6592 0.000000 +v 0.281930 -1.929525 1.696119 +v 0.281930 -1.929525 -1.696119 +v 0.287140 -0.384375 -1.727460 +v 0.287140 -0.384375 1.727460 +v 0.289340 -2.98125 -0.150793 +v 0.289340 -2.98125 0.150793 +v 0.290138 -3.08115 -0.213123 +v 0.290138 -3.08115 0.213123 +v 0.290295 -3.0348 -0.213234 +v 0.290295 -3.0348 0.213234 +v 0.292719 -1.7748 -1.761022 +v 0.292719 -1.7748 1.761022 +v 0.293360 -3.1176 -0.098814 +v 0.293360 -3.1176 0.098814 +v 0.299282 -0.4632 -1.800507 +v 0.299282 -0.4632 1.800507 +v 0.302522 -1.621875 -1.820003 +v 0.302523 -1.621875 1.820003 +v 0.303862 -0.018225 0.904575 +v 0.303862 -0.018225 -0.904575 +v 0.304843 -3.1176 -0.050855 +v 0.304843 -3.1176 0.050855 +v 0.308744 -2.98125 -0.103976 +v 0.308744 -2.98125 0.103976 +v 0.308800 -3.1176 0.000000 +v 0.308800 -3.1176 -0.000000 +v 0.309596 -2.5272 -0.921647 +v 0.309596 -2.5272 0.921647 +v 0.310439 -0.553725 -1.867631 +v 0.310439 -0.553725 1.867631 +v 0.311096 -1.4712 -1.871580 +v 0.311096 -1.4712 1.871580 +v 0.311850 -2.5728 -0.599396 +v 0.311850 -2.5728 0.599396 +v 0.312283 -2.5974 -0.425519 +v 0.312283 -2.5974 0.425519 +v 0.314223 -0.002175 -0.230604 +v 0.314223 -0.002175 0.230604 +v 0.316590 -2.6256 -0.232342 +v 0.316590 -2.6256 0.232342 +v 0.318192 -1.323225 -1.914272 +v 0.318192 -1.323225 1.914272 +v 0.318907 -3.08115 -0.166221 +v 0.318907 -3.08115 0.166221 +v 0.319082 -3.0348 -0.166306 +v 0.319082 -3.0348 0.166306 +v 0.319628 -0.6564 -1.922910 +v 0.319628 -0.6564 1.922910 +v 0.320834 -2.98125 -0.053508 +v 0.320834 -2.98125 0.053508 +v 0.323566 -1.1784 -1.946601 +v 0.323566 -1.1784 1.946601 +v 0.325000 -2.98125 0.000000 +v 0.325000 -2.98125 -0.000000 +v 0.325553 -0.0084 -0.625735 +v 0.325553 -0.0084 0.625735 +v 0.325863 -0.771675 -1.960420 +v 0.325863 -0.771675 1.960420 +v 0.326970 -1.037175 -1.967083 +v 0.326970 -1.037175 1.967083 +v 0.328160 -0.9 -1.974240 +v 0.328160 -0.9 -1.974240 +v 0.328160 -0.9 1.974240 +v 0.340289 -3.08115 -0.114619 +v 0.340289 -3.08115 0.114619 +v 0.340477 -3.0348 -0.114676 +v 0.340477 -3.0348 0.114676 +v 0.345503 -0.002175 -0.179756 +v 0.345503 -0.002175 0.179756 +v 0.348105 -2.6256 -0.181110 +v 0.348105 -2.6256 0.181110 +v 0.351008 -2.5026 -1.044926 +v 0.351008 -2.5026 1.044926 +v 0.353610 -3.08115 -0.058988 +v 0.353610 -3.08115 0.058988 +v 0.353807 -3.0348 -0.059016 +v 0.353807 -3.0348 0.059016 +v 0.358200 -3.08115 -0.000000 +v 0.358200 -3.08115 0.000000 +v 0.358400 -3.0348 0.000000 +v 0.358400 -3.0348 0.000000 +v 0.364854 -0.0312 1.086146 +v 0.364854 -0.0312 -1.086146 +v 0.368768 -0.002175 -0.123875 +v 0.368768 -0.002175 0.123875 +v 0.371546 -2.6256 -0.124808 +v 0.371546 -2.6256 0.124808 +v 0.373318 -2.5974 -0.373318 +v 0.373318 -2.5974 0.373318 +v 0.381942 -2.55 -0.734118 +v 0.381942 -2.55 0.734118 +v 0.383274 -0.002175 -0.063708 +v 0.383274 -0.002175 0.063708 +v 0.384379 -2.4744 -1.144271 +v 0.384379 -2.4744 1.144271 +v 0.386161 -2.6256 -0.064188 +v 0.386161 -2.6256 0.064188 +v 0.388275 -0.002175 0.000000 +v 0.388275 -0.002175 0.000000 +v 0.391200 -2.6256 0.000000 +v 0.391200 -2.6256 0.000000 +v 0.400065 -2.5728 -0.545131 +v 0.400065 -2.5728 0.545131 +v 0.406648 -2.4408 -1.210564 +v 0.406648 -2.4408 1.210564 +v 0.409767 -0.046875 1.219848 +v 0.409767 -0.046875 -1.219848 +v 0.414752 -2.4 -1.234688 +v 0.414752 -2.4 1.234688 +v 0.417645 -0.0084 -0.569086 +v 0.417645 -0.0084 0.569086 +v 0.425519 -2.5974 0.312283 +v 0.425519 -2.5974 -0.312283 +v 0.440403 -2.463 -1.311049 +v 0.440403 -2.463 1.311049 +v 0.440935 -0.018225 0.847506 +v 0.440935 -0.018225 -0.847506 +v 0.440985 -2.482687 -1.312782 +v 0.440985 -2.482687 1.312782 +v 0.441041 -0.0648 1.312948 +v 0.441041 -0.0648 -1.312948 +v 0.442166 -2.435437 -1.316296 +v 0.442166 -2.435437 1.316296 +v 0.443529 -2.4945 -1.320356 +v 0.443529 -2.4945 1.320356 +v 0.446656 -2.4 -1.329664 +v 0.446656 -2.4 1.329664 +v 0.447653 -2.498438 -1.332632 +v 0.447653 -2.498438 1.332632 +v 0.449256 -2.5272 -0.863501 +v 0.449256 -2.5272 0.863501 +v 0.452973 -2.4945 -1.348469 +v 0.452973 -2.4945 1.348469 +v 0.459107 -2.482687 -1.366728 +v 0.459107 -2.482687 1.366728 +v 0.461116 -0.084525 1.372712 +v 0.461116 -0.084525 -1.372712 +v 0.465671 -2.463 -1.386270 +v 0.465671 -2.463 1.386270 +v 0.467878 -2.5974 -0.243424 +v 0.467878 -2.5974 0.243424 +v 0.472283 -2.435437 -1.405953 +v 0.472283 -2.435437 1.405953 +v 0.472434 -0.1056 1.406405 +v 0.472434 -0.1056 -1.406405 +v 0.477435 -0.127575 1.421292 +v 0.477435 -0.127575 -1.421292 +v 0.478256 -2.5728 -0.478256 +v 0.478256 -2.5728 0.478256 +v 0.478560 -0.15 -1.424640 +v 0.478560 -2.4 -1.424640 +v 0.478560 -0.15 1.424640 +v 0.478560 -0.15 1.424640 +v 0.478560 -0.15 -1.424640 +v 0.478560 -2.4 1.424640 +v 0.483027 -0.177075 -1.437937 +v 0.483027 -0.177075 1.437937 +v 0.489984 -2.55 -0.667656 +v 0.489984 -2.55 0.667656 +v 0.495150 -0.2136 -1.474028 +v 0.495150 -0.2136 1.474028 +v 0.499272 -0.0084 -0.499272 +v 0.499272 -0.0084 0.499272 +v 0.499384 -2.5974 -0.167751 +v 0.499384 -2.5974 0.167751 +v 0.502408 -2.242575 -1.495635 +v 0.502408 -2.242575 1.495635 +v 0.509349 -2.5026 0.979002 +v 0.509349 -2.5026 -0.979002 +v 0.513016 -0.260025 -1.527214 +v 0.513016 -0.260025 1.527214 +v 0.519028 -2.5974 0.086273 +v 0.519028 -2.5974 -0.086273 +v 0.525778 -2.0856 -1.565204 +v 0.525778 -2.0856 1.565204 +v 0.525800 -2.5974 -0.000000 +v 0.525800 -2.5974 0.000000 +v 0.529441 -0.0312 -1.017621 +v 0.529441 -0.0312 1.017621 +v 0.534711 -0.3168 -1.591798 +v 0.534711 -0.3168 1.591798 +v 0.545131 -2.5728 -0.400065 +v 0.545131 -2.5728 0.400065 +v 0.548190 -1.929525 -1.631925 +v 0.548190 -1.929525 1.631925 +v 0.557774 -2.4744 -1.072079 +v 0.557774 -2.4744 1.072079 +v 0.558320 -0.384375 -1.662080 +v 0.558320 -0.384375 1.662080 +v 0.565664 -0.018225 0.770779 +v 0.565664 -0.018225 -0.770779 +v 0.569086 -0.0084 -0.417645 +v 0.569086 -0.0084 0.417645 +v 0.569167 -1.7748 -1.694372 +v 0.569167 -1.7748 1.694372 +v 0.576340 -2.5272 -0.785325 +v 0.576340 -2.5272 0.785325 +v 0.581929 -0.4632 -1.732362 +v 0.581929 -0.4632 1.732362 +v 0.585750 -2.55 -0.585750 +v 0.585750 -2.55 0.585750 +v 0.588230 -1.621875 -1.751120 +v 0.588230 -1.621875 1.751120 +v 0.590089 -2.4408 1.134190 +v 0.590089 -2.4408 -1.134190 +v 0.594614 -0.046875 -1.142888 +v 0.594614 -0.046875 1.142888 +v 0.599396 -2.5728 -0.311850 +v 0.599396 -2.5728 0.311850 +v 0.601848 -2.4 -1.156792 +v 0.601848 -2.4 1.156792 +v 0.603624 -0.553725 -1.796946 +v 0.603624 -0.553725 1.796946 +v 0.604900 -1.4712 -1.800745 +v 0.604900 -1.4712 1.800745 +v 0.618698 -1.323225 -1.841822 +v 0.618698 -1.323225 1.841822 +v 0.621490 -0.6564 -1.850132 +v 0.621490 -0.6564 1.850132 +v 0.625735 -0.0084 0.325553 +v 0.625735 -0.0084 -0.325553 +v 0.629147 -1.1784 -1.872927 +v 0.629147 -1.1784 1.872927 +v 0.633613 -0.771675 -1.886223 +v 0.633613 -0.771675 1.886223 +v 0.635767 -1.037175 -1.892634 +v 0.635767 -1.037175 1.892634 +v 0.638080 -0.9 -1.899520 +v 0.638080 -0.9 -1.899520 +v 0.638080 -0.9 1.899520 +v 0.638080 -0.9 1.899520 +v 0.639070 -2.463 -1.228335 +v 0.639070 -2.463 1.228335 +v 0.639758 -2.5728 -0.214905 +v 0.639758 -2.5728 0.214905 +v 0.639915 -2.482687 1.229959 +v 0.639915 -2.482687 -1.229959 +v 0.639996 -0.0648 -1.230115 +v 0.639996 -0.0648 1.230115 +v 0.641628 -2.435437 -1.233252 +v 0.641628 -2.435437 1.233252 +v 0.643607 -2.4945 -1.237056 +v 0.643607 -2.4945 1.237056 +v 0.648144 -2.4 -1.245776 +v 0.648144 -2.4 1.245776 +v 0.649591 -2.498438 -1.248557 +v 0.649591 -2.498438 1.248557 +v 0.653431 -2.5026 -0.890370 +v 0.653431 -2.5026 0.890370 +v 0.657311 -2.4945 -1.263395 +v 0.657311 -2.4945 1.263395 +v 0.664924 -2.5728 -0.110524 +v 0.664924 -2.5728 0.110524 +v 0.666211 -2.482687 1.280502 +v 0.666211 -2.482687 -1.280502 +v 0.667656 -2.55 -0.489984 +v 0.667656 -2.55 0.489984 +v 0.667871 -0.0084 -0.224349 +v 0.667871 -0.0084 0.224349 +v 0.669128 -0.084525 -1.286108 +v 0.669128 -0.084525 1.286108 +v 0.673600 -2.5728 0.000000 +v 0.673600 -2.5728 -0.000000 +v 0.675736 -2.463 -1.298810 +v 0.675736 -2.463 1.298810 +v 0.676222 -0.018225 0.676222 +v 0.676222 -0.018225 -0.676222 +v 0.679207 -0.0312 -0.925493 +v 0.679207 -0.0312 0.925493 +v 0.685331 -2.435437 -1.317252 +v 0.685331 -2.435437 1.317252 +v 0.685551 -0.1056 -1.317675 +v 0.685551 -0.1056 1.317675 +v 0.688984 -2.5272 -0.688984 +v 0.688984 -2.5272 0.688984 +v 0.692808 -0.127575 1.331623 +v 0.692808 -0.127575 -1.331623 +v 0.694143 -0.0084 -0.115381 +v 0.694143 -0.0084 0.115381 +v 0.694440 -0.15 1.334760 +v 0.694440 -0.15 -1.334760 +v 0.694440 -2.4 1.334760 +v 0.694440 -0.15 -1.334760 +v 0.694440 -0.15 1.334760 +v 0.694440 -2.4 -1.334760 +v 0.700921 -0.177075 1.347218 +v 0.700921 -0.177075 -1.347218 +v 0.703200 -0.0084 0.000000 +v 0.715555 -2.4744 -0.975021 +v 0.715555 -2.4744 0.975021 +v 0.718514 -0.2136 1.381032 +v 0.718514 -0.2136 -1.381032 +v 0.729046 -2.242575 -1.401276 +v 0.729046 -2.242575 1.401276 +v 0.734118 -2.55 -0.381942 +v 0.734118 -2.55 0.381942 +v 0.744440 -0.260025 1.430863 +v 0.744440 -0.260025 -1.430863 +v 0.757010 -2.4408 1.031508 +v 0.757010 -2.4408 -1.031508 +v 0.762816 -0.046875 -1.039419 +v 0.762816 -0.046875 1.039419 +v 0.762958 -2.0856 -1.466456 +v 0.762958 -2.0856 1.466456 +v 0.770779 -0.018225 0.565664 +v 0.770779 -0.018225 -0.565664 +v 0.772096 -2.4 -1.052064 +v 0.772096 -2.4 1.052064 +v 0.775921 -0.3168 -1.491372 +v 0.775921 -0.3168 1.491372 +v 0.781142 -2.5026 -0.781142 +v 0.781142 -2.5026 0.781142 +v 0.783552 -2.55 -0.263208 +v 0.783552 -2.55 0.263208 +v 0.785325 -2.5272 -0.576340 +v 0.785325 -2.5272 0.576340 +v 0.795481 -1.929525 1.528968 +v 0.795481 -1.929525 -1.528968 +v 0.810180 -0.384375 1.557220 +v 0.810180 -0.384375 -1.557220 +v 0.811956 -0.0312 0.811956 +v 0.811956 -0.0312 -0.811956 +v 0.814374 -2.55 -0.135366 +v 0.814374 -2.55 0.135366 +v 0.819847 -2.463 -1.117130 +v 0.819847 -2.463 1.117130 +v 0.820931 -2.482687 1.118607 +v 0.820931 -2.482687 -1.118607 +v 0.821035 -0.0648 1.118749 +v 0.821035 -0.0648 -1.118749 +v 0.823129 -2.435437 -1.121601 +v 0.823129 -2.435437 1.121601 +v 0.825000 -2.55 0.000000 +v 0.825000 -2.55 0.000000 +v 0.825668 -2.4945 -1.125061 +v 0.825668 -2.4945 1.125061 +v 0.825921 -1.7748 1.587475 +v 0.825921 -1.7748 -1.587475 +v 0.831488 -2.4 -1.132992 +v 0.831488 -2.4 1.132992 +v 0.833344 -2.498438 -1.135521 +v 0.833344 -2.498438 1.135521 +v 0.843248 -2.4945 -1.149016 +v 0.843248 -2.4945 1.149016 +v 0.844439 -0.4632 1.623068 +v 0.844439 -0.4632 -1.623068 +v 0.847506 -0.018225 -0.440935 +v 0.847506 -0.018225 0.440935 +v 0.853583 -1.621875 -1.640643 +v 0.853583 -1.621875 1.640643 +v 0.854666 -2.482687 -1.164574 +v 0.854666 -2.482687 1.164574 +v 0.855408 -2.4744 -0.855408 +v 0.855408 -2.4744 0.855408 +v 0.858407 -0.084525 -1.169673 +v 0.858407 -0.084525 1.169673 +v 0.863501 -2.5272 -0.449256 +v 0.863501 -2.5272 0.449256 +v 0.866886 -2.463 -1.181225 +v 0.866886 -2.463 1.181225 +v 0.875920 -0.553725 -1.683577 +v 0.875920 -0.553725 1.683577 +v 0.877772 -1.4712 -1.687137 +v 0.877772 -1.4712 1.687137 +v 0.879195 -2.435437 -1.197997 +v 0.879195 -2.435437 1.197997 +v 0.879477 -0.1056 -1.198382 +v 0.879477 -0.1056 1.198382 +v 0.888786 -0.127575 1.211067 +v 0.888786 -0.127575 -1.211067 +v 0.890370 -2.5026 -0.653431 +v 0.890370 -2.5026 0.653431 +v 0.890880 -0.15 -1.213920 +v 0.890880 -0.15 1.213920 +v 0.890880 -2.4 -1.213920 +v 0.890880 -0.15 -1.213920 +v 0.890880 -0.15 1.213920 +v 0.890880 -2.4 1.213920 +v 0.897795 -1.323225 -1.725622 +v 0.897795 -1.323225 1.725622 +v 0.899195 -0.177075 1.225250 +v 0.899195 -0.177075 -1.225250 +v 0.901846 -0.6564 -1.733408 +v 0.901846 -0.6564 1.733408 +v 0.904575 -0.018225 0.303862 +v 0.904575 -0.018225 -0.303862 +v 0.904966 -2.4408 0.904966 +v 0.904966 -2.4408 -0.904966 +v 0.911906 -0.046875 -0.911906 +v 0.911906 -0.046875 0.911906 +v 0.912957 -1.1784 -1.754764 +v 0.912957 -1.1784 1.754764 +v 0.919439 -0.771675 -1.767222 +v 0.919439 -0.771675 1.767222 +v 0.921647 -2.5272 -0.309596 +v 0.921647 -2.5272 0.309596 +v 0.921764 -0.2136 1.256003 +v 0.921764 -0.2136 -1.256003 +v 0.922564 -1.037175 1.773229 +v 0.922564 -1.037175 -1.773229 +v 0.923000 -2.4 -0.923000 +v 0.923000 -2.4 0.923000 +v 0.925493 -0.0312 0.679207 +v 0.925493 -0.0312 -0.679207 +v 0.925920 -0.9 1.779680 +v 0.925920 -0.9 -1.779680 +v 0.925920 -0.9 -1.779680 +v 0.925920 -0.9 1.779680 +v 0.935276 -2.242575 -1.274414 +v 0.935276 -2.242575 1.274414 +v 0.940158 -0.018225 0.156274 +v 0.940158 -0.018225 -0.156274 +v 0.952425 -0.018225 0.000000 +v 0.952425 -0.018225 0.000000 +v 0.955023 -0.260025 1.301322 +v 0.955023 -0.260025 -1.301322 +v 0.957901 -2.5272 -0.159223 +v 0.957901 -2.5272 0.159223 +v 0.970400 -2.5272 0.000000 +v 0.970400 -2.5272 -0.000000 +v 0.975021 -2.4744 -0.715555 +v 0.975021 -2.4744 0.715555 +v 0.978780 -2.0856 -1.333693 +v 0.978780 -2.0856 1.333693 +v 0.979002 -2.5026 0.509349 +v 0.979002 -2.5026 -0.509349 +v 0.980084 -2.463 -0.980084 +v 0.980084 -2.463 0.980084 +v 0.981380 -2.482687 -0.981380 +v 0.981380 -2.482687 0.981380 +v 0.981504 -0.0648 0.981504 +v 0.981504 -0.0648 -0.981504 +v 0.984007 -2.435437 -0.984007 +v 0.984007 -2.435437 0.984007 +v 0.987042 -2.4945 -0.987042 +v 0.987042 -2.4945 0.987042 +v 0.994000 -2.4 -0.994000 +v 0.994000 -2.4 0.994000 +v 0.995410 -0.3168 -1.356353 +v 0.995410 -0.3168 1.356353 +v 0.996219 -2.498438 -0.996219 +v 0.996219 -2.498438 0.996219 +v 1.008058 -2.4945 -1.008058 +v 1.008058 -2.4945 1.008058 +v 1.017621 -0.0312 0.529441 +v 1.017621 -0.0312 -0.529441 +v 1.020503 -1.929525 -1.390545 +v 1.020503 -1.929525 1.390545 +v 1.021708 -2.482687 -1.021708 +v 1.021708 -2.482687 1.021708 +v 1.026181 -0.084525 -1.026181 +v 1.026181 -0.084525 1.026181 +v 1.031508 -2.4408 0.757010 +v 1.031508 -2.4408 -0.757010 +v 1.036316 -2.463 -1.036316 +v 1.036316 -2.463 1.036316 +v 1.039360 -0.384375 -1.416240 +v 1.039360 -0.384375 1.416240 +v 1.039419 -0.046875 -0.762816 +v 1.039419 -0.046875 0.762816 +v 1.044926 -2.5026 -0.351008 +v 1.044926 -2.5026 0.351008 +v 1.051031 -2.435437 -1.051031 +v 1.051031 -2.435437 1.051031 +v 1.051368 -0.1056 -1.051368 +v 1.051368 -0.1056 1.051368 +v 1.052064 -2.4 -0.772096 +v 1.052064 -2.4 0.772096 +v 1.059553 -1.7748 -1.443756 +v 1.059553 -1.7748 1.443756 +v 1.062497 -0.127575 1.062497 +v 1.062497 -0.127575 -1.062497 +v 1.065000 -0.15 -1.065000 +v 1.065000 -0.15 1.065000 +v 1.065000 -2.4 -1.065000 +v 1.065000 -2.4 1.065000 +v 1.072079 -2.4744 -0.557774 +v 1.072079 -2.4744 0.557774 +v 1.074940 -0.177075 -1.074940 +v 1.074940 -0.177075 1.074940 +v 1.083310 -0.4632 -1.476127 +v 1.083310 -0.4632 1.476127 +v 1.086029 -2.5026 0.180521 +v 1.086029 -2.5026 -0.180521 +v 1.086146 -0.0312 0.364854 +v 1.086146 -0.0312 -0.364854 +v 1.095040 -1.621875 -1.492110 +v 1.095040 -1.621875 1.492110 +v 1.100200 -2.5026 -0.000000 +v 1.100200 -2.5026 0.000000 +v 1.101920 -0.2136 1.101920 +v 1.101920 -0.2136 -1.101920 +v 1.117130 -2.463 -0.819847 +v 1.117130 -2.463 0.819847 +v 1.118073 -2.242575 -1.118073 +v 1.118073 -2.242575 1.118073 +v 1.118607 -2.482687 -0.820931 +v 1.118607 -2.482687 0.820931 +v 1.118749 -0.0648 -0.821035 +v 1.118749 -0.0648 0.821035 +v 1.121601 -2.435437 -0.823129 +v 1.121601 -2.435437 0.823129 +v 1.123697 -0.553725 -1.531158 +v 1.123697 -0.553725 1.531158 +v 1.125061 -2.4945 -0.825668 +v 1.125061 -2.4945 0.825668 +v 1.126072 -1.4712 -1.534395 +v 1.126072 -1.4712 1.534395 +v 1.128870 -0.0312 -0.187642 +v 1.128870 -0.0312 0.187642 +v 1.132992 -2.4 -0.831488 +v 1.132992 -2.4 0.831488 +v 1.134190 -2.4408 0.590089 +v 1.134190 -2.4408 -0.590089 +v 1.135521 -2.498438 -0.833344 +v 1.135521 -2.498438 0.833344 +v 1.141680 -0.260025 1.141680 +v 1.141680 -0.260025 -1.141680 +v 1.142888 -0.046875 -0.594614 +v 1.142888 -0.046875 0.594614 +v 1.143600 -0.0312 0.000000 +v 1.143600 -0.0312 0.000000 +v 1.144271 -2.4744 -0.384379 +v 1.144271 -2.4744 0.384379 +v 1.149016 -2.4945 -0.843248 +v 1.149016 -2.4945 0.843248 +v 1.151759 -1.323225 -1.569396 +v 1.151759 -1.323225 1.569396 +v 1.156792 -2.4 -0.601848 +v 1.156792 -2.4 0.601848 +v 1.156956 -0.6564 -1.576477 +v 1.156956 -0.6564 1.576477 +v 1.164574 -2.482687 -0.854666 +v 1.164574 -2.482687 0.854666 +v 1.169673 -0.084525 -0.858407 +v 1.169673 -0.084525 0.858407 +v 1.170080 -2.0856 -1.170080 +v 1.170080 -2.0856 1.170080 +v 1.171210 -1.1784 -1.595900 +v 1.171210 -1.1784 1.595900 +v 1.179525 -0.771675 -1.607230 +v 1.179525 -0.771675 1.607230 +v 1.181225 -2.463 -0.866886 +v 1.181225 -2.463 0.866886 +v 1.183534 -1.037175 -1.612693 +v 1.183534 -1.037175 1.612693 +v 1.187840 -0.9 -1.618560 +v 1.187840 -0.9 -1.618560 +v 1.187840 -0.9 1.618560 +v 1.187840 -0.9 1.618560 +v 1.189282 -2.4744 -0.197684 +v 1.189282 -2.4744 0.197684 +v 1.189960 -0.3168 -1.189960 +v 1.189960 -0.3168 1.189960 +v 1.197997 -2.435437 -0.879195 +v 1.197997 -2.435437 0.879195 +v 1.198382 -0.1056 -0.879477 +v 1.198382 -0.1056 0.879477 +v 1.204800 -2.4744 0.000000 +v 1.204800 -2.4744 -0.000000 +v 1.210564 -2.4408 0.406648 +v 1.210564 -2.4408 -0.406648 +v 1.211067 -0.127575 0.888786 +v 1.211067 -0.127575 -0.888786 +v 1.213920 -0.15 -0.890880 +v 1.213920 -0.15 -0.890880 +v 1.213920 -0.15 0.890880 +v 1.213920 -0.15 0.890880 +v 1.213920 -2.4 -0.890880 +v 1.213920 -2.4 0.890880 +v 1.219848 -0.046875 -0.409767 +v 1.219848 -0.046875 0.409767 +v 1.219958 -1.929525 1.219958 +v 1.219958 -1.929525 -1.219958 +v 1.225250 -0.177075 0.899195 +v 1.225250 -0.177075 -0.899195 +v 1.228335 -2.463 -0.639070 +v 1.228335 -2.463 0.639070 +v 1.229959 -2.482687 -0.639915 +v 1.229959 -2.482687 0.639915 +v 1.230115 -0.0648 -0.639996 +v 1.230115 -0.0648 0.639996 +v 1.233252 -2.435437 -0.641628 +v 1.233252 -2.435437 0.641628 +v 1.234688 -2.4 -0.414752 +v 1.234688 -2.4 0.414752 +v 1.237056 -2.4945 -0.643607 +v 1.237056 -2.4945 0.643607 +v 1.242500 -0.384375 -1.242500 +v 1.242500 -0.384375 1.242500 +v 1.245776 -2.4 -0.648144 +v 1.245776 -2.4 0.648144 +v 1.248557 -2.498438 -0.649591 +v 1.248557 -2.498438 0.649591 +v 1.256003 -0.2136 0.921764 +v 1.256003 -0.2136 -0.921764 +v 1.258183 -2.4408 0.209136 +v 1.258183 -2.4408 -0.209136 +v 1.263395 -2.4945 -0.657311 +v 1.263395 -2.4945 0.657311 +v 1.266640 -1.7748 -1.266640 +v 1.266640 -1.7748 1.266640 +v 1.267832 -0.046875 -0.210740 +v 1.267832 -0.046875 0.210740 +v 1.274414 -2.242575 -0.935276 +v 1.274414 -2.242575 0.935276 +v 1.274600 -2.4408 0.000000 +v 1.274600 -2.4408 0.000000 +v 1.280502 -2.482687 -0.666211 +v 1.280502 -2.482687 0.666211 +v 1.283256 -2.4 -0.213304 +v 1.283256 -2.4 0.213304 +v 1.284375 -0.046875 0.000000 +v 1.284375 -0.046875 -0.000000 +v 1.286108 -0.084525 -0.669128 +v 1.286108 -0.084525 0.669128 +v 1.295040 -0.4632 -1.295040 +v 1.295040 -0.4632 1.295040 +v 1.298810 -2.463 -0.675736 +v 1.298810 -2.463 0.675736 +v 1.300000 -2.4 0.000000 +v 1.300000 -2.4 -0.000000 +v 1.301322 -0.260025 0.955023 +v 1.301322 -0.260025 -0.955023 +v 1.309063 -1.621875 -1.309063 +v 1.309063 -1.621875 1.309063 +v 1.311049 -2.463 -0.440403 +v 1.311049 -2.463 0.440403 +v 1.312782 -2.482687 -0.440985 +v 1.312782 -2.482687 0.440985 +v 1.312948 -0.0648 0.441041 +v 1.312948 -0.0648 -0.441041 +v 1.316296 -2.435437 -0.442166 +v 1.316296 -2.435437 0.442166 +v 1.317252 -2.435437 -0.685331 +v 1.317252 -2.435437 0.685331 +v 1.317675 -0.1056 -0.685551 +v 1.317675 -0.1056 0.685551 +v 1.320356 -2.4945 -0.443529 +v 1.320356 -2.4945 0.443529 +v 1.329664 -2.4 -0.446656 +v 1.329664 -2.4 0.446656 +v 1.331623 -0.127575 0.692808 +v 1.331623 -0.127575 -0.692808 +v 1.332632 -2.498438 -0.447653 +v 1.332632 -2.498438 0.447653 +v 1.333693 -2.0856 -0.978780 +v 1.333693 -2.0856 0.978780 +v 1.334760 -0.15 0.694440 +v 1.334760 -0.15 -0.694440 +v 1.334760 -0.15 -0.694440 +v 1.334760 -0.15 0.694440 +v 1.334760 -2.4 -0.694440 +v 1.334760 -2.4 0.694440 +v 1.343320 -0.553725 -1.343320 +v 1.343320 -0.553725 1.343320 +v 1.346160 -1.4712 -1.346160 +v 1.346160 -1.4712 1.346160 +v 1.347218 -0.177075 0.700921 +v 1.347218 -0.177075 -0.700921 +v 1.348469 -2.4945 -0.452973 +v 1.348469 -2.4945 0.452973 +v 1.356353 -0.3168 -0.995410 +v 1.356353 -0.3168 0.995410 +v 1.362620 -2.463 -0.226496 +v 1.362620 -2.463 0.226496 +v 1.364422 -2.482687 -0.226795 +v 1.364422 -2.482687 0.226795 +v 1.364595 -0.0648 -0.226824 +v 1.364595 -0.0648 0.226824 +v 1.366728 -2.482687 -0.459107 +v 1.366728 -2.482687 0.459107 +v 1.368074 -2.435437 -0.227403 +v 1.368074 -2.435437 0.227403 +v 1.372294 -2.4945 -0.228104 +v 1.372294 -2.4945 0.228104 +v 1.372712 -0.084525 -0.461116 +v 1.372712 -0.084525 0.461116 +v 1.376867 -1.323225 -1.376868 +v 1.376868 -1.323225 1.376867 +v 1.380400 -2.463 0.000000 +v 1.380400 -2.463 -0.000000 +v 1.381032 -0.2136 0.718514 +v 1.381032 -0.2136 -0.718514 +v 1.381968 -2.4 -0.229712 +v 1.381968 -2.4 0.229712 +v 1.382225 -2.482687 0.000000 +v 1.382225 -2.482687 0.000000 +v 1.382400 -0.0648 0.000000 +v 1.382400 -0.0648 0.000000 +v 1.383080 -0.6564 -1.383080 +v 1.383080 -0.6564 1.383080 +v 1.385053 -2.498438 -0.230225 +v 1.385053 -2.498438 0.230225 +v 1.385925 -2.435437 0.000000 +v 1.385925 -2.435437 -0.000000 +v 1.386270 -2.463 -0.465671 +v 1.386270 -2.463 0.465671 +v 1.390200 -2.4945 0.000000 +v 1.390200 -2.4945 -0.000000 +v 1.390545 -1.929525 -1.020503 +v 1.390545 -1.929525 1.020503 +v 1.400000 -2.4 0.000000 +v 1.400000 -2.4 0.000000 +v 1.400120 -1.1784 -1.400120 +v 1.400120 -1.1784 1.400120 +v 1.401276 -2.242575 -0.729046 +v 1.401276 -2.242575 0.729046 +v 1.401513 -2.4945 -0.232961 +v 1.401513 -2.4945 0.232961 +v 1.403125 -2.498438 0.000000 +v 1.403125 -2.498438 0.000000 +v 1.405953 -2.435437 -0.472283 +v 1.405953 -2.435437 0.472283 +v 1.406405 -0.1056 -0.472434 +v 1.406405 -0.1056 0.472434 +v 1.410060 -0.771675 -1.410060 +v 1.410060 -0.771675 1.410060 +v 1.414853 -1.037175 -1.414853 +v 1.414853 -1.037175 1.414853 +v 1.416240 -0.384375 -1.039360 +v 1.416240 -0.384375 1.039360 +v 1.419800 -2.4945 0.000000 +v 1.419800 -2.4945 -0.000000 +v 1.420000 -0.9 -1.420000 +v 1.420000 -0.9 -1.420000 +v 1.420000 -0.9 1.420000 +v 1.420000 -0.9 1.420000 +v 1.420490 -2.482687 -0.236115 +v 1.420490 -2.482687 0.236115 +v 1.421292 -0.127575 0.477435 +v 1.421292 -0.127575 -0.477435 +v 1.424640 -0.15 -0.478560 +v 1.424640 -0.15 -0.478560 +v 1.424640 -0.15 0.478560 +v 1.424640 -0.15 0.478560 +v 1.424640 -2.4 -0.478560 +v 1.424640 -2.4 0.478560 +v 1.426709 -0.084525 -0.237149 +v 1.426709 -0.084525 0.237149 +v 1.430863 -0.260025 0.744440 +v 1.430863 -0.260025 -0.744440 +v 1.437937 -0.177075 0.483027 +v 1.437937 -0.177075 -0.483027 +v 1.439025 -2.482687 0.000000 +v 1.440800 -2.463 -0.239491 +v 1.440800 -2.463 0.239491 +v 1.443756 -1.7748 -1.059553 +v 1.443756 -1.7748 1.059553 +v 1.445325 -0.084525 0.000000 +v 1.445325 -0.084525 0.000000 +v 1.459600 -2.463 0.000000 +v 1.459600 -2.463 -0.000000 +v 1.461258 -2.435437 -0.242892 +v 1.461258 -2.435437 0.242892 +v 1.461727 -0.1056 -0.242970 +v 1.461727 -0.1056 0.242970 +v 1.466456 -2.0856 -0.762958 +v 1.466456 -2.0856 0.762958 +v 1.474028 -0.2136 0.495150 +v 1.474028 -0.2136 -0.495150 +v 1.476127 -0.4632 -1.083310 +v 1.476127 -0.4632 1.083310 +v 1.477200 -0.127575 0.245542 +v 1.477200 -0.127575 -0.245542 +v 1.480325 -2.435437 0.000000 +v 1.480325 -2.435437 -0.000000 +v 1.480680 -0.15 -0.246120 +v 1.480680 -0.15 0.246120 +v 1.480680 -0.15 0.246120 +v 1.480680 -0.15 -0.246120 +v 1.480680 -2.4 -0.246120 +v 1.480680 -2.4 0.246120 +v 1.480800 -0.1056 0.000000 +v 1.480800 -0.1056 0.000000 +v 1.491372 -0.3168 -0.775921 +v 1.491372 -0.3168 0.775921 +v 1.492110 -1.621875 -1.095040 +v 1.492110 -1.621875 1.095040 +v 1.494500 -0.177075 0.248417 +v 1.494500 -0.177075 -0.248417 +v 1.495635 -2.242575 -0.502408 +v 1.495635 -2.242575 0.502408 +v 1.496475 -0.127575 0.000000 +v 1.496475 -0.127575 0.000000 +v 1.500000 -0.15 0.000000 +v 1.500000 -0.15 0.000000 +v 1.500000 -2.4 0.000000 +v 1.500000 -2.4 0.000000 +v 1.514000 -0.177075 -0.000000 +v 1.514000 -0.177075 0.000000 +v 1.527214 -0.260025 -0.513016 +v 1.527214 -0.260025 0.513016 +v 1.528968 -1.929525 -0.795481 +v 1.528968 -1.929525 0.795481 +v 1.531158 -0.553725 -1.123697 +v 1.531158 -0.553725 1.123697 +v 1.532010 -0.2136 0.254652 +v 1.532010 -0.2136 -0.254652 +v 1.534395 -1.4712 -1.126072 +v 1.534395 -1.4712 1.126072 +v 1.552000 -0.2136 0.000000 +v 1.552000 -0.2136 0.000000 +v 1.554467 -2.242575 -0.258385 +v 1.554467 -2.242575 0.258385 +v 1.557220 -0.384375 -0.810180 +v 1.557220 -0.384375 0.810180 +v 1.565204 -2.0856 -0.525778 +v 1.565204 -2.0856 0.525778 +v 1.569396 -1.323225 -1.151759 +v 1.569396 -1.323225 1.151759 +v 1.574750 -2.242575 0.000000 +v 1.574750 -2.242575 0.000000 +v 1.576477 -0.6564 -1.156956 +v 1.576477 -0.6564 1.156956 +v 1.587289 -0.260025 0.263841 +v 1.587289 -0.260025 -0.263841 +v 1.587475 -1.7748 -0.825921 +v 1.587475 -1.7748 0.825921 +v 1.591798 -0.3168 -0.534711 +v 1.591798 -0.3168 0.534711 +v 1.595900 -1.1784 -1.171210 +v 1.595900 -1.1784 1.171210 +v 1.607230 -0.771675 -1.179525 +v 1.607230 -0.771675 1.179525 +v 1.608000 -0.260025 0.000000 +v 1.608000 -0.260025 0.000000 +v 1.612693 -1.037175 -1.183534 +v 1.612693 -1.037175 1.183534 +v 1.618560 -0.9 -1.187840 +v 1.618560 -0.9 -1.187840 +v 1.618560 -0.9 1.187840 +v 1.618560 -0.9 1.187840 +v 1.623068 -0.4632 -0.844439 +v 1.623068 -0.4632 0.844439 +v 1.626774 -2.0856 -0.270404 +v 1.626774 -2.0856 0.270404 +v 1.631925 -1.929525 -0.548190 +v 1.631925 -1.929525 0.548190 +v 1.640643 -1.621875 -0.853583 +v 1.640643 -1.621875 0.853583 +v 1.648000 -2.0856 0.000000 +v 1.648000 -2.0856 -0.000000 +v 1.654413 -0.3168 -0.274998 +v 1.654413 -0.3168 0.274998 +v 1.662080 -0.384375 -0.558320 +v 1.662080 -0.384375 0.558320 +v 1.676000 -0.3168 0.000000 +v 1.676000 -0.3168 0.000000 +v 1.683577 -0.553725 -0.875920 +v 1.683577 -0.553725 0.875920 +v 1.687137 -1.4712 -0.877772 +v 1.687137 -1.4712 0.877772 +v 1.694372 -1.7748 -0.569167 +v 1.694372 -1.7748 0.569167 +v 1.696119 -1.929525 -0.281930 +v 1.696119 -1.929525 0.281930 +v 1.700000 -0.6 0.000000 +v 1.700000 -0.6 0.000000 +v 1.700000 -0.6231 0.178200 +v 1.700000 -0.6231 -0.178200 +v 1.700000 -0.6858 -0.316800 +v 1.700000 -0.6858 0.316800 +v 1.700000 -0.7782 0.415800 +v 1.700000 -0.7782 -0.415800 +v 1.700000 -0.8904 -0.475200 +v 1.700000 -0.8904 0.475200 +v 1.700000 -1.0125 -0.495000 +v 1.700000 -1.0125 0.495000 +v 1.700000 -1.1346 -0.475200 +v 1.700000 -1.1346 0.475200 +v 1.700000 -1.2468 0.415800 +v 1.700000 -1.2468 -0.415800 +v 1.700000 -1.3392 -0.316800 +v 1.700000 -1.3392 0.316800 +v 1.700000 -1.4019 0.178200 +v 1.700000 -1.4019 -0.178200 +v 1.700000 -1.425 0.000000 +v 1.700000 -1.425 0.000000 +v 1.718250 -1.929525 0.000000 +v 1.718250 -1.929525 0.000000 +v 1.725622 -1.323225 -0.897795 +v 1.725622 -1.323225 0.897795 +v 1.727460 -0.384375 -0.287140 +v 1.727460 -0.384375 0.287140 +v 1.732362 -0.4632 -0.581929 +v 1.732362 -0.4632 0.581929 +v 1.733408 -0.6564 -0.901846 +v 1.733408 -0.6564 0.901846 +v 1.750000 -0.384375 0.000000 +v 1.750000 -0.384375 0.000000 +v 1.751120 -1.621875 -0.588230 +v 1.751120 -1.621875 0.588230 +v 1.754764 -1.1784 -0.912957 +v 1.754764 -1.1784 0.912957 +v 1.761022 -1.7748 -0.292719 +v 1.761022 -1.7748 0.292719 +v 1.767222 -0.771675 -0.919439 +v 1.767222 -0.771675 0.919439 +v 1.773229 -1.037175 -0.922564 +v 1.773229 -1.037175 0.922564 +v 1.779680 -0.9 -0.925920 +v 1.779680 -0.9 -0.925920 +v 1.779680 -0.9 0.925920 +v 1.779680 -0.9 0.925920 +v 1.784000 -1.7748 0.000000 +v 1.784000 -1.7748 0.000000 +v 1.796946 -0.553725 -0.603624 +v 1.796946 -0.553725 0.603624 +v 1.800507 -0.4632 -0.299282 +v 1.800507 -0.4632 0.299282 +v 1.800745 -1.4712 -0.604900 +v 1.800745 -1.4712 0.604900 +v 1.820003 -1.621875 -0.302523 +v 1.820003 -1.621875 0.302522 +v 1.824000 -0.4632 0.000000 +v 1.824000 -0.4632 0.000000 +v 1.841822 -1.323225 -0.618698 +v 1.841822 -1.323225 0.618698 +v 1.843750 -1.621875 0.000000 +v 1.843750 -1.621875 -0.000000 +v 1.850132 -0.6564 -0.621490 +v 1.850132 -0.6564 0.621490 +v 1.867631 -0.553725 -0.310439 +v 1.867631 -0.553725 0.310439 +v 1.871580 -1.4712 -0.311096 +v 1.871580 -1.4712 0.311096 +v 1.872927 -1.1784 -0.629147 +v 1.872927 -1.1784 0.629147 +v 1.886223 -0.771675 -0.633613 +v 1.886223 -0.771675 0.633613 +v 1.892000 -0.553725 0.000000 +v 1.892000 -0.553725 -0.000000 +v 1.892634 -1.037175 -0.635767 +v 1.892634 -1.037175 0.635767 +v 1.896000 -1.4712 0.000000 +v 1.896000 -1.4712 0.000000 +v 1.899520 -0.9 -0.638080 +v 1.899520 -0.9 -0.638080 +v 1.899520 -0.9 0.638080 +v 1.899520 -0.9 0.638080 +v 1.914272 -1.323225 -0.318192 +v 1.914272 -1.323225 0.318192 +v 1.922910 -0.6564 -0.319628 +v 1.922910 -0.6564 0.319628 +v 1.935900 -1.4442 0.000000 +v 1.935900 -1.4442 0.000000 +v 1.939250 -1.323225 0.000000 +v 1.939250 -1.323225 -0.000000 +v 1.939394 -1.423221 -0.175100 +v 1.939394 -1.423221 0.175100 +v 1.946601 -1.1784 -0.323566 +v 1.946601 -1.1784 0.323566 +v 1.948000 -0.6564 0.000000 +v 1.948000 -0.6564 -0.000000 +v 1.948879 -1.366278 -0.311290 +v 1.948879 -1.366278 0.311290 +v 1.960420 -0.771675 -0.325863 +v 1.960420 -0.771675 0.325863 +v 1.962857 -1.282362 -0.408568 +v 1.962857 -1.282362 0.408568 +v 1.967083 -1.037175 -0.326970 +v 1.967083 -1.037175 0.326970 +v 1.972000 -1.1784 0.000000 +v 1.972000 -1.1784 0.000000 +v 1.974240 -0.9 -0.328160 +v 1.974240 -0.9 0.328160 +v 1.974240 -0.9 0.328160 +v 1.979830 -1.180464 -0.466934 +v 1.979830 -1.180464 0.466934 +v 1.986000 -0.771675 0.000000 +v 1.986000 -0.771675 -0.000000 +v 1.992750 -1.037175 0.000000 +v 1.992750 -1.037175 0.000000 +v 1.998300 -1.069575 -0.486390 +v 1.998300 -1.069575 0.486390 +v 2.000000 -0.9 0.000000 +v 2.000000 -0.9 0.000000 +v 2.016770 -0.958686 -0.466934 +v 2.016770 -0.958686 0.466934 +v 2.033743 -0.856788 -0.408568 +v 2.033743 -0.856788 0.408568 +v 2.047721 -0.772872 0.311290 +v 2.047721 -0.772872 -0.311290 +v 2.057206 -0.715929 0.175100 +v 2.057206 -0.715929 -0.175100 +v 2.060700 -0.69495 0.000000 +v 2.060700 -0.69495 0.000000 +v 2.111200 -1.4976 0.000000 +v 2.111200 -1.4976 0.000000 +v 2.116979 -1.47912 -0.166687 +v 2.116979 -1.47912 0.166687 +v 2.132666 -1.42896 -0.296333 +v 2.132666 -1.42896 0.296333 +v 2.155782 -1.35504 -0.388937 +v 2.155782 -1.35504 0.388937 +v 2.183853 -1.26528 -0.444499 +v 2.183853 -1.26528 0.444499 +v 2.214400 -1.1676 -0.463020 +v 2.214400 -1.1676 0.463020 +v 2.237300 -1.5789 0.000000 +v 2.237300 -1.5789 0.000000 +v 2.244457 -1.563171 -0.154289 +v 2.244457 -1.563171 0.154289 +v 2.244947 -1.06992 -0.444499 +v 2.244947 -1.06992 0.444499 +v 2.263882 -1.520478 -0.274291 +v 2.263882 -1.520478 0.274291 +v 2.273018 -0.98016 -0.388937 +v 2.273018 -0.98016 0.388937 +v 2.292510 -1.457562 -0.360007 +v 2.292510 -1.457562 0.360007 +v 2.296134 -0.90624 -0.296333 +v 2.296134 -0.90624 0.296333 +v 2.311821 -0.85608 -0.166687 +v 2.311821 -0.85608 0.166687 +v 2.317600 -0.8376 0.000000 +v 2.317600 -0.8376 0.000000 +v 2.325600 -1.6818 0.000000 +v 2.325600 -1.6818 0.000000 +v 2.327271 -1.381164 -0.411437 +v 2.327271 -1.381164 0.411437 +v 2.333530 -1.668948 -0.139234 +v 2.333530 -1.668948 0.139234 +v 2.355053 -1.634064 -0.247526 +v 2.355053 -1.634064 0.247526 +v 2.365100 -1.298025 -0.428580 +v 2.365100 -1.298025 0.428580 +v 2.386771 -1.582656 -0.324878 +v 2.386771 -1.582656 0.324878 +v 2.387500 -1.8 0.000000 +v 2.387500 -1.8 0.000000 +v 2.395900 -1.790025 0.122850 +v 2.395900 -1.790025 -0.122850 +v 2.402929 -1.214886 -0.411437 +v 2.402929 -1.214886 0.411437 +v 2.418700 -1.76295 -0.218400 +v 2.418700 -1.76295 0.218400 +v 2.425286 -1.520232 -0.371290 +v 2.425286 -1.520232 0.371290 +v 2.434400 -1.9272 0.000000 +v 2.434400 -1.9272 0.000000 +v 2.437690 -1.138488 -0.360007 +v 2.437690 -1.138488 0.360007 +v 2.443270 -1.919976 0.106466 +v 2.443270 -1.919976 -0.106466 +v 2.452300 -1.72305 -0.286650 +v 2.452300 -1.72305 0.286650 +v 2.466318 -1.075572 -0.274291 +v 2.466318 -1.075572 0.274291 +v 2.467200 -1.4523 -0.386760 +v 2.467200 -1.4523 0.386760 +v 2.467347 -1.900368 0.189274 +v 2.467347 -1.900368 -0.189274 +v 2.477700 -2.0571 0.000000 +v 2.477700 -2.0571 0.000000 +v 2.485743 -1.032879 -0.154289 +v 2.485743 -1.032879 0.154289 +v 2.487343 -2.052375 -0.091411 +v 2.487343 -2.052375 0.091411 +v 2.492900 -1.01715 0.000000 +v 2.492900 -1.01715 0.000000 +v 2.493100 -1.6746 -0.327600 +v 2.493100 -1.6746 0.327600 +v 2.502829 -1.871472 0.248422 +v 2.502829 -1.871472 -0.248422 +v 2.509114 -1.384368 -0.371290 +v 2.509114 -1.384368 0.371290 +v 2.513518 -2.03955 0.162509 +v 2.513518 -2.03955 -0.162509 +v 2.528800 -2.1834 0.000000 +v 2.537500 -1.621875 -0.341250 +v 2.537500 -1.621875 0.341250 +v 2.539821 -2.180796 -0.079013 +v 2.539821 -2.180796 0.079013 +v 2.545914 -1.836384 -0.283910 +v 2.545914 -1.836384 0.283910 +v 2.547629 -1.321944 -0.324878 +v 2.547629 -1.321944 0.324878 +v 2.552090 -2.02065 -0.213293 +v 2.552090 -2.02065 0.213293 +v 2.569734 -2.173728 -0.140467 +v 2.569734 -2.173728 0.140467 +v 2.579347 -1.270536 -0.247526 +v 2.579347 -1.270536 0.247526 +v 2.581900 -1.56915 -0.327600 +v 2.581900 -1.56915 0.327600 +v 2.592800 -1.7982 -0.295740 +v 2.592800 -1.7982 0.295740 +v 2.598929 -1.9977 -0.243763 +v 2.598929 -1.9977 0.243763 +v 2.599100 -2.2998 0.000000 +v 2.599100 -2.2998 0.000000 +v 2.600870 -1.235652 -0.139234 +v 2.600870 -1.235652 0.139234 +v 2.608800 -1.2228 0.000000 +v 2.608800 -1.2228 0.000000 +v 2.612406 -2.298813 0.070600 +v 2.612406 -2.298813 -0.070600 +v 2.613818 -2.163312 -0.184363 +v 2.613818 -2.163312 0.184363 +v 2.622700 -1.5207 -0.286650 +v 2.622700 -1.5207 0.286650 +v 2.639686 -1.760016 -0.283910 +v 2.639686 -1.760016 0.283910 +v 2.648521 -2.296134 0.125510 +v 2.648521 -2.296134 -0.125510 +v 2.649900 -1.972725 0.253920 +v 2.649900 -1.972725 -0.253920 +v 2.656300 -1.4808 -0.218400 +v 2.656300 -1.4808 0.218400 +v 2.667347 -2.150664 -0.210701 +v 2.667347 -2.150664 0.210701 +v 2.679100 -1.453725 0.122850 +v 2.679100 -1.453725 -0.122850 +v 2.682771 -1.724928 0.248422 +v 2.682771 -1.724928 -0.248422 +v 2.687500 -1.44375 0.000000 +v 2.687500 -1.44375 0.000000 +v 2.700000 -2.4 0.000000 +v 2.700000 -2.4 0.000000 +v 2.700000 -2.4 0.000000 +v 2.700871 -1.94775 -0.243763 +v 2.700871 -1.94775 0.243763 +v 2.701743 -2.292186 0.164732 +v 2.701743 -2.292186 -0.164732 +v 2.716800 -2.4 0.067500 +v 2.716800 -2.4 -0.067500 +v 2.716800 -2.4 -0.067500 +v 2.716800 -2.4 0.067500 +v 2.718253 -1.696032 0.189274 +v 2.718253 -1.696032 -0.189274 +v 2.725600 -2.1369 -0.219480 +v 2.725600 -2.1369 0.219480 +v 2.729800 -2.42025 0.000000 +v 2.742330 -1.676424 0.106466 +v 2.742330 -1.676424 -0.106466 +v 2.747407 -2.420406 -0.066744 +v 2.747407 -2.420406 0.066744 +v 2.747710 -1.9248 -0.213293 +v 2.747710 -1.9248 0.213293 +v 2.751200 -1.6692 0.000000 +v 2.751200 -1.6692 0.000000 +v 2.758400 -2.436 0.000000 +v 2.762400 -2.4 0.120000 +v 2.762400 -2.4 -0.120000 +v 2.762400 -2.4 -0.120000 +v 2.762400 -2.4 0.120000 +v 2.766370 -2.287392 0.188266 +v 2.766370 -2.287392 -0.188266 +v 2.776365 -2.436302 -0.064692 +v 2.776365 -2.436302 0.064692 +v 2.783853 -2.123136 -0.210701 +v 2.783853 -2.123136 0.210701 +v 2.784600 -2.44725 0.000000 +v 2.784600 -2.44725 0.000000 +v 2.786282 -1.9059 0.162509 +v 2.786282 -1.9059 -0.162509 +v 2.795198 -2.420829 -0.118656 +v 2.795198 -2.420829 0.118656 +v 2.800000 -2.4 0.000000 +v 2.802528 -2.44768 -0.061668 +v 2.802528 -2.44768 0.061668 +v 2.807200 -2.454 0.000000 +v 2.811200 -2.4 -0.040500 +v 2.811200 -2.4 0.040500 +v 2.812457 -1.893075 0.091411 +v 2.812457 -1.893075 -0.091411 +v 2.822100 -1.88835 0.000000 +v 2.822100 -1.88835 0.000000 +v 2.824200 -2.42025 0.000000 +v 2.824200 -2.42025 0.000000 +v 2.824750 -2.454529 -0.057996 +v 2.824750 -2.454529 0.057996 +v 2.825000 -2.45625 0.000000 +v 2.825000 -2.45625 0.000000 +v 2.825126 -2.437123 -0.115008 +v 2.825126 -2.437123 0.115008 +v 2.829600 -2.4 0.157500 +v 2.829600 -2.4 -0.157500 +v 2.829600 -2.4 -0.157500 +v 2.829600 -2.4 0.157500 +v 2.836672 -2.420519 -0.041256 +v 2.836672 -2.420519 0.041256 +v 2.836700 -2.282175 0.196110 +v 2.836700 -2.282175 -0.196110 +v 2.836800 -2.454 0.000000 +v 2.836800 -2.454 0.000000 +v 2.837382 -2.110488 -0.184363 +v 2.837382 -2.110488 0.184363 +v 2.837600 -2.436 0.000000 +v 2.837600 -2.436 0.000000 +v 2.841400 -2.44725 0.000000 +v 2.841400 -2.44725 0.000000 +v 2.841600 -2.4 -0.072000 +v 2.841600 -2.4 0.072000 +v 2.841887 -2.456841 -0.054000 +v 2.841887 -2.456841 0.054000 +v 2.851189 -2.448847 -0.109632 +v 2.851189 -2.448847 0.109632 +v 2.851331 -2.436454 -0.043308 +v 2.851331 -2.436454 0.043308 +v 2.852794 -2.454605 -0.050004 +v 2.852794 -2.454605 0.050004 +v 2.856323 -2.447812 -0.046332 +v 2.856323 -2.447812 0.046332 +v 2.865626 -2.421453 -0.155736 +v 2.865626 -2.421453 0.155736 +v 2.870524 -2.42125 -0.073344 +v 2.870524 -2.42125 0.073344 +v 2.872387 -2.455966 -0.103104 +v 2.872387 -2.455966 0.103104 +v 2.881466 -2.100072 -0.140467 +v 2.881466 -2.100072 0.140467 +v 2.886400 -2.4 -0.094500 +v 2.886400 -2.4 0.094500 +v 2.887725 -2.458444 -0.096000 +v 2.887725 -2.458444 0.096000 +v 2.888602 -2.437685 -0.076992 +v 2.888602 -2.437685 0.076992 +v 2.896205 -2.456246 0.088896 +v 2.896205 -2.456246 -0.088896 +v 2.896829 -2.449338 -0.082368 +v 2.896829 -2.449338 0.082368 +v 2.896986 -2.438333 -0.150948 +v 2.896986 -2.438333 0.150948 +v 2.907030 -2.276958 0.188266 +v 2.907030 -2.276958 -0.188266 +v 2.911200 -2.4 -0.180000 +v 2.911200 -2.4 -0.180000 +v 2.911200 -2.4 0.180000 +v 2.911379 -2.093004 -0.079013 +v 2.911379 -2.093004 0.079013 +v 2.920412 -2.422328 -0.096264 +v 2.920412 -2.422328 0.096264 +v 2.922400 -2.0904 0.000000 +v 2.922899 -2.450567 -0.143892 +v 2.922899 -2.450567 0.143892 +v 2.940800 -2.4 -0.108000 +v 2.940800 -2.4 0.108000 +v 2.942589 -2.458082 -0.135324 +v 2.942589 -2.458082 0.135324 +v 2.943526 -2.439499 -0.101052 +v 2.943526 -2.439499 0.101052 +v 2.951146 -2.42221 -0.177984 +v 2.951146 -2.42221 0.177984 +v 2.955275 -2.460806 -0.126000 +v 2.955275 -2.460806 0.126000 +v 2.956523 -2.451588 -0.108108 +v 2.956523 -2.451588 0.108108 +v 2.960179 -2.458666 -0.116676 +v 2.960179 -2.458666 0.116676 +v 2.971657 -2.272164 0.164732 +v 2.971657 -2.272164 -0.164732 +v 2.980990 -2.423636 0.110016 +v 2.980990 -2.423636 -0.110016 +v 2.984243 -2.439802 -0.172512 +v 2.984243 -2.439802 0.172512 +v 3.000000 -2.4 -0.187500 +v 3.000000 -2.4 -0.187500 +v 3.000000 -2.4 -0.112500 +v 3.000000 -2.4 0.112500 +v 3.000000 -2.4 0.187500 +v 3.009977 -2.452655 -0.164448 +v 3.009977 -2.452655 0.164448 +v 3.010221 -2.441702 -0.115488 +v 3.010221 -2.441702 0.115488 +v 3.024879 -2.268216 0.125510 +v 3.024879 -2.268216 -0.125510 +v 3.027834 -2.460653 -0.154656 +v 3.027834 -2.460653 0.154656 +v 3.029007 -2.454319 -0.123552 +v 3.029007 -2.454319 0.123552 +v 3.037300 -2.463675 -0.144000 +v 3.037300 -2.463675 0.144000 +v 3.037862 -2.461603 0.133344 +v 3.037862 -2.461603 -0.133344 +v 3.044212 -2.423034 -0.185400 +v 3.044212 -2.423034 0.185400 +v 3.046912 -2.425059 0.114600 +v 3.046912 -2.425059 -0.114600 +v 3.059200 -2.4 -0.108000 +v 3.059200 -2.4 0.108000 +v 3.060994 -2.265537 0.070600 +v 3.060994 -2.265537 -0.070600 +v 3.074300 -2.26455 0.000000 +v 3.074300 -2.26455 0.000000 +v 3.079200 -2.4414 -0.179700 +v 3.079200 -2.4414 0.179700 +v 3.082800 -2.4441 -0.120300 +v 3.082800 -2.4441 0.120300 +v 3.088800 -2.4 -0.180000 +v 3.088800 -2.4 -0.180000 +v 3.088800 -2.4 0.180000 +v 3.104737 -2.454928 -0.171300 +v 3.104738 -2.454928 0.171300 +v 3.107887 -2.457291 -0.128700 +v 3.107887 -2.457291 0.128700 +v 3.112835 -2.426483 0.110016 +v 3.112835 -2.426483 -0.110016 +v 3.113600 -2.4 -0.094500 +v 3.113600 -2.4 0.094500 +v 3.120600 -2.46345 0.161100 +v 3.120600 -2.46345 -0.161100 +v 3.122400 -2.4648 0.138900 +v 3.122400 -2.4648 -0.138900 +v 3.126562 -2.466797 -0.150000 +v 3.126562 -2.466797 0.150000 +v 3.137279 -2.423859 -0.177984 +v 3.137279 -2.423859 0.177984 +v 3.155379 -2.446498 -0.115488 +v 3.155379 -2.446498 0.115488 +v 3.158400 -2.4 -0.072000 +v 3.158400 -2.4 0.072000 +v 3.170400 -2.4 -0.157500 +v 3.170400 -2.4 0.157500 +v 3.170400 -2.4 -0.157500 +v 3.173413 -2.427791 -0.096264 +v 3.173413 -2.427791 0.096264 +v 3.174157 -2.442998 -0.172512 +v 3.174157 -2.442998 0.172512 +v 3.186768 -2.460263 -0.123552 +v 3.186768 -2.460263 0.123552 +v 3.188800 -2.4 -0.040500 +v 3.188800 -2.4 0.040500 +v 3.199498 -2.457201 -0.164448 +v 3.199498 -2.457201 0.164448 +v 3.200000 -2.4 0.000000 +v 3.206938 -2.467997 0.133344 +v 3.206938 -2.467997 -0.133344 +v 3.213366 -2.466247 -0.154656 +v 3.213366 -2.466247 0.154656 +v 3.215825 -2.469919 -0.144000 +v 3.215825 -2.469919 0.144000 +v 3.222074 -2.448701 -0.101052 +v 3.222074 -2.448701 0.101052 +v 3.222799 -2.424616 -0.155736 +v 3.222799 -2.424616 0.155736 +v 3.223301 -2.428868 -0.073344 +v 3.223301 -2.428868 0.073344 +v 3.237600 -2.4 -0.120000 +v 3.237600 -2.4 0.120000 +v 3.237600 -2.4 -0.120000 +v 3.257153 -2.429599 -0.041256 +v 3.257153 -2.429599 0.041256 +v 3.259252 -2.462994 -0.108108 +v 3.259252 -2.462994 0.108108 +v 3.261414 -2.444467 -0.150948 +v 3.261414 -2.444467 0.150948 +v 3.269625 -2.429869 0.000000 +v 3.269625 -2.429869 0.000000 +v 3.276998 -2.450515 -0.076992 +v 3.276998 -2.450515 0.076992 +v 3.283200 -2.4 -0.067500 +v 3.283200 -2.4 0.067500 +v 3.283200 -2.4 -0.067500 +v 3.284621 -2.470934 -0.116676 +v 3.284621 -2.470934 0.116676 +v 3.286576 -2.459289 -0.143892 +v 3.286576 -2.459289 0.143892 +v 3.293227 -2.42524 -0.118656 +v 3.293227 -2.42524 0.118656 +v 3.297850 -2.472787 -0.126000 +v 3.297850 -2.472788 0.126000 +v 3.298611 -2.468818 -0.135324 +v 3.298611 -2.468818 0.135324 +v 3.300000 -2.4 0.000000 +v 3.300000 -2.4 0.000000 +v 3.314269 -2.451746 -0.043308 +v 3.314269 -2.451746 0.043308 +v 3.318946 -2.465243 -0.082368 +v 3.318946 -2.465243 0.082368 +v 3.328000 -2.4522 0.000000 +v 3.328000 -2.4522 0.000000 +v 3.333274 -2.445677 -0.115008 +v 3.333274 -2.445677 0.115008 +v 3.341018 -2.425663 -0.066744 +v 3.341018 -2.425663 0.066744 +v 3.348595 -2.473354 0.088896 +v 3.348595 -2.473354 -0.088896 +v 3.358286 -2.461009 -0.109632 +v 3.358286 -2.461009 0.109632 +v 3.358625 -2.425819 0.000000 +v 3.359452 -2.466769 -0.046332 +v 3.359452 -2.466769 0.046332 +v 3.365400 -2.47515 -0.096000 +v 3.365400 -2.47515 0.096000 +v 3.368813 -2.470934 -0.103104 +v 3.368813 -2.470934 0.103104 +v 3.374375 -2.467331 0.000000 +v 3.374375 -2.467331 0.000000 +v 3.382035 -2.446498 -0.064692 +v 3.382035 -2.446498 0.064692 +v 3.392006 -2.474995 -0.050004 +v 3.392006 -2.474995 0.050004 +v 3.400000 -2.4468 0.000000 +v 3.406947 -2.462176 -0.061668 +v 3.406947 -2.462176 0.061668 +v 3.408000 -2.4756 0.000000 +v 3.408000 -2.4756 0.000000 +v 3.411237 -2.476753 -0.054000 +v 3.411237 -2.476753 0.054000 +v 3.416450 -2.472371 -0.057996 +v 3.416450 -2.472371 0.057996 +v 3.424875 -2.462606 0.000000 +v 3.428125 -2.477344 0.000000 +v 3.428125 -2.477344 0.000000 +v 3.434000 -2.4729 0.000000 + +f 2909 2921 2939 +f 2939 2931 2909 +f 2869 2877 2921 +f 2921 2909 2869 +f 2819 2827 2877 +f 2877 2869 2819 +f 2737 2747 2827 +f 2827 2819 2737 +f 2669 2673 2747 +f 2747 2737 2669 +f 2567 2575 2673 +f 2673 2669 2567 +f 2476 2480 2575 +f 2575 2567 2476 +f 2358 2362 2480 +f 2480 2476 2358 +f 2158 2162 2362 +f 2362 2358 2158 +f 1715 1812 2162 +f 2162 2158 1715 +f 2901 2909 2931 +f 2931 2917 2901 +f 2863 2869 2909 +f 2909 2901 2863 +f 2813 2819 2869 +f 2869 2863 2813 +f 2729 2737 2819 +f 2819 2813 2729 +f 2663 2669 2737 +f 2737 2729 2663 +f 2561 2567 2669 +f 2669 2663 2561 +f 2468 2476 2567 +f 2567 2561 2468 +f 2350 2358 2476 +f 2476 2468 2350 +f 2152 2158 2358 +f 2358 2350 2152 +f 1717 1715 2158 +f 2158 2152 1717 +f 2903 2901 2917 +f 2917 2923 2903 +f 2865 2863 2901 +f 2901 2903 2865 +f 2815 2813 2863 +f 2863 2865 2815 +f 2733 2729 2813 +f 2813 2815 2733 +f 2665 2663 2729 +f 2729 2733 2665 +f 2564 2561 2663 +f 2663 2665 2564 +f 2473 2468 2561 +f 2561 2564 2473 +f 2354 2350 2468 +f 2468 2473 2354 +f 2155 2152 2350 +f 2350 2354 2155 +f 1927 1717 2152 +f 2152 2155 1927 +f 2911 2903 2923 +f 2923 2935 2911 +f 2875 2865 2903 +f 2903 2911 2875 +f 2823 2815 2865 +f 2865 2875 2823 +f 2741 2733 2815 +f 2815 2823 2741 +f 2671 2665 2733 +f 2733 2741 2671 +f 2571 2564 2665 +f 2665 2671 2571 +f 2478 2473 2564 +f 2564 2571 2478 +f 2360 2354 2473 +f 2473 2478 2360 +f 2160 2155 2354 +f 2354 2360 2160 +f 1718 1927 2155 +f 2155 2160 1718 +f 2929 2911 2935 +f 2935 2947 2929 +f 2881 2875 2911 +f 2911 2929 2881 +f 2829 2823 2875 +f 2875 2881 2829 +f 2751 2741 2823 +f 2823 2829 2751 +f 2677 2671 2741 +f 2741 2751 2677 +f 2577 2571 2671 +f 2671 2677 2577 +f 2482 2478 2571 +f 2571 2577 2482 +f 2364 2360 2478 +f 2478 2482 2364 +f 2164 2160 2360 +f 2360 2364 2164 +f 1842 1718 2160 +f 2160 2164 1842 +f 2945 2929 2947 +f 2947 2959 2945 +f 2897 2881 2929 +f 2929 2945 2897 +f 2835 2829 2881 +f 2881 2897 2835 +f 2761 2751 2829 +f 2829 2835 2761 +f 2679 2677 2751 +f 2751 2761 2679 +f 2579 2577 2677 +f 2677 2679 2579 +f 2486 2482 2577 +f 2577 2579 2486 +f 2368 2364 2482 +f 2482 2486 2368 +f 2172 2164 2364 +f 2364 2368 2172 +f 1725 1842 2164 +f 2164 2172 1725 +f 2965 2945 2959 +f 2959 2981 2965 +f 2907 2897 2945 +f 2945 2965 2907 +f 2845 2835 2897 +f 2897 2907 2845 +f 2769 2761 2835 +f 2835 2845 2769 +f 2685 2679 2761 +f 2761 2769 2685 +f 2587 2579 2679 +f 2679 2685 2587 +f 2491 2486 2579 +f 2579 2587 2491 +f 2370 2368 2486 +f 2486 2491 2370 +f 2174 2172 2368 +f 2368 2370 2174 +f 1834 1725 2172 +f 2172 2174 1834 +f 2982 2965 2981 +f 2981 2988 2982 +f 2933 2907 2965 +f 2965 2982 2933 +f 2855 2845 2907 +f 2907 2933 2855 +f 2779 2769 2845 +f 2845 2855 2779 +f 2691 2685 2769 +f 2769 2779 2691 +f 2595 2587 2685 +f 2685 2691 2595 +f 2500 2491 2587 +f 2587 2595 2500 +f 2374 2370 2491 +f 2491 2500 2374 +f 2178 2174 2370 +f 2370 2374 2178 +f 1716 1834 2174 +f 2174 2178 1716 +f 2990 2982 2988 +f 2988 3002 2990 +f 2949 2933 2982 +f 2982 2990 2949 +f 2871 2855 2933 +f 2933 2949 2871 +f 2791 2779 2855 +f 2855 2871 2791 +f 2699 2691 2779 +f 2779 2791 2699 +f 2601 2595 2691 +f 2691 2699 2601 +f 2506 2500 2595 +f 2595 2601 2506 +f 2378 2374 2500 +f 2500 2506 2378 +f 2180 2178 2374 +f 2374 2378 2180 +f 1714 1716 2178 +f 2178 2180 1714 +f 3008 2990 3002 +f 3002 3024 3008 +f 2973 2949 2990 +f 2990 3008 2973 +f 2889 2871 2949 +f 2949 2973 2889 +f 2805 2791 2871 +f 2871 2889 2805 +f 2711 2699 2791 +f 2791 2805 2711 +f 2611 2601 2699 +f 2699 2711 2611 +f 2521 2506 2601 +f 2601 2611 2521 +f 2387 2378 2506 +f 2506 2521 2387 +f 2191 2180 2378 +f 2378 2387 2191 +f 1810 1714 2180 +f 2180 2191 1810 +f 1464 1460 1813 +f 1813 1821 1464 +f 1264 1260 1460 +f 1460 1464 1264 +f 1146 1142 1260 +f 1260 1264 1146 +f 1055 1047 1142 +f 1142 1146 1055 +f 953 949 1047 +f 1047 1055 953 +f 885 875 949 +f 949 953 885 +f 803 795 875 +f 875 885 803 +f 753 745 795 +f 795 803 753 +f 713 701 745 +f 745 753 713 +f 691 683 701 +f 701 713 691 +f 1470 1464 1821 +f 1821 1829 1470 +f 1272 1264 1464 +f 1464 1470 1272 +f 1154 1146 1264 +f 1264 1272 1154 +f 1061 1055 1146 +f 1146 1154 1061 +f 959 953 1055 +f 1055 1061 959 +f 893 885 953 +f 953 959 893 +f 809 803 885 +f 885 893 809 +f 759 753 803 +f 803 809 759 +f 721 713 753 +f 753 759 721 +f 705 691 713 +f 713 721 705 +f 1469 1470 1829 +f 1829 1835 1469 +f 1268 1272 1470 +f 1470 1469 1268 +f 1151 1154 1272 +f 1272 1268 1151 +f 1060 1061 1154 +f 1154 1151 1060 +f 957 959 1061 +f 1061 1060 957 +f 889 893 959 +f 959 957 889 +f 807 809 893 +f 893 889 807 +f 757 759 809 +f 809 807 757 +f 719 721 759 +f 759 757 719 +f 699 705 721 +f 721 719 699 +f 1462 1469 1835 +f 1835 1839 1462 +f 1262 1268 1469 +f 1469 1462 1262 +f 1144 1151 1268 +f 1268 1262 1144 +f 1051 1060 1151 +f 1151 1144 1051 +f 951 957 1060 +f 1060 1051 951 +f 881 889 957 +f 957 951 881 +f 799 807 889 +f 889 881 799 +f 747 757 807 +f 807 799 747 +f 711 719 757 +f 757 747 711 +f 687 699 719 +f 719 711 687 +f 1458 1462 1839 +f 1839 1843 1458 +f 1258 1262 1462 +f 1462 1458 1258 +f 1140 1144 1262 +f 1262 1258 1140 +f 1045 1051 1144 +f 1144 1140 1045 +f 945 951 1051 +f 1051 1045 945 +f 871 881 951 +f 951 945 871 +f 793 799 881 +f 881 871 793 +f 741 747 799 +f 799 793 741 +f 693 711 747 +f 747 741 693 +f 675 687 711 +f 711 693 675 +f 1450 1458 1843 +f 1843 1838 1450 +f 1254 1258 1458 +f 1458 1450 1254 +f 1136 1140 1258 +f 1258 1254 1136 +f 1043 1045 1140 +f 1140 1136 1043 +f 943 945 1045 +f 1045 1043 943 +f 861 871 945 +f 945 943 861 +f 787 793 871 +f 871 861 787 +f 725 741 793 +f 793 787 725 +f 677 693 741 +f 741 725 677 +f 663 675 693 +f 693 677 663 +f 1448 1450 1838 +f 1838 1834 1448 +f 1252 1254 1450 +f 1450 1448 1252 +f 1133 1136 1254 +f 1254 1252 1133 +f 1035 1043 1136 +f 1136 1133 1035 +f 937 943 1043 +f 1043 1035 937 +f 853 861 943 +f 943 937 853 +f 777 787 861 +f 861 853 777 +f 715 725 787 +f 787 777 715 +f 657 677 725 +f 725 715 657 +f 642 663 677 +f 677 657 642 +f 1444 1448 1834 +f 1834 1828 1444 +f 1248 1252 1448 +f 1448 1444 1248 +f 1122 1133 1252 +f 1252 1248 1122 +f 1027 1035 1133 +f 1133 1122 1027 +f 931 937 1035 +f 1035 1027 931 +f 843 853 937 +f 937 931 843 +f 767 777 853 +f 853 843 767 +f 689 715 777 +f 777 767 689 +f 640 657 715 +f 715 689 640 +f 634 642 657 +f 657 640 634 +f 1442 1444 1828 +f 1828 1820 1442 +f 1244 1248 1444 +f 1444 1442 1244 +f 1116 1122 1248 +f 1248 1244 1116 +f 1021 1027 1122 +f 1122 1116 1021 +f 923 931 1027 +f 1027 1021 923 +f 831 843 931 +f 931 923 831 +f 751 767 843 +f 843 831 751 +f 673 689 767 +f 767 751 673 +f 632 640 689 +f 689 673 632 +f 620 634 640 +f 640 632 620 +f 1429 1442 1820 +f 1820 1811 1429 +f 1233 1244 1442 +f 1442 1429 1233 +f 1106 1116 1244 +f 1244 1233 1106 +f 1011 1021 1116 +f 1116 1106 1011 +f 911 923 1021 +f 1021 1011 911 +f 817 831 923 +f 923 911 817 +f 733 751 831 +f 831 817 733 +f 649 673 751 +f 751 733 649 +f 614 632 673 +f 673 649 614 +f 597 620 632 +f 632 614 597 +f 714 702 684 +f 684 692 714 +f 754 746 702 +f 702 714 754 +f 804 796 746 +f 746 754 804 +f 886 876 796 +f 796 804 886 +f 954 950 876 +f 876 886 954 +f 1056 1048 950 +f 950 954 1056 +f 1147 1143 1048 +f 1048 1056 1147 +f 1265 1261 1143 +f 1143 1147 1265 +f 1465 1461 1261 +f 1261 1265 1465 +f 1915 1817 1461 +f 1461 1465 1915 +f 722 714 692 +f 692 706 722 +f 760 754 714 +f 714 722 760 +f 810 804 754 +f 754 760 810 +f 894 886 804 +f 804 810 894 +f 960 954 886 +f 886 894 960 +f 1062 1056 954 +f 954 960 1062 +f 1155 1147 1056 +f 1056 1062 1155 +f 1273 1265 1147 +f 1147 1155 1273 +f 1471 1465 1265 +f 1265 1273 1471 +f 1917 1915 1465 +f 1465 1471 1917 +f 720 722 706 +f 706 700 720 +f 758 760 722 +f 722 720 758 +f 808 810 760 +f 760 758 808 +f 890 894 810 +f 810 808 890 +f 958 960 894 +f 894 890 958 +f 1059 1062 960 +f 960 958 1059 +f 1150 1155 1062 +f 1062 1059 1150 +f 1269 1273 1155 +f 1155 1150 1269 +f 1468 1471 1273 +f 1273 1269 1468 +f 1697 1917 1471 +f 1471 1468 1697 +f 712 720 700 +f 700 688 712 +f 748 758 720 +f 720 712 748 +f 800 808 758 +f 758 748 800 +f 882 890 808 +f 808 800 882 +f 952 958 890 +f 890 882 952 +f 1052 1059 958 +f 958 952 1052 +f 1145 1150 1059 +f 1059 1052 1145 +f 1263 1269 1150 +f 1150 1145 1263 +f 1463 1468 1269 +f 1269 1263 1463 +f 1919 1697 1468 +f 1468 1463 1919 +f 694 712 688 +f 688 676 694 +f 742 748 712 +f 712 694 742 +f 794 800 748 +f 748 742 794 +f 872 882 800 +f 800 794 872 +f 946 952 882 +f 882 872 946 +f 1046 1052 952 +f 952 946 1046 +f 1141 1145 1052 +f 1052 1046 1141 +f 1259 1263 1145 +f 1145 1141 1259 +f 1459 1463 1263 +f 1263 1259 1459 +f 1845 1919 1463 +f 1463 1459 1845 +f 678 694 676 +f 676 664 678 +f 726 742 694 +f 694 678 726 +f 788 794 742 +f 742 726 788 +f 862 872 794 +f 794 788 862 +f 944 946 872 +f 872 862 944 +f 1044 1046 946 +f 946 944 1044 +f 1137 1141 1046 +f 1046 1044 1137 +f 1255 1259 1141 +f 1141 1137 1255 +f 1451 1459 1259 +f 1259 1255 1451 +f 1898 1845 1459 +f 1459 1451 1898 +f 658 678 664 +f 664 642 658 +f 716 726 678 +f 678 658 716 +f 778 788 726 +f 726 716 778 +f 854 862 788 +f 788 778 854 +f 938 944 862 +f 862 854 938 +f 1036 1044 944 +f 944 938 1036 +f 1132 1137 1044 +f 1044 1036 1132 +f 1253 1255 1137 +f 1137 1132 1253 +f 1449 1451 1255 +f 1255 1253 1449 +f 1837 1898 1451 +f 1451 1449 1837 +f 641 658 642 +f 642 635 641 +f 690 716 658 +f 658 641 690 +f 768 778 716 +f 716 690 768 +f 844 854 778 +f 778 768 844 +f 932 938 854 +f 854 844 932 +f 1028 1036 938 +f 938 932 1028 +f 1123 1132 1036 +f 1036 1028 1123 +f 1249 1253 1132 +f 1132 1123 1249 +f 1445 1449 1253 +f 1253 1249 1445 +f 1918 1837 1449 +f 1449 1445 1918 +f 633 641 635 +f 635 621 633 +f 674 690 641 +f 641 633 674 +f 752 768 690 +f 690 674 752 +f 832 844 768 +f 768 752 832 +f 924 932 844 +f 844 832 924 +f 1022 1028 932 +f 932 924 1022 +f 1117 1123 1028 +f 1028 1022 1117 +f 1245 1249 1123 +f 1123 1117 1245 +f 1443 1445 1249 +f 1249 1245 1443 +f 1916 1918 1445 +f 1445 1443 1916 +f 616 633 621 +f 621 600 616 +f 654 674 633 +f 633 616 654 +f 737 752 674 +f 674 654 737 +f 822 832 752 +f 752 737 822 +f 914 924 832 +f 832 822 914 +f 1014 1022 924 +f 924 914 1014 +f 1104 1117 1022 +f 1022 1014 1104 +f 1237 1245 1117 +f 1117 1104 1237 +f 1433 1443 1245 +f 1245 1237 1433 +f 1819 1916 1443 +f 1443 1433 1819 +f 2159 2163 1816 +f 1816 1822 2159 +f 2359 2363 2163 +f 2163 2159 2359 +f 2477 2481 2363 +f 2363 2359 2477 +f 2568 2576 2481 +f 2481 2477 2568 +f 2670 2674 2576 +f 2576 2568 2670 +f 2738 2748 2674 +f 2674 2670 2738 +f 2820 2828 2748 +f 2748 2738 2820 +f 2870 2878 2828 +f 2828 2820 2870 +f 2910 2922 2878 +f 2878 2870 2910 +f 2932 2940 2922 +f 2922 2910 2932 +f 2153 2159 1822 +f 1822 1830 2153 +f 2351 2359 2159 +f 2159 2153 2351 +f 2469 2477 2359 +f 2359 2351 2469 +f 2562 2568 2477 +f 2477 2469 2562 +f 2664 2670 2568 +f 2568 2562 2664 +f 2730 2738 2670 +f 2670 2664 2730 +f 2814 2820 2738 +f 2738 2730 2814 +f 2864 2870 2820 +f 2820 2814 2864 +f 2902 2910 2870 +f 2870 2864 2902 +f 2918 2932 2910 +f 2910 2902 2918 +f 2154 2153 1830 +f 1830 1836 2154 +f 2355 2351 2153 +f 2153 2154 2355 +f 2472 2469 2351 +f 2351 2355 2472 +f 2563 2562 2469 +f 2469 2472 2563 +f 2666 2664 2562 +f 2562 2563 2666 +f 2734 2730 2664 +f 2664 2666 2734 +f 2816 2814 2730 +f 2730 2734 2816 +f 2866 2864 2814 +f 2814 2816 2866 +f 2904 2902 2864 +f 2864 2866 2904 +f 2924 2918 2902 +f 2902 2904 2924 +f 2161 2154 1836 +f 1836 1840 2161 +f 2361 2355 2154 +f 2154 2161 2361 +f 2479 2472 2355 +f 2355 2361 2479 +f 2572 2563 2472 +f 2472 2479 2572 +f 2672 2666 2563 +f 2563 2572 2672 +f 2742 2734 2666 +f 2666 2672 2742 +f 2824 2816 2734 +f 2734 2742 2824 +f 2876 2866 2816 +f 2816 2824 2876 +f 2912 2904 2866 +f 2866 2876 2912 +f 2936 2924 2904 +f 2904 2912 2936 +f 2165 2161 1840 +f 1840 1844 2165 +f 2365 2361 2161 +f 2161 2165 2365 +f 2483 2479 2361 +f 2361 2365 2483 +f 2578 2572 2479 +f 2479 2483 2578 +f 2678 2672 2572 +f 2572 2578 2678 +f 2752 2742 2672 +f 2672 2678 2752 +f 2830 2824 2742 +f 2742 2752 2830 +f 2882 2876 2824 +f 2824 2830 2882 +f 2930 2912 2876 +f 2876 2882 2930 +f 2948 2936 2912 +f 2912 2930 2948 +f 2173 2165 1844 +f 1844 1841 2173 +f 2369 2365 2165 +f 2165 2173 2369 +f 2487 2483 2365 +f 2365 2369 2487 +f 2580 2578 2483 +f 2483 2487 2580 +f 2680 2678 2578 +f 2578 2580 2680 +f 2762 2752 2678 +f 2678 2680 2762 +f 2836 2830 2752 +f 2752 2762 2836 +f 2898 2882 2830 +f 2830 2836 2898 +f 2946 2930 2882 +f 2882 2898 2946 +f 2960 2948 2930 +f 2930 2946 2960 +f 2175 2173 1841 +f 1841 1837 2175 +f 2371 2369 2173 +f 2173 2175 2371 +f 2490 2487 2369 +f 2369 2371 2490 +f 2588 2580 2487 +f 2487 2490 2588 +f 2686 2680 2580 +f 2580 2588 2686 +f 2770 2762 2680 +f 2680 2686 2770 +f 2846 2836 2762 +f 2762 2770 2846 +f 2908 2898 2836 +f 2836 2846 2908 +f 2966 2946 2898 +f 2898 2908 2966 +f 2981 2960 2946 +f 2946 2966 2981 +f 2179 2175 1837 +f 1837 1831 2179 +f 2375 2371 2175 +f 2175 2179 2375 +f 2501 2490 2371 +f 2371 2375 2501 +f 2596 2588 2490 +f 2490 2501 2596 +f 2692 2686 2588 +f 2588 2596 2692 +f 2780 2770 2686 +f 2686 2692 2780 +f 2856 2846 2770 +f 2770 2780 2856 +f 2934 2908 2846 +f 2846 2856 2934 +f 2983 2966 2908 +f 2908 2934 2983 +f 2989 2981 2966 +f 2966 2983 2989 +f 2181 2179 1831 +f 1831 1823 2181 +f 2379 2375 2179 +f 2179 2181 2379 +f 2507 2501 2375 +f 2375 2379 2507 +f 2602 2596 2501 +f 2501 2507 2602 +f 2700 2692 2596 +f 2596 2602 2700 +f 2792 2780 2692 +f 2692 2700 2792 +f 2872 2856 2780 +f 2780 2792 2872 +f 2950 2934 2856 +f 2856 2872 2950 +f 2991 2983 2934 +f 2934 2950 2991 +f 3003 2989 2983 +f 2983 2991 3003 +f 2194 2181 1823 +f 1823 1818 2194 +f 2391 2379 2181 +f 2181 2194 2391 +f 2518 2507 2379 +f 2379 2391 2518 +f 2614 2602 2507 +f 2507 2518 2614 +f 2712 2700 2602 +f 2602 2614 2712 +f 2806 2792 2700 +f 2700 2712 2806 +f 2890 2872 2792 +f 2792 2806 2890 +f 2974 2950 2872 +f 2872 2890 2974 +f 3009 2991 2950 +f 2950 2974 3009 +f 3025 3003 2991 +f 2991 3009 3025 +f 3040 3008 3024 +f 3024 3048 3040 +f 3018 2973 3008 +f 3008 3040 3018 +f 2943 2889 2973 +f 2973 3018 2943 +f 2841 2805 2889 +f 2889 2943 2841 +f 2731 2711 2805 +f 2805 2841 2731 +f 2645 2611 2711 +f 2711 2731 2645 +f 2529 2521 2611 +f 2611 2645 2529 +f 2402 2387 2521 +f 2521 2529 2402 +f 2208 2191 2387 +f 2387 2402 2208 +f 1806 1810 2191 +f 2191 2208 1806 +f 3072 3040 3048 +f 3048 3078 3072 +f 3044 3018 3040 +f 3040 3072 3044 +f 2994 2943 3018 +f 3018 3044 2994 +f 2883 2841 2943 +f 2943 2994 2883 +f 2773 2731 2841 +f 2841 2883 2773 +f 2659 2645 2731 +f 2731 2773 2659 +f 2539 2529 2645 +f 2645 2659 2539 +f 2410 2402 2529 +f 2529 2539 2410 +f 2222 2208 2402 +f 2402 2410 2222 +f 1694 1806 2208 +f 2208 2222 1694 +f 3092 3072 3078 +f 3078 3116 3092 +f 3074 3044 3072 +f 3072 3092 3074 +f 3030 2994 3044 +f 3044 3074 3030 +f 2937 2883 2994 +f 2994 3030 2937 +f 2810 2773 2883 +f 2883 2937 2810 +f 2683 2659 2773 +f 2773 2810 2683 +f 2554 2539 2659 +f 2659 2683 2554 +f 2420 2410 2539 +f 2539 2554 2420 +f 2238 2222 2410 +f 2410 2420 2238 +f 1930 1694 2222 +f 2222 2238 1930 +f 3132 3092 3116 +f 3116 3142 3132 +f 3090 3074 3092 +f 3092 3132 3090 +f 3054 3030 3074 +f 3074 3090 3054 +f 2984 2937 3030 +f 3030 3054 2984 +f 2837 2810 2937 +f 2937 2984 2837 +f 2705 2683 2810 +f 2810 2837 2705 +f 2574 2554 2683 +f 2683 2705 2574 +f 2430 2420 2554 +f 2554 2574 2430 +f 2247 2238 2420 +f 2420 2430 2247 +f 1913 1930 2238 +f 2238 2247 1913 +f 3150 3132 3142 +f 3142 3156 3150 +f 3128 3090 3132 +f 3132 3150 3128 +f 3076 3054 3090 +f 3090 3128 3076 +f 3014 2984 3054 +f 3054 3076 3014 +f 2861 2837 2984 +f 2984 3014 2861 +f 2723 2705 2837 +f 2837 2861 2723 +f 2585 2574 2705 +f 2705 2723 2585 +f 2438 2430 2574 +f 2574 2585 2438 +f 2253 2247 2430 +f 2430 2438 2253 +f 1711 1913 2247 +f 2247 2253 1711 +f 3162 3150 3156 +f 3156 3172 3162 +f 3148 3128 3150 +f 3150 3162 3148 +f 3088 3076 3128 +f 3128 3148 3088 +f 3036 3014 3076 +f 3076 3088 3036 +f 2893 2861 3014 +f 3014 3036 2893 +f 2743 2723 2861 +f 2861 2893 2743 +f 2599 2585 2723 +f 2723 2743 2599 +f 2450 2438 2585 +f 2585 2599 2450 +f 2267 2253 2438 +f 2438 2450 2267 +f 1794 1711 2253 +f 2253 2267 1794 +f 3178 3162 3172 +f 3172 3184 3178 +f 3154 3148 3162 +f 3162 3178 3154 +f 3118 3088 3148 +f 3148 3154 3118 +f 3046 3036 3088 +f 3088 3118 3046 +f 2915 2893 3036 +f 3036 3046 2915 +f 2763 2743 2893 +f 2893 2915 2763 +f 2615 2599 2743 +f 2743 2763 2615 +f 2452 2450 2599 +f 2599 2615 2452 +f 2277 2267 2450 +f 2450 2452 2277 +f 1710 1794 2267 +f 2267 2277 1710 +f 3188 3178 3184 +f 3184 3200 3188 +f 3164 3154 3178 +f 3178 3188 3164 +f 3130 3118 3154 +f 3154 3164 3130 +f 3058 3046 3118 +f 3118 3130 3058 +f 2941 2915 3046 +f 3046 3058 2941 +f 2775 2763 2915 +f 2915 2941 2775 +f 2627 2615 2763 +f 2763 2775 2627 +f 2458 2452 2615 +f 2615 2627 2458 +f 2287 2277 2452 +f 2452 2458 2287 +f 1910 1710 2277 +f 2277 2287 1910 +f 3198 3188 3200 +f 3200 3209 3198 +f 3170 3164 3188 +f 3188 3198 3170 +f 3136 3130 3164 +f 3164 3170 3136 +f 3064 3058 3130 +f 3130 3136 3064 +f 2955 2941 3058 +f 3058 3064 2955 +f 2781 2775 2941 +f 2941 2955 2781 +f 2636 2627 2775 +f 2775 2781 2636 +f 2462 2458 2627 +f 2627 2636 2462 +f 2295 2287 2458 +f 2458 2462 2295 +f 1909 1910 2287 +f 2287 2295 1909 +f 3202 3198 3209 +f 3209 3213 3202 +f 3174 3170 3198 +f 3198 3202 3174 +f 3138 3136 3170 +f 3170 3174 3138 +f 3066 3064 3136 +f 3136 3138 3066 +f 2961 2955 3064 +f 3064 3066 2961 +f 2783 2781 2955 +f 2955 2961 2783 +f 2642 2636 2781 +f 2781 2783 2642 +f 2464 2462 2636 +f 2636 2642 2464 +f 2297 2295 2462 +f 2462 2464 2297 +f 1784 1909 2295 +f 2295 2297 1784 +f 1414 1429 1811 +f 1811 1807 1414 +f 1220 1233 1429 +f 1429 1414 1220 +f 1093 1106 1233 +f 1233 1220 1093 +f 977 1011 1106 +f 1106 1093 977 +f 891 911 1011 +f 1011 977 891 +f 781 817 911 +f 911 891 781 +f 679 733 817 +f 817 781 679 +f 604 649 733 +f 733 679 604 +f 571 614 649 +f 649 604 571 +f 561 597 614 +f 614 571 561 +f 1400 1414 1807 +f 1807 1804 1400 +f 1212 1220 1414 +f 1414 1400 1212 +f 1083 1093 1220 +f 1220 1212 1083 +f 963 977 1093 +f 1093 1083 963 +f 849 891 977 +f 977 963 849 +f 739 781 891 +f 891 849 739 +f 628 679 781 +f 781 739 628 +f 565 604 679 +f 679 628 565 +f 530 571 604 +f 604 565 530 +f 524 561 571 +f 571 530 524 +f 1386 1400 1804 +f 1804 1802 1386 +f 1202 1212 1400 +f 1400 1386 1202 +f 1070 1083 1212 +f 1212 1202 1070 +f 939 963 1083 +f 1083 1070 939 +f 814 849 963 +f 963 939 814 +f 685 739 849 +f 849 814 685 +f 585 628 739 +f 739 685 585 +f 528 565 628 +f 628 585 528 +f 510 530 565 +f 565 528 510 +f 508 524 530 +f 530 510 508 +f 1375 1386 1802 +f 1802 1800 1375 +f 1192 1202 1386 +f 1386 1375 1192 +f 1050 1070 1202 +f 1202 1192 1050 +f 917 939 1070 +f 1070 1050 917 +f 785 814 939 +f 939 917 785 +f 638 685 814 +f 814 785 638 +f 553 585 685 +f 685 638 553 +f 512 528 585 +f 585 553 512 +f 492 510 528 +f 528 512 492 +f 482 508 510 +f 510 492 482 +f 1369 1375 1800 +f 1800 1798 1369 +f 1184 1192 1375 +f 1375 1369 1184 +f 1037 1050 1192 +f 1192 1184 1037 +f 899 917 1050 +f 1050 1037 899 +f 761 785 917 +f 917 899 761 +f 608 638 785 +f 785 761 608 +f 526 553 638 +f 638 608 526 +f 496 512 553 +f 553 526 496 +f 454 492 512 +f 512 496 454 +f 448 482 492 +f 492 454 448 +f 1355 1369 1798 +f 1798 1795 1355 +f 1172 1184 1369 +f 1369 1355 1172 +f 1023 1037 1184 +f 1184 1172 1023 +f 879 899 1037 +f 1037 1023 879 +f 729 761 899 +f 899 879 729 +f 579 608 761 +f 761 729 579 +f 514 526 608 +f 608 579 514 +f 457 496 526 +f 526 514 457 +f 442 454 496 +f 496 457 442 +f 432 448 454 +f 454 442 432 +f 1345 1355 1795 +f 1795 1792 1345 +f 1170 1172 1355 +f 1355 1345 1170 +f 1007 1023 1172 +f 1172 1170 1007 +f 859 879 1023 +f 1023 1007 859 +f 707 729 879 +f 879 859 707 +f 563 579 729 +f 729 707 563 +f 506 514 579 +f 579 563 506 +f 450 457 514 +f 514 506 450 +f 420 442 457 +f 457 450 420 +f 412 432 442 +f 442 420 412 +f 1335 1345 1792 +f 1792 1790 1335 +f 1164 1170 1345 +f 1345 1335 1164 +f 995 1007 1170 +f 1170 1164 995 +f 847 859 1007 +f 1007 995 847 +f 681 707 859 +f 859 847 681 +f 547 563 707 +f 707 681 547 +f 494 506 563 +f 563 547 494 +f 440 450 506 +f 506 494 440 +f 410 420 450 +f 450 440 410 +f 398 412 420 +f 420 410 398 +f 1327 1335 1790 +f 1790 1788 1327 +f 1160 1164 1335 +f 1335 1327 1160 +f 988 995 1164 +f 1164 1160 988 +f 841 847 995 +f 995 988 841 +f 667 681 847 +f 847 841 667 +f 538 547 681 +f 681 667 538 +f 488 494 547 +f 547 538 488 +f 434 440 494 +f 494 488 434 +f 400 410 440 +f 440 434 400 +f 381 398 410 +f 410 400 381 +f 1324 1327 1788 +f 1788 1785 1324 +f 1156 1160 1327 +f 1327 1324 1156 +f 979 988 1160 +f 1160 1156 979 +f 837 841 988 +f 988 979 837 +f 659 667 841 +f 841 837 659 +f 534 538 667 +f 667 659 534 +f 484 488 538 +f 538 534 484 +f 428 434 488 +f 488 484 428 +f 395 400 434 +f 434 428 395 +f 374 381 400 +f 400 395 374 +f 572 616 600 +f 600 562 572 +f 605 654 616 +f 616 572 605 +f 680 737 654 +f 654 605 680 +f 782 822 737 +f 737 680 782 +f 892 914 822 +f 822 782 892 +f 978 1014 914 +f 914 892 978 +f 1094 1104 1014 +f 1014 978 1094 +f 1221 1237 1104 +f 1104 1094 1221 +f 1415 1433 1237 +f 1237 1221 1415 +f 1809 1819 1433 +f 1433 1415 1809 +f 531 572 562 +f 562 525 531 +f 566 605 572 +f 572 531 566 +f 629 680 605 +f 605 566 629 +f 740 782 680 +f 680 629 740 +f 850 892 782 +f 782 740 850 +f 964 978 892 +f 892 850 964 +f 1084 1094 978 +f 978 964 1084 +f 1213 1221 1094 +f 1094 1084 1213 +f 1401 1415 1221 +f 1221 1213 1401 +f 1931 1809 1415 +f 1415 1401 1931 +f 511 531 525 +f 525 509 511 +f 529 566 531 +f 531 511 529 +f 586 629 566 +f 566 529 586 +f 686 740 629 +f 629 586 686 +f 813 850 740 +f 740 686 813 +f 940 964 850 +f 850 813 940 +f 1069 1084 964 +f 964 940 1069 +f 1203 1213 1084 +f 1084 1069 1203 +f 1385 1401 1213 +f 1213 1203 1385 +f 1693 1931 1401 +f 1401 1385 1693 +f 493 511 509 +f 509 483 493 +f 513 529 511 +f 511 493 513 +f 554 586 529 +f 529 513 554 +f 639 686 586 +f 586 554 639 +f 786 813 686 +f 686 639 786 +f 918 940 813 +f 813 786 918 +f 1049 1069 940 +f 940 918 1049 +f 1193 1203 1069 +f 1069 1049 1193 +f 1376 1385 1203 +f 1203 1193 1376 +f 1712 1693 1385 +f 1385 1376 1712 +f 455 493 483 +f 483 449 455 +f 497 513 493 +f 493 455 497 +f 527 554 513 +f 513 497 527 +f 609 639 554 +f 554 527 609 +f 762 786 639 +f 639 609 762 +f 900 918 786 +f 786 762 900 +f 1038 1049 918 +f 918 900 1038 +f 1185 1193 1049 +f 1049 1038 1185 +f 1370 1376 1193 +f 1193 1185 1370 +f 1912 1712 1376 +f 1376 1370 1912 +f 443 455 449 +f 449 433 443 +f 458 497 455 +f 455 443 458 +f 515 527 497 +f 497 458 515 +f 580 609 527 +f 527 515 580 +f 730 762 609 +f 609 580 730 +f 880 900 762 +f 762 730 880 +f 1024 1038 900 +f 900 880 1024 +f 1173 1185 1038 +f 1038 1024 1173 +f 1356 1370 1185 +f 1185 1173 1356 +f 1797 1912 1370 +f 1370 1356 1797 +f 421 443 433 +f 433 413 421 +f 451 458 443 +f 443 421 451 +f 507 515 458 +f 458 451 507 +f 564 580 515 +f 515 507 564 +f 708 730 580 +f 580 564 708 +f 860 880 730 +f 730 708 860 +f 1008 1024 880 +f 880 860 1008 +f 1171 1173 1024 +f 1024 1008 1171 +f 1346 1356 1173 +f 1173 1171 1346 +f 1911 1797 1356 +f 1356 1346 1911 +f 411 421 413 +f 413 399 411 +f 441 451 421 +f 421 411 441 +f 495 507 451 +f 451 441 495 +f 548 564 507 +f 507 495 548 +f 682 708 564 +f 564 548 682 +f 848 860 708 +f 708 682 848 +f 996 1008 860 +f 860 848 996 +f 1165 1171 1008 +f 1008 996 1165 +f 1336 1346 1171 +f 1171 1165 1336 +f 1709 1911 1346 +f 1346 1336 1709 +f 401 411 399 +f 399 382 401 +f 435 441 411 +f 411 401 435 +f 489 495 441 +f 441 435 489 +f 539 548 495 +f 495 489 539 +f 668 682 548 +f 548 539 668 +f 842 848 682 +f 682 668 842 +f 987 996 848 +f 848 842 987 +f 1161 1165 996 +f 996 987 1161 +f 1328 1336 1165 +f 1165 1161 1328 +f 1708 1709 1336 +f 1336 1328 1708 +f 397 401 382 +f 382 376 397 +f 431 435 401 +f 401 397 431 +f 487 489 435 +f 435 431 487 +f 537 539 489 +f 489 487 537 +f 662 668 539 +f 539 537 662 +f 840 842 668 +f 668 662 840 +f 981 987 842 +f 842 840 981 +f 1159 1161 987 +f 987 981 1159 +f 1326 1328 1161 +f 1161 1159 1326 +f 1787 1708 1328 +f 1328 1326 1787 +f 2209 2194 1818 +f 1818 1808 2209 +f 2403 2391 2194 +f 2194 2209 2403 +f 2530 2518 2391 +f 2391 2403 2530 +f 2646 2614 2518 +f 2518 2530 2646 +f 2732 2712 2614 +f 2614 2646 2732 +f 2842 2806 2712 +f 2712 2732 2842 +f 2944 2890 2806 +f 2806 2842 2944 +f 3019 2974 2890 +f 2890 2944 3019 +f 3041 3009 2974 +f 2974 3019 3041 +f 3049 3025 3009 +f 3009 3041 3049 +f 2223 2209 1808 +f 1808 1805 2223 +f 2411 2403 2209 +f 2209 2223 2411 +f 2540 2530 2403 +f 2403 2411 2540 +f 2660 2646 2530 +f 2530 2540 2660 +f 2774 2732 2646 +f 2646 2660 2774 +f 2884 2842 2732 +f 2732 2774 2884 +f 2995 2944 2842 +f 2842 2884 2995 +f 3045 3019 2944 +f 2944 2995 3045 +f 3073 3041 3019 +f 3019 3045 3073 +f 3079 3049 3041 +f 3041 3073 3079 +f 2237 2223 1805 +f 1805 1803 2237 +f 2421 2411 2223 +f 2223 2237 2421 +f 2553 2540 2411 +f 2411 2421 2553 +f 2684 2660 2540 +f 2540 2553 2684 +f 2809 2774 2660 +f 2660 2684 2809 +f 2938 2884 2774 +f 2774 2809 2938 +f 3031 2995 2884 +f 2884 2938 3031 +f 3075 3045 2995 +f 2995 3031 3075 +f 3093 3073 3045 +f 3045 3075 3093 +f 3117 3079 3073 +f 3073 3093 3117 +f 2248 2237 1803 +f 1803 1801 2248 +f 2431 2421 2237 +f 2237 2248 2431 +f 2573 2553 2421 +f 2421 2431 2573 +f 2706 2684 2553 +f 2553 2573 2706 +f 2838 2809 2684 +f 2684 2706 2838 +f 2985 2938 2809 +f 2809 2838 2985 +f 3055 3031 2938 +f 2938 2985 3055 +f 3091 3075 3031 +f 3031 3055 3091 +f 3133 3093 3075 +f 3075 3091 3133 +f 3143 3117 3093 +f 3093 3133 3143 +f 2254 2248 1801 +f 1801 1799 2254 +f 2439 2431 2248 +f 2248 2254 2439 +f 2586 2573 2431 +f 2431 2439 2586 +f 2724 2706 2573 +f 2573 2586 2724 +f 2862 2838 2706 +f 2706 2724 2862 +f 3015 2985 2838 +f 2838 2862 3015 +f 3077 3055 2985 +f 2985 3015 3077 +f 3129 3091 3055 +f 3055 3077 3129 +f 3151 3133 3091 +f 3091 3129 3151 +f 3157 3143 3133 +f 3133 3151 3157 +f 2268 2254 1799 +f 1799 1796 2268 +f 2451 2439 2254 +f 2254 2268 2451 +f 2600 2586 2439 +f 2439 2451 2600 +f 2744 2724 2586 +f 2586 2600 2744 +f 2894 2862 2724 +f 2724 2744 2894 +f 3037 3015 2862 +f 2862 2894 3037 +f 3089 3077 3015 +f 3015 3037 3089 +f 3149 3129 3077 +f 3077 3089 3149 +f 3163 3151 3129 +f 3129 3149 3163 +f 3173 3157 3151 +f 3151 3163 3173 +f 2278 2268 1796 +f 1796 1793 2278 +f 2453 2451 2268 +f 2268 2278 2453 +f 2616 2600 2451 +f 2451 2453 2616 +f 2764 2744 2600 +f 2600 2616 2764 +f 2916 2894 2744 +f 2744 2764 2916 +f 3047 3037 2894 +f 2894 2916 3047 +f 3119 3089 3037 +f 3037 3047 3119 +f 3155 3149 3089 +f 3089 3119 3155 +f 3179 3163 3149 +f 3149 3155 3179 +f 3185 3173 3163 +f 3163 3179 3185 +f 2288 2278 1793 +f 1793 1791 2288 +f 2459 2453 2278 +f 2278 2288 2459 +f 2628 2616 2453 +f 2453 2459 2628 +f 2776 2764 2616 +f 2616 2628 2776 +f 2942 2916 2764 +f 2764 2776 2942 +f 3059 3047 2916 +f 2916 2942 3059 +f 3131 3119 3047 +f 3047 3059 3131 +f 3165 3155 3119 +f 3119 3131 3165 +f 3189 3179 3155 +f 3155 3165 3189 +f 3201 3185 3179 +f 3179 3189 3201 +f 2296 2288 1791 +f 1791 1789 2296 +f 2463 2459 2288 +f 2288 2296 2463 +f 2635 2628 2459 +f 2459 2463 2635 +f 2782 2776 2628 +f 2628 2635 2782 +f 2956 2942 2776 +f 2776 2782 2956 +f 3065 3059 2942 +f 2942 2956 3065 +f 3137 3131 3059 +f 3059 3065 3137 +f 3171 3165 3131 +f 3131 3137 3171 +f 3199 3189 3165 +f 3165 3171 3199 +f 3210 3201 3189 +f 3189 3199 3210 +f 2299 2296 1789 +f 1789 1786 2299 +f 2467 2463 2296 +f 2296 2299 2467 +f 2644 2635 2463 +f 2463 2467 2644 +f 2786 2782 2635 +f 2635 2644 2786 +f 2964 2956 2782 +f 2782 2786 2964 +f 3069 3065 2956 +f 2956 2964 3069 +f 3141 3137 3065 +f 3065 3069 3141 +f 3177 3171 3137 +f 3137 3141 3177 +f 3204 3199 3171 +f 3171 3177 3204 +f 3214 3210 3199 +f 3199 3204 3214 +f 3194 3202 3213 +f 3213 3207 3194 +f 3166 3175 3202 +f 3202 3194 3166 +f 3134 3139 3175 +f 3175 3166 3134 +f 3060 3067 3139 +f 3139 3134 3060 +f 2953 2962 3067 +f 3067 3060 2953 +f 2777 2784 2962 +f 2962 2953 2777 +f 2629 2643 2784 +f 2784 2777 2629 +f 2460 2465 2643 +f 2643 2629 2460 +f 2293 2298 2465 +f 2465 2460 2293 +f 1696 1785 2298 +f 2298 2293 1696 +f 3180 3194 3207 +f 3207 3190 3180 +f 3158 3166 3194 +f 3194 3180 3158 +f 3124 3134 3166 +f 3166 3158 3124 +f 3050 3060 3134 +f 3134 3124 3050 +f 2927 2953 3060 +f 3060 3050 2927 +f 2767 2777 2953 +f 2953 2927 2767 +f 2619 2629 2777 +f 2777 2767 2619 +f 2454 2460 2629 +f 2629 2619 2454 +f 2283 2293 2460 +f 2460 2454 2283 +f 1695 1696 2293 +f 2293 2283 1695 +f 3160 3180 3190 +f 3190 3168 3160 +f 3144 3158 3180 +f 3180 3160 3144 +f 3086 3124 3158 +f 3158 3144 3086 +f 3032 3050 3124 +f 3124 3086 3032 +f 2891 2927 3050 +f 3050 3032 2891 +f 2739 2767 2927 +f 2927 2891 2739 +f 2597 2619 2767 +f 2767 2739 2597 +f 2448 2454 2619 +f 2619 2597 2448 +f 2265 2283 2454 +f 2454 2448 2265 +f 1707 1695 2283 +f 2283 2265 1707 +f 3146 3160 3168 +f 3168 3152 3146 +f 3122 3144 3160 +f 3160 3146 3122 +f 3070 3086 3144 +f 3144 3122 3070 +f 2998 3032 3086 +f 3086 3070 2998 +f 2853 2891 3032 +f 3032 2998 2853 +f 2717 2739 2891 +f 2891 2853 2717 +f 2582 2597 2739 +f 2739 2717 2582 +f 2434 2448 2597 +f 2597 2582 2434 +f 2251 2265 2448 +f 2448 2434 2251 +f 1907 1707 2265 +f 2265 2251 1907 +f 3120 3146 3152 +f 3152 3126 3120 +f 3082 3122 3146 +f 3146 3120 3082 +f 3042 3070 3122 +f 3122 3082 3042 +f 2957 2998 3070 +f 3070 3042 2957 +f 2825 2853 2998 +f 2998 2957 2825 +f 2693 2717 2853 +f 2853 2825 2693 +f 2556 2582 2717 +f 2717 2693 2556 +f 2424 2434 2582 +f 2582 2556 2424 +f 2239 2251 2434 +f 2434 2424 2239 +f 1906 1907 2251 +f 2251 2239 1906 +f 3080 3120 3126 +f 3126 3084 3080 +f 3056 3082 3120 +f 3120 3080 3056 +f 3012 3042 3082 +f 3082 3056 3012 +f 2899 2957 3042 +f 3042 3012 2899 +f 2789 2825 2957 +f 2957 2899 2789 +f 2675 2693 2825 +f 2825 2789 2675 +f 2545 2556 2693 +f 2693 2675 2545 +f 2416 2424 2556 +f 2556 2545 2416 +f 2228 2239 2424 +f 2424 2416 2228 +f 1770 1906 2239 +f 2239 2228 1770 +f 3053 3080 3084 +f 3084 3062 3053 +f 3028 3056 3080 +f 3080 3053 3028 +f 2978 3012 3056 +f 3056 3028 2978 +f 2860 2899 3012 +f 3012 2978 2860 +f 2754 2789 2899 +f 2899 2860 2754 +f 2652 2675 2789 +f 2789 2754 2652 +f 2534 2545 2675 +f 2675 2652 2534 +f 2406 2416 2545 +f 2545 2534 2406 +f 2217 2228 2416 +f 2416 2406 2217 +f 1929 1770 2228 +f 2228 2217 1929 +f 3035 3053 3062 +f 3062 3039 3035 +f 2997 3028 3053 +f 3053 3035 2997 +f 2920 2978 3028 +f 3028 2997 2920 +f 2832 2860 2978 +f 2978 2920 2832 +f 2728 2754 2860 +f 2860 2832 2728 +f 2634 2652 2754 +f 2754 2728 2634 +f 2528 2534 2652 +f 2652 2634 2528 +f 2396 2406 2534 +f 2534 2528 2396 +f 2202 2217 2406 +f 2406 2396 2202 +f 1765 1929 2217 +f 2217 2202 1765 +f 3017 3035 3039 +f 3039 3027 3017 +f 2980 2997 3035 +f 3035 3017 2980 +f 2896 2920 2997 +f 2997 2980 2896 +f 2812 2832 2920 +f 2920 2896 2812 +f 2715 2728 2832 +f 2832 2812 2715 +f 2618 2634 2728 +f 2728 2715 2618 +f 2523 2528 2634 +f 2634 2618 2523 +f 2392 2396 2528 +f 2528 2523 2392 +f 2196 2202 2396 +f 2396 2392 2196 +f 1724 1765 2202 +f 2202 2196 1724 +f 3007 3017 3027 +f 3027 3023 3007 +f 2969 2980 3017 +f 3017 3007 2969 +f 2887 2896 2980 +f 2980 2969 2887 +f 2802 2812 2896 +f 2896 2887 2802 +f 2709 2715 2812 +f 2812 2802 2709 +f 2609 2618 2715 +f 2715 2709 2609 +f 2519 2523 2618 +f 2618 2609 2519 +f 2386 2392 2523 +f 2523 2519 2386 +f 2190 2196 2392 +f 2392 2386 2190 +f 1759 1724 2196 +f 2196 2190 1759 +f 1329 1324 1785 +f 1785 1782 1329 +f 1162 1157 1324 +f 1324 1329 1162 +f 993 982 1157 +f 1157 1162 993 +f 845 838 982 +f 982 993 845 +f 669 660 838 +f 838 845 669 +f 542 535 660 +f 660 669 542 +f 490 485 535 +f 535 542 490 +f 438 429 485 +f 485 490 438 +f 404 396 429 +f 429 438 404 +f 387 376 396 +f 396 404 387 +f 1339 1329 1782 +f 1782 1780 1339 +f 1168 1162 1329 +f 1329 1339 1168 +f 1003 993 1162 +f 1162 1168 1003 +f 855 845 993 +f 993 1003 855 +f 695 669 845 +f 845 855 695 +f 559 542 669 +f 669 695 559 +f 500 490 542 +f 542 559 500 +f 446 438 490 +f 490 500 446 +f 416 404 438 +f 438 446 416 +f 408 387 404 +f 404 416 408 +f 1357 1339 1780 +f 1780 1778 1357 +f 1174 1168 1339 +f 1339 1357 1174 +f 1025 1003 1168 +f 1168 1174 1025 +f 883 855 1003 +f 1003 1025 883 +f 731 695 855 +f 855 883 731 +f 583 559 695 +f 695 731 583 +f 516 500 559 +f 559 583 516 +f 467 446 500 +f 500 516 467 +f 444 416 446 +f 446 467 444 +f 436 408 416 +f 416 444 436 +f 1371 1357 1778 +f 1778 1776 1371 +f 1188 1174 1357 +f 1357 1371 1188 +f 1042 1025 1174 +f 1174 1188 1042 +f 905 883 1025 +f 1025 1042 905 +f 769 731 883 +f 883 905 769 +f 624 583 731 +f 731 769 624 +f 532 516 583 +f 583 624 532 +f 502 467 516 +f 516 532 502 +f 459 444 467 +f 467 502 459 +f 452 436 444 +f 444 459 452 +f 1383 1371 1776 +f 1776 1774 1383 +f 1198 1188 1371 +f 1371 1383 1198 +f 1068 1042 1188 +f 1188 1198 1068 +f 929 905 1042 +f 1042 1068 929 +f 797 769 905 +f 905 929 797 +f 665 624 769 +f 769 797 665 +f 569 532 624 +f 624 665 569 +f 520 502 532 +f 532 569 520 +f 504 459 502 +f 502 520 504 +f 498 452 459 +f 459 504 498 +f 1394 1383 1774 +f 1774 1771 1394 +f 1206 1198 1383 +f 1383 1394 1206 +f 1077 1068 1198 +f 1198 1206 1077 +f 947 929 1068 +f 1068 1077 947 +f 833 797 929 +f 929 947 833 +f 723 665 797 +f 797 833 723 +f 610 569 665 +f 665 723 610 +f 549 520 569 +f 569 610 549 +f 522 504 520 +f 520 549 522 +f 518 498 504 +f 504 522 518 +f 1407 1394 1771 +f 1771 1768 1407 +f 1216 1206 1394 +f 1394 1407 1216 +f 1090 1077 1206 +f 1206 1216 1090 +f 972 947 1077 +f 1077 1090 972 +f 870 833 947 +f 947 972 870 +f 764 723 833 +f 833 870 764 +f 646 610 723 +f 723 764 646 +f 587 549 610 +f 610 646 587 +f 556 522 549 +f 549 587 556 +f 540 518 522 +f 522 556 540 +f 1420 1407 1768 +f 1768 1764 1420 +f 1226 1216 1407 +f 1407 1420 1226 +f 1096 1090 1216 +f 1216 1226 1096 +f 990 972 1090 +f 1090 1096 990 +f 896 870 972 +f 972 990 896 +f 792 764 870 +f 870 896 792 +f 704 646 764 +f 764 792 704 +f 627 587 646 +f 646 704 627 +f 582 556 587 +f 587 627 582 +f 574 540 556 +f 556 582 574 +f 1426 1420 1764 +f 1764 1762 1426 +f 1230 1226 1420 +f 1420 1426 1230 +f 1101 1096 1226 +f 1226 1230 1101 +f 1006 990 1096 +f 1096 1101 1006 +f 907 896 990 +f 990 1006 907 +f 812 792 896 +f 896 907 812 +f 728 704 792 +f 792 812 728 +f 644 627 704 +f 704 728 644 +f 607 582 627 +f 627 644 607 +f 592 574 582 +f 582 607 592 +f 1430 1426 1762 +f 1762 1758 1430 +f 1234 1230 1426 +f 1426 1430 1234 +f 1107 1101 1230 +f 1230 1234 1107 +f 1012 1006 1101 +f 1101 1107 1012 +f 912 907 1006 +f 1006 1012 912 +f 819 812 907 +f 907 912 819 +f 738 728 812 +f 812 819 738 +f 651 644 728 +f 728 738 651 +f 618 607 644 +f 644 651 618 +f 601 592 607 +f 607 618 601 +f 405 397 376 +f 376 388 405 +f 439 430 397 +f 397 405 439 +f 491 486 430 +f 430 439 491 +f 543 536 486 +f 486 491 543 +f 670 661 536 +f 536 543 670 +f 846 839 661 +f 661 670 846 +f 994 980 839 +f 839 846 994 +f 1163 1158 980 +f 980 994 1163 +f 1330 1325 1158 +f 1158 1163 1330 +f 1926 1786 1325 +f 1325 1330 1926 +f 417 405 388 +f 388 409 417 +f 447 439 405 +f 405 417 447 +f 501 491 439 +f 439 447 501 +f 560 543 491 +f 491 501 560 +f 696 670 543 +f 543 560 696 +f 856 846 670 +f 670 696 856 +f 1004 994 846 +f 846 856 1004 +f 1169 1163 994 +f 994 1004 1169 +f 1340 1330 1163 +f 1163 1169 1340 +f 1925 1926 1330 +f 1330 1340 1925 +f 445 417 409 +f 409 437 445 +f 468 447 417 +f 417 445 468 +f 517 501 447 +f 447 468 517 +f 584 560 501 +f 501 517 584 +f 732 696 560 +f 560 584 732 +f 884 856 696 +f 696 732 884 +f 1026 1004 856 +f 856 884 1026 +f 1175 1169 1004 +f 1004 1026 1175 +f 1358 1340 1169 +f 1169 1175 1358 +f 1908 1925 1340 +f 1340 1358 1908 +f 460 445 437 +f 437 453 460 +f 503 468 445 +f 445 460 503 +f 533 517 468 +f 468 503 533 +f 625 584 517 +f 517 533 625 +f 770 732 584 +f 584 625 770 +f 906 884 732 +f 732 770 906 +f 1041 1026 884 +f 884 906 1041 +f 1189 1175 1026 +f 1026 1041 1189 +f 1372 1358 1175 +f 1175 1189 1372 +f 1706 1908 1358 +f 1358 1372 1706 +f 505 460 453 +f 453 499 505 +f 521 503 460 +f 460 505 521 +f 570 533 503 +f 503 521 570 +f 666 625 533 +f 533 570 666 +f 798 770 625 +f 625 666 798 +f 930 906 770 +f 770 798 930 +f 1067 1041 906 +f 906 930 1067 +f 1199 1189 1041 +f 1041 1067 1199 +f 1384 1372 1189 +f 1189 1199 1384 +f 1705 1706 1372 +f 1372 1384 1705 +f 523 505 499 +f 499 519 523 +f 550 521 505 +f 505 523 550 +f 611 570 521 +f 521 550 611 +f 724 666 570 +f 570 611 724 +f 834 798 666 +f 666 724 834 +f 948 930 798 +f 798 834 948 +f 1078 1067 930 +f 930 948 1078 +f 1207 1199 1067 +f 1067 1078 1207 +f 1395 1384 1199 +f 1199 1207 1395 +f 1773 1705 1384 +f 1384 1395 1773 +f 555 523 519 +f 519 541 555 +f 588 550 523 +f 523 555 588 +f 645 611 550 +f 550 588 645 +f 763 724 611 +f 611 645 763 +f 869 834 724 +f 724 763 869 +f 971 948 834 +f 834 869 971 +f 1089 1078 948 +f 948 971 1089 +f 1217 1207 1078 +f 1078 1089 1217 +f 1406 1395 1207 +f 1207 1217 1406 +f 1692 1773 1395 +f 1395 1406 1692 +f 581 555 541 +f 541 573 581 +f 626 588 555 +f 555 581 626 +f 703 645 588 +f 588 626 703 +f 791 763 645 +f 645 703 791 +f 895 869 763 +f 763 791 895 +f 989 971 869 +f 869 895 989 +f 1095 1089 971 +f 971 989 1095 +f 1227 1217 1089 +f 1089 1095 1227 +f 1421 1406 1217 +f 1217 1227 1421 +f 1766 1692 1406 +f 1406 1421 1766 +f 606 581 573 +f 573 591 606 +f 643 626 581 +f 581 606 643 +f 727 703 626 +f 626 643 727 +f 811 791 703 +f 703 727 811 +f 908 895 791 +f 791 811 908 +f 1005 989 895 +f 895 908 1005 +f 1100 1095 989 +f 989 1005 1100 +f 1231 1227 1095 +f 1095 1100 1231 +f 1427 1421 1227 +f 1227 1231 1427 +f 1897 1766 1421 +f 1421 1427 1897 +f 615 606 591 +f 591 598 615 +f 653 643 606 +f 606 615 653 +f 735 727 643 +f 643 653 735 +f 820 811 727 +f 727 735 820 +f 913 908 811 +f 811 820 913 +f 1013 1005 908 +f 908 913 1013 +f 1103 1100 1005 +f 1005 1013 1103 +f 1236 1231 1100 +f 1100 1103 1236 +f 1432 1427 1231 +f 1231 1236 1432 +f 1760 1897 1427 +f 1427 1432 1760 +f 2294 2299 1786 +f 1786 1783 2294 +f 2461 2466 2299 +f 2299 2294 2461 +f 2630 2641 2466 +f 2466 2461 2630 +f 2778 2785 2641 +f 2641 2630 2778 +f 2954 2963 2785 +f 2785 2778 2954 +f 3061 3068 2963 +f 2963 2954 3061 +f 3135 3140 3068 +f 3068 3061 3135 +f 3167 3176 3140 +f 3140 3135 3167 +f 3195 3203 3176 +f 3176 3167 3195 +f 3208 3213 3203 +f 3203 3195 3208 +f 2284 2294 1783 +f 1783 1781 2284 +f 2455 2461 2294 +f 2294 2284 2455 +f 2620 2630 2461 +f 2461 2455 2620 +f 2768 2778 2630 +f 2630 2620 2768 +f 2928 2954 2778 +f 2778 2768 2928 +f 3051 3061 2954 +f 2954 2928 3051 +f 3125 3135 3061 +f 3061 3051 3125 +f 3159 3167 3135 +f 3135 3125 3159 +f 3181 3195 3167 +f 3167 3159 3181 +f 3191 3208 3195 +f 3195 3181 3191 +f 2266 2284 1781 +f 1781 1779 2266 +f 2449 2455 2284 +f 2284 2266 2449 +f 2598 2620 2455 +f 2455 2449 2598 +f 2740 2768 2620 +f 2620 2598 2740 +f 2892 2928 2768 +f 2768 2740 2892 +f 3033 3051 2928 +f 2928 2892 3033 +f 3087 3125 3051 +f 3051 3033 3087 +f 3145 3159 3125 +f 3125 3087 3145 +f 3161 3181 3159 +f 3159 3145 3161 +f 3169 3191 3181 +f 3181 3161 3169 +f 2252 2266 1779 +f 1779 1777 2252 +f 2435 2449 2266 +f 2266 2252 2435 +f 2581 2598 2449 +f 2449 2435 2581 +f 2718 2740 2598 +f 2598 2581 2718 +f 2854 2892 2740 +f 2740 2718 2854 +f 2999 3033 2892 +f 2892 2854 2999 +f 3071 3087 3033 +f 3033 2999 3071 +f 3123 3145 3087 +f 3087 3071 3123 +f 3147 3161 3145 +f 3145 3123 3147 +f 3153 3169 3161 +f 3161 3147 3153 +f 2240 2252 1777 +f 1777 1775 2240 +f 2425 2435 2252 +f 2252 2240 2425 +f 2555 2581 2435 +f 2435 2425 2555 +f 2694 2718 2581 +f 2581 2555 2694 +f 2826 2854 2718 +f 2718 2694 2826 +f 2958 2999 2854 +f 2854 2826 2958 +f 3043 3071 2999 +f 2999 2958 3043 +f 3083 3123 3071 +f 3071 3043 3083 +f 3121 3147 3123 +f 3123 3083 3121 +f 3127 3153 3147 +f 3147 3121 3127 +f 2229 2240 1775 +f 1775 1772 2229 +f 2417 2425 2240 +f 2240 2229 2417 +f 2546 2555 2425 +f 2425 2417 2546 +f 2676 2694 2555 +f 2555 2546 2676 +f 2790 2826 2694 +f 2694 2676 2790 +f 2900 2958 2826 +f 2826 2790 2900 +f 3013 3043 2958 +f 2958 2900 3013 +f 3057 3083 3043 +f 3043 3013 3057 +f 3081 3121 3083 +f 3083 3057 3081 +f 3085 3127 3121 +f 3121 3081 3085 +f 2216 2229 1772 +f 1772 1769 2216 +f 2407 2417 2229 +f 2229 2216 2407 +f 2533 2546 2417 +f 2417 2407 2533 +f 2651 2676 2546 +f 2546 2533 2651 +f 2753 2790 2676 +f 2676 2651 2753 +f 2859 2900 2790 +f 2790 2753 2859 +f 2977 3013 2900 +f 2900 2859 2977 +f 3029 3057 3013 +f 3013 2977 3029 +f 3052 3081 3057 +f 3057 3029 3052 +f 3063 3085 3081 +f 3081 3052 3063 +f 2203 2216 1769 +f 1769 1767 2203 +f 2397 2407 2216 +f 2216 2203 2397 +f 2527 2533 2407 +f 2407 2397 2527 +f 2633 2651 2533 +f 2533 2527 2633 +f 2727 2753 2651 +f 2651 2633 2727 +f 2831 2859 2753 +f 2753 2727 2831 +f 2919 2977 2859 +f 2859 2831 2919 +f 2996 3029 2977 +f 2977 2919 2996 +f 3034 3052 3029 +f 3029 2996 3034 +f 3038 3063 3052 +f 3052 3034 3038 +f 2197 2203 1767 +f 1767 1763 2197 +f 2393 2397 2203 +f 2203 2197 2393 +f 2522 2527 2397 +f 2397 2393 2522 +f 2617 2633 2527 +f 2527 2522 2617 +f 2716 2727 2633 +f 2633 2617 2716 +f 2811 2831 2727 +f 2727 2716 2811 +f 2895 2919 2831 +f 2831 2811 2895 +f 2979 2996 2919 +f 2919 2895 2979 +f 3016 3034 2996 +f 2996 2979 3016 +f 3026 3038 3034 +f 3034 3016 3026 +f 2193 2197 1763 +f 1763 1761 2193 +f 2389 2393 2197 +f 2197 2193 2389 +f 2516 2522 2393 +f 2393 2389 2516 +f 2610 2617 2522 +f 2522 2516 2610 +f 2710 2716 2617 +f 2617 2610 2710 +f 2803 2811 2716 +f 2716 2710 2803 +f 2885 2895 2811 +f 2811 2803 2885 +f 2971 2979 2895 +f 2895 2885 2971 +f 3005 3016 2979 +f 2979 2971 3005 +f 3022 3026 3016 +f 3016 3005 3022 +f 461 545 544 +f 544 456 461 +f 463 551 545 +f 545 461 463 +f 465 557 551 +f 551 463 465 +f 469 567 557 +f 557 465 469 +f 471 575 567 +f 567 469 471 +f 473 577 575 +f 575 471 473 +f 475 589 577 +f 577 473 475 +f 477 593 589 +f 589 475 477 +f 479 595 593 +f 593 477 479 +f 481 599 595 +f 595 479 481 +f 389 461 456 +f 456 392 389 +f 386 463 461 +f 461 389 386 +f 379 465 463 +f 463 386 379 +f 373 469 465 +f 465 379 373 +f 371 471 469 +f 469 373 371 +f 369 473 471 +f 471 371 369 +f 366 475 473 +f 473 369 366 +f 364 477 475 +f 475 366 364 +f 362 479 477 +f 477 364 362 +f 361 481 479 +f 479 362 361 +f 335 389 392 +f 392 337 335 +f 333 386 389 +f 389 335 333 +f 331 379 386 +f 386 333 331 +f 329 373 379 +f 379 331 329 +f 328 371 373 +f 373 329 328 +f 325 369 371 +f 371 328 325 +f 323 366 369 +f 369 325 323 +f 321 364 366 +f 366 323 321 +f 319 362 364 +f 364 321 319 +f 316 361 362 +f 362 319 316 +f 298 335 337 +f 337 302 298 +f 290 333 335 +f 335 298 290 +f 288 331 333 +f 333 290 288 +f 286 329 331 +f 331 288 286 +f 281 328 329 +f 329 286 281 +f 275 325 328 +f 328 281 275 +f 265 323 325 +f 325 275 265 +f 259 321 323 +f 323 265 259 +f 255 319 321 +f 321 259 255 +f 249 316 319 +f 319 255 249 +f 269 298 302 +f 302 271 269 +f 261 290 298 +f 298 269 261 +f 251 288 290 +f 290 261 251 +f 238 286 288 +f 288 251 238 +f 230 281 286 +f 286 238 230 +f 218 275 281 +f 281 230 218 +f 208 265 275 +f 275 218 208 +f 196 259 265 +f 265 208 196 +f 186 255 259 +f 259 196 186 +f 181 249 255 +f 255 186 181 +f 228 269 271 +f 271 234 228 +f 222 261 269 +f 269 228 222 +f 212 251 261 +f 261 222 212 +f 200 238 251 +f 251 212 200 +f 177 230 238 +f 238 200 177 +f 160 218 230 +f 230 177 160 +f 134 208 218 +f 218 160 134 +f 112 196 208 +f 208 134 112 +f 102 186 196 +f 196 112 102 +f 96 181 186 +f 186 102 96 +f 198 228 234 +f 234 205 198 +f 182 222 228 +f 228 198 182 +f 168 212 222 +f 222 182 168 +f 146 200 212 +f 212 168 146 +f 118 177 200 +f 200 146 118 +f 92 160 177 +f 177 118 92 +f 74 134 160 +f 160 92 74 +f 63 112 134 +f 134 74 63 +f 53 102 112 +f 112 63 53 +f 50 96 102 +f 102 53 50 +f 167 198 205 +f 205 170 167 +f 154 182 198 +f 198 167 154 +f 126 168 182 +f 182 154 126 +f 100 146 168 +f 168 126 100 +f 83 118 146 +f 146 100 83 +f 61 92 118 +f 118 83 61 +f 46 74 92 +f 92 61 46 +f 32 63 74 +f 74 46 32 +f 25 53 63 +f 63 32 25 +f 21 50 53 +f 53 25 21 +f 143 167 170 +f 170 150 143 +f 124 154 167 +f 167 143 124 +f 104 126 154 +f 154 124 104 +f 84 100 126 +f 126 104 84 +f 65 83 100 +f 100 84 65 +f 44 61 83 +f 83 65 44 +f 30 46 61 +f 61 44 30 +f 17 32 46 +f 46 30 17 +f 9 25 32 +f 32 17 9 +f 5 21 25 +f 25 9 5 +f 132 143 150 +f 150 140 132 +f 116 124 143 +f 143 132 116 +f 94 104 124 +f 124 116 94 +f 76 84 104 +f 104 94 76 +f 55 65 84 +f 84 76 55 +f 40 44 65 +f 65 55 40 +f 22 30 44 +f 44 40 22 +f 11 17 30 +f 30 22 11 +f 2 9 17 +f 17 11 2 +f 1 5 9 +f 9 2 1 +f 480 596 599 +f 599 481 480 +f 478 594 596 +f 596 480 478 +f 476 590 594 +f 594 478 476 +f 474 578 590 +f 590 476 474 +f 472 576 578 +f 578 474 472 +f 470 568 576 +f 576 472 470 +f 466 558 568 +f 568 470 466 +f 464 552 558 +f 558 466 464 +f 462 546 552 +f 552 464 462 +f 456 544 546 +f 546 462 456 +f 363 480 481 +f 481 360 363 +f 365 478 480 +f 480 363 365 +f 367 476 478 +f 478 365 367 +f 368 474 476 +f 476 367 368 +f 370 472 474 +f 474 368 370 +f 372 470 472 +f 472 370 372 +f 380 466 470 +f 470 372 380 +f 385 464 466 +f 466 380 385 +f 390 462 464 +f 464 385 390 +f 391 456 462 +f 462 390 391 +f 320 363 360 +f 360 316 320 +f 322 365 363 +f 363 320 322 +f 324 367 365 +f 365 322 324 +f 326 368 367 +f 367 324 326 +f 327 370 368 +f 368 326 327 +f 330 372 370 +f 370 327 330 +f 332 380 372 +f 372 330 332 +f 334 385 380 +f 380 332 334 +f 336 390 385 +f 385 334 336 +f 337 391 390 +f 390 336 337 +f 256 320 316 +f 316 250 256 +f 260 322 320 +f 320 256 260 +f 266 324 322 +f 322 260 266 +f 276 326 324 +f 324 266 276 +f 282 327 326 +f 326 276 282 +f 287 330 327 +f 327 282 287 +f 289 332 330 +f 330 287 289 +f 291 334 332 +f 332 289 291 +f 299 336 334 +f 334 291 299 +f 303 337 336 +f 336 299 303 +f 187 256 250 +f 250 181 187 +f 197 260 256 +f 256 187 197 +f 209 266 260 +f 260 197 209 +f 219 276 266 +f 266 209 219 +f 231 282 276 +f 276 219 231 +f 239 287 282 +f 282 231 239 +f 252 289 287 +f 287 239 252 +f 262 291 289 +f 289 252 262 +f 270 299 291 +f 291 262 270 +f 272 303 299 +f 299 270 272 +f 103 187 181 +f 181 97 103 +f 113 197 187 +f 187 103 113 +f 135 209 197 +f 197 113 135 +f 161 219 209 +f 209 135 161 +f 178 231 219 +f 219 161 178 +f 201 239 231 +f 231 178 201 +f 213 252 239 +f 239 201 213 +f 223 262 252 +f 252 213 223 +f 229 270 262 +f 262 223 229 +f 235 272 270 +f 270 229 235 +f 54 103 97 +f 97 50 54 +f 64 113 103 +f 103 54 64 +f 75 135 113 +f 113 64 75 +f 93 161 135 +f 135 75 93 +f 119 178 161 +f 161 93 119 +f 147 201 178 +f 178 119 147 +f 169 213 201 +f 201 147 169 +f 183 223 213 +f 213 169 183 +f 199 229 223 +f 223 183 199 +f 205 235 229 +f 229 199 205 +f 24 54 50 +f 50 21 24 +f 33 64 54 +f 54 24 33 +f 47 75 64 +f 64 33 47 +f 62 93 75 +f 75 47 62 +f 82 119 93 +f 93 62 82 +f 101 147 119 +f 119 82 101 +f 127 169 147 +f 147 101 127 +f 155 183 169 +f 169 127 155 +f 166 199 183 +f 183 155 166 +f 171 205 199 +f 199 166 171 +f 10 24 21 +f 21 6 10 +f 18 33 24 +f 24 10 18 +f 31 47 33 +f 33 18 31 +f 45 62 47 +f 47 31 45 +f 66 82 62 +f 62 45 66 +f 85 101 82 +f 82 66 85 +f 105 127 101 +f 101 85 105 +f 125 155 127 +f 127 105 125 +f 144 166 155 +f 155 125 144 +f 151 171 166 +f 166 144 151 +f 3 10 6 +f 6 1 3 +f 12 18 10 +f 10 3 12 +f 23 31 18 +f 18 12 23 +f 41 45 31 +f 31 23 41 +f 56 66 45 +f 45 41 56 +f 77 85 66 +f 66 56 77 +f 95 105 85 +f 85 77 95 +f 117 125 105 +f 105 95 117 +f 133 144 125 +f 125 117 133 +f 140 151 144 +f 144 133 140 +f 138 132 140 +f 140 145 138 +f 122 116 132 +f 132 138 122 +f 98 94 116 +f 116 122 98 +f 80 76 94 +f 94 98 80 +f 60 55 76 +f 76 80 60 +f 42 40 55 +f 55 60 42 +f 28 22 40 +f 40 42 28 +f 13 11 22 +f 22 28 13 +f 7 2 11 +f 11 13 7 +f 4 1 2 +f 2 7 4 +f 152 138 145 +f 145 158 152 +f 136 122 138 +f 138 152 136 +f 108 98 122 +f 122 136 108 +f 89 80 98 +f 98 108 89 +f 70 60 80 +f 80 89 70 +f 52 42 60 +f 60 70 52 +f 38 28 42 +f 42 52 38 +f 26 13 28 +f 28 38 26 +f 19 7 13 +f 13 26 19 +f 15 4 7 +f 7 19 15 +f 173 152 158 +f 158 176 173 +f 162 136 152 +f 152 173 162 +f 142 108 136 +f 136 162 142 +f 111 89 108 +f 108 142 111 +f 91 70 89 +f 89 111 91 +f 73 52 70 +f 70 91 73 +f 58 38 52 +f 52 73 58 +f 48 26 38 +f 38 58 48 +f 37 19 26 +f 26 48 37 +f 35 15 19 +f 19 37 35 +f 194 173 176 +f 176 202 194 +f 184 162 173 +f 173 194 184 +f 174 142 162 +f 162 184 174 +f 156 111 142 +f 142 174 156 +f 128 91 111 +f 111 156 128 +f 106 73 91 +f 91 128 106 +f 86 58 73 +f 73 106 86 +f 78 48 58 +f 58 86 78 +f 68 37 48 +f 48 78 68 +f 67 35 37 +f 37 68 67 +f 221 194 202 +f 202 225 221 +f 216 184 194 +f 194 221 216 +f 206 174 184 +f 184 216 206 +f 192 156 174 +f 174 206 192 +f 180 128 156 +f 156 192 180 +f 164 106 128 +f 128 180 164 +f 148 86 106 +f 106 164 148 +f 130 78 86 +f 86 148 130 +f 121 68 78 +f 78 130 121 +f 115 67 68 +f 68 121 115 +f 244 221 225 +f 225 247 244 +f 240 216 221 +f 221 244 240 +f 236 206 216 +f 216 240 236 +f 233 192 206 +f 206 236 233 +f 227 180 192 +f 192 233 227 +f 215 164 180 +f 180 227 215 +f 210 148 164 +f 164 215 210 +f 203 130 148 +f 148 210 203 +f 191 121 130 +f 130 203 191 +f 188 115 121 +f 121 191 188 +f 284 244 247 +f 247 285 284 +f 279 240 244 +f 244 284 279 +f 277 236 240 +f 240 279 277 +f 273 233 236 +f 236 277 273 +f 267 227 233 +f 233 273 267 +f 263 215 227 +f 227 267 263 +f 258 210 215 +f 215 263 258 +f 253 203 210 +f 210 258 253 +f 245 191 203 +f 203 253 245 +f 242 188 191 +f 191 245 242 +f 315 284 285 +f 285 318 315 +f 312 279 284 +f 284 315 312 +f 311 277 279 +f 279 312 311 +f 309 273 277 +f 277 311 309 +f 307 267 273 +f 273 309 307 +f 305 263 267 +f 267 307 305 +f 301 258 263 +f 263 305 301 +f 297 253 258 +f 258 301 297 +f 295 245 253 +f 253 297 295 +f 293 242 245 +f 245 295 293 +f 341 315 318 +f 318 339 341 +f 343 312 315 +f 315 341 343 +f 345 311 312 +f 312 343 345 +f 347 309 311 +f 311 345 347 +f 349 307 309 +f 309 347 349 +f 351 305 307 +f 307 349 351 +f 353 301 305 +f 305 351 353 +f 355 297 301 +f 301 353 355 +f 357 295 297 +f 297 355 357 +f 359 293 295 +f 295 357 359 +f 378 341 339 +f 339 376 378 +f 384 343 341 +f 341 378 384 +f 394 345 343 +f 343 384 394 +f 403 347 345 +f 345 394 403 +f 406 349 347 +f 347 403 406 +f 415 351 349 +f 349 406 415 +f 419 353 351 +f 351 415 419 +f 423 355 353 +f 353 419 423 +f 425 357 355 +f 355 423 425 +f 427 359 357 +f 357 425 427 +f 8 3 1 +f 1 4 8 +f 14 12 3 +f 3 8 14 +f 29 23 12 +f 12 14 29 +f 43 41 23 +f 23 29 43 +f 59 56 41 +f 41 43 59 +f 81 77 56 +f 56 59 81 +f 99 95 77 +f 77 81 99 +f 123 117 95 +f 95 99 123 +f 139 133 117 +f 117 123 139 +f 145 140 133 +f 133 139 145 +f 20 8 4 +f 4 16 20 +f 27 14 8 +f 8 20 27 +f 39 29 14 +f 14 27 39 +f 51 43 29 +f 29 39 51 +f 71 59 43 +f 43 51 71 +f 88 81 59 +f 59 71 88 +f 109 99 81 +f 81 88 109 +f 137 123 99 +f 99 109 137 +f 153 139 123 +f 123 137 153 +f 159 145 139 +f 139 153 159 +f 36 20 16 +f 16 34 36 +f 49 27 20 +f 20 36 49 +f 57 39 27 +f 27 49 57 +f 72 51 39 +f 39 57 72 +f 90 71 51 +f 51 72 90 +f 110 88 71 +f 71 90 110 +f 141 109 88 +f 88 110 141 +f 163 137 109 +f 109 141 163 +f 172 153 137 +f 137 163 172 +f 176 159 153 +f 153 172 176 +f 69 36 34 +f 34 67 69 +f 79 49 36 +f 36 69 79 +f 87 57 49 +f 49 79 87 +f 107 72 57 +f 57 87 107 +f 129 90 72 +f 72 107 129 +f 157 110 90 +f 90 129 157 +f 175 141 110 +f 110 157 175 +f 185 163 141 +f 141 175 185 +f 195 172 163 +f 163 185 195 +f 202 176 172 +f 172 195 202 +f 120 69 67 +f 67 114 120 +f 131 79 69 +f 69 120 131 +f 149 87 79 +f 79 131 149 +f 165 107 87 +f 87 149 165 +f 179 129 107 +f 107 165 179 +f 193 157 129 +f 129 179 193 +f 207 175 157 +f 157 193 207 +f 217 185 175 +f 175 207 217 +f 220 195 185 +f 185 217 220 +f 224 202 195 +f 195 220 224 +f 190 120 114 +f 114 189 190 +f 204 131 120 +f 120 190 204 +f 211 149 131 +f 131 204 211 +f 214 165 149 +f 149 211 214 +f 226 179 165 +f 165 214 226 +f 232 193 179 +f 179 226 232 +f 237 207 193 +f 193 232 237 +f 241 217 207 +f 207 237 241 +f 243 220 217 +f 217 241 243 +f 248 224 220 +f 220 243 248 +f 246 190 189 +f 189 242 246 +f 254 204 190 +f 190 246 254 +f 257 211 204 +f 204 254 257 +f 264 214 211 +f 211 257 264 +f 268 226 214 +f 214 264 268 +f 274 232 226 +f 226 268 274 +f 278 237 232 +f 232 274 278 +f 280 241 237 +f 237 278 280 +f 283 243 241 +f 241 280 283 +f 285 248 243 +f 243 283 285 +f 294 246 242 +f 242 292 294 +f 296 254 246 +f 246 294 296 +f 300 257 254 +f 254 296 300 +f 304 264 257 +f 257 300 304 +f 306 268 264 +f 264 304 306 +f 308 274 268 +f 268 306 308 +f 310 278 274 +f 274 308 310 +f 313 280 278 +f 278 310 313 +f 314 283 280 +f 280 313 314 +f 317 285 283 +f 283 314 317 +f 356 294 292 +f 292 358 356 +f 354 296 294 +f 294 356 354 +f 352 300 296 +f 296 354 352 +f 350 304 300 +f 300 352 350 +f 348 306 304 +f 304 350 348 +f 346 308 306 +f 306 348 346 +f 344 310 308 +f 308 346 344 +f 342 313 310 +f 310 344 342 +f 340 314 313 +f 313 342 340 +f 338 317 314 +f 314 340 338 +f 424 356 358 +f 358 426 424 +f 422 354 356 +f 356 424 422 +f 418 352 354 +f 354 422 418 +f 414 350 352 +f 352 418 414 +f 407 348 350 +f 350 414 407 +f 402 346 348 +f 348 407 402 +f 393 344 346 +f 346 402 393 +f 383 342 344 +f 344 393 383 +f 377 340 342 +f 342 383 377 +f 375 338 340 +f 340 377 375 +f 3186 3113 3115 +f 3115 3182 3186 +f 3192 3110 3113 +f 3113 3186 3192 +f 3196 3109 3110 +f 3110 3192 3196 +f 3205 3106 3109 +f 3109 3196 3205 +f 3211 3104 3106 +f 3106 3205 3211 +f 3215 3102 3104 +f 3104 3211 3215 +f 3217 3101 3102 +f 3102 3215 3217 +f 3220 3098 3101 +f 3101 3217 3220 +f 3222 3097 3098 +f 3098 3220 3222 +f 3223 3095 3097 +f 3097 3222 3223 +f 3227 3186 3182 +f 3182 3225 3227 +f 3229 3192 3186 +f 3186 3227 3229 +f 3231 3196 3192 +f 3192 3229 3231 +f 3233 3205 3196 +f 3196 3231 3233 +f 3235 3211 3205 +f 3205 3233 3235 +f 3241 3215 3211 +f 3211 3235 3241 +f 3245 3217 3215 +f 3215 3241 3245 +f 3249 3220 3217 +f 3217 3245 3249 +f 3251 3222 3220 +f 3220 3249 3251 +f 3253 3223 3222 +f 3222 3251 3253 +f 3239 3227 3225 +f 3225 3237 3239 +f 3243 3229 3227 +f 3227 3239 3243 +f 3247 3231 3229 +f 3229 3243 3247 +f 3257 3233 3231 +f 3231 3247 3257 +f 3263 3235 3233 +f 3233 3257 3263 +f 3271 3241 3235 +f 3235 3263 3271 +f 3279 3245 3241 +f 3241 3271 3279 +f 3285 3249 3245 +f 3245 3279 3285 +f 3293 3251 3249 +f 3249 3285 3293 +f 3297 3253 3251 +f 3251 3293 3297 +f 3259 3239 3237 +f 3237 3255 3259 +f 3261 3243 3239 +f 3239 3259 3261 +f 3265 3247 3243 +f 3243 3261 3265 +f 3275 3257 3247 +f 3247 3265 3275 +f 3287 3263 3257 +f 3257 3275 3287 +f 3303 3271 3263 +f 3263 3287 3303 +f 3314 3279 3271 +f 3271 3303 3314 +f 3320 3285 3279 +f 3279 3314 3320 +f 3330 3293 3285 +f 3285 3320 3330 +f 3332 3297 3293 +f 3293 3330 3332 +f 3270 3259 3255 +f 3255 3268 3270 +f 3273 3261 3259 +f 3259 3270 3273 +f 3283 3265 3261 +f 3261 3273 3283 +f 3299 3275 3265 +f 3265 3283 3299 +f 3308 3287 3275 +f 3275 3299 3308 +f 3322 3303 3287 +f 3287 3308 3322 +f 3338 3314 3303 +f 3303 3322 3338 +f 3346 3320 3314 +f 3314 3338 3346 +f 3351 3330 3320 +f 3320 3346 3351 +f 3355 3332 3330 +f 3330 3351 3355 +f 3282 3270 3268 +f 3268 3278 3282 +f 3290 3273 3270 +f 3270 3282 3290 +f 3302 3283 3273 +f 3273 3290 3302 +f 3312 3299 3283 +f 3283 3302 3312 +f 3324 3308 3299 +f 3299 3312 3324 +f 3340 3322 3308 +f 3308 3324 3340 +f 3353 3338 3322 +f 3322 3340 3353 +f 3368 3346 3338 +f 3338 3353 3368 +f 3373 3351 3346 +f 3346 3368 3373 +f 3379 3355 3351 +f 3351 3373 3379 +f 3295 3282 3278 +f 3278 3292 3295 +f 3306 3290 3282 +f 3282 3295 3306 +f 3316 3302 3290 +f 3290 3306 3316 +f 3326 3312 3302 +f 3302 3316 3326 +f 3345 3324 3312 +f 3312 3326 3345 +f 3359 3340 3324 +f 3324 3345 3359 +f 3376 3353 3340 +f 3340 3359 3376 +f 3394 3368 3353 +f 3353 3376 3394 +f 3404 3373 3368 +f 3368 3394 3404 +f 3406 3379 3373 +f 3373 3404 3406 +f 3310 3295 3292 +f 3292 3307 3310 +f 3318 3306 3295 +f 3295 3310 3318 +f 3336 3316 3306 +f 3306 3318 3336 +f 3348 3326 3316 +f 3316 3336 3348 +f 3369 3345 3326 +f 3326 3348 3369 +f 3389 3359 3345 +f 3345 3369 3389 +f 3425 3376 3359 +f 3359 3389 3425 +f 3449 3394 3376 +f 3376 3425 3449 +f 3468 3404 3394 +f 3394 3449 3468 +f 3472 3406 3404 +f 3404 3468 3472 +f 3335 3310 3307 +f 3307 3329 3335 +f 3343 3318 3310 +f 3310 3335 3343 +f 3362 3336 3318 +f 3318 3343 3362 +f 3386 3348 3336 +f 3336 3362 3386 +f 3422 3369 3348 +f 3348 3386 3422 +f 3464 3389 3369 +f 3369 3422 3464 +f 3490 3425 3389 +f 3389 3464 3490 +f 3505 3449 3425 +f 3425 3490 3505 +f 3521 3468 3449 +f 3449 3505 3521 +f 3523 3472 3468 +f 3468 3521 3523 +f 3364 3335 3329 +f 3329 3357 3364 +f 3382 3343 3335 +f 3335 3364 3382 +f 3416 3362 3343 +f 3343 3382 3416 +f 3465 3386 3362 +f 3362 3416 3465 +f 3495 3422 3386 +f 3386 3465 3495 +f 3528 3464 3422 +f 3422 3495 3528 +f 3553 3490 3464 +f 3464 3528 3553 +f 3579 3505 3490 +f 3490 3553 3579 +f 3592 3521 3505 +f 3505 3579 3592 +f 3604 3523 3521 +f 3521 3592 3604 +f 3221 3096 3094 +f 3094 3224 3221 +f 3219 3099 3096 +f 3096 3221 3219 +f 3218 3100 3099 +f 3099 3219 3218 +f 3216 3103 3100 +f 3100 3218 3216 +f 3212 3105 3103 +f 3103 3216 3212 +f 3206 3107 3105 +f 3105 3212 3206 +f 3197 3108 3107 +f 3107 3206 3197 +f 3193 3111 3108 +f 3108 3197 3193 +f 3187 3112 3111 +f 3111 3193 3187 +f 3183 3114 3112 +f 3112 3187 3183 +f 3252 3221 3224 +f 3224 3254 3252 +f 3250 3219 3221 +f 3221 3252 3250 +f 3246 3218 3219 +f 3219 3250 3246 +f 3242 3216 3218 +f 3218 3246 3242 +f 3236 3212 3216 +f 3216 3242 3236 +f 3234 3206 3212 +f 3212 3236 3234 +f 3232 3197 3206 +f 3206 3234 3232 +f 3230 3193 3197 +f 3197 3232 3230 +f 3228 3187 3193 +f 3193 3230 3228 +f 3226 3183 3187 +f 3187 3228 3226 +f 3294 3252 3254 +f 3254 3298 3294 +f 3286 3250 3252 +f 3252 3294 3286 +f 3280 3246 3250 +f 3250 3286 3280 +f 3272 3242 3246 +f 3246 3280 3272 +f 3264 3236 3242 +f 3242 3272 3264 +f 3258 3234 3236 +f 3236 3264 3258 +f 3248 3232 3234 +f 3234 3258 3248 +f 3244 3230 3232 +f 3232 3248 3244 +f 3240 3228 3230 +f 3230 3244 3240 +f 3238 3226 3228 +f 3228 3240 3238 +f 3331 3294 3298 +f 3298 3333 3331 +f 3321 3286 3294 +f 3294 3331 3321 +f 3315 3280 3286 +f 3286 3321 3315 +f 3304 3272 3280 +f 3280 3315 3304 +f 3288 3264 3272 +f 3272 3304 3288 +f 3276 3258 3264 +f 3264 3288 3276 +f 3266 3248 3258 +f 3258 3276 3266 +f 3262 3244 3248 +f 3248 3266 3262 +f 3260 3240 3244 +f 3244 3262 3260 +f 3256 3238 3240 +f 3240 3260 3256 +f 3350 3331 3333 +f 3333 3354 3350 +f 3347 3321 3331 +f 3331 3350 3347 +f 3339 3315 3321 +f 3321 3347 3339 +f 3323 3304 3315 +f 3315 3339 3323 +f 3309 3288 3304 +f 3304 3323 3309 +f 3300 3276 3288 +f 3288 3309 3300 +f 3284 3266 3276 +f 3276 3300 3284 +f 3274 3262 3266 +f 3266 3284 3274 +f 3269 3260 3262 +f 3262 3274 3269 +f 3267 3256 3260 +f 3260 3269 3267 +f 3372 3350 3354 +f 3354 3378 3372 +f 3367 3347 3350 +f 3350 3372 3367 +f 3352 3339 3347 +f 3347 3367 3352 +f 3341 3323 3339 +f 3339 3352 3341 +f 3325 3309 3323 +f 3323 3341 3325 +f 3313 3300 3309 +f 3309 3325 3313 +f 3301 3284 3300 +f 3300 3313 3301 +f 3289 3274 3284 +f 3284 3301 3289 +f 3281 3269 3274 +f 3274 3289 3281 +f 3277 3267 3269 +f 3269 3281 3277 +f 3403 3372 3378 +f 3378 3405 3403 +f 3393 3367 3372 +f 3372 3403 3393 +f 3377 3352 3367 +f 3367 3393 3377 +f 3360 3341 3352 +f 3352 3377 3360 +f 3344 3325 3341 +f 3341 3360 3344 +f 3327 3313 3325 +f 3325 3344 3327 +f 3317 3301 3313 +f 3313 3327 3317 +f 3305 3289 3301 +f 3301 3317 3305 +f 3296 3281 3289 +f 3289 3305 3296 +f 3291 3277 3281 +f 3281 3296 3291 +f 3469 3403 3405 +f 3405 3472 3469 +f 3450 3393 3403 +f 3403 3469 3450 +f 3426 3377 3393 +f 3393 3450 3426 +f 3390 3360 3377 +f 3377 3426 3390 +f 3370 3344 3360 +f 3360 3390 3370 +f 3349 3327 3344 +f 3344 3370 3349 +f 3337 3317 3327 +f 3327 3349 3337 +f 3319 3305 3317 +f 3317 3337 3319 +f 3311 3296 3305 +f 3305 3319 3311 +f 3307 3291 3296 +f 3296 3311 3307 +f 3520 3469 3472 +f 3472 3522 3520 +f 3504 3450 3469 +f 3469 3520 3504 +f 3489 3426 3450 +f 3450 3504 3489 +f 3463 3390 3426 +f 3426 3489 3463 +f 3421 3370 3390 +f 3390 3463 3421 +f 3385 3349 3370 +f 3370 3421 3385 +f 3361 3337 3349 +f 3349 3385 3361 +f 3342 3319 3337 +f 3337 3361 3342 +f 3334 3311 3319 +f 3319 3342 3334 +f 3328 3307 3311 +f 3311 3334 3328 +f 3591 3520 3522 +f 3522 3603 3591 +f 3578 3504 3520 +f 3520 3591 3578 +f 3552 3489 3504 +f 3504 3578 3552 +f 3530 3463 3489 +f 3489 3552 3530 +f 3499 3421 3463 +f 3463 3530 3499 +f 3467 3385 3421 +f 3421 3499 3467 +f 3415 3361 3385 +f 3385 3467 3415 +f 3381 3342 3361 +f 3361 3415 3381 +f 3363 3334 3342 +f 3342 3381 3363 +f 3356 3328 3334 +f 3334 3363 3356 +f 3374 3365 3358 +f 3358 3371 3374 +f 3395 3383 3365 +f 3365 3374 3395 +f 3443 3417 3383 +f 3383 3395 3443 +f 3481 3466 3417 +f 3417 3443 3481 +f 3514 3496 3466 +f 3466 3481 3514 +f 3545 3529 3496 +f 3496 3514 3545 +f 3573 3551 3529 +f 3529 3545 3573 +f 3597 3577 3551 +f 3551 3573 3597 +f 3613 3590 3577 +f 3577 3597 3613 +f 3619 3603 3590 +f 3590 3613 3619 +f 3387 3374 3371 +f 3371 3380 3387 +f 3413 3395 3374 +f 3374 3387 3413 +f 3461 3443 3395 +f 3395 3413 3461 +f 3493 3481 3443 +f 3443 3461 3493 +f 3524 3514 3481 +f 3481 3493 3524 +f 3556 3545 3514 +f 3514 3524 3556 +f 3584 3573 3545 +f 3545 3556 3584 +f 3611 3597 3573 +f 3573 3584 3611 +f 3628 3613 3597 +f 3597 3611 3628 +f 3632 3619 3613 +f 3613 3628 3632 +f 3398 3387 3380 +f 3380 3391 3398 +f 3435 3413 3387 +f 3387 3398 3435 +f 3473 3461 3413 +f 3413 3435 3473 +f 3500 3493 3461 +f 3461 3473 3500 +f 3531 3524 3493 +f 3493 3500 3531 +f 3562 3556 3524 +f 3524 3531 3562 +f 3595 3584 3556 +f 3556 3562 3595 +f 3617 3611 3584 +f 3584 3595 3617 +f 3633 3628 3611 +f 3611 3617 3633 +f 3641 3632 3628 +f 3628 3633 3641 +f 3409 3398 3391 +f 3391 3400 3409 +f 3447 3435 3398 +f 3398 3409 3447 +f 3477 3473 3435 +f 3435 3447 3477 +f 3506 3500 3473 +f 3473 3477 3506 +f 3540 3531 3500 +f 3500 3506 3540 +f 3567 3562 3531 +f 3531 3540 3567 +f 3601 3595 3562 +f 3562 3567 3601 +f 3624 3617 3595 +f 3595 3601 3624 +f 3639 3633 3617 +f 3617 3624 3639 +f 3644 3641 3633 +f 3633 3639 3644 +f 3433 3409 3400 +f 3400 3411 3433 +f 3453 3447 3409 +f 3409 3433 3453 +f 3483 3477 3447 +f 3447 3453 3483 +f 3510 3506 3477 +f 3477 3483 3510 +f 3543 3540 3506 +f 3506 3510 3543 +f 3569 3567 3540 +f 3540 3543 3569 +f 3599 3601 3567 +f 3567 3569 3599 +f 3622 3624 3601 +f 3601 3599 3622 +f 3637 3639 3624 +f 3624 3622 3637 +f 3642 3644 3639 +f 3639 3637 3642 +f 3439 3433 3411 +f 3411 3424 3439 +f 3458 3453 3433 +f 3433 3439 3458 +f 3487 3483 3453 +f 3453 3458 3487 +f 3513 3510 3483 +f 3483 3487 3513 +f 3542 3543 3510 +f 3510 3513 3542 +f 3566 3569 3543 +f 3543 3542 3566 +f 3593 3599 3569 +f 3569 3566 3593 +f 3616 3622 3599 +f 3599 3593 3616 +f 3630 3637 3622 +f 3622 3616 3630 +f 3636 3642 3637 +f 3637 3630 3636 +f 3441 3439 3424 +f 3424 3429 3441 +f 3459 3458 3439 +f 3439 3441 3459 +f 3485 3487 3458 +f 3458 3459 3485 +f 3508 3513 3487 +f 3487 3485 3508 +f 3533 3542 3513 +f 3513 3508 3533 +f 3558 3566 3542 +f 3542 3533 3558 +f 3582 3593 3566 +f 3566 3558 3582 +f 3607 3616 3593 +f 3593 3582 3607 +f 3620 3630 3616 +f 3616 3607 3620 +f 3626 3636 3630 +f 3630 3620 3626 +f 3437 3441 3429 +f 3429 3427 3437 +f 3455 3459 3441 +f 3441 3437 3455 +f 3479 3485 3459 +f 3459 3455 3479 +f 3502 3508 3485 +f 3485 3479 3502 +f 3526 3533 3508 +f 3508 3502 3526 +f 3547 3558 3533 +f 3533 3526 3547 +f 3571 3582 3558 +f 3558 3547 3571 +f 3588 3607 3582 +f 3582 3571 3588 +f 3605 3620 3607 +f 3607 3588 3605 +f 3609 3626 3620 +f 3620 3605 3609 +f 3419 3437 3427 +f 3427 3408 3419 +f 3445 3455 3437 +f 3437 3419 3445 +f 3470 3479 3455 +f 3455 3445 3470 +f 3492 3502 3479 +f 3479 3470 3492 +f 3517 3526 3502 +f 3502 3492 3517 +f 3536 3547 3526 +f 3526 3517 3536 +f 3554 3571 3547 +f 3547 3536 3554 +f 3575 3588 3571 +f 3571 3554 3575 +f 3580 3605 3588 +f 3588 3575 3580 +f 3587 3609 3605 +f 3605 3580 3587 +f 3401 3419 3408 +f 3408 3397 3401 +f 3431 3445 3419 +f 3419 3401 3431 +f 3451 3470 3445 +f 3445 3431 3451 +f 3475 3492 3470 +f 3470 3451 3475 +f 3497 3517 3492 +f 3492 3475 3497 +f 3518 3536 3517 +f 3517 3497 3518 +f 3537 3554 3536 +f 3536 3518 3537 +f 3549 3575 3554 +f 3554 3537 3549 +f 3560 3580 3575 +f 3575 3549 3560 +f 3564 3587 3580 +f 3580 3560 3564 +f 3614 3591 3603 +f 3603 3619 3614 +f 3598 3578 3591 +f 3591 3614 3598 +f 3574 3552 3578 +f 3578 3598 3574 +f 3546 3530 3552 +f 3552 3574 3546 +f 3515 3499 3530 +f 3530 3546 3515 +f 3482 3467 3499 +f 3499 3515 3482 +f 3444 3418 3467 +f 3467 3482 3444 +f 3396 3384 3418 +f 3418 3444 3396 +f 3375 3366 3384 +f 3384 3396 3375 +f 3371 3358 3366 +f 3366 3375 3371 +f 3629 3614 3619 +f 3619 3632 3629 +f 3612 3598 3614 +f 3614 3629 3612 +f 3585 3574 3598 +f 3598 3612 3585 +f 3557 3546 3574 +f 3574 3585 3557 +f 3525 3515 3546 +f 3546 3557 3525 +f 3494 3482 3515 +f 3515 3525 3494 +f 3462 3444 3482 +f 3482 3494 3462 +f 3414 3396 3444 +f 3444 3462 3414 +f 3388 3375 3396 +f 3396 3414 3388 +f 3380 3371 3375 +f 3375 3388 3380 +f 3634 3629 3632 +f 3632 3641 3634 +f 3618 3612 3629 +f 3629 3634 3618 +f 3596 3585 3612 +f 3612 3618 3596 +f 3563 3557 3585 +f 3585 3596 3563 +f 3532 3525 3557 +f 3557 3563 3532 +f 3501 3494 3525 +f 3525 3532 3501 +f 3474 3462 3494 +f 3494 3501 3474 +f 3436 3414 3462 +f 3462 3474 3436 +f 3399 3388 3414 +f 3414 3436 3399 +f 3392 3380 3388 +f 3388 3399 3392 +f 3640 3634 3641 +f 3641 3644 3640 +f 3625 3618 3634 +f 3634 3640 3625 +f 3602 3596 3618 +f 3618 3625 3602 +f 3568 3563 3596 +f 3596 3602 3568 +f 3539 3532 3563 +f 3563 3568 3539 +f 3507 3501 3532 +f 3532 3539 3507 +f 3478 3474 3501 +f 3501 3507 3478 +f 3448 3436 3474 +f 3474 3478 3448 +f 3410 3399 3436 +f 3436 3448 3410 +f 3400 3392 3399 +f 3399 3410 3400 +f 3638 3640 3644 +f 3644 3643 3638 +f 3623 3625 3640 +f 3640 3638 3623 +f 3600 3602 3625 +f 3625 3623 3600 +f 3570 3568 3602 +f 3602 3600 3570 +f 3544 3539 3568 +f 3568 3570 3544 +f 3511 3507 3539 +f 3539 3544 3511 +f 3484 3478 3507 +f 3507 3511 3484 +f 3454 3448 3478 +f 3478 3484 3454 +f 3434 3410 3448 +f 3448 3454 3434 +f 3412 3400 3410 +f 3410 3434 3412 +f 3631 3638 3643 +f 3643 3635 3631 +f 3615 3623 3638 +f 3638 3631 3615 +f 3594 3600 3623 +f 3623 3615 3594 +f 3565 3570 3600 +f 3600 3594 3565 +f 3541 3544 3570 +f 3570 3565 3541 +f 3512 3511 3544 +f 3544 3541 3512 +f 3488 3484 3511 +f 3511 3512 3488 +f 3457 3454 3484 +f 3484 3488 3457 +f 3440 3434 3454 +f 3454 3457 3440 +f 3423 3412 3434 +f 3434 3440 3423 +f 3621 3631 3635 +f 3635 3627 3621 +f 3608 3615 3631 +f 3631 3621 3608 +f 3583 3594 3615 +f 3615 3608 3583 +f 3559 3565 3594 +f 3594 3583 3559 +f 3534 3541 3565 +f 3565 3559 3534 +f 3509 3512 3541 +f 3541 3534 3509 +f 3486 3488 3512 +f 3512 3509 3486 +f 3460 3457 3488 +f 3488 3486 3460 +f 3442 3440 3457 +f 3457 3460 3442 +f 3430 3423 3440 +f 3440 3442 3430 +f 3606 3621 3627 +f 3627 3610 3606 +f 3589 3608 3621 +f 3621 3606 3589 +f 3572 3583 3608 +f 3608 3589 3572 +f 3548 3559 3583 +f 3583 3572 3548 +f 3527 3534 3559 +f 3559 3548 3527 +f 3503 3509 3534 +f 3534 3527 3503 +f 3480 3486 3509 +f 3509 3503 3480 +f 3456 3460 3486 +f 3486 3480 3456 +f 3438 3442 3460 +f 3460 3456 3438 +f 3428 3430 3442 +f 3442 3438 3428 +f 3581 3606 3610 +f 3610 3586 3581 +f 3576 3589 3606 +f 3606 3581 3576 +f 3555 3572 3589 +f 3589 3576 3555 +f 3535 3548 3572 +f 3572 3555 3535 +f 3516 3527 3548 +f 3548 3535 3516 +f 3491 3503 3527 +f 3527 3516 3491 +f 3471 3480 3503 +f 3503 3491 3471 +f 3446 3456 3480 +f 3480 3471 3446 +f 3420 3438 3456 +f 3456 3446 3420 +f 3407 3428 3438 +f 3438 3420 3407 +f 3561 3581 3586 +f 3586 3564 3561 +f 3550 3576 3581 +f 3581 3561 3550 +f 3538 3555 3576 +f 3576 3550 3538 +f 3519 3535 3555 +f 3555 3538 3519 +f 3498 3516 3535 +f 3535 3519 3498 +f 3476 3491 3516 +f 3516 3498 3476 +f 3452 3471 3491 +f 3491 3476 3452 +f 3432 3446 3471 +f 3471 3452 3432 +f 3402 3420 3446 +f 3446 3432 3402 +f 3397 3407 3420 +f 3420 3402 3397 +f 1888 2110 2104 +f 1888 2104 2096 +f 1888 2096 2076 +f 1888 2076 2048 +f 1888 2048 2030 +f 1888 2030 2006 +f 1888 2006 1982 +f 1888 1982 1960 +f 1888 1960 1936 +f 1888 1936 1732 +f 2257 2104 2110 +f 2110 2261 2257 +f 2249 2096 2104 +f 2104 2257 2249 +f 2226 2076 2096 +f 2096 2249 2226 +f 2200 2048 2076 +f 2076 2226 2200 +f 2142 2030 2048 +f 2048 2200 2142 +f 2094 2006 2030 +f 2030 2142 2094 +f 2036 1982 2006 +f 2006 2094 2036 +f 1988 1960 1982 +f 1982 2036 1988 +f 1948 1936 1960 +f 1960 1988 1948 +f 1728 1732 1936 +f 1936 1948 1728 +f 2310 2257 2261 +f 2261 2315 2310 +f 2300 2249 2257 +f 2257 2310 2300 +f 2279 2226 2249 +f 2249 2300 2279 +f 2243 2200 2226 +f 2226 2279 2243 +f 2204 2142 2200 +f 2200 2243 2204 +f 2132 2094 2142 +f 2142 2204 2132 +f 2067 2036 2094 +f 2094 2132 2067 +f 2000 1988 2036 +f 2036 2067 2000 +f 1956 1948 1988 +f 1988 2000 1956 +f 1734 1728 1948 +f 1948 1956 1734 +f 2312 2310 2315 +f 2315 2316 2312 +f 2302 2300 2310 +f 2310 2312 2302 +f 2281 2279 2300 +f 2300 2302 2281 +f 2245 2243 2279 +f 2279 2281 2245 +f 2206 2204 2243 +f 2243 2245 2206 +f 2134 2132 2204 +f 2204 2206 2134 +f 2068 2067 2132 +f 2132 2134 2068 +f 2002 2000 2067 +f 2067 2068 2002 +f 1958 1956 2000 +f 2000 2002 1958 +f 1878 1734 1956 +f 1956 1958 1878 +f 2285 2312 2316 +f 2316 2289 2285 +f 2259 2302 2312 +f 2312 2285 2259 +f 2241 2281 2302 +f 2302 2259 2241 +f 2214 2245 2281 +f 2281 2241 2214 +f 2168 2206 2245 +f 2245 2214 2168 +f 2106 2134 2206 +f 2206 2168 2106 +f 2042 2068 2134 +f 2134 2106 2042 +f 1994 2002 2068 +f 2068 2042 1994 +f 1952 1958 2002 +f 2002 1994 1952 +f 1731 1878 1958 +f 1958 1952 1731 +f 2220 2285 2289 +f 2289 2225 2220 +f 2210 2259 2285 +f 2285 2220 2210 +f 2186 2241 2259 +f 2259 2210 2186 +f 2146 2214 2241 +f 2241 2186 2146 +f 2108 2168 2214 +f 2214 2146 2108 +f 2060 2106 2168 +f 2168 2108 2060 +f 2018 2042 2106 +f 2106 2060 2018 +f 1978 1994 2042 +f 2042 2018 1978 +f 1944 1952 1994 +f 1994 1978 1944 +f 1727 1731 1952 +f 1952 1944 1727 +f 2141 2220 2225 +f 2225 2145 2141 +f 2127 2210 2220 +f 2220 2141 2127 +f 2112 2186 2210 +f 2210 2127 2112 +f 2084 2146 2186 +f 2186 2112 2084 +f 2044 2108 2146 +f 2146 2084 2044 +f 2024 2060 2108 +f 2108 2044 2024 +f 1992 2018 2060 +f 2060 2024 1992 +f 1970 1978 2018 +f 2018 1992 1970 +f 1942 1944 1978 +f 1978 1970 1942 +f 1721 1727 1944 +f 1944 1942 1721 +f 2079 2141 2145 +f 2145 2087 2079 +f 2075 2127 2141 +f 2141 2079 2075 +f 2055 2112 2127 +f 2127 2075 2055 +f 2039 2084 2112 +f 2112 2055 2039 +f 2021 2044 2084 +f 2084 2039 2021 +f 1996 2024 2044 +f 2044 2021 1996 +f 1974 1992 2024 +f 2024 1996 1974 +f 1954 1970 1992 +f 1992 1974 1954 +f 1934 1942 1970 +f 1970 1954 1934 +f 1720 1721 1942 +f 1942 1934 1720 +f 2063 2079 2087 +f 2087 2071 2063 +f 2051 2075 2079 +f 2079 2063 2051 +f 2041 2055 2075 +f 2075 2051 2041 +f 2029 2039 2055 +f 2055 2041 2029 +f 2013 2021 2039 +f 2039 2029 2013 +f 1991 1996 2021 +f 2021 2013 1991 +f 1972 1974 1996 +f 1996 1991 1972 +f 1950 1954 1974 +f 1974 1972 1950 +f 1932 1934 1954 +f 1954 1950 1932 +f 1701 1720 1934 +f 1934 1932 1701 +f 2115 2063 2071 +f 2071 2123 2115 +f 2101 2051 2063 +f 2063 2115 2101 +f 2081 2041 2051 +f 2051 2101 2081 +f 2057 2029 2041 +f 2041 2081 2057 +f 2033 2013 2029 +f 2029 2057 2033 +f 2009 1991 2013 +f 2013 2033 2009 +f 1984 1972 1991 +f 1991 2009 1984 +f 1964 1950 1972 +f 1972 1984 1964 +f 1938 1932 1950 +f 1950 1964 1938 +f 1698 1701 1932 +f 1932 1938 1698 +f 1888 1886 1686 +f 1888 1686 1662 +f 1888 1662 1640 +f 1888 1640 1616 +f 1888 1616 1592 +f 1888 1592 1574 +f 1888 1574 1546 +f 1888 1546 1526 +f 1888 1526 1518 +f 1888 1518 1512 +f 1674 1686 1886 +f 1886 1884 1674 +f 1634 1662 1686 +f 1686 1674 1634 +f 1586 1640 1662 +f 1662 1634 1586 +f 1528 1616 1640 +f 1640 1586 1528 +f 1480 1592 1616 +f 1616 1528 1480 +f 1422 1574 1592 +f 1592 1480 1422 +f 1396 1546 1574 +f 1574 1422 1396 +f 1373 1526 1546 +f 1546 1396 1373 +f 1365 1518 1526 +f 1526 1373 1365 +f 1361 1512 1518 +f 1518 1365 1361 +f 1666 1674 1884 +f 1884 1882 1666 +f 1622 1634 1674 +f 1674 1666 1622 +f 1557 1586 1634 +f 1634 1622 1557 +f 1490 1528 1586 +f 1586 1557 1490 +f 1418 1480 1528 +f 1528 1490 1418 +f 1379 1422 1480 +f 1480 1418 1379 +f 1343 1396 1422 +f 1422 1379 1343 +f 1322 1373 1396 +f 1396 1343 1322 +f 1312 1365 1373 +f 1373 1322 1312 +f 1309 1361 1365 +f 1365 1312 1309 +f 1664 1666 1882 +f 1882 1879 1664 +f 1620 1622 1666 +f 1666 1664 1620 +f 1554 1557 1622 +f 1622 1620 1554 +f 1488 1490 1557 +f 1557 1554 1488 +f 1416 1418 1490 +f 1490 1488 1416 +f 1377 1379 1418 +f 1418 1416 1377 +f 1341 1343 1379 +f 1379 1377 1341 +f 1320 1322 1343 +f 1343 1341 1320 +f 1310 1312 1322 +f 1322 1320 1310 +f 1306 1309 1312 +f 1312 1310 1306 +f 1670 1664 1879 +f 1879 1876 1670 +f 1628 1620 1664 +f 1664 1670 1628 +f 1580 1554 1620 +f 1620 1628 1580 +f 1516 1488 1554 +f 1554 1580 1516 +f 1454 1416 1488 +f 1488 1516 1454 +f 1408 1377 1416 +f 1416 1454 1408 +f 1381 1341 1377 +f 1377 1408 1381 +f 1363 1320 1341 +f 1341 1381 1363 +f 1337 1310 1320 +f 1320 1363 1337 +f 1333 1306 1310 +f 1310 1337 1333 +f 1678 1670 1876 +f 1876 1874 1678 +f 1644 1628 1670 +f 1670 1678 1644 +f 1604 1580 1628 +f 1628 1644 1604 +f 1562 1516 1580 +f 1580 1604 1562 +f 1514 1454 1516 +f 1516 1562 1514 +f 1476 1408 1454 +f 1454 1514 1476 +f 1436 1381 1408 +f 1408 1476 1436 +f 1412 1363 1381 +f 1381 1436 1412 +f 1402 1337 1363 +f 1363 1412 1402 +f 1399 1333 1337 +f 1337 1402 1399 +f 1680 1678 1874 +f 1874 1872 1680 +f 1652 1644 1678 +f 1678 1680 1652 +f 1630 1604 1644 +f 1644 1652 1630 +f 1598 1562 1604 +f 1604 1630 1598 +f 1578 1514 1562 +f 1562 1598 1578 +f 1538 1476 1514 +f 1514 1578 1538 +f 1510 1436 1476 +f 1476 1538 1510 +f 1497 1412 1436 +f 1436 1510 1497 +f 1483 1402 1412 +f 1412 1497 1483 +f 1479 1399 1402 +f 1402 1483 1479 +f 1688 1680 1872 +f 1872 1870 1688 +f 1668 1652 1680 +f 1680 1688 1668 +f 1648 1630 1652 +f 1652 1668 1648 +f 1626 1598 1630 +f 1630 1648 1626 +f 1603 1578 1598 +f 1598 1626 1603 +f 1585 1538 1578 +f 1578 1603 1585 +f 1569 1510 1538 +f 1538 1585 1569 +f 1549 1497 1510 +f 1510 1569 1549 +f 1545 1483 1497 +f 1497 1549 1545 +f 1537 1479 1483 +f 1483 1545 1537 +f 1690 1688 1870 +f 1870 1868 1690 +f 1672 1668 1688 +f 1688 1690 1672 +f 1650 1648 1668 +f 1668 1672 1650 +f 1633 1626 1648 +f 1648 1650 1633 +f 1611 1603 1626 +f 1626 1633 1611 +f 1595 1585 1603 +f 1603 1611 1595 +f 1583 1569 1585 +f 1585 1595 1583 +f 1573 1549 1569 +f 1569 1583 1573 +f 1561 1545 1549 +f 1549 1573 1561 +f 1553 1537 1545 +f 1545 1561 1553 +f 1684 1690 1868 +f 1868 1865 1684 +f 1658 1672 1690 +f 1690 1684 1658 +f 1638 1650 1672 +f 1672 1658 1638 +f 1615 1633 1650 +f 1650 1638 1615 +f 1591 1611 1633 +f 1633 1615 1591 +f 1567 1595 1611 +f 1611 1591 1567 +f 1543 1583 1595 +f 1595 1567 1543 +f 1523 1573 1583 +f 1583 1543 1523 +f 1509 1561 1573 +f 1573 1523 1509 +f 1501 1553 1561 +f 1561 1509 1501 +f 1888 1513 1519 +f 1888 1519 1527 +f 1888 1527 1547 +f 1888 1547 1575 +f 1888 1575 1593 +f 1888 1593 1617 +f 1888 1617 1641 +f 1888 1641 1663 +f 1888 1663 1687 +f 1888 1687 1894 +f 1366 1519 1513 +f 1513 1362 1366 +f 1374 1527 1519 +f 1519 1366 1374 +f 1397 1547 1527 +f 1527 1374 1397 +f 1423 1575 1547 +f 1547 1397 1423 +f 1481 1593 1575 +f 1575 1423 1481 +f 1529 1617 1593 +f 1593 1481 1529 +f 1587 1641 1617 +f 1617 1529 1587 +f 1635 1663 1641 +f 1641 1587 1635 +f 1675 1687 1663 +f 1663 1635 1675 +f 1895 1894 1687 +f 1687 1675 1895 +f 1313 1366 1362 +f 1362 1308 1313 +f 1323 1374 1366 +f 1366 1313 1323 +f 1344 1397 1374 +f 1374 1323 1344 +f 1380 1423 1397 +f 1397 1344 1380 +f 1419 1481 1423 +f 1423 1380 1419 +f 1491 1529 1481 +f 1481 1419 1491 +f 1556 1587 1529 +f 1529 1491 1556 +f 1623 1635 1587 +f 1587 1556 1623 +f 1667 1675 1635 +f 1635 1623 1667 +f 1890 1895 1675 +f 1675 1667 1890 +f 1311 1313 1308 +f 1308 1307 1311 +f 1321 1323 1313 +f 1313 1311 1321 +f 1342 1344 1323 +f 1323 1321 1342 +f 1378 1380 1344 +f 1344 1342 1378 +f 1417 1419 1380 +f 1380 1378 1417 +f 1489 1491 1419 +f 1419 1417 1489 +f 1555 1556 1491 +f 1491 1489 1555 +f 1621 1623 1556 +f 1556 1555 1621 +f 1665 1667 1623 +f 1623 1621 1665 +f 1881 1890 1667 +f 1667 1665 1881 +f 1338 1311 1307 +f 1307 1334 1338 +f 1364 1321 1311 +f 1311 1338 1364 +f 1382 1342 1321 +f 1321 1364 1382 +f 1409 1378 1342 +f 1342 1382 1409 +f 1455 1417 1378 +f 1378 1409 1455 +f 1517 1489 1417 +f 1417 1455 1517 +f 1581 1555 1489 +f 1489 1517 1581 +f 1629 1621 1555 +f 1555 1581 1629 +f 1671 1665 1621 +f 1621 1629 1671 +f 1893 1881 1665 +f 1665 1671 1893 +f 1403 1338 1334 +f 1334 1398 1403 +f 1413 1364 1338 +f 1338 1403 1413 +f 1437 1382 1364 +f 1364 1413 1437 +f 1477 1409 1382 +f 1382 1437 1477 +f 1515 1455 1409 +f 1409 1477 1515 +f 1563 1517 1455 +f 1455 1515 1563 +f 1605 1581 1517 +f 1517 1563 1605 +f 1645 1629 1581 +f 1581 1605 1645 +f 1679 1671 1629 +f 1629 1645 1679 +f 1900 1893 1671 +f 1671 1679 1900 +f 1482 1403 1398 +f 1398 1478 1482 +f 1496 1413 1403 +f 1403 1482 1496 +f 1511 1437 1413 +f 1413 1496 1511 +f 1539 1477 1437 +f 1437 1511 1539 +f 1579 1515 1477 +f 1477 1539 1579 +f 1599 1563 1515 +f 1515 1579 1599 +f 1631 1605 1563 +f 1563 1599 1631 +f 1653 1645 1605 +f 1605 1631 1653 +f 1681 1679 1645 +f 1645 1653 1681 +f 1902 1900 1679 +f 1679 1681 1902 +f 1544 1482 1478 +f 1478 1536 1544 +f 1548 1496 1482 +f 1482 1544 1548 +f 1568 1511 1496 +f 1496 1548 1568 +f 1584 1539 1511 +f 1511 1568 1584 +f 1602 1579 1539 +f 1539 1584 1602 +f 1627 1599 1579 +f 1579 1602 1627 +f 1649 1631 1599 +f 1599 1627 1649 +f 1669 1653 1631 +f 1631 1649 1669 +f 1689 1681 1653 +f 1653 1669 1689 +f 1921 1902 1681 +f 1681 1689 1921 +f 1560 1544 1536 +f 1536 1552 1560 +f 1572 1548 1544 +f 1544 1560 1572 +f 1582 1568 1548 +f 1548 1572 1582 +f 1594 1584 1568 +f 1568 1582 1594 +f 1610 1602 1584 +f 1584 1594 1610 +f 1632 1627 1602 +f 1602 1610 1632 +f 1651 1649 1627 +f 1627 1632 1651 +f 1673 1669 1649 +f 1649 1651 1673 +f 1691 1689 1669 +f 1669 1673 1691 +f 1922 1921 1689 +f 1689 1691 1922 +f 1508 1560 1552 +f 1552 1500 1508 +f 1522 1572 1560 +f 1560 1508 1522 +f 1542 1582 1572 +f 1572 1522 1542 +f 1566 1594 1582 +f 1582 1542 1566 +f 1590 1610 1594 +f 1594 1566 1590 +f 1614 1632 1610 +f 1610 1590 1614 +f 1639 1651 1632 +f 1632 1614 1639 +f 1659 1673 1651 +f 1651 1639 1659 +f 1685 1691 1673 +f 1673 1659 1685 +f 1928 1922 1691 +f 1691 1685 1928 +f 1888 1887 1937 +f 1888 1937 1961 +f 1888 1961 1983 +f 1888 1983 2007 +f 1888 2007 2031 +f 1888 2031 2049 +f 1888 2049 2077 +f 1888 2077 2097 +f 1888 2097 2105 +f 1888 2105 2111 +f 1949 1937 1887 +f 1887 1885 1949 +f 1989 1961 1937 +f 1937 1949 1989 +f 2037 1983 1961 +f 1961 1989 2037 +f 2095 2007 1983 +f 1983 2037 2095 +f 2143 2031 2007 +f 2007 2095 2143 +f 2201 2049 2031 +f 2031 2143 2201 +f 2227 2077 2049 +f 2049 2201 2227 +f 2250 2097 2077 +f 2077 2227 2250 +f 2258 2105 2097 +f 2097 2250 2258 +f 2262 2111 2105 +f 2105 2258 2262 +f 1957 1949 1885 +f 1885 1883 1957 +f 2001 1989 1949 +f 1949 1957 2001 +f 2066 2037 1989 +f 1989 2001 2066 +f 2133 2095 2037 +f 2037 2066 2133 +f 2205 2143 2095 +f 2095 2133 2205 +f 2244 2201 2143 +f 2143 2205 2244 +f 2280 2227 2201 +f 2201 2244 2280 +f 2301 2250 2227 +f 2227 2280 2301 +f 2311 2258 2250 +f 2250 2301 2311 +f 2314 2262 2258 +f 2258 2311 2314 +f 1959 1957 1883 +f 1883 1880 1959 +f 2003 2001 1957 +f 1957 1959 2003 +f 2069 2066 2001 +f 2001 2003 2069 +f 2135 2133 2066 +f 2066 2069 2135 +f 2207 2205 2133 +f 2133 2135 2207 +f 2246 2244 2205 +f 2205 2207 2246 +f 2282 2280 2244 +f 2244 2246 2282 +f 2303 2301 2280 +f 2280 2282 2303 +f 2313 2311 2301 +f 2301 2303 2313 +f 2317 2314 2311 +f 2311 2313 2317 +f 1953 1959 1880 +f 1880 1877 1953 +f 1995 2003 1959 +f 1959 1953 1995 +f 2043 2069 2003 +f 2003 1995 2043 +f 2107 2135 2069 +f 2069 2043 2107 +f 2169 2207 2135 +f 2135 2107 2169 +f 2215 2246 2207 +f 2207 2169 2215 +f 2242 2282 2246 +f 2246 2215 2242 +f 2260 2303 2282 +f 2282 2242 2260 +f 2286 2313 2303 +f 2303 2260 2286 +f 2290 2317 2313 +f 2313 2286 2290 +f 1945 1953 1877 +f 1877 1875 1945 +f 1979 1995 1953 +f 1953 1945 1979 +f 2019 2043 1995 +f 1995 1979 2019 +f 2061 2107 2043 +f 2043 2019 2061 +f 2109 2169 2107 +f 2107 2061 2109 +f 2147 2215 2169 +f 2169 2109 2147 +f 2187 2242 2215 +f 2215 2147 2187 +f 2211 2260 2242 +f 2242 2187 2211 +f 2221 2286 2260 +f 2260 2211 2221 +f 2224 2290 2286 +f 2286 2221 2224 +f 1943 1945 1875 +f 1875 1873 1943 +f 1971 1979 1945 +f 1945 1943 1971 +f 1993 2019 1979 +f 1979 1971 1993 +f 2025 2061 2019 +f 2019 1993 2025 +f 2045 2109 2061 +f 2061 2025 2045 +f 2085 2147 2109 +f 2109 2045 2085 +f 2113 2187 2147 +f 2147 2085 2113 +f 2126 2211 2187 +f 2187 2113 2126 +f 2140 2221 2211 +f 2211 2126 2140 +f 2144 2224 2221 +f 2221 2140 2144 +f 1935 1943 1873 +f 1873 1871 1935 +f 1955 1971 1943 +f 1943 1935 1955 +f 1975 1993 1971 +f 1971 1955 1975 +f 1997 2025 1993 +f 1993 1975 1997 +f 2020 2045 2025 +f 2025 1997 2020 +f 2038 2085 2045 +f 2045 2020 2038 +f 2054 2113 2085 +f 2085 2038 2054 +f 2074 2126 2113 +f 2113 2054 2074 +f 2078 2140 2126 +f 2126 2074 2078 +f 2086 2144 2140 +f 2140 2078 2086 +f 1933 1935 1871 +f 1871 1869 1933 +f 1951 1955 1935 +f 1935 1933 1951 +f 1973 1975 1955 +f 1955 1951 1973 +f 1990 1997 1975 +f 1975 1973 1990 +f 2012 2020 1997 +f 1997 1990 2012 +f 2028 2038 2020 +f 2020 2012 2028 +f 2040 2054 2038 +f 2038 2028 2040 +f 2050 2074 2054 +f 2054 2040 2050 +f 2062 2078 2074 +f 2074 2050 2062 +f 2070 2086 2078 +f 2078 2062 2070 +f 1939 1933 1869 +f 1869 1866 1939 +f 1965 1951 1933 +f 1933 1939 1965 +f 1985 1973 1951 +f 1951 1965 1985 +f 2008 1990 1973 +f 1973 1985 2008 +f 2032 2012 1990 +f 1990 2008 2032 +f 2056 2028 2012 +f 2012 2032 2056 +f 2080 2040 2028 +f 2028 2056 2080 +f 2100 2050 2040 +f 2040 2080 2100 +f 2114 2062 2050 +f 2050 2100 2114 +f 2122 2070 2062 +f 2062 2114 2122 +f 2232 2116 2124 +f 2124 2236 2232 +f 2218 2102 2116 +f 2116 2232 2218 +f 2199 2082 2102 +f 2102 2218 2199 +f 2150 2058 2082 +f 2082 2199 2150 +f 2120 2034 2058 +f 2058 2150 2120 +f 2064 2010 2034 +f 2034 2120 2064 +f 2023 1986 2010 +f 2010 2064 2023 +f 1980 1966 1986 +f 1986 2023 1980 +f 1946 1940 1966 +f 1966 1980 1946 +f 1862 1730 1940 +f 1940 1946 1862 +f 2332 2232 2236 +f 2236 2336 2332 +f 2322 2218 2232 +f 2232 2332 2322 +f 2306 2199 2218 +f 2218 2322 2306 +f 2275 2150 2199 +f 2199 2306 2275 +f 2234 2120 2150 +f 2150 2275 2234 +f 2170 2064 2120 +f 2120 2234 2170 +f 2093 2023 2064 +f 2064 2170 2093 +f 2016 1980 2023 +f 2023 2093 2016 +f 1968 1946 1980 +f 1980 2016 1968 +f 1858 1862 1946 +f 1946 1968 1858 +f 2409 2332 2336 +f 2336 2413 2409 +f 2400 2322 2332 +f 2332 2409 2400 +f 2376 2306 2322 +f 2322 2400 2376 +f 2349 2275 2306 +f 2306 2376 2349 +f 2324 2234 2275 +f 2275 2349 2324 +f 2271 2170 2234 +f 2234 2324 2271 +f 2185 2093 2170 +f 2170 2271 2185 +f 2072 2016 2093 +f 2093 2185 2072 +f 1976 1968 2016 +f 2016 2072 1976 +f 1729 1858 1968 +f 1968 1976 1729 +f 2488 2409 2413 +f 2413 2498 2488 +f 2470 2400 2409 +f 2409 2488 2470 +f 2444 2376 2400 +f 2400 2470 2444 +f 2418 2349 2376 +f 2376 2444 2418 +f 2384 2324 2349 +f 2349 2418 2384 +f 2338 2271 2324 +f 2324 2384 2338 +f 2269 2185 2271 +f 2271 2338 2269 +f 2138 2072 2185 +f 2185 2269 2138 +f 1998 1976 2072 +f 2072 2138 1998 +f 1722 1729 1976 +f 1976 1998 1722 +f 2559 2488 2498 +f 2498 2569 2559 +f 2549 2470 2488 +f 2488 2559 2549 +f 2531 2444 2470 +f 2470 2549 2531 +f 2492 2418 2444 +f 2444 2531 2492 +f 2436 2384 2418 +f 2418 2492 2436 +f 2394 2338 2384 +f 2384 2436 2394 +f 2326 2269 2338 +f 2338 2394 2326 +f 2212 2138 2269 +f 2269 2326 2212 +f 2026 1998 2138 +f 2138 2212 2026 +f 1850 1722 1998 +f 1998 2026 1850 +f 2653 2559 2569 +f 2569 2655 2653 +f 2631 2549 2559 +f 2559 2653 2631 +f 2593 2531 2549 +f 2549 2631 2593 +f 2551 2492 2531 +f 2531 2593 2551 +f 2510 2436 2492 +f 2492 2551 2510 +f 2432 2394 2436 +f 2436 2510 2432 +f 2366 2326 2394 +f 2394 2432 2366 +f 2263 2212 2326 +f 2326 2366 2263 +f 2052 2026 2212 +f 2212 2263 2052 +f 1726 1850 2026 +f 2026 2052 1726 +f 2720 2653 2655 +f 2655 2726 2720 +f 2697 2631 2653 +f 2653 2720 2697 +f 2662 2593 2631 +f 2631 2697 2662 +f 2607 2551 2593 +f 2593 2662 2607 +f 2547 2510 2551 +f 2551 2607 2547 +f 2484 2432 2510 +f 2510 2547 2484 +f 2405 2366 2432 +f 2432 2484 2405 +f 2308 2263 2366 +f 2366 2405 2308 +f 2090 2052 2263 +f 2263 2308 2090 +f 1719 1726 2052 +f 2052 2090 1719 +f 2787 2720 2726 +f 2726 2795 2787 +f 2759 2697 2720 +f 2720 2787 2759 +f 2713 2662 2697 +f 2697 2759 2713 +f 2657 2607 2662 +f 2662 2713 2657 +f 2589 2547 2607 +f 2607 2657 2589 +f 2525 2484 2547 +f 2547 2589 2525 +f 2422 2405 2484 +f 2484 2525 2422 +f 2330 2308 2405 +f 2405 2422 2330 +f 2118 2090 2308 +f 2308 2330 2118 +f 1700 1719 2090 +f 2090 2118 1700 +f 2834 2787 2795 +f 2795 2844 2834 +f 2798 2759 2787 +f 2787 2834 2798 +f 2750 2713 2759 +f 2759 2798 2750 +f 2690 2657 2713 +f 2713 2750 2690 +f 2624 2589 2657 +f 2657 2690 2624 +f 2536 2525 2589 +f 2589 2624 2536 +f 2441 2422 2525 +f 2525 2536 2441 +f 2340 2330 2422 +f 2422 2441 2340 +f 2128 2118 2330 +f 2330 2340 2128 +f 1825 1700 2118 +f 2118 2128 1825 +f 2847 2834 2844 +f 2844 2857 2847 +f 2821 2798 2834 +f 2834 2847 2821 +f 2765 2750 2798 +f 2798 2821 2765 +f 2703 2690 2750 +f 2750 2765 2703 +f 2637 2624 2690 +f 2690 2703 2637 +f 2543 2536 2624 +f 2624 2637 2543 +f 2446 2441 2536 +f 2536 2543 2446 +f 2344 2340 2441 +f 2441 2446 2344 +f 2136 2128 2340 +f 2340 2344 2136 +f 1713 1825 2128 +f 2128 2136 1713 +f 1676 1682 1864 +f 1864 1862 1676 +f 1642 1656 1682 +f 1682 1676 1642 +f 1601 1636 1656 +f 1656 1642 1601 +f 1558 1612 1636 +f 1636 1601 1558 +f 1502 1588 1612 +f 1612 1558 1502 +f 1472 1564 1588 +f 1588 1502 1472 +f 1425 1540 1564 +f 1564 1472 1425 +f 1404 1520 1540 +f 1540 1425 1404 +f 1390 1506 1520 +f 1520 1404 1390 +f 1387 1498 1506 +f 1506 1390 1387 +f 1654 1676 1862 +f 1862 1859 1654 +f 1606 1642 1676 +f 1676 1654 1606 +f 1531 1601 1642 +f 1642 1606 1531 +f 1452 1558 1601 +f 1601 1531 1452 +f 1388 1502 1558 +f 1558 1452 1388 +f 1347 1472 1502 +f 1502 1388 1347 +f 1316 1425 1472 +f 1472 1347 1316 +f 1300 1404 1425 +f 1425 1316 1300 +f 1290 1390 1404 +f 1404 1300 1290 +f 1286 1387 1390 +f 1390 1290 1286 +f 1646 1654 1859 +f 1859 1856 1646 +f 1550 1606 1654 +f 1654 1646 1550 +f 1439 1531 1606 +f 1606 1550 1439 +f 1351 1452 1531 +f 1531 1439 1351 +f 1298 1388 1452 +f 1452 1351 1298 +f 1275 1347 1388 +f 1388 1298 1275 +f 1246 1316 1347 +f 1347 1275 1246 +f 1222 1300 1316 +f 1316 1246 1222 +f 1215 1290 1300 +f 1300 1222 1215 +f 1211 1286 1290 +f 1290 1215 1211 +f 1624 1646 1856 +f 1856 1854 1624 +f 1484 1550 1646 +f 1646 1624 1484 +f 1353 1439 1550 +f 1550 1484 1353 +f 1284 1351 1439 +f 1439 1353 1284 +f 1238 1298 1351 +f 1351 1284 1238 +f 1204 1275 1298 +f 1298 1238 1204 +f 1178 1246 1275 +f 1275 1204 1178 +f 1152 1222 1246 +f 1246 1178 1152 +f 1134 1215 1222 +f 1222 1152 1134 +f 1124 1211 1215 +f 1215 1134 1124 +f 1596 1624 1854 +f 1854 1851 1596 +f 1410 1484 1624 +f 1624 1596 1410 +f 1296 1353 1484 +f 1484 1410 1296 +f 1228 1284 1353 +f 1353 1296 1228 +f 1186 1238 1284 +f 1284 1228 1186 +f 1130 1204 1238 +f 1238 1186 1130 +f 1091 1178 1204 +f 1204 1130 1091 +f 1073 1152 1178 +f 1178 1091 1073 +f 1063 1134 1152 +f 1152 1073 1063 +f 1053 1124 1134 +f 1134 1063 1053 +f 1570 1596 1851 +f 1851 1848 1570 +f 1359 1410 1596 +f 1596 1570 1359 +f 1256 1296 1410 +f 1410 1359 1256 +f 1190 1228 1296 +f 1296 1256 1190 +f 1112 1186 1228 +f 1228 1190 1112 +f 1071 1130 1186 +f 1186 1112 1071 +f 1029 1091 1130 +f 1130 1071 1029 +f 991 1073 1091 +f 1091 1029 991 +f 969 1063 1073 +f 1073 991 969 +f 967 1053 1063 +f 1063 969 967 +f 1532 1570 1848 +f 1848 1846 1532 +f 1314 1359 1570 +f 1570 1532 1314 +f 1219 1256 1359 +f 1359 1314 1219 +f 1138 1190 1256 +f 1256 1219 1138 +f 1075 1112 1190 +f 1190 1138 1075 +f 1015 1071 1112 +f 1112 1075 1015 +f 962 1029 1071 +f 1071 1015 962 +f 925 991 1029 +f 1029 962 925 +f 904 969 991 +f 991 925 904 +f 898 967 969 +f 969 904 898 +f 1504 1532 1846 +f 1846 1832 1504 +f 1292 1314 1532 +f 1532 1504 1292 +f 1200 1219 1314 +f 1314 1292 1200 +f 1097 1138 1219 +f 1219 1200 1097 +f 1033 1075 1138 +f 1138 1097 1033 +f 965 1015 1075 +f 1075 1033 965 +f 909 962 1015 +f 1015 965 909 +f 863 925 962 +f 962 909 863 +f 835 904 925 +f 925 863 835 +f 827 898 904 +f 904 835 827 +f 1494 1504 1832 +f 1832 1824 1494 +f 1282 1292 1504 +f 1504 1494 1282 +f 1183 1200 1292 +f 1292 1282 1183 +f 1088 1097 1200 +f 1200 1183 1088 +f 1000 1033 1097 +f 1097 1088 1000 +f 934 965 1033 +f 1033 1000 934 +f 874 909 965 +f 965 934 874 +f 826 863 909 +f 909 874 826 +f 790 835 863 +f 863 826 790 +f 780 827 835 +f 835 790 780 +f 1486 1494 1824 +f 1824 1814 1486 +f 1278 1282 1494 +f 1494 1486 1278 +f 1176 1183 1282 +f 1282 1278 1176 +f 1079 1088 1183 +f 1183 1176 1079 +f 985 1000 1088 +f 1088 1079 985 +f 919 934 1000 +f 1000 985 919 +f 857 874 934 +f 934 919 857 +f 801 826 874 +f 874 857 801 +f 775 790 826 +f 826 801 775 +f 765 780 790 +f 790 775 765 +f 1391 1507 1499 +f 1499 1387 1391 +f 1405 1521 1507 +f 1507 1391 1405 +f 1424 1541 1521 +f 1521 1405 1424 +f 1473 1565 1541 +f 1541 1424 1473 +f 1503 1589 1565 +f 1565 1473 1503 +f 1559 1613 1589 +f 1589 1503 1559 +f 1600 1637 1613 +f 1613 1559 1600 +f 1643 1657 1637 +f 1637 1600 1643 +f 1677 1683 1657 +f 1657 1643 1677 +f 1863 1892 1683 +f 1683 1677 1863 +f 1291 1391 1387 +f 1387 1287 1291 +f 1301 1405 1391 +f 1391 1291 1301 +f 1317 1424 1405 +f 1405 1301 1317 +f 1348 1473 1424 +f 1424 1317 1348 +f 1389 1503 1473 +f 1473 1348 1389 +f 1453 1559 1503 +f 1503 1389 1453 +f 1530 1600 1559 +f 1559 1453 1530 +f 1607 1643 1600 +f 1600 1530 1607 +f 1655 1677 1643 +f 1643 1607 1655 +f 1861 1863 1677 +f 1677 1655 1861 +f 1214 1291 1287 +f 1287 1210 1214 +f 1223 1301 1291 +f 1291 1214 1223 +f 1247 1317 1301 +f 1301 1223 1247 +f 1274 1348 1317 +f 1317 1247 1274 +f 1299 1389 1348 +f 1348 1274 1299 +f 1352 1453 1389 +f 1389 1299 1352 +f 1438 1530 1453 +f 1453 1352 1438 +f 1551 1607 1530 +f 1530 1438 1551 +f 1647 1655 1607 +f 1607 1551 1647 +f 1891 1861 1655 +f 1655 1647 1891 +f 1135 1214 1210 +f 1210 1125 1135 +f 1153 1223 1214 +f 1214 1135 1153 +f 1179 1247 1223 +f 1223 1153 1179 +f 1205 1274 1247 +f 1247 1179 1205 +f 1239 1299 1274 +f 1274 1205 1239 +f 1285 1352 1299 +f 1299 1239 1285 +f 1354 1438 1352 +f 1352 1285 1354 +f 1485 1551 1438 +f 1438 1354 1485 +f 1625 1647 1551 +f 1551 1485 1625 +f 1901 1891 1647 +f 1647 1625 1901 +f 1064 1135 1125 +f 1125 1054 1064 +f 1074 1153 1135 +f 1135 1064 1074 +f 1092 1179 1153 +f 1153 1074 1092 +f 1131 1205 1179 +f 1179 1092 1131 +f 1187 1239 1205 +f 1205 1131 1187 +f 1229 1285 1239 +f 1239 1187 1229 +f 1297 1354 1285 +f 1285 1229 1297 +f 1411 1485 1354 +f 1354 1297 1411 +f 1597 1625 1485 +f 1485 1411 1597 +f 1853 1901 1625 +f 1625 1597 1853 +f 970 1064 1054 +f 1054 968 970 +f 992 1074 1064 +f 1064 970 992 +f 1030 1092 1074 +f 1074 992 1030 +f 1072 1131 1092 +f 1092 1030 1072 +f 1113 1187 1131 +f 1131 1072 1113 +f 1191 1229 1187 +f 1187 1113 1191 +f 1257 1297 1229 +f 1229 1191 1257 +f 1360 1411 1297 +f 1297 1257 1360 +f 1571 1597 1411 +f 1411 1360 1571 +f 1899 1853 1597 +f 1597 1571 1899 +f 903 970 968 +f 968 897 903 +f 926 992 970 +f 970 903 926 +f 961 1030 992 +f 992 926 961 +f 1016 1072 1030 +f 1030 961 1016 +f 1076 1113 1072 +f 1072 1016 1076 +f 1139 1191 1113 +f 1113 1076 1139 +f 1218 1257 1191 +f 1191 1139 1218 +f 1315 1360 1257 +f 1257 1218 1315 +f 1533 1571 1360 +f 1360 1315 1533 +f 1920 1899 1571 +f 1571 1533 1920 +f 836 903 897 +f 897 828 836 +f 864 926 903 +f 903 836 864 +f 910 961 926 +f 926 864 910 +f 966 1016 961 +f 961 910 966 +f 1034 1076 1016 +f 1016 966 1034 +f 1098 1139 1076 +f 1076 1034 1098 +f 1201 1218 1139 +f 1139 1098 1201 +f 1293 1315 1218 +f 1218 1201 1293 +f 1505 1533 1315 +f 1315 1293 1505 +f 1924 1920 1533 +f 1533 1505 1924 +f 789 836 828 +f 828 779 789 +f 825 864 836 +f 836 789 825 +f 873 910 864 +f 864 825 873 +f 933 966 910 +f 910 873 933 +f 999 1034 966 +f 966 933 999 +f 1087 1098 1034 +f 1034 999 1087 +f 1182 1201 1098 +f 1098 1087 1182 +f 1283 1293 1201 +f 1201 1182 1283 +f 1495 1505 1293 +f 1293 1283 1495 +f 1826 1924 1505 +f 1505 1495 1826 +f 776 789 779 +f 779 766 776 +f 802 825 789 +f 789 776 802 +f 858 873 825 +f 825 802 858 +f 920 933 873 +f 873 858 920 +f 986 999 933 +f 933 920 986 +f 1080 1087 999 +f 999 986 1080 +f 1177 1182 1087 +f 1087 1080 1177 +f 1279 1283 1182 +f 1182 1177 1279 +f 1487 1495 1283 +f 1283 1279 1487 +f 1914 1826 1495 +f 1495 1487 1914 +f 1947 1941 1867 +f 1867 1863 1947 +f 1981 1967 1941 +f 1941 1947 1981 +f 2022 1987 1967 +f 1967 1981 2022 +f 2065 2011 1987 +f 1987 2022 2065 +f 2121 2035 2011 +f 2011 2065 2121 +f 2151 2059 2035 +f 2035 2121 2151 +f 2198 2083 2059 +f 2059 2151 2198 +f 2219 2103 2083 +f 2083 2198 2219 +f 2233 2117 2103 +f 2103 2219 2233 +f 2236 2125 2117 +f 2117 2233 2236 +f 1969 1947 1863 +f 1863 1860 1969 +f 2017 1981 1947 +f 1947 1969 2017 +f 2092 2022 1981 +f 1981 2017 2092 +f 2171 2065 2022 +f 2022 2092 2171 +f 2235 2121 2065 +f 2065 2171 2235 +f 2276 2151 2121 +f 2121 2235 2276 +f 2307 2198 2151 +f 2151 2276 2307 +f 2323 2219 2198 +f 2198 2307 2323 +f 2333 2233 2219 +f 2219 2323 2333 +f 2337 2236 2233 +f 2233 2333 2337 +f 1977 1969 1860 +f 1860 1857 1977 +f 2073 2017 1969 +f 1969 1977 2073 +f 2184 2092 2017 +f 2017 2073 2184 +f 2272 2171 2092 +f 2092 2184 2272 +f 2325 2235 2171 +f 2171 2272 2325 +f 2348 2276 2235 +f 2235 2325 2348 +f 2377 2307 2276 +f 2276 2348 2377 +f 2401 2323 2307 +f 2307 2377 2401 +f 2408 2333 2323 +f 2323 2401 2408 +f 2412 2337 2333 +f 2333 2408 2412 +f 1999 1977 1857 +f 1857 1855 1999 +f 2139 2073 1977 +f 1977 1999 2139 +f 2270 2184 2073 +f 2073 2139 2270 +f 2339 2272 2184 +f 2184 2270 2339 +f 2385 2325 2272 +f 2272 2339 2385 +f 2419 2348 2325 +f 2325 2385 2419 +f 2445 2377 2348 +f 2348 2419 2445 +f 2471 2401 2377 +f 2377 2445 2471 +f 2489 2408 2401 +f 2401 2471 2489 +f 2499 2412 2408 +f 2408 2489 2499 +f 2027 1999 1855 +f 1855 1852 2027 +f 2213 2139 1999 +f 1999 2027 2213 +f 2327 2270 2139 +f 2139 2213 2327 +f 2395 2339 2270 +f 2270 2327 2395 +f 2437 2385 2339 +f 2339 2395 2437 +f 2493 2419 2385 +f 2385 2437 2493 +f 2532 2445 2419 +f 2419 2493 2532 +f 2550 2471 2445 +f 2445 2532 2550 +f 2560 2489 2471 +f 2471 2550 2560 +f 2570 2499 2489 +f 2489 2560 2570 +f 2053 2027 1852 +f 1852 1849 2053 +f 2264 2213 2027 +f 2027 2053 2264 +f 2367 2327 2213 +f 2213 2264 2367 +f 2433 2395 2327 +f 2327 2367 2433 +f 2511 2437 2395 +f 2395 2433 2511 +f 2552 2493 2437 +f 2437 2511 2552 +f 2594 2532 2493 +f 2493 2552 2594 +f 2632 2550 2532 +f 2532 2594 2632 +f 2654 2560 2550 +f 2550 2632 2654 +f 2656 2570 2560 +f 2560 2654 2656 +f 2091 2053 1849 +f 1849 1847 2091 +f 2309 2264 2053 +f 2053 2091 2309 +f 2404 2367 2264 +f 2264 2309 2404 +f 2485 2433 2367 +f 2367 2404 2485 +f 2548 2511 2433 +f 2433 2485 2548 +f 2608 2552 2511 +f 2511 2548 2608 +f 2661 2594 2552 +f 2552 2608 2661 +f 2698 2632 2594 +f 2594 2661 2698 +f 2719 2654 2632 +f 2632 2698 2719 +f 2725 2656 2654 +f 2654 2719 2725 +f 2119 2091 1847 +f 1847 1833 2119 +f 2331 2309 2091 +f 2091 2119 2331 +f 2423 2404 2309 +f 2309 2331 2423 +f 2526 2485 2404 +f 2404 2423 2526 +f 2590 2548 2485 +f 2485 2526 2590 +f 2658 2608 2548 +f 2548 2590 2658 +f 2714 2661 2608 +f 2608 2658 2714 +f 2760 2698 2661 +f 2661 2714 2760 +f 2788 2719 2698 +f 2698 2760 2788 +f 2796 2725 2719 +f 2719 2788 2796 +f 2129 2119 1833 +f 1833 1827 2129 +f 2341 2331 2119 +f 2119 2129 2341 +f 2440 2423 2331 +f 2331 2341 2440 +f 2535 2526 2423 +f 2423 2440 2535 +f 2623 2590 2526 +f 2526 2535 2623 +f 2689 2658 2590 +f 2590 2623 2689 +f 2749 2714 2658 +f 2658 2689 2749 +f 2797 2760 2714 +f 2714 2749 2797 +f 2833 2788 2760 +f 2760 2797 2833 +f 2843 2796 2788 +f 2788 2833 2843 +f 2137 2129 1827 +f 1827 1815 2137 +f 2345 2341 2129 +f 2129 2137 2345 +f 2447 2440 2341 +f 2341 2345 2447 +f 2544 2535 2440 +f 2440 2447 2544 +f 2638 2623 2535 +f 2535 2544 2638 +f 2704 2689 2623 +f 2623 2638 2704 +f 2766 2749 2689 +f 2689 2704 2766 +f 2822 2797 2749 +f 2749 2766 2822 +f 2848 2833 2797 +f 2797 2822 2848 +f 2858 2843 2833 +f 2833 2848 2858 +f 1735 2334 2329 +f 1735 2329 2321 +f 1735 2321 2305 +f 1735 2305 2274 +f 1735 2274 2231 +f 1735 2231 2167 +f 1735 2167 2089 +f 1735 2089 2014 +f 1735 2014 1962 +f 1735 1962 1733 +f 2515 2329 2334 +f 2334 2524 2515 +f 2495 2321 2329 +f 2329 2515 2495 +f 2456 2305 2321 +f 2321 2495 2456 +f 2429 2274 2305 +f 2305 2456 2429 +f 2399 2231 2274 +f 2274 2429 2399 +f 2347 2167 2231 +f 2231 2399 2347 +f 2292 2089 2167 +f 2167 2347 2292 +f 2148 2014 2089 +f 2089 2292 2148 +f 2004 1962 2014 +f 2014 2148 2004 +f 1739 1733 1962 +f 1962 2004 1739 +f 2647 2515 2524 +f 2524 2649 2647 +f 2621 2495 2515 +f 2515 2647 2621 +f 2584 2456 2495 +f 2495 2621 2584 +f 2541 2429 2456 +f 2456 2584 2541 +f 2502 2399 2429 +f 2429 2541 2502 +f 2426 2347 2399 +f 2399 2502 2426 +f 2352 2292 2347 +f 2347 2426 2352 +f 2255 2148 2292 +f 2292 2352 2255 +f 2046 2004 2148 +f 2148 2255 2046 +f 1702 1739 2004 +f 2004 2046 1702 +f 2746 2647 2649 +f 2649 2757 2746 +f 2721 2621 2647 +f 2647 2746 2721 +f 2681 2584 2621 +f 2621 2721 2681 +f 2639 2541 2584 +f 2584 2681 2639 +f 2557 2502 2541 +f 2541 2639 2557 +f 2505 2426 2502 +f 2502 2557 2505 +f 2415 2352 2426 +f 2426 2505 2415 +f 2318 2255 2352 +f 2352 2415 2318 +f 2098 2046 2255 +f 2255 2318 2098 +f 1745 1702 2046 +f 2046 2098 1745 +f 2840 2746 2757 +f 2757 2849 2840 +f 2808 2721 2746 +f 2746 2840 2808 +f 2756 2681 2721 +f 2721 2808 2756 +f 2696 2639 2681 +f 2681 2756 2696 +f 2626 2557 2639 +f 2639 2696 2626 +f 2538 2505 2557 +f 2557 2626 2538 +f 2443 2415 2505 +f 2505 2538 2443 +f 2342 2318 2415 +f 2415 2443 2342 +f 2131 2098 2318 +f 2318 2342 2131 +f 1904 1745 2098 +f 2098 2131 1904 +f 2906 2840 2849 +f 2849 2925 2906 +f 2867 2808 2840 +f 2840 2906 2867 +f 2818 2756 2808 +f 2808 2867 2818 +f 2736 2696 2756 +f 2756 2818 2736 +f 2667 2626 2696 +f 2696 2736 2667 +f 2565 2538 2626 +f 2626 2667 2565 +f 2475 2443 2538 +f 2538 2565 2475 +f 2356 2342 2443 +f 2443 2475 2356 +f 2156 2131 2342 +f 2342 2356 2156 +f 1704 1904 2131 +f 2131 2156 1704 +f 2976 2906 2925 +f 2925 2987 2976 +f 2914 2867 2906 +f 2906 2976 2914 +f 2852 2818 2867 +f 2867 2914 2852 +f 2772 2736 2818 +f 2818 2852 2772 +f 2688 2667 2736 +f 2736 2772 2688 +f 2592 2565 2667 +f 2667 2688 2592 +f 2497 2475 2565 +f 2565 2592 2497 +f 2372 2356 2475 +f 2475 2497 2372 +f 2176 2156 2356 +f 2356 2372 2176 +f 1752 1704 2156 +f 2156 2176 1752 +f 2993 2976 2987 +f 2987 3011 2993 +f 2952 2914 2976 +f 2976 2993 2952 +f 2874 2852 2914 +f 2914 2952 2874 +f 2794 2772 2852 +f 2852 2874 2794 +f 2702 2688 2772 +f 2772 2794 2702 +f 2604 2592 2688 +f 2688 2702 2604 +f 2509 2497 2592 +f 2592 2604 2509 +f 2380 2372 2497 +f 2497 2509 2380 +f 2182 2176 2372 +f 2372 2380 2182 +f 1723 1752 2176 +f 2176 2182 1723 +f 3000 2993 3011 +f 3011 3020 3000 +f 2967 2952 2993 +f 2993 3000 2967 +f 2879 2874 2952 +f 2952 2967 2879 +f 2799 2794 2874 +f 2874 2879 2799 +f 2707 2702 2794 +f 2794 2799 2707 +f 2605 2604 2702 +f 2702 2707 2605 +f 2512 2509 2604 +f 2604 2605 2512 +f 2382 2380 2509 +f 2509 2512 2382 +f 2188 2182 2380 +f 2380 2382 2188 +f 1699 1723 2182 +f 2182 2188 1699 +f 3006 3000 3020 +f 3020 3022 3006 +f 2972 2967 3000 +f 3000 3006 2972 +f 2888 2879 2967 +f 2967 2972 2888 +f 2804 2799 2879 +f 2879 2888 2804 +f 2710 2707 2799 +f 2799 2804 2710 +f 2613 2605 2707 +f 2707 2710 2613 +f 2520 2512 2605 +f 2605 2613 2520 +f 2388 2382 2512 +f 2512 2520 2388 +f 2192 2188 2382 +f 2382 2388 2192 +f 1760 1699 2188 +f 2188 2192 1760 +f 1735 1737 1660 +f 1735 1660 1608 +f 1735 1608 1535 +f 1735 1535 1457 +f 1735 1457 1393 +f 1735 1393 1350 +f 1735 1350 1319 +f 1735 1319 1303 +f 1735 1303 1295 +f 1735 1295 1288 +f 1618 1660 1737 +f 1737 1739 1618 +f 1474 1608 1660 +f 1660 1618 1474 +f 1332 1535 1608 +f 1608 1474 1332 +f 1277 1457 1535 +f 1535 1332 1277 +f 1225 1393 1457 +f 1457 1277 1225 +f 1195 1350 1393 +f 1393 1225 1195 +f 1166 1319 1350 +f 1350 1195 1166 +f 1129 1303 1319 +f 1319 1166 1129 +f 1109 1295 1303 +f 1303 1129 1109 +f 1099 1288 1295 +f 1295 1109 1099 +f 1576 1618 1739 +f 1739 1741 1576 +f 1367 1474 1618 +f 1618 1576 1367 +f 1270 1332 1474 +f 1474 1367 1270 +f 1196 1277 1332 +f 1332 1270 1196 +f 1120 1225 1277 +f 1277 1196 1120 +f 1081 1195 1225 +f 1225 1120 1081 +f 1040 1166 1195 +f 1195 1081 1040 +f 1001 1129 1166 +f 1166 1040 1001 +f 975 1109 1129 +f 1129 1001 975 +f 973 1099 1109 +f 1109 975 973 +f 1524 1576 1741 +f 1741 1744 1524 +f 1304 1367 1576 +f 1576 1524 1304 +f 1209 1270 1367 +f 1367 1304 1209 +f 1119 1196 1270 +f 1270 1209 1119 +f 1065 1120 1196 +f 1196 1119 1065 +f 983 1081 1120 +f 1120 1065 983 +f 941 1040 1081 +f 1081 983 941 +f 901 1001 1040 +f 1040 941 901 +f 878 975 1001 +f 1001 901 878 +f 865 973 975 +f 975 878 865 +f 1493 1524 1744 +f 1744 1747 1493 +f 1280 1304 1524 +f 1524 1493 1280 +f 1181 1209 1304 +f 1304 1280 1181 +f 1086 1119 1209 +f 1209 1181 1086 +f 998 1065 1119 +f 1119 1086 998 +f 928 983 1065 +f 1065 998 928 +f 868 941 983 +f 983 928 868 +f 816 901 941 +f 941 868 816 +f 784 878 901 +f 901 816 784 +f 773 865 878 +f 878 784 773 +f 1466 1493 1747 +f 1747 1749 1466 +f 1266 1280 1493 +f 1493 1466 1266 +f 1149 1181 1280 +f 1280 1266 1149 +f 1057 1086 1181 +f 1181 1149 1057 +f 955 998 1086 +f 1086 1057 955 +f 888 928 998 +f 998 955 888 +f 806 868 928 +f 928 888 806 +f 755 816 868 +f 868 806 755 +f 718 784 816 +f 816 755 718 +f 697 773 784 +f 784 718 697 +f 1446 1466 1749 +f 1749 1753 1446 +f 1250 1266 1466 +f 1466 1446 1250 +f 1127 1149 1266 +f 1266 1250 1127 +f 1032 1057 1149 +f 1149 1127 1032 +f 936 955 1057 +f 1057 1032 936 +f 852 888 955 +f 955 936 852 +f 772 806 888 +f 888 852 772 +f 710 755 806 +f 806 772 710 +f 648 718 755 +f 755 710 648 +f 637 697 718 +f 718 648 637 +f 1440 1446 1753 +f 1753 1755 1440 +f 1242 1250 1446 +f 1446 1440 1242 +f 1115 1127 1250 +f 1250 1242 1115 +f 1020 1032 1127 +f 1127 1115 1020 +f 922 936 1032 +f 1032 1020 922 +f 830 852 936 +f 936 922 830 +f 750 772 852 +f 852 830 750 +f 672 710 772 +f 772 750 672 +f 631 648 710 +f 710 672 631 +f 613 637 648 +f 648 631 613 +f 1434 1440 1755 +f 1755 1757 1434 +f 1240 1242 1440 +f 1440 1434 1240 +f 1110 1115 1242 +f 1242 1240 1110 +f 1017 1020 1115 +f 1115 1110 1017 +f 915 922 1020 +f 1020 1017 915 +f 823 830 922 +f 922 915 823 +f 743 750 830 +f 830 823 743 +f 655 672 750 +f 750 743 655 +f 622 631 672 +f 672 655 622 +f 602 613 631 +f 631 622 602 +f 1428 1434 1757 +f 1757 1760 1428 +f 1232 1240 1434 +f 1434 1428 1232 +f 1105 1110 1240 +f 1240 1232 1105 +f 1010 1017 1110 +f 1110 1105 1010 +f 913 915 1017 +f 1017 1010 913 +f 821 823 915 +f 915 913 821 +f 736 743 823 +f 823 821 736 +f 652 655 743 +f 743 736 652 +f 619 622 655 +f 655 652 619 +f 601 602 622 +f 622 619 601 +f 1735 1289 1294 +f 1735 1294 1302 +f 1735 1302 1318 +f 1735 1318 1349 +f 1735 1349 1392 +f 1735 1392 1456 +f 1735 1456 1534 +f 1735 1534 1609 +f 1735 1609 1661 +f 1735 1661 1889 +f 1108 1294 1289 +f 1289 1099 1108 +f 1128 1302 1294 +f 1294 1108 1128 +f 1167 1318 1302 +f 1302 1128 1167 +f 1194 1349 1318 +f 1318 1167 1194 +f 1224 1392 1349 +f 1349 1194 1224 +f 1276 1456 1392 +f 1392 1224 1276 +f 1331 1534 1456 +f 1456 1276 1331 +f 1475 1609 1534 +f 1534 1331 1475 +f 1619 1661 1609 +f 1609 1475 1619 +f 1738 1889 1661 +f 1661 1619 1738 +f 976 1108 1099 +f 1099 974 976 +f 1002 1128 1108 +f 1108 976 1002 +f 1039 1167 1128 +f 1128 1002 1039 +f 1082 1194 1167 +f 1167 1039 1082 +f 1121 1224 1194 +f 1194 1082 1121 +f 1197 1276 1224 +f 1224 1121 1197 +f 1271 1331 1276 +f 1276 1197 1271 +f 1368 1475 1331 +f 1331 1271 1368 +f 1577 1619 1475 +f 1475 1368 1577 +f 1903 1738 1619 +f 1619 1577 1903 +f 877 976 974 +f 974 866 877 +f 902 1002 976 +f 976 877 902 +f 942 1039 1002 +f 1002 902 942 +f 984 1082 1039 +f 1039 942 984 +f 1066 1121 1082 +f 1082 984 1066 +f 1118 1197 1121 +f 1121 1066 1118 +f 1208 1271 1197 +f 1197 1118 1208 +f 1305 1368 1271 +f 1271 1208 1305 +f 1525 1577 1368 +f 1368 1305 1525 +f 1742 1903 1577 +f 1577 1525 1742 +f 783 877 866 +f 866 774 783 +f 815 902 877 +f 877 783 815 +f 867 942 902 +f 902 815 867 +f 927 984 942 +f 942 867 927 +f 997 1066 984 +f 984 927 997 +f 1085 1118 1066 +f 1066 997 1085 +f 1180 1208 1118 +f 1118 1085 1180 +f 1281 1305 1208 +f 1208 1180 1281 +f 1492 1525 1305 +f 1305 1281 1492 +f 1703 1742 1525 +f 1525 1492 1703 +f 717 783 774 +f 774 698 717 +f 756 815 783 +f 783 717 756 +f 805 867 815 +f 815 756 805 +f 887 927 867 +f 867 805 887 +f 956 997 927 +f 927 887 956 +f 1058 1085 997 +f 997 956 1058 +f 1148 1180 1085 +f 1085 1058 1148 +f 1267 1281 1180 +f 1180 1148 1267 +f 1467 1492 1281 +f 1281 1267 1467 +f 1905 1703 1492 +f 1492 1467 1905 +f 647 717 698 +f 698 636 647 +f 709 756 717 +f 717 647 709 +f 771 805 756 +f 756 709 771 +f 851 887 805 +f 805 771 851 +f 935 956 887 +f 887 851 935 +f 1031 1058 956 +f 956 935 1031 +f 1126 1148 1058 +f 1058 1031 1126 +f 1251 1267 1148 +f 1148 1126 1251 +f 1447 1467 1267 +f 1267 1251 1447 +f 1751 1905 1467 +f 1467 1447 1751 +f 630 647 636 +f 636 612 630 +f 671 709 647 +f 647 630 671 +f 749 771 709 +f 709 671 749 +f 829 851 771 +f 771 749 829 +f 921 935 851 +f 851 829 921 +f 1019 1031 935 +f 935 921 1019 +f 1114 1126 1031 +f 1031 1019 1114 +f 1243 1251 1126 +f 1126 1114 1243 +f 1441 1447 1251 +f 1251 1243 1441 +f 1896 1751 1447 +f 1447 1441 1896 +f 623 630 612 +f 612 603 623 +f 656 671 630 +f 630 623 656 +f 744 749 671 +f 671 656 744 +f 824 829 749 +f 749 744 824 +f 916 921 829 +f 829 824 916 +f 1018 1019 921 +f 921 916 1018 +f 1111 1114 1019 +f 1019 1018 1111 +f 1241 1243 1114 +f 1114 1111 1241 +f 1435 1441 1243 +f 1243 1241 1435 +f 1923 1896 1441 +f 1441 1435 1923 +f 617 623 603 +f 603 601 617 +f 650 656 623 +f 623 617 650 +f 734 744 656 +f 656 650 734 +f 818 824 744 +f 744 734 818 +f 912 916 824 +f 824 818 912 +f 1009 1018 916 +f 916 912 1009 +f 1102 1111 1018 +f 1018 1009 1102 +f 1235 1241 1111 +f 1111 1102 1235 +f 1431 1435 1241 +f 1241 1235 1431 +f 1759 1923 1435 +f 1435 1431 1759 +f 1735 1736 1963 +f 1735 1963 2015 +f 1735 2015 2088 +f 1735 2088 2166 +f 1735 2166 2230 +f 1735 2230 2273 +f 1735 2273 2304 +f 1735 2304 2320 +f 1735 2320 2328 +f 1735 2328 2335 +f 2005 1963 1736 +f 1736 1738 2005 +f 2149 2015 1963 +f 1963 2005 2149 +f 2291 2088 2015 +f 2015 2149 2291 +f 2346 2166 2088 +f 2088 2291 2346 +f 2398 2230 2166 +f 2166 2346 2398 +f 2428 2273 2230 +f 2230 2398 2428 +f 2457 2304 2273 +f 2273 2428 2457 +f 2494 2320 2304 +f 2304 2457 2494 +f 2514 2328 2320 +f 2320 2494 2514 +f 2524 2335 2328 +f 2328 2514 2524 +f 2047 2005 1738 +f 1738 1740 2047 +f 2256 2149 2005 +f 2005 2047 2256 +f 2353 2291 2149 +f 2149 2256 2353 +f 2427 2346 2291 +f 2291 2353 2427 +f 2503 2398 2346 +f 2346 2427 2503 +f 2542 2428 2398 +f 2398 2503 2542 +f 2583 2457 2428 +f 2428 2542 2583 +f 2622 2494 2457 +f 2457 2583 2622 +f 2648 2514 2494 +f 2494 2622 2648 +f 2650 2524 2514 +f 2514 2648 2650 +f 2099 2047 1740 +f 1740 1743 2099 +f 2319 2256 2047 +f 2047 2099 2319 +f 2414 2353 2256 +f 2256 2319 2414 +f 2504 2427 2353 +f 2353 2414 2504 +f 2558 2503 2427 +f 2427 2504 2558 +f 2640 2542 2503 +f 2503 2558 2640 +f 2682 2583 2542 +f 2542 2640 2682 +f 2722 2622 2583 +f 2583 2682 2722 +f 2745 2648 2622 +f 2622 2722 2745 +f 2758 2650 2648 +f 2648 2745 2758 +f 2130 2099 1743 +f 1743 1746 2130 +f 2343 2319 2099 +f 2099 2130 2343 +f 2442 2414 2319 +f 2319 2343 2442 +f 2537 2504 2414 +f 2414 2442 2537 +f 2625 2558 2504 +f 2504 2537 2625 +f 2695 2640 2558 +f 2558 2625 2695 +f 2755 2682 2640 +f 2640 2695 2755 +f 2807 2722 2682 +f 2682 2755 2807 +f 2839 2745 2722 +f 2722 2807 2839 +f 2850 2758 2745 +f 2745 2839 2850 +f 2157 2130 1746 +f 1746 1748 2157 +f 2357 2343 2130 +f 2130 2157 2357 +f 2474 2442 2343 +f 2343 2357 2474 +f 2566 2537 2442 +f 2442 2474 2566 +f 2668 2625 2537 +f 2537 2566 2668 +f 2735 2695 2625 +f 2625 2668 2735 +f 2817 2755 2695 +f 2695 2735 2817 +f 2868 2807 2755 +f 2755 2817 2868 +f 2905 2839 2807 +f 2807 2868 2905 +f 2926 2850 2839 +f 2839 2905 2926 +f 2177 2157 1748 +f 1748 1750 2177 +f 2373 2357 2157 +f 2157 2177 2373 +f 2496 2474 2357 +f 2357 2373 2496 +f 2591 2566 2474 +f 2474 2496 2591 +f 2687 2668 2566 +f 2566 2591 2687 +f 2771 2735 2668 +f 2668 2687 2771 +f 2851 2817 2735 +f 2735 2771 2851 +f 2913 2868 2817 +f 2817 2851 2913 +f 2975 2905 2868 +f 2868 2913 2975 +f 2986 2926 2905 +f 2905 2975 2986 +f 2183 2177 1750 +f 1750 1754 2183 +f 2381 2373 2177 +f 2177 2183 2381 +f 2508 2496 2373 +f 2373 2381 2508 +f 2603 2591 2496 +f 2496 2508 2603 +f 2701 2687 2591 +f 2591 2603 2701 +f 2793 2771 2687 +f 2687 2701 2793 +f 2873 2851 2771 +f 2771 2793 2873 +f 2951 2913 2851 +f 2851 2873 2951 +f 2992 2975 2913 +f 2913 2951 2992 +f 3010 2986 2975 +f 2975 2992 3010 +f 2189 2183 1754 +f 1754 1756 2189 +f 2383 2381 2183 +f 2183 2189 2383 +f 2513 2508 2381 +f 2381 2383 2513 +f 2606 2603 2508 +f 2508 2513 2606 +f 2708 2701 2603 +f 2603 2606 2708 +f 2800 2793 2701 +f 2701 2708 2800 +f 2880 2873 2793 +f 2793 2800 2880 +f 2968 2951 2873 +f 2873 2880 2968 +f 3001 2992 2951 +f 2951 2968 3001 +f 3021 3010 2992 +f 2992 3001 3021 +f 2195 2189 1756 +f 1756 1759 2195 +f 2390 2383 2189 +f 2189 2195 2390 +f 2517 2513 2383 +f 2383 2390 2517 +f 2612 2606 2513 +f 2513 2517 2612 +f 2709 2708 2606 +f 2606 2612 2709 +f 2801 2800 2708 +f 2708 2709 2801 +f 2886 2880 2800 +f 2800 2801 2886 +f 2970 2968 2880 +f 2880 2886 2970 +f 3004 3001 2968 +f 2968 2970 3004 +f 3022 3021 3001 +f 3001 3004 3022 diff --git a/content/handbook_2e/examples/17 Shapes/Ex_09/Ex_09.pde b/content/handbook_2e/examples/17 Shapes/Ex_09/Ex_09.pde new file mode 100644 index 000000000..1f2969446 --- /dev/null +++ b/content/handbook_2e/examples/17 Shapes/Ex_09/Ex_09.pde @@ -0,0 +1,21 @@ +PShape zig; + +void setup() { + size(100, 100); + zig = createShape(); + zig.beginShape(); + zig.fill(0); + zig.noStroke(); + zig.vertex(10, 0); + zig.vertex(100, 30); + zig.vertex(90, 70); + zig.vertex(100, 70); + zig.vertex(10, 90); + zig.vertex(50, 40); + zig.endShape(); +} + +void draw() { + background(204); + shape(zig, 0, 0); +} diff --git a/content/handbook_2e/examples/17 Shapes/Ex_10/Ex_10.pde b/content/handbook_2e/examples/17 Shapes/Ex_10/Ex_10.pde new file mode 100644 index 000000000..25da73ba6 --- /dev/null +++ b/content/handbook_2e/examples/17 Shapes/Ex_10/Ex_10.pde @@ -0,0 +1,24 @@ +PShape zig; + +void setup() { + size(100, 100); + zig = createShape(); + zig.beginShape(); + zig.fill(0); + zig.noStroke(); + zig.vertex(10, 0); + zig.vertex(100, 30); + zig.vertex(90, 70); + zig.vertex(100, 70); + zig.vertex(10, 90); + zig.vertex(50, 40); + zig.endShape(); + zig.scale(0.7); + zig.translate(-50, -50); +} + +void draw() { + background(204); + shape(zig, 50, 50); + zig.rotate(0.01); +} diff --git a/content/handbook_2e/examples/17 Shapes/Ex_11/Ex_11.pde b/content/handbook_2e/examples/17 Shapes/Ex_11/Ex_11.pde new file mode 100644 index 000000000..bd5f0cdf3 --- /dev/null +++ b/content/handbook_2e/examples/17 Shapes/Ex_11/Ex_11.pde @@ -0,0 +1,20 @@ +PShape petal; + +void setup() { + size(100, 100, P3D); + petal = createShape(); + petal.beginShape(); + petal.noStroke(); + petal.fill(0); + petal.vertex(90, 39); + petal.bezierVertex(90, 39, 54, 17, 26, 83); + petal.bezierVertex(26, 83, 90, 107, 90, 39); + petal.endShape(); + petal.translate(-50, -50); +} + +void draw() { + background(204); + shape(petal, 50, 50); + petal.rotateX(0.01); +} diff --git a/content/handbook_2e/examples/17 Shapes/Ex_12/Ex_12.pde b/content/handbook_2e/examples/17 Shapes/Ex_12/Ex_12.pde new file mode 100644 index 000000000..70accbdb0 --- /dev/null +++ b/content/handbook_2e/examples/17 Shapes/Ex_12/Ex_12.pde @@ -0,0 +1,25 @@ +PShape zig; + +void setup() { + size(100, 100); + zig = createShape(); + zig.beginShape(); + zig.fill(0); + zig.vertex(10, 0); + zig.vertex(100, 30); + zig.vertex(90, 70); + zig.vertex(100, 70); + zig.vertex(10, 90); + zig.vertex(50, 40); + zig.endShape(CLOSE); + frameRate(4); +} + +void draw() { + background(204); + color strokeVal = color(random(255)); + color fillVal = color(random(255)); + zig.setStroke(strokeVal); + zig.setFill(fillVal); + shape(zig, 0, 0); +} diff --git a/content/handbook_2e/examples/17 Shapes/Ex_13/Ex_13.pde b/content/handbook_2e/examples/17 Shapes/Ex_13/Ex_13.pde new file mode 100644 index 000000000..635f6e298 --- /dev/null +++ b/content/handbook_2e/examples/17 Shapes/Ex_13/Ex_13.pde @@ -0,0 +1,27 @@ +PShape zig; + +void setup() { + size(100, 100); + zig = createShape(); + zig.beginShape(); + zig.fill(0); + zig.vertex(10, 0); + zig.vertex(100, 30); + zig.vertex(90, 70); + zig.vertex(100, 70); + zig.vertex(10, 90); + zig.vertex(50, 40); + zig.endShape(CLOSE); +} + +void draw() { + background(204); + for (int i = 0; i < zig.getVertexCount(); i++) { + float x = zig.getVertexX(i); + float y = zig.getVertexY(i); + x += random(-1, 1); + y += random(-1, 1); + zig.setVertex(i, x, y); + } + shape(zig, 0, 0); +} diff --git a/content/handbook_2e/examples/18 Synthesis 2/Ex_01/Ex_01.pde b/content/handbook_2e/examples/18 Synthesis 2/Ex_01/Ex_01.pde new file mode 100644 index 000000000..e6d18c509 --- /dev/null +++ b/content/handbook_2e/examples/18 Synthesis 2/Ex_01/Ex_01.pde @@ -0,0 +1,32 @@ +int x = 320; // Hero x-coordinate +int y = 240; // Hero y-coordinate +int r = 40; // Hero radius +float speed = 2.0; // Hero speed + +void setup() { + size(640, 480); + ellipseMode(RADIUS); + noCursor(); +} + +void draw() { + background(204); + + // Draw hero + noStroke(); + fill(126); + ellipse(x, y, r, r); + + // Move hero with arrow keys + if ((keyPressed == true) && (key == CODED)) { + if (keyCode == UP) { + y -= speed; + } else if (keyCode == DOWN) { + y += speed; + } else if (keyCode == LEFT) { + x -= speed; + } else if (keyCode == RIGHT) { + x += speed; + } + } +} diff --git a/content/handbook_2e/examples/18 Synthesis 2/Ex_02/Ex_02.pde b/content/handbook_2e/examples/18 Synthesis 2/Ex_02/Ex_02.pde new file mode 100644 index 000000000..693e5ffff --- /dev/null +++ b/content/handbook_2e/examples/18 Synthesis 2/Ex_02/Ex_02.pde @@ -0,0 +1,44 @@ +// Master variables +int w = 40; // Wall thickness +int tx = 620; // Text x-coordinate +int ty = 420; // Text y-coordinate +boolean gate = true; // Is the gate closed or open? + +// Room 1 variables +int gx = 260; // Gate x-coordinate +int dx = 150; // Dagger x-coordinate +int dy = 210; // Dagger y-coordinate + +void setup() { + size(640, 480); + ellipseMode(RADIUS); + noCursor(); + textSize(14); + textAlign(RIGHT); +} + +void draw() { + + // Walls + background(255); + noStroke(); + fill(0); + rect(0, 0, width, w); // Top + rect(0, 0, w, height); // Left + rect(0, height-w, width, w); // Bottom + + // Gate + fill(0); + if (gate == true) { + for (int y = w; y <= height-w; y += 20) { + ellipse(gx, y, 5, 5); + } + text("Use the arrow keys to explore", tx, ty); + } + + // Dagger + fill(102); + triangle(dx, dy, dx+5, dy-10, dx+10, dy); + rect(dx, dy, 10, 70); + rect(dx-10, dy+45, 30, 10); +} diff --git a/content/handbook_2e/examples/18 Synthesis 2/Ex_03/Ex_03.pde b/content/handbook_2e/examples/18 Synthesis 2/Ex_03/Ex_03.pde new file mode 100644 index 000000000..9735e3487 --- /dev/null +++ b/content/handbook_2e/examples/18 Synthesis 2/Ex_03/Ex_03.pde @@ -0,0 +1,62 @@ +// Master variables +int w = 40; // Wall thickness +int tx = 620; // Text x-coordinate +int ty = 420; // Text y-coordinate +boolean gate = true; // Is the gate closed or open? + +// Room 2 variables +int kx = 440; // Key x-coordinate +int ky = 230; // Key y-coordinate + +void setup() { + size(640, 480); + ellipseMode(RADIUS); + noCursor(); + textSize(14); + textAlign(RIGHT); +} + +void draw() { + + // Walls + background(255); + noStroke(); + fill(0); + rect(0, 0, width, w); // Top + rect(width-w, 0, w, height); // Right + rect(0, height-w, width, w); // Bottom + + // Key + if (gate == true) { + fill(102); + pushMatrix(); + translate(kx, ky); + beginShape(); + vertex(0, 10); + vertex(50, 10); + vertex(50, 0); + vertex(80, 0); + vertex(80, 30); + vertex(50, 30); + vertex(50, 20); + vertex(30, 20); + vertex(30, 30); + vertex(20, 30); + vertex(20, 20); + vertex(10, 20); + vertex(10, 30); + vertex(0, 30); + endShape(); + popMatrix(); + } + + // Text + fill(0); + if (gate) { + text("Grab the key to open the gate", tx-w, ty); + } + else { + text("You have the key. The gate is open!", tx-w, ty); + } + +} diff --git a/content/handbook_2e/examples/18 Synthesis 2/Ex_04/Ex_04.pde b/content/handbook_2e/examples/18 Synthesis 2/Ex_04/Ex_04.pde new file mode 100644 index 000000000..d953e2e63 --- /dev/null +++ b/content/handbook_2e/examples/18 Synthesis 2/Ex_04/Ex_04.pde @@ -0,0 +1,169 @@ +// Master variables +int mode = 1; // Current room +int w = 40; // Wall thickness +int tx = 620; // Text x-coordinate +int ty = 420; // Text y-coordinate +boolean gate = true; // Is the gate closed or open? + +// Hero variables +int x = 400; // Hero x-coordinate +int y = 240; // Hero y-coordinate +int r = 40; // Hero radius +float speed = 2.0; // Hero speed + +// Room 1 variables +int gx = 260; // Gate x-coordinate +int dx = 150; // Dagger x-coordinate +int dy = 210; // Dagger y-coordinate + +// Room 2 variables +int kx = 440; // Key x-coordinate +int ky = 230; // Key y-coordinate + +void setup() { + size(640, 480); + ellipseMode(RADIUS); + noCursor(); + textSize(14); + textAlign(RIGHT); +} + +void draw() { + + if (mode == 1) { // ROOM 1 + + // Walls + background(255); + noStroke(); + fill(0); + rect(0, 0, width, w); // Top + rect(0, 0, w, height); // Left + rect(0, height-w, width, w); // Bottom + + // Gate + fill(0); + if (gate == true) { + for (int y = w; y <= height-w; y += 20) { + ellipse(gx, y, 5, 5); + } + text("Use the arrow keys to explore", tx, ty); + } else { + text("Edit the code to grab the dagger", tx, ty); + } + + // Dagger + fill(102); + triangle(dx, dy, dx+5, dy-10, dx+10, dy); + rect(dx, dy, 10, 70); + rect(dx-10, dy+45, 30, 10); + + // Stop the hero from walking through walls + if (gate == true) { + if (x < gx+r+5) { // Check gate + x = gx+r+5; + } + } + else { + if (x < w+r) { // Check left wall + x = w+r; + } + } + if (y > height-w-r) { // Check bottom wall + y = height-w-r; + } + if (y < w+r) { // Check top wall + y = w+r; + } + + // Move to room 2 + if (x > width+r) { + mode = 2; + x = r; + } + + } else { // ROOM 2 + + // Walls + background(255); + noStroke(); + fill(0); + rect(0, 0, width, w); // Top + rect(width-w, 0, w, height); // Right + rect(0, height-w, width, w); // Bottom + + // Key + if (gate == true) { + fill(102); + pushMatrix(); + translate(kx, ky); + beginShape(); + vertex(0, 10); + vertex(50, 10); + vertex(50, 0); + vertex(80, 0); + vertex(80, 30); + vertex(50, 30); + vertex(50, 20); + vertex(30, 20); + vertex(30, 30); + vertex(20, 30); + vertex(20, 20); + vertex(10, 20); + vertex(10, 30); + vertex(0, 30); + endShape(); + popMatrix(); + } + + // Text + fill(0); + if (gate == true) { + text("Grab the key to open the gate", tx-w, ty); + } + else { + text("You have the key. The gate is open!", tx-w, ty); + } + + // Check if hero is on top of the key + if (x > kx && x < kx+80 && y > ky && y < ky+30) { + gate = false; + } + + // Stop the hero from walking through walls + if (x < -r) { + mode = 1; + x = width-r; + } + if (x > width-w-r) { // Check right wall + x = width-w-r; + } + if (y > height-w-r) { // Check bottom wall + y = height-w-r; + } + if (y < w+r) { // Check top wall + y = w+r; + } + // Move to room 2 + if (x > width+r) { + mode = 2; + x = r; + } + } + + // Draw hero + fill(126); + ellipse(x, y, r, r); + + // Move hero with arrow keys + if (keyPressed && key == CODED) { + if (keyCode == UP) { + y -= speed; + } else if (keyCode == DOWN) { + y += speed; + } else if (keyCode == LEFT) { + x -= speed; + } else if (keyCode == RIGHT) { + x += speed; + } + } +} diff --git a/content/handbook_2e/examples/18 Synthesis 2/Ex_05/Ex_05.pde b/content/handbook_2e/examples/18 Synthesis 2/Ex_05/Ex_05.pde new file mode 100644 index 000000000..a2cf45a50 --- /dev/null +++ b/content/handbook_2e/examples/18 Synthesis 2/Ex_05/Ex_05.pde @@ -0,0 +1,144 @@ +// Master variables +int mode = 1; // Current room +int w = 40; // Wall thickness +int tx = 620; // Text x-coordinate +int ty = 420; // Text y-coordinate +boolean gate = true; // Is the gate closed or open? +PImage scribbles; // Background image +PFont heroFont; // Font for the project + +// Hero variables +PImage hero; // Hero image +int x = 440; // Hero x-coordinate +int y = 240; // Hero y-coordinate +int r = 110; // Hero radius +float speed = 2; // Hero speed + +// Room 1 variables +int gx = 220; // Gate x-coordinate +int dx = 75; // Dagger x-coordinate +int dy = 120; // Dagger y-coordinate +PImage dagger; // Dagger image + +// Room 2 variables +int kx = 390; // Key x-coordinate +int ky = 180; // Key y-coordinate +PImage gateKey; // Key image + +void setup() { + size(640, 480); + noCursor(); + textAlign(RIGHT); + hero = loadImage("figure.png"); + scribbles = loadImage("background.png"); + heroFont = createFont("SourceCodePro-Bold", 16); + gateKey = loadImage("key.png"); + dagger = loadImage("dagger.png"); + textFont(heroFont); +} + +void draw() { + + if (mode == 1) { // ROOM 1 + + // Walls + imageMode(CORNER); + image(scribbles, 0, 0); + + // Gate + if (gate == true) { + noStroke(); + fill(0); + rect(gx, w, w, height-w*2); + fill(0); + text("Use the arrow keys to explore", tx, ty); + } else { + text("Edit the code to grab the dagger", tx, ty); + } + + // Dagger + image(dagger, dx, dy); + + // Stop the hero from walking through walls + if (gate == true) { + if (x < gx+r+5) { // Check gate + x = gx+r+5; + } + } else { + if (x < w+r) { // Check left wall + x = w+r; + } + } + if (y > height-w-r) { // Check bottom wall + y = height-w-r; + } + if (y < w+r) { // Check top wall + y = w+r; + } + + // Move to room 2 + if (x > width+r) { + mode = 2; + x = r; + } + + } else { // ROOM 2 + + // Walls + imageMode(CORNER); + image(scribbles, -width, 0); + + // Key + if (gate == true) { + image(gateKey, kx, ky); + } + + // Text + fill(0); + if (gate == true) { + text("Grab the key to open the gate", tx-w, ty); + } + else { + text("You have the key. The gate is open!", tx-w, ty); + } + + // Check if hero is on top of the key + if (x > kx && x < kx+gateKey.width && y > ky && y < ky+gateKey.height) { + gate = false; + } + + // Stop the hero from walking through walls + if (x > width-w-r) { // Check right wall + x = width-w-r; + } + if (y > height-w-r) { // Check bottom wall + y = height-w-r; + } + if (y < w+r) { // Check top wall + y = w+r; + } + + // Move to room 1 + if (x < -r) { + mode = 1; + x = width-r; + } + } + + // Draw hero + imageMode(CENTER); + image(hero, x, y); + + // Move hero with arrow keys + if ((keyPressed == true) && (key == CODED)) { + if (keyCode == UP) { + y -= speed; + } else if (keyCode == DOWN) { + y += speed; + } else if (keyCode == LEFT) { + x -= speed; + } else if (keyCode == RIGHT) { + x += speed; + } + } +} diff --git a/content/handbook_2e/examples/18 Synthesis 2/Ex_05/data/background.png b/content/handbook_2e/examples/18 Synthesis 2/Ex_05/data/background.png new file mode 100644 index 000000000..8d7a8165a Binary files /dev/null and b/content/handbook_2e/examples/18 Synthesis 2/Ex_05/data/background.png differ diff --git a/content/handbook_2e/examples/18 Synthesis 2/Ex_05/data/dagger.png b/content/handbook_2e/examples/18 Synthesis 2/Ex_05/data/dagger.png new file mode 100644 index 000000000..1b9426585 Binary files /dev/null and b/content/handbook_2e/examples/18 Synthesis 2/Ex_05/data/dagger.png differ diff --git a/content/handbook_2e/examples/18 Synthesis 2/Ex_05/data/figure.png b/content/handbook_2e/examples/18 Synthesis 2/Ex_05/data/figure.png new file mode 100644 index 000000000..54a859340 Binary files /dev/null and b/content/handbook_2e/examples/18 Synthesis 2/Ex_05/data/figure.png differ diff --git a/content/handbook_2e/examples/18 Synthesis 2/Ex_05/data/key.png b/content/handbook_2e/examples/18 Synthesis 2/Ex_05/data/key.png new file mode 100644 index 000000000..6d121cefb Binary files /dev/null and b/content/handbook_2e/examples/18 Synthesis 2/Ex_05/data/key.png differ diff --git a/content/handbook_2e/examples/20 Calculate/Ex_01/Ex_01.pde b/content/handbook_2e/examples/20 Calculate/Ex_01/Ex_01.pde new file mode 100644 index 000000000..e96a0837b --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_01/Ex_01.pde @@ -0,0 +1,3 @@ +float a = sq(1); // Assign 1 to a, equivalent to 1 * 1 +float b = sq(-5); // Assign 25 to b, equivalent to -5 * -5 +float c = sq(9); // Assign 81 to c, equivalent to 9 * 9 diff --git a/content/handbook_2e/examples/20 Calculate/Ex_02/Ex_02.pde b/content/handbook_2e/examples/20 Calculate/Ex_02/Ex_02.pde new file mode 100644 index 000000000..4316d88ab --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_02/Ex_02.pde @@ -0,0 +1,3 @@ +float a = sqrt(6561); // Assign 81 to a +float b = sqrt(625); // Assign 25 to b +float c = sqrt(1); // Assign 1 to c diff --git a/content/handbook_2e/examples/20 Calculate/Ex_03/Ex_03.pde b/content/handbook_2e/examples/20 Calculate/Ex_03/Ex_03.pde new file mode 100644 index 000000000..6fe0cc66d --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_03/Ex_03.pde @@ -0,0 +1,4 @@ +float a = pow(1, 3); // Assign 1.0 to a, equivalent to 1*1*1 +float b = pow(3, 4); // Assign 81.0 to b, equivalent to 3*3*3*3 +float c = pow(3, -2); // Assign 0.11 to c, equivalent to 1 / 3*3 +float d = pow(-3, 3); // Assign -27.0 to d, equivalent to -3*-3*-3 diff --git a/content/handbook_2e/examples/20 Calculate/Ex_04/Ex_04.pde b/content/handbook_2e/examples/20 Calculate/Ex_04/Ex_04.pde new file mode 100644 index 000000000..ca560fc8a --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_04/Ex_04.pde @@ -0,0 +1,3 @@ +float a = pow(8, 0); // Assign 1 to a +float b = pow(3, 1); // Assign 3 to b +float c = pow(4, 1); // Assign 4 to c diff --git a/content/handbook_2e/examples/20 Calculate/Ex_05/Ex_05.pde b/content/handbook_2e/examples/20 Calculate/Ex_05/Ex_05.pde new file mode 100644 index 000000000..99f98d310 --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_05/Ex_05.pde @@ -0,0 +1,3 @@ +float x = norm(0.0, 0.0, 255.0); // Assign 0.0 to x +float y = norm(102.0, 0.0, 255.0); // Assign 0.4 to y +float z = norm(255.0, 0.0, 255.0); // Assign 1.0 to z diff --git a/content/handbook_2e/examples/20 Calculate/Ex_06/Ex_06.pde b/content/handbook_2e/examples/20 Calculate/Ex_06/Ex_06.pde new file mode 100644 index 000000000..059b8592d --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_06/Ex_06.pde @@ -0,0 +1,3 @@ +float x = lerp(-20.0, 60.0, 0.0); // Assign -20.0 to x +float y = lerp(-20.0, 60.0, 0.5); // Assign 20.0 to y +float z = lerp(-20.0, 60.0, 1.0); // Assign 60.0 to z diff --git a/content/handbook_2e/examples/20 Calculate/Ex_07/Ex_07.pde b/content/handbook_2e/examples/20 Calculate/Ex_07/Ex_07.pde new file mode 100644 index 000000000..ccda0faf3 --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_07/Ex_07.pde @@ -0,0 +1,3 @@ +float x = map(20.0, 0.0, 255.0, -1.0, 1.0); // Assign -0.84 to x +float y = map(0.0, 0.0, 255.0, -1.0, 1.0); // Assign -1.0 to y +float z = map(255.0, 0.0, 255.0, -1.0, 1.0); // Assign 1.0 to z diff --git a/content/handbook_2e/examples/20 Calculate/Ex_08/Ex_08.pde b/content/handbook_2e/examples/20 Calculate/Ex_08/Ex_08.pde new file mode 100644 index 000000000..655734b09 --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_08/Ex_08.pde @@ -0,0 +1,13 @@ +void setup() { + size(100, 100); +} + +void draw() { + background(204); + float x1 = map(mouseX, 0, width, 0, 20); + float x2 = map(mouseX, 0, width, -20, 80); + float x3 = map(mouseX, 0, width, 20, 60); + ellipse(x1, 25, 40, 40); + ellipse(x2, 50, 40, 40); + ellipse(x3, 75, 40, 40); +} diff --git a/content/handbook_2e/examples/20 Calculate/Ex_09/Ex_09.pde b/content/handbook_2e/examples/20 Calculate/Ex_09/Ex_09.pde new file mode 100644 index 000000000..7e2fec74e --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_09/Ex_09.pde @@ -0,0 +1,6 @@ +for (int x = 0; x < 100; x++) { + float n = norm(x, 0.0, 100.0); // Range 0.0 to 1.0 + float y = pow(n, 4); // Calculate curve + y *= 100; // Range 0.0 to 100.0 + point(x, y); +} diff --git a/content/handbook_2e/examples/20 Calculate/Ex_10/Ex_10.pde b/content/handbook_2e/examples/20 Calculate/Ex_10/Ex_10.pde new file mode 100644 index 000000000..fe6c7a737 --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_10/Ex_10.pde @@ -0,0 +1,6 @@ +for (int x = 0; x < 100; x++) { + float n = norm(x, 0.0, 100.0); // Range 0.0 to 1.0 + float y = pow(n, 0.4); // Calculate curve + y *= 100; // Range 0.0 to 100.0 + point(x, y); +} diff --git a/content/handbook_2e/examples/20 Calculate/Ex_11/Ex_11.pde b/content/handbook_2e/examples/20 Calculate/Ex_11/Ex_11.pde new file mode 100644 index 000000000..824ee60e0 --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_11/Ex_11.pde @@ -0,0 +1,8 @@ +noFill(); +for (int x = 0; x < 100; x += 5) { + float n = norm(x, 0.0, 100.0); // Range 0.0 to 1.0 + float y = pow(n, 4); // Calculate curve + y *= 100; // Scale y to range 0.0 to 100.0 + strokeWeight(n * 5); // Increase thickness + ellipse(x, y, 120, 120); +} diff --git a/content/handbook_2e/examples/20 Calculate/Ex_12/Ex_12.pde b/content/handbook_2e/examples/20 Calculate/Ex_12/Ex_12.pde new file mode 100644 index 000000000..056df55df --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_12/Ex_12.pde @@ -0,0 +1,6 @@ +for (int x = 5; x < 100; x += 5) { + float n = map(x, 5, 95, -1, 1); + float p = pow(n, 4); + float ypos = lerp(20, 80, p); + line(x, 0, x, ypos); +} diff --git a/content/handbook_2e/examples/20 Calculate/Ex_13/Ex_13.pde b/content/handbook_2e/examples/20 Calculate/Ex_13/Ex_13.pde new file mode 100644 index 000000000..47419e914 --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_13/Ex_13.pde @@ -0,0 +1,9 @@ +for (int x = 0; x < 100; x++) { + float n = norm(x, 0.0, 100.0); // Range 0.0 to 1.0 + float val = n * 255.0; + stroke(val); + line(x, 0, x, 50); // Draw top gradient + float valSquare = pow(n, 4) * 255.0; + stroke(valSquare); + line(x, 50, x, 100); // Draw bottom gradient +} diff --git a/content/handbook_2e/examples/20 Calculate/Ex_14/Ex_14.pde b/content/handbook_2e/examples/20 Calculate/Ex_14/Ex_14.pde new file mode 100644 index 000000000..2353ab3e0 --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_14/Ex_14.pde @@ -0,0 +1,4 @@ +int w = ceil(2.0); // Assign 2 to w +int x = ceil(2.1); // Assign 3 to x +int y = ceil(2.5); // Assign 3 to y +int z = ceil(2.9); // Assign 3 to z diff --git a/content/handbook_2e/examples/20 Calculate/Ex_15/Ex_15.pde b/content/handbook_2e/examples/20 Calculate/Ex_15/Ex_15.pde new file mode 100644 index 000000000..11cf8ec09 --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_15/Ex_15.pde @@ -0,0 +1,4 @@ +int w = floor(2.0); // Assign 2 to w +int x = floor(2.1); // Assign 2 to x +int y = floor(2.5); // Assign 2 to y +int z = floor(2.9); // Assign 2 to z diff --git a/content/handbook_2e/examples/20 Calculate/Ex_16/Ex_16.pde b/content/handbook_2e/examples/20 Calculate/Ex_16/Ex_16.pde new file mode 100644 index 000000000..616e24793 --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_16/Ex_16.pde @@ -0,0 +1,4 @@ +int w = round(2.0); // Assign 2 to w +int x = round(2.1); // Assign 2 to x +int y = round(2.5); // Assign 3 to y +int z = round(2.9); // Assign 3 to z diff --git a/content/handbook_2e/examples/20 Calculate/Ex_17/Ex_17.pde b/content/handbook_2e/examples/20 Calculate/Ex_17/Ex_17.pde new file mode 100644 index 000000000..f0b0318bd --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_17/Ex_17.pde @@ -0,0 +1 @@ +float w = round(2.1); // Assign 2.0 to w diff --git a/content/handbook_2e/examples/20 Calculate/Ex_18/Ex_18.pde b/content/handbook_2e/examples/20 Calculate/Ex_18/Ex_18.pde new file mode 100644 index 000000000..068f45e5f --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_18/Ex_18.pde @@ -0,0 +1,6 @@ +int u = min(5, 9); // Assign 5 to u +int v = min(-4, -12, -9); // Assign -12 to v +float w = min(12.3, 230.24); // Assign 12.3 to w +int x = max(5, 9); // Assign 9 to x +int y = max(-4, -12, -9); // Assign -4 to y +float z = max(12.3, 230.24); // Assign 230.24 to z diff --git a/content/handbook_2e/examples/20 Calculate/Ex_19/Ex_19.pde b/content/handbook_2e/examples/20 Calculate/Ex_19/Ex_19.pde new file mode 100644 index 000000000..9f5c45c56 --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_19/Ex_19.pde @@ -0,0 +1,4 @@ +int x = constrain(35, 10, 90); // Assign 35 to x +int y = constrain(5, 10, 90); // Assign 10 to y +float z = constrain(1.2, 0.5, 1.0); // Assign 1.0 to z + diff --git a/content/handbook_2e/examples/20 Calculate/Ex_20/Ex_20.pde b/content/handbook_2e/examples/20 Calculate/Ex_20/Ex_20.pde new file mode 100644 index 000000000..b86fbac60 --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_20/Ex_20.pde @@ -0,0 +1,16 @@ +void setup() { + size(100, 100); + noStroke(); +} + +void draw() { + background(0); + // Limits variable mx between 35 and 65 + int mx = constrain(mouseX, 35, 65); + // Limits variable my between 40 and 60 + int my = constrain(mouseY, 40, 60); + fill(102); + rect(20, 25, 60, 50); + fill(255); + ellipse(mx, my, 30, 30); +} diff --git a/content/handbook_2e/examples/20 Calculate/Ex_21/Ex_21.pde b/content/handbook_2e/examples/20 Calculate/Ex_21/Ex_21.pde new file mode 100644 index 000000000..b63071c03 --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_21/Ex_21.pde @@ -0,0 +1,3 @@ +float x = abs(10); // Assign 10.0 to x +float y = abs(0); // Assign 0.0 to y +float z = abs(-60); // Assign 60.0 to z diff --git a/content/handbook_2e/examples/20 Calculate/Ex_22/Ex_22.pde b/content/handbook_2e/examples/20 Calculate/Ex_22/Ex_22.pde new file mode 100644 index 000000000..860dd0e3d --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_22/Ex_22.pde @@ -0,0 +1,3 @@ +float x = dist(0, 0, 50, 0); // Assign 50.0 to x +float y = dist(50, 0, 50, 90); // Assign 90.0 to y +float z = dist(30, 20, 80, 90); // Assign 86.023254 to z diff --git a/content/handbook_2e/examples/20 Calculate/Ex_23/Ex_23.pde b/content/handbook_2e/examples/20 Calculate/Ex_23/Ex_23.pde new file mode 100644 index 000000000..dcf08f2a4 --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_23/Ex_23.pde @@ -0,0 +1,9 @@ +void setup() { + size(100, 100); +} + +void draw() { + background(0); + float r = dist(width/2, height/2, mouseX, mouseY); + ellipse(width/2, height/2, r*2, r*2); +} diff --git a/content/handbook_2e/examples/20 Calculate/Ex_24/Ex_24.pde b/content/handbook_2e/examples/20 Calculate/Ex_24/Ex_24.pde new file mode 100644 index 000000000..fb47c4f7f --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_24/Ex_24.pde @@ -0,0 +1,19 @@ +float maxDistance; + +void setup() { + size(100, 100); + noStroke(); + fill(0); + maxDistance = dist(0, 0, width, height); +} + +void draw() { + background(204); + for (int i = 0; i <= width; i += 20) { + for (int j = 0; j <= height; j += 20) { + float mouseDist = dist(mouseX, mouseY, i, j); + float diameter = (mouseDist / maxDistance) * 66.0; + ellipse(i, j, diameter, diameter); + } + } +} diff --git a/content/handbook_2e/examples/20 Calculate/Ex_25/Ex_25.pde b/content/handbook_2e/examples/20 Calculate/Ex_25/Ex_25.pde new file mode 100644 index 000000000..d1dc483da --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_25/Ex_25.pde @@ -0,0 +1,14 @@ +float x = 0.0; +float easing = 0.05; // Numbers 0.0 to 1.0 + +void setup() { + size(100, 100); +} + +void draw() { + background(0); + float targetX = mouseX; + x += (targetX - x) * easing; + ellipse(mouseX, 30, 40, 40); + ellipse(x, 70, 40, 40); +} diff --git a/content/handbook_2e/examples/20 Calculate/Ex_26/Ex_26.pde b/content/handbook_2e/examples/20 Calculate/Ex_26/Ex_26.pde new file mode 100644 index 000000000..73c17dae3 --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_26/Ex_26.pde @@ -0,0 +1,20 @@ +float x = 0.0; +float y = 0.0; +float easing = 0.05; // Numbers 0.0 to 1.0 + +void setup() { + size(100, 100); + noStroke(); +} + +void draw() { + background(0); + float targetX = mouseX; + float targetY = mouseY; + x += (targetX - x) * easing; + y += (targetY - y) * easing; + fill(153); + ellipse(mouseX, mouseY, 20, 20); + fill(255); + ellipse(x, y, 40, 40); +} diff --git a/content/handbook_2e/examples/20 Calculate/Ex_27/Ex_27.pde b/content/handbook_2e/examples/20 Calculate/Ex_27/Ex_27.pde new file mode 100644 index 000000000..3bcb1726e --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_27/Ex_27.pde @@ -0,0 +1,20 @@ +float x = 0.0; +float easing = 0.05; // Numbers 0.0 to 1.0 + +void setup() { + size(100, 100); +} + +void draw() { + background(0); + float targetX = mouseX; + // Distance from position and target + float dx = targetX - x; + // If the distance between the current position and the + // destination is greater than 1.0, update the position + if (abs(dx) > 1.0) { + x += dx * easing; + } + ellipse(mouseX, 30, 40, 40); + ellipse(x, 70, 40, 40); +} diff --git a/content/handbook_2e/examples/20 Calculate/Ex_28/Ex_28.pde b/content/handbook_2e/examples/20 Calculate/Ex_28/Ex_28.pde new file mode 100644 index 000000000..e0c8bda02 --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_28/Ex_28.pde @@ -0,0 +1 @@ +println(PI); // Print the value of PI to the console diff --git a/content/handbook_2e/examples/20 Calculate/Ex_29/Ex_29.pde b/content/handbook_2e/examples/20 Calculate/Ex_29/Ex_29.pde new file mode 100644 index 000000000..4dc1d2434 --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_29/Ex_29.pde @@ -0,0 +1,8 @@ +float r1 = radians(90); +float r2 = radians(180); +println(r1); // Prints "1.5707964" +println(r2); // Prints "3.1415927" +float d1 = degrees(PI); +float d2 = degrees(TWO_PI); +println(d1); // Prints "180.0" +println(d2); // Prints "360.0" diff --git a/content/handbook_2e/examples/20 Calculate/Ex_30/Ex_30.pde b/content/handbook_2e/examples/20 Calculate/Ex_30/Ex_30.pde new file mode 100644 index 000000000..797a803cb --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_30/Ex_30.pde @@ -0,0 +1,4 @@ +for (int degree = 0; degree < 360; degree++) { + float angle = radians(degree); + println(sin(angle)); +} diff --git a/content/handbook_2e/examples/20 Calculate/Ex_31/Ex_31.pde b/content/handbook_2e/examples/20 Calculate/Ex_31/Ex_31.pde new file mode 100644 index 000000000..cbb878bfd --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_31/Ex_31.pde @@ -0,0 +1,3 @@ +for (float angle = 0; angle < TWO_PI; angle += PI/24.0) { + println(sin(angle) * 50.0); +} diff --git a/content/handbook_2e/examples/20 Calculate/Ex_32/Ex_32.pde b/content/handbook_2e/examples/20 Calculate/Ex_32/Ex_32.pde new file mode 100644 index 000000000..d16fced55 --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_32/Ex_32.pde @@ -0,0 +1,4 @@ +for (float angle = 0; angle < TWO_PI; angle += PI/24.0) { + float newValue = map(sin(angle), -1, 1, 0, 1000); + println(newValue); +} diff --git a/content/handbook_2e/examples/20 Calculate/Ex_33/Ex_33.pde b/content/handbook_2e/examples/20 Calculate/Ex_33/Ex_33.pde new file mode 100644 index 000000000..719a8545f --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_33/Ex_33.pde @@ -0,0 +1,14 @@ +void setup() { + size(700, 100); + noStroke(); + fill(0); +} + +void draw() { + float angle = 0.0; + for (int x = 0; x < width; x += 5) { + float y = 50 + (sin(angle) * 35.0); + rect(x, y, 2, 4); + angle += PI/40.0; + } +} diff --git a/content/handbook_2e/examples/20 Calculate/Ex_34/Ex_34.pde b/content/handbook_2e/examples/20 Calculate/Ex_34/Ex_34.pde new file mode 100644 index 000000000..dc9a76615 --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_34/Ex_34.pde @@ -0,0 +1,19 @@ +float offset = 50.0; // Y offset +float scaleVal = 35.0; // Scale value for the wave magnitude +float angleInc = PI/28.0; // Increment between the next angle + +void setup() { + size(700, 100); + noStroke(); + fill(0); +} + +void draw() { + background(204); + float angle = 0.0; + for (int x = 0; x < width; x += 5) { + float y = offset + (sin(angle) * scaleVal); + rect(x, y, 2, 4); + angle += angleInc; + } +} diff --git a/content/handbook_2e/examples/20 Calculate/Ex_35/Ex_35.pde b/content/handbook_2e/examples/20 Calculate/Ex_35/Ex_35.pde new file mode 100644 index 000000000..35f41ead5 --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_35/Ex_35.pde @@ -0,0 +1,23 @@ +float offset = 50.0; // Y offset +float scaleVal = 35.0; // Scale value for the wave magnitude +float angleInc = PI/28.0; // Increment between the next angle + +void setup() { + size(700, 100); + noStroke(); + fill(0); +} + +void draw() { + background(204); + float angle = 0.0; + for (int x = 0; x < width; x += 5) { + float y1 = offset + (sin(angle) * scaleVal); + fill(255); + rect(x, y1, 2, 4); + float y2 = offset + (cos(angle) * scaleVal); + fill(0); + rect(x, y2, 2, 4); + angle += angleInc; + } +} diff --git a/content/handbook_2e/examples/20 Calculate/Ex_36/Ex_36.pde b/content/handbook_2e/examples/20 Calculate/Ex_36/Ex_36.pde new file mode 100644 index 000000000..67fa488dc --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_36/Ex_36.pde @@ -0,0 +1,23 @@ +float offset = 50.0; +float scaleVal = 30.0; +float angleInc = PI/56.0; + +void setup() { + size(700, 100); +} + +void draw() { + background(204); + float angle = 0.0; + beginShape(TRIANGLE_STRIP); + for (int x = 4 ; x <= width+5; x += 5) { + float y = sin(angle) * scaleVal; + if ((x % 2) == 0) { // Every other time through the loop + vertex(x, offset + y); + } else { + vertex(x, offset - y); + } + angle += angleInc; + } + endShape(); +} diff --git a/content/handbook_2e/examples/20 Calculate/Ex_37/Ex_37.pde b/content/handbook_2e/examples/20 Calculate/Ex_37/Ex_37.pde new file mode 100644 index 000000000..605fbbd0a --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_37/Ex_37.pde @@ -0,0 +1,17 @@ +float offset = 126.0; +float scaleVal = 126.0; +float angleInc = 0.2; + +void setup() { + size(700, 100); +} + +void draw() { + float angle = 0.0; + for (int x = -52; x < width; x += 1) { + float y = offset + (sin(angle) * scaleVal); + stroke(y); + line(x, 0, x+50, height); + angle += angleInc; + } +} diff --git a/content/handbook_2e/examples/20 Calculate/Ex_38/Ex_38.pde b/content/handbook_2e/examples/20 Calculate/Ex_38/Ex_38.pde new file mode 100644 index 000000000..3aaa9b7d2 --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_38/Ex_38.pde @@ -0,0 +1,21 @@ +float scaleVal = 6.0; +float angleInc = 0.19; + +void setup() { + size(700, 100); + stroke(255); +} + +void draw() { + background(0); + float angle = 0.0; + for (int offset = -10; offset < width+10; offset += 5) { + for (int y = 0; y <= height; y += 2) { + float x = offset + (sin(angle) * scaleVal); + line(x, y, x, y+2); + angle += angleInc; + } + angle += PI; + } +} + diff --git a/content/handbook_2e/examples/20 Calculate/Ex_39/Ex_39.pde b/content/handbook_2e/examples/20 Calculate/Ex_39/Ex_39.pde new file mode 100644 index 000000000..e554ff339 --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_39/Ex_39.pde @@ -0,0 +1,16 @@ +int radius = 38; + +void setup() { + size(100, 100); + fill(0); +} + +void draw() { + background(204); + for (int deg = 0; deg < 360; deg += 12) { + float angle = radians(deg); + float x = 50 + (cos(angle) * radius); + float y = 50 + (sin(angle) * radius); + ellipse(x, y, 4, 4); + } +} diff --git a/content/handbook_2e/examples/20 Calculate/Ex_40/Ex_40.pde b/content/handbook_2e/examples/20 Calculate/Ex_40/Ex_40.pde new file mode 100644 index 000000000..62743133d --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_40/Ex_40.pde @@ -0,0 +1,17 @@ +int radius = 38; + +void setup() { + size(100, 100); + fill(0); +} + +void draw() { + background(204); + int piece = int(map(mouseX, 0, width, 0, 360)); + for (int deg = 0; deg <= piece; deg += 12) { + float angle = radians(deg); + float x = 50 + (cos(angle) * radius); + float y = 50 + (sin(angle) * radius); + ellipse(x, y, 4, 4); + } +} diff --git a/content/handbook_2e/examples/20 Calculate/Ex_41/Ex_41.pde b/content/handbook_2e/examples/20 Calculate/Ex_41/Ex_41.pde new file mode 100644 index 000000000..a05a78c70 --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_41/Ex_41.pde @@ -0,0 +1,18 @@ +void setup() { + size(100, 100); + fill(0); + noStroke(); +} + +void draw() { + background(204); + float scalar = map(mouseX, 0, width, 4, 20); + float radius = 1.0; + for (int deg = 0; deg < 360*6; deg += scalar) { + float angle = radians(deg); + float x = 75 + (cos(angle) * radius); + float y = 42 + (sin(angle) * radius); + ellipse(x, y, 4, 4); + radius = radius + 0.34; + } +} diff --git a/content/handbook_2e/examples/20 Calculate/Ex_42/Ex_42.pde b/content/handbook_2e/examples/20 Calculate/Ex_42/Ex_42.pde new file mode 100644 index 000000000..9d6fc80e9 --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_42/Ex_42.pde @@ -0,0 +1,19 @@ +float cx = 33.0; // Center x-coordinate +float cy = 66.0; // Center y-coordinate + +void setup() { + size(100, 100); +} + +void draw() { + background(204); + float radius = 0.15; + float radVal = map(mouseX, 0, width, 1.05, 1.1); + for (int deg = 0; deg < 360*5; deg += 12) { + float angle = radians(deg); + float x = cx + (cos(angle) * radius); + float y = cy + (sin(angle) * radius); + line(x, y, x, y+2); + radius = radius * radVal; + } +} diff --git a/content/handbook_2e/examples/20 Calculate/Ex_43/Ex_43.pde b/content/handbook_2e/examples/20 Calculate/Ex_43/Ex_43.pde new file mode 100644 index 000000000..c5c85ab47 --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_43/Ex_43.pde @@ -0,0 +1,14 @@ +void setup() { + size(100, 100); + fill(0); +} + +void draw() { + float angle = atan2(mouseY, mouseX); + float deg = degrees(angle); + background(204); + text(int(deg), 50, 50); + ellipse(mouseX, mouseY, 8, 8); + rotate(angle); + line(0, 0, 150, 0); +} diff --git a/content/handbook_2e/examples/20 Calculate/Ex_44/Ex_44.pde b/content/handbook_2e/examples/20 Calculate/Ex_44/Ex_44.pde new file mode 100644 index 000000000..e5b6339a1 --- /dev/null +++ b/content/handbook_2e/examples/20 Calculate/Ex_44/Ex_44.pde @@ -0,0 +1,26 @@ +int x = 50; +int y1 = 33; +int y2 = 66; + +void setup() { + size(100, 100); + noStroke(); +} + +void draw() { + background(0); + // Top triangle + float angle = atan2(mouseY-y1, mouseX-x); + pushMatrix(); + translate(x, y1); + rotate(angle); + triangle(-20, -8, 20, 0, -20, 8); + popMatrix(); + pushMatrix(); + // Bottom triangle + float angle2 = atan2(mouseY-(y2), mouseX-x); + translate(x, y2); + rotate(angle2); + triangle(-20, -8, 20, 0, -20, 8); + popMatrix(); +} diff --git a/content/handbook_2e/examples/21 Random/Ex_01/Ex_01.pde b/content/handbook_2e/examples/21 Random/Ex_01/Ex_01.pde new file mode 100644 index 000000000..f4ecd7a91 --- /dev/null +++ b/content/handbook_2e/examples/21 Random/Ex_01/Ex_01.pde @@ -0,0 +1,3 @@ +float f = random(5.2); // Assign f a float value from 0 to 5.2 +int i = random(5.2); // ERROR! Can't assign a float to an int +int j = int(random(5.2)); // Assign j an int value from 0 to 5 diff --git a/content/handbook_2e/examples/21 Random/Ex_01/sketch.properties b/content/handbook_2e/examples/21 Random/Ex_01/sketch.properties new file mode 100644 index 000000000..68851a4d1 --- /dev/null +++ b/content/handbook_2e/examples/21 Random/Ex_01/sketch.properties @@ -0,0 +1,2 @@ +mode.id=processing.mode.tweak.TweakMode +mode=Tweak diff --git a/content/handbook_2e/examples/21 Random/Ex_02/Ex_02.pde b/content/handbook_2e/examples/21 Random/Ex_02/Ex_02.pde new file mode 100644 index 000000000..bb7d32135 --- /dev/null +++ b/content/handbook_2e/examples/21 Random/Ex_02/Ex_02.pde @@ -0,0 +1,7 @@ +strokeWeight(10); +stroke(0, 130); +line(random(100), 0, random(100), 100); +line(random(100), 0, random(100), 100); +line(random(100), 0, random(100), 100); +line(random(100), 0, random(100), 100); +line(random(100), 0, random(100), 100); diff --git a/content/handbook_2e/examples/21 Random/Ex_03/Ex_03.pde b/content/handbook_2e/examples/21 Random/Ex_03/Ex_03.pde new file mode 100644 index 000000000..296d3556e --- /dev/null +++ b/content/handbook_2e/examples/21 Random/Ex_03/Ex_03.pde @@ -0,0 +1,10 @@ +strokeWeight(20); +//stroke(0, 230); +float r1 = random(5, 45); +float r2 = random(55, 95); +stroke(r1 * 4, 230); +line(r1, 0, r2, 100); +r1 = random(5, 45); +r2 = random(55, 95); +stroke(r1 * 4, 230); +line(r1, 0, r2, 100); diff --git a/content/handbook_2e/examples/21 Random/Ex_04/Ex_04.pde b/content/handbook_2e/examples/21 Random/Ex_04/Ex_04.pde new file mode 100644 index 000000000..13a3c866a --- /dev/null +++ b/content/handbook_2e/examples/21 Random/Ex_04/Ex_04.pde @@ -0,0 +1,8 @@ +size(700, 100); +stroke(255, 102); +background(0); +for (int i = 0; i < width; i+=6) { + float r = random(-10, 10); + strokeWeight(abs(r)); + line(i-r, 100, i+r, 0); +} diff --git a/content/handbook_2e/examples/21 Random/Ex_05/Ex_05.pde b/content/handbook_2e/examples/21 Random/Ex_05/Ex_05.pde new file mode 100644 index 000000000..3a56ab669 --- /dev/null +++ b/content/handbook_2e/examples/21 Random/Ex_05/Ex_05.pde @@ -0,0 +1,13 @@ +void setup() { + size(700, 100); + stroke(255, 102); +} + +void draw() { + background(0); + for (int i = 0; i < width; i+=6) { + float r = random(-10, 10); + strokeWeight(abs(r)); + line(i-r, 100, i+r, 0); + } +} diff --git a/content/handbook_2e/examples/21 Random/Ex_06/Ex_06.pde b/content/handbook_2e/examples/21 Random/Ex_06/Ex_06.pde new file mode 100644 index 000000000..73e25db18 --- /dev/null +++ b/content/handbook_2e/examples/21 Random/Ex_06/Ex_06.pde @@ -0,0 +1,15 @@ +void setup() { + size(100, 100); + stroke(255); + frameRate(2); +} + +void draw() { + background(0); + float r = random(100); + if (r < 50.0) { + line(0, 0, 100, 100); + } else { + ellipse(50, 50, 75, 75); + } +} diff --git a/content/handbook_2e/examples/21 Random/Ex_07/Ex_07.pde b/content/handbook_2e/examples/21 Random/Ex_07/Ex_07.pde new file mode 100644 index 000000000..542b17342 --- /dev/null +++ b/content/handbook_2e/examples/21 Random/Ex_07/Ex_07.pde @@ -0,0 +1,13 @@ +void setup() { + size(100, 100); + stroke(255); + frameRate(2); +} + +void draw() { + background(0); + int num = int(random(50)) + 1; + for (int i = 0; i < num; i++) { + line(i * 2, 0, i * 2, 100); + } +} diff --git a/content/handbook_2e/examples/21 Random/Ex_08/Ex_08.pde b/content/handbook_2e/examples/21 Random/Ex_08/Ex_08.pde new file mode 100644 index 000000000..5ae7e7039 --- /dev/null +++ b/content/handbook_2e/examples/21 Random/Ex_08/Ex_08.pde @@ -0,0 +1,7 @@ +int numPoints = 2000; +noSmooth(); +for (int i = 0; i < numPoints; i++) { + float x = random(20, 80); + float y = random(10, 90); + point(x, y); +} diff --git a/content/handbook_2e/examples/21 Random/Ex_09/Ex_09.pde b/content/handbook_2e/examples/21 Random/Ex_09/Ex_09.pde new file mode 100644 index 000000000..9d1f2bfec --- /dev/null +++ b/content/handbook_2e/examples/21 Random/Ex_09/Ex_09.pde @@ -0,0 +1,9 @@ +int power = 8; +int numPoints = 4000; +noSmooth(); +for (int i = 0; i < numPoints; i++) { + float x = random(20, 80); + float y = random(1); + y = 10 + (pow(y, power) * 80); + point(x, y); +} diff --git a/content/handbook_2e/examples/21 Random/Ex_10/Ex_10.pde b/content/handbook_2e/examples/21 Random/Ex_10/Ex_10.pde new file mode 100644 index 000000000..7062102a6 --- /dev/null +++ b/content/handbook_2e/examples/21 Random/Ex_10/Ex_10.pde @@ -0,0 +1,9 @@ +int numPoints = 900; +noSmooth(); +for (int i = 0; i < numPoints; i++) { + float angle = random(0, TWO_PI); + float scalar = random(10, 40); + float x = 50 + (cos(angle) * scalar); + float y = 50 + (sin(angle) * scalar); + point(x, y); +} diff --git a/content/handbook_2e/examples/21 Random/Ex_11/Ex_11.pde b/content/handbook_2e/examples/21 Random/Ex_11/Ex_11.pde new file mode 100644 index 000000000..587595ca1 --- /dev/null +++ b/content/handbook_2e/examples/21 Random/Ex_11/Ex_11.pde @@ -0,0 +1,9 @@ +int d = 2; +noSmooth(); +for (int y = 10; y <= 90; y+=4) { + for (int x = 10; x <= 90; x+=4) { + float dx = random(-d, d); + float dy = random(-d, d); + point(x+dx, y+dy); + } +} diff --git a/content/handbook_2e/examples/21 Random/Ex_12/Ex_12.pde b/content/handbook_2e/examples/21 Random/Ex_12/Ex_12.pde new file mode 100644 index 000000000..584d5d02f --- /dev/null +++ b/content/handbook_2e/examples/21 Random/Ex_12/Ex_12.pde @@ -0,0 +1,11 @@ +float threshold = 0.2; +noSmooth(); +for (int y = 10; y <= 90; y+=4) { + for (int x = 10; x <= 90; x+=4) { + float r = random(1); + if (r > threshold) { + point(x, y); + } + } +} + diff --git a/content/handbook_2e/examples/21 Random/Ex_13/Ex_13.pde b/content/handbook_2e/examples/21 Random/Ex_13/Ex_13.pde new file mode 100644 index 000000000..9e9883f94 --- /dev/null +++ b/content/handbook_2e/examples/21 Random/Ex_13/Ex_13.pde @@ -0,0 +1,13 @@ +int u = 5; +float threshold = 0.5; +noSmooth(); +for (int y = 0; y < 100; y += u) { + for (int x = 0; x < 100; x += u) { + float r = random(1); + if (r > threshold) { + line(x, y, x+u, y+u); + } else { + line(x, y+u, x+u, y); + } + } +} diff --git a/content/handbook_2e/examples/21 Random/Ex_14/Ex_14.pde b/content/handbook_2e/examples/21 Random/Ex_14/Ex_14.pde new file mode 100644 index 000000000..85b9ac38d --- /dev/null +++ b/content/handbook_2e/examples/21 Random/Ex_14/Ex_14.pde @@ -0,0 +1,10 @@ +int s = 6; // Seed value +size(700, 100); +stroke(255, 102); +randomSeed(s); // Produce the same numbers each time +background(0); +for (int i = 0; i < width; i+=6) { + float r = random(-10, 10); + strokeWeight(abs(r)); + line(i-r, 100, i+r, 0); +} diff --git a/content/handbook_2e/examples/21 Random/Ex_15/Ex_15.pde b/content/handbook_2e/examples/21 Random/Ex_15/Ex_15.pde new file mode 100644 index 000000000..7a129621f --- /dev/null +++ b/content/handbook_2e/examples/21 Random/Ex_15/Ex_15.pde @@ -0,0 +1,18 @@ +float v = 0.0; +float inc = 0.1; + +void setup() { + size(700, 100); + noStroke(); + fill(0); + noiseSeed(0); + noLoop(); +} + +void draw() { + for (int i = 0; i < width; i = i+4) { + float n = noise(v) * 70.0; + rect(i, 10 + n, 3, 20); + v = v + inc; + } +} diff --git a/content/handbook_2e/examples/21 Random/Ex_16/21_16_1.tif b/content/handbook_2e/examples/21 Random/Ex_16/21_16_1.tif new file mode 100644 index 000000000..9bb957f69 Binary files /dev/null and b/content/handbook_2e/examples/21 Random/Ex_16/21_16_1.tif differ diff --git a/content/handbook_2e/examples/21 Random/Ex_16/Ex_16.pde b/content/handbook_2e/examples/21 Random/Ex_16/Ex_16.pde new file mode 100644 index 000000000..7d18ecd83 --- /dev/null +++ b/content/handbook_2e/examples/21 Random/Ex_16/Ex_16.pde @@ -0,0 +1,24 @@ +float xnoise = 0.0; +float ynoise = 0.0; +float inc = 0.04; + +void setup() { + size(700, 100); + noLoop(); + noSmooth(); +} + +void draw() { + background(0); + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + float gray = noise(xnoise, ynoise) * 255; + stroke(gray); + point(x, y); + xnoise = xnoise + inc; + } + xnoise = 0; + ynoise = ynoise + inc; + } +} + diff --git a/content/handbook_2e/examples/21 Random/Ex_17/Ex_17.pde b/content/handbook_2e/examples/21 Random/Ex_17/Ex_17.pde new file mode 100644 index 000000000..2ae95ff25 --- /dev/null +++ b/content/handbook_2e/examples/21 Random/Ex_17/Ex_17.pde @@ -0,0 +1,25 @@ +float power = 3.0; // Turbulence power +float d = 16.0; // Turbulence density + +void setup() { + size(700, 100); + noLoop(); + noSmooth(); +} + +void draw() { + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + float total = 0.0; + for (float i = d; i >= 1; i = i/2.0) { + total += noise(x/d, y/d) * d; + } + float turbulence = 128.0 * total / d; + float base = (x * 0.2) + (y * 0.12); + float offset = base + (power * turbulence / 256.0); + float gray = abs(sin(offset)) * 256.0; + stroke(gray); + point(x, y); + } + } +} diff --git a/content/handbook_2e/examples/22 Motion/Ex_01/Ex_01.pde b/content/handbook_2e/examples/22 Motion/Ex_01/Ex_01.pde new file mode 100644 index 000000000..83235c0fa --- /dev/null +++ b/content/handbook_2e/examples/22 Motion/Ex_01/Ex_01.pde @@ -0,0 +1,18 @@ +float y = 50.0; +float speed = 1.0; +float radius = 15.0; + +void setup() { + size(100, 100); + noStroke(); + ellipseMode(RADIUS); +} + +void draw() { + background(0); + ellipse(33, y, radius, radius); + y = y + speed; + if (y > height+radius) { + y = -radius; + } +} diff --git a/content/handbook_2e/examples/22 Motion/Ex_02/Ex_02.pde b/content/handbook_2e/examples/22 Motion/Ex_02/Ex_02.pde new file mode 100644 index 000000000..63dab0d53 --- /dev/null +++ b/content/handbook_2e/examples/22 Motion/Ex_02/Ex_02.pde @@ -0,0 +1,21 @@ +float y = 50.0; +float speed = 1.0; +float radius = 15.0; +int direction = 1; + +void setup() { + size(100, 100); + noStroke(); + ellipseMode(RADIUS); +} + +void draw() { + fill(0, 12); + rect(0, 0, width, height); + fill(255); + ellipse(33, y, radius, radius); + y += speed * direction; + if ((y > height-radius) || (y < radius)) { + direction = -direction; + } +} diff --git a/content/handbook_2e/examples/22 Motion/Ex_03/Ex_03.pde b/content/handbook_2e/examples/22 Motion/Ex_03/Ex_03.pde new file mode 100644 index 000000000..179c90d8c --- /dev/null +++ b/content/handbook_2e/examples/22 Motion/Ex_03/Ex_03.pde @@ -0,0 +1,28 @@ +float x = 50.0; // X-coordinate +float y = 50.0; // Y-coordinate +float radius = 15.0; // Radius of the circle +float speedX = 1.0; // Speed of motion on the x-axis +float speedY = 0.4; // Speed of motion on the y-axis +int directionX = 1; // Direction of motion on the x-axis +int directionY = -1; // Direction of motion on the y-axis + +void setup() { + size(100, 100); + noStroke(); + ellipseMode(RADIUS); +} + +void draw() { + fill(0, 12); + rect(0, 0, width, height); + fill(255); + ellipse(x, y, radius, radius); + x += speedX * directionX; + if ((x > width-radius) || (x < radius)) { + directionX = -directionX; // Change direction + } + y += speedY * directionY; + if ((y > height-radius) || (y < radius)) { + directionY = -directionY; // Change direction + } +} diff --git a/content/handbook_2e/examples/22 Motion/Ex_04/Ex_04.pde b/content/handbook_2e/examples/22 Motion/Ex_04/Ex_04.pde new file mode 100644 index 000000000..dbface58a --- /dev/null +++ b/content/handbook_2e/examples/22 Motion/Ex_04/Ex_04.pde @@ -0,0 +1,20 @@ +float d = 20.0; +float speed = 1.0; +int direction = 1; + +void setup() { + size(100, 100); + noStroke(); + fill(255, 204); +} +void draw() { + background(0); + ellipse(0, 50, d, d); + ellipse(100, 50, d, d); + ellipse(50, 0, d, d); + ellipse(50, 100, d, d); + d += speed * direction; + if ((d > width) || (d < width/10)) { + direction = -direction; + } +} diff --git a/content/handbook_2e/examples/22 Motion/Ex_05/Ex_05.pde b/content/handbook_2e/examples/22 Motion/Ex_05/Ex_05.pde new file mode 100644 index 000000000..44e592edb --- /dev/null +++ b/content/handbook_2e/examples/22 Motion/Ex_05/Ex_05.pde @@ -0,0 +1,29 @@ +float beginX = 20.0; // Initial x-coordinate +float beginY = 10.0; // Initial y-coordinate +float endX = 70.0; // Final x-coordinate +float endY = 80.0; // Final y-coordinate +float distX; // X-axis distance to move +float distY; // Y-axis distance to move +float x = 0.0; // Current x-coordinate +float y = 0.0; // Current y-coordinate +float step = 0.02; // Size of each step (0.0 to 1.0) +float pct = 0.0; // Percentage traveled (0.0 to 1.0) + +void setup() { + size(100, 100); + noStroke(); + distX = endX - beginX; + distY = endY - beginY; +} + +void draw() { + fill(0, 12); + rect(0, 0, width, height); + pct += step; + if (pct < 1.0) { + x = beginX + (pct * distX); + y = beginY + (pct * distY); + } + fill(255); + ellipse(x, y, 20, 20); +} diff --git a/content/handbook_2e/examples/22 Motion/Ex_06/Ex_06.pde b/content/handbook_2e/examples/22 Motion/Ex_06/Ex_06.pde new file mode 100644 index 000000000..18ef9b8a7 --- /dev/null +++ b/content/handbook_2e/examples/22 Motion/Ex_06/Ex_06.pde @@ -0,0 +1,22 @@ +float x = 20.0; // Initial x-coordinate +float y = 10.0; // Initial y-coordinate +float endX = 70.0; // Destination x-coordinate +float endY = 80.0; // Destination y-coordinate +float easing = 0.05; // Size of each step along the path + +void setup() { + size(100, 100); + noStroke(); +} + +void draw() { + fill(0, 12); + rect(0, 0, width, height); + float d = dist(x, y, endX, endY); + if (d > 1.0) { + x += (endX - x) * easing; + y += (endY - y) * easing; + } + fill(255); + ellipse(x, y, 20, 20); +} diff --git a/content/handbook_2e/examples/22 Motion/Ex_07/Ex_07.pde b/content/handbook_2e/examples/22 Motion/Ex_07/Ex_07.pde new file mode 100644 index 000000000..2a1119791 --- /dev/null +++ b/content/handbook_2e/examples/22 Motion/Ex_07/Ex_07.pde @@ -0,0 +1,30 @@ +float beginX = 20.0; // Initial x-coordinate +float beginY = 10.0; // Initial y-coordinate +float endX = 70.0; // Final x-coordinate +float endY = 80.0; // Final y-coordinate +float distX; // X-axis distance to move +float distY; // Y-axis distance to move +float exponent = 0.5; // Determines the curve +float x = 0.0; // Current x-coordinate +float y = 0.0; // Current y-coordinate +float step = 0.01; // Size of each step along the path +float pct = 0.0; // Percentage traveled (0.0 to 1.0) + +void setup() { + size(100, 100); + noStroke(); + distX = endX - beginX; + distY = endY - beginY; +} + +void draw() { + fill(0, 2); + rect(0, 0, width, height); + pct += step; + if (pct < 1.0) { + x = beginX + (pct * distX); + y = beginY + (pow(pct, exponent) * distY); + } + fill(255); + ellipse(x, y, 20, 20); +} diff --git a/content/handbook_2e/examples/22 Motion/Ex_08/Ex_08.pde b/content/handbook_2e/examples/22 Motion/Ex_08/Ex_08.pde new file mode 100644 index 000000000..feeb37c3a --- /dev/null +++ b/content/handbook_2e/examples/22 Motion/Ex_08/Ex_08.pde @@ -0,0 +1,39 @@ +float beginX = 20.0; // Initial x-coordinate +float beginY = 10.0; // Initial y-coordinate +float endX = 70.0; // Final x-coordinate +float endY = 80.0; // Final y-coordinate +float distX; // X-axis distance to move +float distY; // Y-axis distance to move +float exponent = 3.0; // Determines the curve +float x = 0.0; // Current x-coordinate +float y = 0.0; // Current y-coordinate +float step = 0.01; // Size of each step along the path +float pct = 0.0; // Percentage traveled (0.0 to 1.0) +int direction = 1; + +void setup() { + size(100, 100); + noStroke(); + distX = endX - beginX; + distY = endY - beginY; +} + +void draw() { + fill(0, 2); + rect(0, 0, width, height); + pct += step * direction; + if ((pct > 1.0) || (pct < 0.0)) { + direction = direction * -1; + } + if (direction == 1) { + x = beginX + (pct * distX); + float e = pow(pct, exponent); + y = beginY + (e * distY); + } else { + x = beginX + (pct * distX); + float e = pow(1.0-pct, exponent*2); + y = beginY + (e * -distY) + distY; + } + fill(255); + ellipse(x, y, 20, 20); +} diff --git a/content/handbook_2e/examples/22 Motion/Ex_09/Ex_09.pde b/content/handbook_2e/examples/22 Motion/Ex_09/Ex_09.pde new file mode 100644 index 000000000..13f59d87f --- /dev/null +++ b/content/handbook_2e/examples/22 Motion/Ex_09/Ex_09.pde @@ -0,0 +1,39 @@ +float beginX = 20.0; // Initial x-coordinate +float beginY = 10.0; // Initial y-coordinate +float endX = 70.0; // Final x-coordinate +float endY = 80.0; // Final y-coordinate +float distX; // X-axis distance to move +float distY; // Y-axis distance to move +float exponent = 3.0; // Determines the curve +float x = 0.0; // Current x-coordinate +float y = 0.0; // Current y-coordinate +float step = 0.01; // Size of each step along the path +float pct = 0.0; // Percentage traveled (0.0 to 1.0) + +void setup() { + size(100, 100); + noStroke(); + distX = endX - beginX; + distY = endY - beginY; +} + +void draw() { + fill(0, 2); + rect(0, 0, width, height); + if (pct < 1.0) { + pct = pct + step; + float rate = pow(pct, exponent); + x = beginX + (rate * distX); + y = beginY + (rate * distY); + } + fill(255); + ellipse(x, y, 20, 20); +} + +void mousePressed() { + pct = 0.0; + beginX = x; + beginY = y; + distX = mouseX - x; + distY = mouseY - y; +} diff --git a/content/handbook_2e/examples/22 Motion/Ex_10/Ex_10.pde b/content/handbook_2e/examples/22 Motion/Ex_10/Ex_10.pde new file mode 100644 index 000000000..37dd0697d --- /dev/null +++ b/content/handbook_2e/examples/22 Motion/Ex_10/Ex_10.pde @@ -0,0 +1,18 @@ +float angle = 0.0; // Current angle +float speed = 0.1; // Speed of motion +float radius = 60.0; // Range of motion + +void setup() { + size(100, 100); + noStroke(); +} + +void draw() { + fill(0, 12); + rect(0, 0, width, height); + fill(255); + angle += speed; + float sinval = sin(angle); + float yoffset = sinval * radius; + ellipse(50, 50 + yoffset, 80, 80); +} diff --git a/content/handbook_2e/examples/22 Motion/Ex_11/Ex_11.pde b/content/handbook_2e/examples/22 Motion/Ex_11/Ex_11.pde new file mode 100644 index 000000000..3ec64da3f --- /dev/null +++ b/content/handbook_2e/examples/22 Motion/Ex_11/Ex_11.pde @@ -0,0 +1,29 @@ +float angle = 0.0; // Current angle +float speed = 0.05; // Speed of motion +float radius = 30.0; // Range of motion +float sx = 2.0; +float sy = 2.0; + +void setup() { + size(100, 100); + noStroke(); +} + +void draw() { + fill(0, 4); + rect(0, 0, width, height); + angle += speed; // Update the angle + float sinval = sin(angle); + float cosval = cos(angle); + // Set the position of the small circle based on new + // values from sine and cosine + float x = 50 + (cosval * radius); + float y = 50 + (sinval * radius); + fill(255); + ellipse(x, y, 2, 2); // Draw smaller circle + // Set the position of the large circles based on the + // new position of the small circle + float x2 = x + cos(angle * sx) * radius/2; + float y2 = y + sin(angle * sy) * radius/2; + ellipse(x2, y2, 6, 6); // Draw larger circle +} diff --git a/content/handbook_2e/examples/22 Motion/Ex_12/Ex_12.pde b/content/handbook_2e/examples/22 Motion/Ex_12/Ex_12.pde new file mode 100644 index 000000000..fc42c335f --- /dev/null +++ b/content/handbook_2e/examples/22 Motion/Ex_12/Ex_12.pde @@ -0,0 +1,15 @@ +float angle = 0.0; +float speed = 0.1; + +void setup() { + size(100, 100); + noStroke(); +} + +void draw() { + background(0); + angle = angle + speed; + ellipse(50 + (sin(angle + PI) * 5), 25, 30, 30); + ellipse(50 + (sin(angle + HALF_PI) * 5), 55, 30, 30); + ellipse(50 + (sin(angle + QUARTER_PI) * 5), 85, 30, 30); +} diff --git a/content/handbook_2e/examples/22 Motion/Ex_13/Ex_13.pde b/content/handbook_2e/examples/22 Motion/Ex_13/Ex_13.pde new file mode 100644 index 000000000..a4c37d5f4 --- /dev/null +++ b/content/handbook_2e/examples/22 Motion/Ex_13/Ex_13.pde @@ -0,0 +1,19 @@ +float angle = 0.0; +float speed = 0.05; + +void setup() { + size(100, 100); + noStroke(); + fill(255, 180); +} + +void draw() { + background(0); + float d1 = 65 + (sin(angle) * 45); + ellipse(50, 50, d1, d1); + float d2 = 65 + (sin(angle + QUARTER_PI) * 45); + ellipse(50, 50, d2, d2); + float d3 = 65 + (sin(angle + HALF_PI) * 45); + ellipse(50, 50, d3, d3); + angle += speed; +} diff --git a/content/handbook_2e/examples/22 Motion/Ex_14/Ex_14.pde b/content/handbook_2e/examples/22 Motion/Ex_14/Ex_14.pde new file mode 100644 index 000000000..b25573efe --- /dev/null +++ b/content/handbook_2e/examples/22 Motion/Ex_14/Ex_14.pde @@ -0,0 +1,16 @@ +float x = 50.0; // X-coordinate +float y = 80.0; // Y-coordinate + +void setup() { + size(100, 100); + randomSeed(0); // Force the same random values + background(0); + stroke(255); + strokeWeight(2); +} + +void draw() { + x += random(-2, 2); // Assign new x-coordinate + y += random(-2, 2); // Assign new y-coordinate + point(x, y); +} diff --git a/content/handbook_2e/examples/22 Motion/Ex_15/Ex_15.pde b/content/handbook_2e/examples/22 Motion/Ex_15/Ex_15.pde new file mode 100644 index 000000000..02d8b02f3 --- /dev/null +++ b/content/handbook_2e/examples/22 Motion/Ex_15/Ex_15.pde @@ -0,0 +1,20 @@ +float x = 0.0; // X-coordinate +float y = 50.0; // Y-coordinate +float angle = 0.0; // Direction of motion +float speed = 0.5; // Speed of motion + +void setup() { + size(100, 100); + background(0); + stroke(255, 130); + randomSeed(121); // Force the same random values +} + +void draw() { + angle += random(-0.3, 0.3); + x += cos(angle) * speed; // Update x-coordinate + y += sin(angle) * speed; // Update y-coordinate + translate(x, y); + rotate(angle); + line(0, -10, 0, 10); +} diff --git a/content/handbook_2e/examples/22 Motion/Ex_16/Ex_16.pde b/content/handbook_2e/examples/22 Motion/Ex_16/Ex_16.pde new file mode 100644 index 000000000..c7e908b1a --- /dev/null +++ b/content/handbook_2e/examples/22 Motion/Ex_16/Ex_16.pde @@ -0,0 +1,20 @@ +float inc1 = 0.1; +float n1 = 0.0; +float inc2 = 0.09; +float n2 = 0.0; + +void setup() { + size(100, 100); + stroke(255); + strokeWeight(40); +} + +void draw() { + background(0); + float y1 = (noise(n1) - 0.5) * 30.0; // Values -15 to 15 + float y2 = (noise(n2) - 0.5) * 30.0; // Values -15 to 15 + line(0, 50, 30, 50 + y1); + line(100, 50, 70, 50 + y2); + n1 += inc1; + n2 += inc2; +} diff --git a/content/handbook_2e/examples/22 Motion/Ex_17/Ex_17.pde b/content/handbook_2e/examples/22 Motion/Ex_17/Ex_17.pde new file mode 100644 index 000000000..e9a5eeed4 --- /dev/null +++ b/content/handbook_2e/examples/22 Motion/Ex_17/Ex_17.pde @@ -0,0 +1,24 @@ +float inc = 0.06; +int density = 4; +float znoise = 0.0; + +void setup() { + size(100, 100); + noStroke(); +} + +void draw() { + float xnoise = 0.0; + float ynoise = 0.0; + for (int y = 0; y < height; y += density) { + for (int x = 0; x < width; x += density) { + float n = noise(xnoise, ynoise, znoise) * 256; + fill(n); + rect(y, x, density, density); + xnoise += inc; + } + xnoise = 0; + ynoise += inc; + } + znoise += inc; +} diff --git a/content/handbook_2e/examples/22 Motion/Ex_18/Ex_18.pde b/content/handbook_2e/examples/22 Motion/Ex_18/Ex_18.pde new file mode 100644 index 000000000..601f82541 --- /dev/null +++ b/content/handbook_2e/examples/22 Motion/Ex_18/Ex_18.pde @@ -0,0 +1,24 @@ +PFont font; +float x1 = 0; +float x2 = 100; + +void setup() { + size(100, 100); + font = createFont("SourceCodePro-Light.otf", 36); + textFont(font); + fill(0); +} + +void draw() { + background(204); + text("Right", x1, 50); + text("Left", x2, 75); + x1 += 1.0; + if (x1 > 100) { + x1 = -150; + } + x2 -= 0.8; + if (x2 < -150) { + x2 = 100; + } +} diff --git a/content/handbook_2e/examples/22 Motion/Ex_18/data/SourceCodePro-Light.otf b/content/handbook_2e/examples/22 Motion/Ex_18/data/SourceCodePro-Light.otf new file mode 100644 index 000000000..f624ee1c6 Binary files /dev/null and b/content/handbook_2e/examples/22 Motion/Ex_18/data/SourceCodePro-Light.otf differ diff --git a/content/handbook_2e/examples/22 Motion/Ex_19/Ex_19.pde b/content/handbook_2e/examples/22 Motion/Ex_19/Ex_19.pde new file mode 100644 index 000000000..d16e5faae --- /dev/null +++ b/content/handbook_2e/examples/22 Motion/Ex_19/Ex_19.pde @@ -0,0 +1,15 @@ +PFont font; + +void setup() { + size(100, 100); + font = createFont("SourceCodePro-Light.otf", 24); + textFont(font); + noStroke(); +} + +void draw() { + fill(204, 24); + rect(0, 0, width, height); + fill(0); + text("flicker", random(-100, 100), random(-20, 120)); +} diff --git a/content/handbook_2e/examples/22 Motion/Ex_19/data/SourceCodePro-Light.otf b/content/handbook_2e/examples/22 Motion/Ex_19/data/SourceCodePro-Light.otf new file mode 100644 index 000000000..f624ee1c6 Binary files /dev/null and b/content/handbook_2e/examples/22 Motion/Ex_19/data/SourceCodePro-Light.otf differ diff --git a/content/handbook_2e/examples/22 Motion/Ex_20/Ex_20.pde b/content/handbook_2e/examples/22 Motion/Ex_20/Ex_20.pde new file mode 100644 index 000000000..fac3770d3 --- /dev/null +++ b/content/handbook_2e/examples/22 Motion/Ex_20/Ex_20.pde @@ -0,0 +1,19 @@ +PFont font; +int opacity = 0; +int direction = 1; + +void setup() { + size(100, 100); + font = createFont("SourceCodePro-Light.otf", 24); + textFont(font); +} + +void draw() { + background(204); + opacity += 2 * direction; + if ((opacity < 0) || (opacity > 255)) { + direction = -direction; + } + fill(0, opacity); + text("FADE", 4, 60); +} diff --git a/content/handbook_2e/examples/22 Motion/Ex_20/data/SourceCodePro-Light.otf b/content/handbook_2e/examples/22 Motion/Ex_20/data/SourceCodePro-Light.otf new file mode 100644 index 000000000..f624ee1c6 Binary files /dev/null and b/content/handbook_2e/examples/22 Motion/Ex_20/data/SourceCodePro-Light.otf differ diff --git a/content/handbook_2e/examples/22 Motion/Ex_21/Ex_21.pde b/content/handbook_2e/examples/22 Motion/Ex_21/Ex_21.pde new file mode 100644 index 000000000..d2ecf17b8 --- /dev/null +++ b/content/handbook_2e/examples/22 Motion/Ex_21/Ex_21.pde @@ -0,0 +1,21 @@ +PFont font; +String s = "VERTIGO"; +float angle = 0.0; + +void setup() { + size(100, 100); + font = createFont("SourceCodePro-Light.otf", 60); + textFont(font); + fill(0); +} + +void draw() { + background(204); + angle += 0.02; + pushMatrix(); + translate(33, 50); + scale((cos(angle/4.0) + 1.2) * 2.0); + rotate(angle); + text(s, 0, 0); + popMatrix(); +} diff --git a/content/handbook_2e/examples/22 Motion/Ex_21/data/SourceCodePro-Light.otf b/content/handbook_2e/examples/22 Motion/Ex_21/data/SourceCodePro-Light.otf new file mode 100644 index 000000000..f624ee1c6 Binary files /dev/null and b/content/handbook_2e/examples/22 Motion/Ex_21/data/SourceCodePro-Light.otf differ diff --git a/content/handbook_2e/examples/22 Motion/Ex_22/Ex_22.pde b/content/handbook_2e/examples/22 Motion/Ex_22/Ex_22.pde new file mode 100644 index 000000000..35402db5e --- /dev/null +++ b/content/handbook_2e/examples/22 Motion/Ex_22/Ex_22.pde @@ -0,0 +1,21 @@ +PFont font; +String[] words = { "Three", "strikes", "and", "youʼre", "out...", " " }; +int whichWord = 0; + +void setup() { + size(100, 100); + font = createFont("SourceCodePro-Light.otf", 22); + textFont(font); + textAlign(CENTER); + frameRate(4); + fill(0); +} + +void draw() { + background(204); + text(words[whichWord], width/2, 55); + whichWord++; + if (whichWord == words.length) { + whichWord = 0; + } +} diff --git a/content/handbook_2e/examples/22 Motion/Ex_22/data/SourceCodePro-Light.otf b/content/handbook_2e/examples/22 Motion/Ex_22/data/SourceCodePro-Light.otf new file mode 100644 index 000000000..f624ee1c6 Binary files /dev/null and b/content/handbook_2e/examples/22 Motion/Ex_22/data/SourceCodePro-Light.otf differ diff --git a/content/handbook_2e/examples/22 Motion/Ex_23/Ex_23.pde b/content/handbook_2e/examples/22 Motion/Ex_23/Ex_23.pde new file mode 100644 index 000000000..c351855de --- /dev/null +++ b/content/handbook_2e/examples/22 Motion/Ex_23/Ex_23.pde @@ -0,0 +1,20 @@ +PFont font; +String s = "AREA"; +float angle = 0.0; + +void setup() { + size(100, 100); + font = createFont("SourceCodePro-Light.otf", 48); + textFont(font); + fill(0); +} + +void draw() { + background(204); + angle += 0.05; + for (int i = 0; i < s.length(); i++) { + float c = sin(angle + i/PI); + textSize((c + 1.0) * 15 + 10); + text(s.charAt(i), i*20, 60); + } +} diff --git a/content/handbook_2e/examples/22 Motion/Ex_23/data/SourceCodePro-Light.otf b/content/handbook_2e/examples/22 Motion/Ex_23/data/SourceCodePro-Light.otf new file mode 100644 index 000000000..f624ee1c6 Binary files /dev/null and b/content/handbook_2e/examples/22 Motion/Ex_23/data/SourceCodePro-Light.otf differ diff --git a/content/handbook_2e/examples/23 Time/Ex_01/Ex_01.pde b/content/handbook_2e/examples/23 Time/Ex_01/Ex_01.pde new file mode 100644 index 000000000..670462de0 --- /dev/null +++ b/content/handbook_2e/examples/23 Time/Ex_01/Ex_01.pde @@ -0,0 +1,4 @@ +int s = second(); // Returns values from 0 to 59 +int m = minute(); // Returns values from 0 to 59 +int h = hour(); // Returns values from 0 to 23 +println(h + ":" + m + ":" + s); // Prints the time to the console diff --git a/content/handbook_2e/examples/23 Time/Ex_02/Ex_02.pde b/content/handbook_2e/examples/23 Time/Ex_02/Ex_02.pde new file mode 100644 index 000000000..7150d8979 --- /dev/null +++ b/content/handbook_2e/examples/23 Time/Ex_02/Ex_02.pde @@ -0,0 +1,16 @@ +int lastSecond = 0; + +void setup() { + size(100, 100); +} + +void draw() { + int s = second(); + int m = minute(); + int h = hour(); + // Only prints once when the second changes + if (s != lastSecond) { + println(h + ":" + m + ":" + s); + lastSecond = s; + } +} diff --git a/content/handbook_2e/examples/23 Time/Ex_03/Ex_03.pde b/content/handbook_2e/examples/23 Time/Ex_03/Ex_03.pde new file mode 100644 index 000000000..1ef295651 --- /dev/null +++ b/content/handbook_2e/examples/23 Time/Ex_03/Ex_03.pde @@ -0,0 +1,18 @@ +PFont font; + +void setup() { + size(100, 100); + font = createFont("mono", 16); + textFont(font); + textAlign(CENTER); +} + +void draw() { + background(0); + int s = second(); + int m = minute(); + int h = hour(); + // The nf() function spaces the numbers nicely + String t = nf(h,2) + ":" + nf(m,2) + ":" + nf(s,2); + text(t, 50, 55); +} diff --git a/content/handbook_2e/examples/23 Time/Ex_04/Ex_04.pde b/content/handbook_2e/examples/23 Time/Ex_04/Ex_04.pde new file mode 100644 index 000000000..51a9f5210 --- /dev/null +++ b/content/handbook_2e/examples/23 Time/Ex_04/Ex_04.pde @@ -0,0 +1,15 @@ +void setup() { + size(100, 100); + noSmooth(); + stroke(255); +} + +void draw() { + background(0); + float s = map(second(), 0, 59, 0, 99); + float m = map(minute(), 0, 59, 0, 99); + float h = map(hour(), 0, 23, 0, 99); + line(s, 0, s, 33); + line(m, 34, m, 66); + line(h, 67, h, 100); +} diff --git a/content/handbook_2e/examples/23 Time/Ex_05/Ex_05.pde b/content/handbook_2e/examples/23 Time/Ex_05/Ex_05.pde new file mode 100644 index 000000000..b3d01cd5b --- /dev/null +++ b/content/handbook_2e/examples/23 Time/Ex_05/Ex_05.pde @@ -0,0 +1,20 @@ +void setup() { + size(100, 100); + stroke(255); +} + +void draw() { + background(0); + fill(80); + noStroke(); + // Angles for sin() and cos() start at 3 o'clock; + // subtract HALF_PI to make them start at the top + ellipse(50, 50, 80, 80); + float s = map(second(), 0, 60, 0, TWO_PI) - HALF_PI; + float m = map(minute(), 0, 60, 0, TWO_PI) - HALF_PI; + float h = map(hour() % 12, 0, 12, 0, TWO_PI) - HALF_PI; + stroke(255); + line(50, 50, cos(s)*38 + 50, sin(s)*38 + 50); + line(50, 50, cos(m)*30 + 50, sin(m)*30 + 50); + line(50, 50, cos(h)*25 + 50, sin(h)*25 + 50); +} diff --git a/content/handbook_2e/examples/23 Time/Ex_06/Ex_06.pde b/content/handbook_2e/examples/23 Time/Ex_06/Ex_06.pde new file mode 100644 index 000000000..9dfadf5c8 --- /dev/null +++ b/content/handbook_2e/examples/23 Time/Ex_06/Ex_06.pde @@ -0,0 +1,12 @@ +int x = 0; + +void setup() { + size(100, 100); +} + +void draw() { + if (millis() > 3000) { + x++; + } + line(x, 0, x, 100); +} diff --git a/content/handbook_2e/examples/23 Time/Ex_07/Ex_07.pde b/content/handbook_2e/examples/23 Time/Ex_07/Ex_07.pde new file mode 100644 index 000000000..102fef2b0 --- /dev/null +++ b/content/handbook_2e/examples/23 Time/Ex_07/Ex_07.pde @@ -0,0 +1,29 @@ +int mode = 0; +int nextTime = 0; +int timer = 1000; + +void setup() { + size(100, 100); + nextTime = millis() + timer; + noFill(); + stroke(255); +} + +void draw() { + background(0); + if (mode == 0) { + line(10, 10, 90, 90); + } else if (mode == 1) { + ellipse(50, 50, 80, 80); + } else if (mode == 2) { + rect(10, 10, 80, 80); + } + + if (millis() > nextTime) { + mode++; + if (mode > 2) { + mode = 0; + } + nextTime = millis() + timer; + } +} diff --git a/content/handbook_2e/examples/23 Time/Ex_08/Ex_08.pde b/content/handbook_2e/examples/23 Time/Ex_08/Ex_08.pde new file mode 100644 index 000000000..482adf028 --- /dev/null +++ b/content/handbook_2e/examples/23 Time/Ex_08/Ex_08.pde @@ -0,0 +1,13 @@ +int x = 0; + +void setup() { + size(100, 100); +} + +void draw() { + float sec = millis() / 1000.0; + if (sec > 3.0) { + x++; + } + line(x, 0, x, 100); +} diff --git a/content/handbook_2e/examples/23 Time/Ex_09/Ex_09.pde b/content/handbook_2e/examples/23 Time/Ex_09/Ex_09.pde new file mode 100644 index 000000000..b752aed75 --- /dev/null +++ b/content/handbook_2e/examples/23 Time/Ex_09/Ex_09.pde @@ -0,0 +1,4 @@ +int d = day(); // Returns values from 1 to 31 +int m = month(); // Returns values from 1 to 12 +int y = year(); // Returns four-digit year (2007, 2008, etc.) +println(y + " " + m + " " + d); diff --git a/content/handbook_2e/examples/23 Time/Ex_10/Ex_10.pde b/content/handbook_2e/examples/23 Time/Ex_10/Ex_10.pde new file mode 100644 index 000000000..d68bf6929 --- /dev/null +++ b/content/handbook_2e/examples/23 Time/Ex_10/Ex_10.pde @@ -0,0 +1,6 @@ +void draw() { + int d = day(); // Values from 1 to 31 + if (d == 1) { + println("Welcome to a new month!"); + } +} diff --git a/content/handbook_2e/examples/23 Time/Ex_11/Ex_11.pde b/content/handbook_2e/examples/23 Time/Ex_11/Ex_11.pde new file mode 100644 index 000000000..3b21e84ec --- /dev/null +++ b/content/handbook_2e/examples/23 Time/Ex_11/Ex_11.pde @@ -0,0 +1,7 @@ +void draw() { + int d = day(); // Values from 1 to 31 + int m = month(); // Values from 1 to 12 + if ((d == 1) && (m == 1)) { + println("Today is the first day of the year!"); + } +} diff --git a/content/handbook_2e/examples/24 Functions/EX_05/EX_05.pde b/content/handbook_2e/examples/24 Functions/EX_05/EX_05.pde new file mode 100644 index 000000000..c34bf85c5 --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/EX_05/EX_05.pde @@ -0,0 +1,22 @@ +void setup() { + size(100, 100); +} + +void draw() { + background(204); + // Draw thick, light gray X + stroke(160); + strokeWeight(20); + line(0, 5, 60, 65); + line(60, 5, 0, 65); + // Draw medium, black X + stroke(0); + strokeWeight(10); + line(30, 20, 90, 80); + line(90, 20, 30, 80); + // Draw thin, white X + stroke(255); + strokeWeight(2); + line(20, 38, 80, 98); + line(80, 38, 20, 98); +} diff --git a/content/handbook_2e/examples/24 Functions/Ex_01/Ex_01.pde b/content/handbook_2e/examples/24 Functions/Ex_01/Ex_01.pde new file mode 100644 index 000000000..753e8656c --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/Ex_01/Ex_01.pde @@ -0,0 +1,15 @@ +void setup() { + size(100, 100); + noStroke(); +} + +void draw() { + background(204); + fill(255); + ellipse(50, 50, 60, 60); // White circle + fill(0); + ellipse(50+10, 50, 30, 30); // Black circle + fill(255); + ellipse(50+16, 45, 6, 6); // Small, white circle +} + diff --git a/content/handbook_2e/examples/24 Functions/Ex_02/Ex_02.pde b/content/handbook_2e/examples/24 Functions/Ex_02/Ex_02.pde new file mode 100644 index 000000000..fe4d1e356 --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/Ex_02/Ex_02.pde @@ -0,0 +1,22 @@ +void setup() { + size(100, 100); + noStroke(); +} + +void draw() { + background(204); + // Right shape + fill(255); + ellipse(65, 44, 60, 60); + fill(0); + ellipse(75, 44, 30, 30); + fill(255); + ellipse(81, 39, 6, 6); + // Left shape + fill(255); + ellipse(20, 50, 60, 60); + fill(0); + ellipse(30, 50, 30, 30); + fill(255); + ellipse(36, 45, 6, 6); +} diff --git a/content/handbook_2e/examples/24 Functions/Ex_03/Ex_03.pde b/content/handbook_2e/examples/24 Functions/Ex_03/Ex_03.pde new file mode 100644 index 000000000..9e6bfe4ba --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/Ex_03/Ex_03.pde @@ -0,0 +1,19 @@ +void setup() { + size(100, 100); + noStroke(); +} + +void draw() { + background(204); + eye(65, 44); + eye(20, 50); +} + +void eye(int x, int y) { + fill(255); + ellipse(x, y, 60, 60); + fill(0); + ellipse(x+10, y, 30, 30); + fill(255); + ellipse(x+16, y-5, 6, 6); +} diff --git a/content/handbook_2e/examples/24 Functions/Ex_04/Ex_04.pde b/content/handbook_2e/examples/24 Functions/Ex_04/Ex_04.pde new file mode 100644 index 000000000..7215caa62 --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/Ex_04/Ex_04.pde @@ -0,0 +1,23 @@ +void setup() { + size(100, 100); + noStroke(); +} + +void draw() { + background(204); + eye(65, 44); + eye(20, 50); + eye(65, 74); + eye(20, 80); + eye(65, 104); + eye(20, 110); +} + +void eye(int x, int y) { + fill(255); + ellipse(x, y, 60, 60); + fill(0); + ellipse(x+10, y, 30, 30); + fill(255); + ellipse(x+16, y-5, 6, 6); +} diff --git a/content/handbook_2e/examples/24 Functions/Ex_06/Ex_06.pde b/content/handbook_2e/examples/24 Functions/Ex_06/Ex_06.pde new file mode 100644 index 000000000..ae7cc95ef --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/Ex_06/Ex_06.pde @@ -0,0 +1,16 @@ +void setup() { + size(100, 100); +} + +void draw() { + drawX(); +} + +void drawX() { + background(204); + // Draw thick, light gray X + stroke(160); + strokeWeight(20); + line(0, 5, 60, 65); + line(60, 5, 0, 65); +} diff --git a/content/handbook_2e/examples/24 Functions/Ex_07/Ex_07.pde b/content/handbook_2e/examples/24 Functions/Ex_07/Ex_07.pde new file mode 100644 index 000000000..2cb37d5fc --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/Ex_07/Ex_07.pde @@ -0,0 +1,15 @@ +void setup() { + size(100, 100); +} + +void draw() { + background(204); + drawX(0); // Passes 0 to drawX(), runs drawX() +} + +void drawX(int gray) { // Declares and assigns gray + stroke(gray); // Uses gray to set the stroke + strokeWeight(20); + line(0, 5, 60, 65); + line(60, 5, 0, 65); +} diff --git a/content/handbook_2e/examples/24 Functions/Ex_08/Ex_08.pde b/content/handbook_2e/examples/24 Functions/Ex_08/Ex_08.pde new file mode 100644 index 000000000..65ff2b2e7 --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/Ex_08/Ex_08.pde @@ -0,0 +1,15 @@ +void setup() { + size(100, 100); +} + +void draw() { + background(204); + drawX(0, 30); // Passes values to drawX(), runs drawX() +} + +void drawX(int gray, int weight) { + stroke(gray); + strokeWeight(weight); + line(0, 5, 60, 65); + line(60, 5, 0, 65); +} diff --git a/content/handbook_2e/examples/24 Functions/Ex_09/Ex_09.pde b/content/handbook_2e/examples/24 Functions/Ex_09/Ex_09.pde new file mode 100644 index 000000000..4337a7bec --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/Ex_09/Ex_09.pde @@ -0,0 +1,16 @@ +void setup() { + size(100, 100); +} + +void draw() { + background(204); + drawX(0, 30, 40, 30, 36); +} + +void drawX(int gray, int weight, int x, int y, int size) { + stroke(gray); + strokeWeight(weight); + line(x, y, x+size, y+size); + line(x+size, y, x, y+size); +} + diff --git a/content/handbook_2e/examples/24 Functions/Ex_10/Ex_10.pde b/content/handbook_2e/examples/24 Functions/Ex_10/Ex_10.pde new file mode 100644 index 000000000..1e8e461dc --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/Ex_10/Ex_10.pde @@ -0,0 +1,17 @@ +void setup() { + size(100, 100); +} + +void draw() { + background(204); + drawX(160, 20, 0, 5, 60); // Draw thick, light gray X + drawX(0, 10, 30, 20, 60); // Draw medium, black X + drawX(255, 2, 20, 38, 60); // Draw thin, white X +} + +void drawX(int gray, int weight, int x, int y, int size) { + stroke(gray); + strokeWeight(weight); + line(x, y, x+size, y+size); + line(x+size, y, x, y+size); +} diff --git a/content/handbook_2e/examples/24 Functions/Ex_11/Ex_11.pde b/content/handbook_2e/examples/24 Functions/Ex_11/Ex_11.pde new file mode 100644 index 000000000..2f3f4fde0 --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/Ex_11/Ex_11.pde @@ -0,0 +1,17 @@ +void setup() { + size(100, 100); +} + +void draw() { + background(204); + for (int i = 0; i < 20; i++) { + drawX(200- i*10, (20-i)*2, i, i/2, 70); + } +} + +void drawX(int gray, int weight, int x, int y, int size) { + stroke(gray); + strokeWeight(weight); + line(x, y, x+size, y+size); + line(x+size, y, x, y+size); +} diff --git a/content/handbook_2e/examples/24 Functions/Ex_12/Ex_12.pde b/content/handbook_2e/examples/24 Functions/Ex_12/Ex_12.pde new file mode 100644 index 000000000..8fb76bbf1 --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/Ex_12/Ex_12.pde @@ -0,0 +1,22 @@ +void setup() { + size(600, 100); + frameRate(4); +} + +void draw() { + background(204); + for (int i = 0; i < 70; i++) { // Draw 70 X shapes + int grayValue = int(random(255)); + int thickness = int(random(30)); + int x = int(random(-50, width)); + int y = int(random(-50, height)); + drawX(grayValue, thickness, x, y, 100); + } +} + +void drawX(int gray, int weight, int x, int y, int size) { + stroke(gray); + strokeWeight(weight); + line(x, y, x+size, y+size); + line(x+size, y, x, y+size); +} diff --git a/content/handbook_2e/examples/24 Functions/Ex_13/Ex_13.pde b/content/handbook_2e/examples/24 Functions/Ex_13/Ex_13.pde new file mode 100644 index 000000000..9e3820c9f --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/Ex_13/Ex_13.pde @@ -0,0 +1,21 @@ +void setup() { + size(100, 100); + noStroke(); +} + +void draw() { + background(0); + leaf(26, 83, 60, 1); +} + +void leaf(int x, int y, int size, int dir) { + pushMatrix(); + translate(x, y); // Move to position + scale(size); // Scale to size + beginShape(); // Draw the shape + vertex(1.0*dir, -0.7); + bezierVertex(1.0*dir, -0.7, 0.4*dir, -1.0, 0.0, 0.0); + bezierVertex(0.0, 0.0, 1.0*dir, 0.4, 1.0*dir, -0.7); + endShape(); + popMatrix(); +} diff --git a/content/handbook_2e/examples/24 Functions/Ex_14/Ex_14.pde b/content/handbook_2e/examples/24 Functions/Ex_14/Ex_14.pde new file mode 100644 index 000000000..8316160d7 --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/Ex_14/Ex_14.pde @@ -0,0 +1,35 @@ +void setup() { + size(100, 100); + frameRate(2); +} + +void draw() { + background(0); + int leaves = int(random(2, 15)); + vine(33, leaves, 16); +} + +void vine(int x, int numLeaves, int leafSize) { + stroke(255); + line(x, 0, x, height); + noStroke(); + int gap = height / numLeaves; + int direction = 1; + for (int i = 0; i < numLeaves; i++) { + int r = int(random(gap)); + leaf(x, gap*i + r, leafSize, direction); + direction = -direction; + } +} + +void leaf(int x, int y, int size, int dir) { + pushMatrix(); + translate(x, y); // Move to position + scale(size); // Scale to size + beginShape(); // Draw the shape + vertex(1.0*dir, -0.7); + bezierVertex(1.0*dir, -0.7, 0.4*dir, -1.0, 0.0, 0.0); + bezierVertex(0.0, 0.0, 1.0*dir, 0.4, 1.0*dir, -0.7); + endShape(); + popMatrix(); +} diff --git a/content/handbook_2e/examples/24 Functions/Ex_15/Ex_15.pde b/content/handbook_2e/examples/24 Functions/Ex_15/Ex_15.pde new file mode 100644 index 000000000..d9e2b05db --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/Ex_15/Ex_15.pde @@ -0,0 +1,26 @@ +void setup() { + size(100, 100); +} + +void draw() { + background(204); + drawX(255); // Run first drawX() + drawX(0, 2, 44, 48, 36); // Run second drawX() +} + +// Draw an X with the gray value set by the parameter +void drawX(int gray) { + stroke(gray); + strokeWeight(20); + line(0, 5, 60, 65); + line(60, 5, 0, 65); +} + +// Draw an X with the gray value, thickness, +// position, and size set by the parameters +void drawX(int gray, int weight, int x, int y, int s) { + stroke(gray); + strokeWeight(weight); + line(x, y, x+s, y+s); + line(x+s, y, x, y+s); +} diff --git a/content/handbook_2e/examples/24 Functions/Ex_16/Ex_16.pde b/content/handbook_2e/examples/24 Functions/Ex_16/Ex_16.pde new file mode 100644 index 000000000..eb493507c --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/Ex_16/Ex_16.pde @@ -0,0 +1,2 @@ +float d = random(0, 100); +ellipse(50, 50, d, d); diff --git a/content/handbook_2e/examples/24 Functions/Ex_17/Ex_17.pde b/content/handbook_2e/examples/24 Functions/Ex_17/Ex_17.pde new file mode 100644 index 000000000..c71cff813 --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/Ex_17/Ex_17.pde @@ -0,0 +1,2 @@ +int d = random(0, 100); // ERROR! random() returns a float +ellipse(50, 50, d, d); diff --git a/content/handbook_2e/examples/24 Functions/Ex_18/Ex_18.pde b/content/handbook_2e/examples/24 Functions/Ex_18/Ex_18.pde new file mode 100644 index 000000000..b935e80e4 --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/Ex_18/Ex_18.pde @@ -0,0 +1,2 @@ +int d = int(random(0, 100)); // int() converts the float value +ellipse(50, 50, d, d); diff --git a/content/handbook_2e/examples/24 Functions/Ex_19/Ex_19.pde b/content/handbook_2e/examples/24 Functions/Ex_19/Ex_19.pde new file mode 100644 index 000000000..405df6bfe --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/Ex_19/Ex_19.pde @@ -0,0 +1,9 @@ +void setup() { + float f = average(12.0, 6.0); // Assign 9.0 to f + println(f); +} + +float average(float num1, float num2) { + float av = (num1 + num2) / 2.0; + return av; +} diff --git a/content/handbook_2e/examples/24 Functions/Ex_20/Ex_20.pde b/content/handbook_2e/examples/24 Functions/Ex_20/Ex_20.pde new file mode 100644 index 000000000..25a150a4b --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/Ex_20/Ex_20.pde @@ -0,0 +1,9 @@ +void setup() { + float c = fahrenheitToCelsius(451.0); // Assign 232.77779 to c + println(c); +} + +float fahrenheitToCelsius(float t) { + float f = (t-32.0) * (5.0/9.0); + return f; +} diff --git a/content/handbook_2e/examples/24 Functions/Ex_21/Ex_21.pde b/content/handbook_2e/examples/24 Functions/Ex_21/Ex_21.pde new file mode 100644 index 000000000..ba44f8fcf --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/Ex_21/Ex_21.pde @@ -0,0 +1,7 @@ +size(120, 100); +int front = int(random(1, 10)); // Select the front card +int back = int(random(1, 10)); // Select the back card +PImage imgFront = loadImage(front + "f.jpg"); +PImage imgBack = loadImage(back + "b.jpg"); +image(imgFront, 0, 0); +image(imgBack, 60, 0); diff --git a/content/handbook_2e/examples/24 Functions/Ex_21/data/1b.jpg b/content/handbook_2e/examples/24 Functions/Ex_21/data/1b.jpg new file mode 100644 index 000000000..59ed7d851 Binary files /dev/null and b/content/handbook_2e/examples/24 Functions/Ex_21/data/1b.jpg differ diff --git a/content/handbook_2e/examples/24 Functions/Ex_21/data/1f.jpg b/content/handbook_2e/examples/24 Functions/Ex_21/data/1f.jpg new file mode 100644 index 000000000..35256c6ab Binary files /dev/null and b/content/handbook_2e/examples/24 Functions/Ex_21/data/1f.jpg differ diff --git a/content/handbook_2e/examples/24 Functions/Ex_21/data/2b.jpg b/content/handbook_2e/examples/24 Functions/Ex_21/data/2b.jpg new file mode 100644 index 000000000..85416542b Binary files /dev/null and b/content/handbook_2e/examples/24 Functions/Ex_21/data/2b.jpg differ diff --git a/content/handbook_2e/examples/24 Functions/Ex_21/data/2f.jpg b/content/handbook_2e/examples/24 Functions/Ex_21/data/2f.jpg new file mode 100644 index 000000000..f6c8bc2d0 Binary files /dev/null and b/content/handbook_2e/examples/24 Functions/Ex_21/data/2f.jpg differ diff --git a/content/handbook_2e/examples/24 Functions/Ex_21/data/3b.jpg b/content/handbook_2e/examples/24 Functions/Ex_21/data/3b.jpg new file mode 100644 index 000000000..40be055b8 Binary files /dev/null and b/content/handbook_2e/examples/24 Functions/Ex_21/data/3b.jpg differ diff --git a/content/handbook_2e/examples/24 Functions/Ex_21/data/3f.jpg b/content/handbook_2e/examples/24 Functions/Ex_21/data/3f.jpg new file mode 100644 index 000000000..607caff59 Binary files /dev/null and b/content/handbook_2e/examples/24 Functions/Ex_21/data/3f.jpg differ diff --git a/content/handbook_2e/examples/24 Functions/Ex_21/data/4b.jpg b/content/handbook_2e/examples/24 Functions/Ex_21/data/4b.jpg new file mode 100644 index 000000000..63c8f2a1d Binary files /dev/null and b/content/handbook_2e/examples/24 Functions/Ex_21/data/4b.jpg differ diff --git a/content/handbook_2e/examples/24 Functions/Ex_21/data/4f.jpg b/content/handbook_2e/examples/24 Functions/Ex_21/data/4f.jpg new file mode 100644 index 000000000..dbfb42def Binary files /dev/null and b/content/handbook_2e/examples/24 Functions/Ex_21/data/4f.jpg differ diff --git a/content/handbook_2e/examples/24 Functions/Ex_21/data/5b.jpg b/content/handbook_2e/examples/24 Functions/Ex_21/data/5b.jpg new file mode 100644 index 000000000..7983a0dc2 Binary files /dev/null and b/content/handbook_2e/examples/24 Functions/Ex_21/data/5b.jpg differ diff --git a/content/handbook_2e/examples/24 Functions/Ex_21/data/5f.jpg b/content/handbook_2e/examples/24 Functions/Ex_21/data/5f.jpg new file mode 100644 index 000000000..b3c8e7c7a Binary files /dev/null and b/content/handbook_2e/examples/24 Functions/Ex_21/data/5f.jpg differ diff --git a/content/handbook_2e/examples/24 Functions/Ex_21/data/6b.jpg b/content/handbook_2e/examples/24 Functions/Ex_21/data/6b.jpg new file mode 100644 index 000000000..205a146bd Binary files /dev/null and b/content/handbook_2e/examples/24 Functions/Ex_21/data/6b.jpg differ diff --git a/content/handbook_2e/examples/24 Functions/Ex_21/data/6f.jpg b/content/handbook_2e/examples/24 Functions/Ex_21/data/6f.jpg new file mode 100644 index 000000000..10da0841c Binary files /dev/null and b/content/handbook_2e/examples/24 Functions/Ex_21/data/6f.jpg differ diff --git a/content/handbook_2e/examples/24 Functions/Ex_21/data/7b.jpg b/content/handbook_2e/examples/24 Functions/Ex_21/data/7b.jpg new file mode 100644 index 000000000..d040e7e77 Binary files /dev/null and b/content/handbook_2e/examples/24 Functions/Ex_21/data/7b.jpg differ diff --git a/content/handbook_2e/examples/24 Functions/Ex_21/data/7f.jpg b/content/handbook_2e/examples/24 Functions/Ex_21/data/7f.jpg new file mode 100644 index 000000000..62d52cf04 Binary files /dev/null and b/content/handbook_2e/examples/24 Functions/Ex_21/data/7f.jpg differ diff --git a/content/handbook_2e/examples/24 Functions/Ex_21/data/8b.jpg b/content/handbook_2e/examples/24 Functions/Ex_21/data/8b.jpg new file mode 100644 index 000000000..fb8321d46 Binary files /dev/null and b/content/handbook_2e/examples/24 Functions/Ex_21/data/8b.jpg differ diff --git a/content/handbook_2e/examples/24 Functions/Ex_21/data/8f.jpg b/content/handbook_2e/examples/24 Functions/Ex_21/data/8f.jpg new file mode 100644 index 000000000..0315ab064 Binary files /dev/null and b/content/handbook_2e/examples/24 Functions/Ex_21/data/8f.jpg differ diff --git a/content/handbook_2e/examples/24 Functions/Ex_21/data/9b.jpg b/content/handbook_2e/examples/24 Functions/Ex_21/data/9b.jpg new file mode 100644 index 000000000..58ddc6b21 Binary files /dev/null and b/content/handbook_2e/examples/24 Functions/Ex_21/data/9b.jpg differ diff --git a/content/handbook_2e/examples/24 Functions/Ex_21/data/9f.jpg b/content/handbook_2e/examples/24 Functions/Ex_21/data/9f.jpg new file mode 100644 index 000000000..9e6a6b123 Binary files /dev/null and b/content/handbook_2e/examples/24 Functions/Ex_21/data/9f.jpg differ diff --git a/content/handbook_2e/examples/24 Functions/Ex_22/Ex_22.pde b/content/handbook_2e/examples/24 Functions/Ex_22/Ex_22.pde new file mode 100644 index 000000000..136513d4e --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/Ex_22/Ex_22.pde @@ -0,0 +1,21 @@ +float c = 25.0; + +void setup() { + size(100, 100); +} + +void draw() { + background(204); + arch(c); +} + +void arch(float curvature) { + float y = 90.0; + strokeWeight(6); + noFill(); + beginShape(); + vertex(15.0, y); + bezierVertex(15.0, y-curvature, 30.0, 55.0, 50.0, 55.0); + bezierVertex(70.0, 55.0, 85.0, y-curvature, 85.0, y); + endShape(); +} diff --git a/content/handbook_2e/examples/24 Functions/Ex_23/Ex_23.pde b/content/handbook_2e/examples/24 Functions/Ex_23/Ex_23.pde new file mode 100644 index 000000000..23fe7070f --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/Ex_23/Ex_23.pde @@ -0,0 +1,22 @@ +float c = 55.0; + +void setup() { + size(100, 100); +} + +void draw() { + background(204); + arch(c); +} + +void arch(float curvature) { + float y = 90.0; + float sw = (65.0 - curvature) / 4.0; + strokeWeight(sw); + noFill(); + beginShape(); + vertex(15.0, y); + bezierVertex(15.0, y-curvature, 30.0, 55.0, 50.0, 55.0); + bezierVertex(70.0, 55.0, 85.0, y-curvature, 85.0, y); + endShape(); +} diff --git a/content/handbook_2e/examples/24 Functions/Ex_24/Ex_24.pde b/content/handbook_2e/examples/24 Functions/Ex_24/Ex_24.pde new file mode 100644 index 000000000..fe27ef7ca --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/Ex_24/Ex_24.pde @@ -0,0 +1,25 @@ +int x = 20; // X-coordinate +int u = 14; // Units +float a = -0.12; // Angle + +void setup() { + size(100, 100); + stroke(255, 204); +} + +void draw() { + background(0); + tail(x, u, a); +} + +void tail(int xpos, int units, float angle) { + pushMatrix(); + translate(xpos, 0); + for (int i = units; i > 0; i--) { // Count in reverse + strokeWeight(i); + line(0, 0, 0, 8); + translate(0, 8); + rotate(angle); + } + popMatrix(); +} diff --git a/content/handbook_2e/examples/24 Functions/Ex_25/Ex_25.pde b/content/handbook_2e/examples/24 Functions/Ex_25/Ex_25.pde new file mode 100644 index 000000000..b9a553c33 --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/Ex_25/Ex_25.pde @@ -0,0 +1,29 @@ +float inc = 0.0; + +void setup() { + size(100, 100); + stroke(255, 204); +} + +void draw() { + background(0); + float angle = sin(inc)/10.0 + sin(inc*1.2)/20.0; + tail(18, 9, angle/1.3); + tail(33, 12, angle); + tail(44, 10, angle/1.3); + tail(62, 5, angle); + tail(88, 7, angle*2); + inc += 0.01; +} + +void tail(int xpos, int units, float angle) { + pushMatrix(); + translate(xpos, 0); + for (int i = units; i > 0; i--) { // Count in reverse + strokeWeight(i); + line(0, 0, 0, 8); + translate(0, 8); + rotate(angle); + } + popMatrix(); +} diff --git a/content/handbook_2e/examples/24 Functions/Ex_26/Ex_26.pde b/content/handbook_2e/examples/24 Functions/Ex_26/Ex_26.pde new file mode 100644 index 000000000..b92c9b037 --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/Ex_26/Ex_26.pde @@ -0,0 +1,25 @@ +int x = 40; // X-coordinate +int y = 30; // Y-coordinate +int g = 20; // Gap between eyes + +void setup() { + size(100, 100); + fill(0); +} + +void draw() { + background(204); + face(x, y, g); +} + +void face(int x, int y, int gap) { + stroke(0); + line(x, 0, x, y); // Nose Bridge + line(x, y, x+gap, y); // Nose + line(x+gap, y, x+gap, 100); + int mouthY = height - (height-y)/2; + line(x, mouthY, x+gap, mouthY); // Mouth + noStroke(); + ellipse(x-gap/2, y/2, 5, 5); // Left eye + ellipse(x+gap, y/2, 5, 5); // Right eye +} diff --git a/content/handbook_2e/examples/24 Functions/Ex_27/Ex_27.pde b/content/handbook_2e/examples/24 Functions/Ex_27/Ex_27.pde new file mode 100644 index 000000000..00864a3d2 --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/Ex_27/Ex_27.pde @@ -0,0 +1,11 @@ +void setup() { + size(100, 100); + drawLines(5, 15); +} + +void drawLines(int x, int num) { + for (int i = 0; i < num; num -= 1) { + line(x, 20, x, 80); + x += 5; + } +} diff --git a/content/handbook_2e/examples/24 Functions/Ex_28/Ex_28.pde b/content/handbook_2e/examples/24 Functions/Ex_28/Ex_28.pde new file mode 100644 index 000000000..7081ad99b --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/Ex_28/Ex_28.pde @@ -0,0 +1,11 @@ +void setup() { + size(100, 100); + drawLines(5, 15); +} + +void drawLines(int x, int num) { + line(x, 20, x, 80); + if (num > 0) { + drawLines(x+5, num-1); + } +} diff --git a/content/handbook_2e/examples/24 Functions/Ex_29/Ex_29.pde b/content/handbook_2e/examples/24 Functions/Ex_29/Ex_29.pde new file mode 100644 index 000000000..d6672f918 --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/Ex_29/Ex_29.pde @@ -0,0 +1,17 @@ +int x = 50; // X-coordinate of the center +int y = 100; // Y-coordinate of the bottom +int a = 35; // Half the width of the top bar + +void setup() { + size(100, 100); + noLoop(); +} + +void draw() { + drawT(x, y, a); +} + +void drawT(int xpos, int ypos, int apex) { + line(xpos, ypos, xpos, ypos-apex); + line(xpos-(apex/2), ypos-apex, xpos+(apex/2), ypos-apex); +} diff --git a/content/handbook_2e/examples/24 Functions/Ex_30/Ex_30.pde b/content/handbook_2e/examples/24 Functions/Ex_30/Ex_30.pde new file mode 100644 index 000000000..25a2746ea --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/Ex_30/Ex_30.pde @@ -0,0 +1,24 @@ +int x = 50; // X-coordinate of the center +int y = 100; // Y-coordinate of the bottom +int a = 35; // Half the width of the top bar +int n = 3; // Number of recursions + +void setup() { + size(100, 100); +} + +void draw() { + background(204); + drawT(x, y, a, n); +} + +void drawT(int x, int y, int apex, int num) { + line(x, y, x, y-apex); + line(x-apex, y-apex, x+apex, y-apex); + // This relational expression must eventually be + // false to stop the recursion and return to draw() + if (num > 0) { + drawT(x-apex, y-apex, apex/2, num-1); + drawT(x+apex, y-apex, apex/2, num-1); + } +} diff --git a/content/handbook_2e/examples/24 Functions/Ex_31/Ex_31.pde b/content/handbook_2e/examples/24 Functions/Ex_31/Ex_31.pde new file mode 100644 index 000000000..5f8b8abce --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/Ex_31/Ex_31.pde @@ -0,0 +1,23 @@ +int x = 63; // X-coordinate +int r = 85; // Starting radius +int n = 5; // Number of recursions + +void setup() { + size(100, 100); + noStroke(); +} + +void draw() { + background(204); + drawCircle(x, r, n); +} + +void drawCircle(int x, int radius, int num) { + float tt = 126 * num/4.0; + fill(tt); + ellipse(x, 50, radius*2, radius*2); + if (num > 0) { + drawCircle(x - radius/2, radius/2, num-1); + drawCircle(x + radius/2, radius/2, num-1); + } +} diff --git a/content/handbook_2e/examples/24 Functions/Ex_32/Ex_32.pde b/content/handbook_2e/examples/24 Functions/Ex_32/Ex_32.pde new file mode 100644 index 000000000..1f0d4f157 --- /dev/null +++ b/content/handbook_2e/examples/24 Functions/Ex_32/Ex_32.pde @@ -0,0 +1,34 @@ +int x = 300; // X-coordinate +int y = 50; // Y-coordinate +int r = 80; // Starting radius +int n = 7; // Number of recursions +int rs = 0; // Random seed value + +void setup() { + size(700, 100); + noStroke(); + frameRate(2); +} + +void draw() { + background(0); + randomSeed(rs); + drawCircle(x, y, r, n); + rs++; +} + +void drawCircle(float x, float y, int radius, int num) { + float value = 255 * num / 6.0; + fill(value, 153); + ellipse(x, y, radius*2, radius*2); + if (num > 1) { + num = num - 1; + int branches = int(random(2, 6)); + for (int i = 0; i < branches; i++) { + float a = random(0, TWO_PI); + float newx = x + cos(a) * 16.0 * num; + float newy = y + sin(a) * 6.0 * num; + drawCircle(newx, newy, radius/2, num); + } + } +} diff --git a/content/handbook_2e/examples/25 Objects/Ex_01/Ex_01.pde b/content/handbook_2e/examples/25 Objects/Ex_01/Ex_01.pde new file mode 100644 index 000000000..23c27c70c --- /dev/null +++ b/content/handbook_2e/examples/25 Objects/Ex_01/Ex_01.pde @@ -0,0 +1,13 @@ +float x = 33; +float y = 50; +float diameter = 30; + +void setup() { + size(100, 100); + noStroke(); +} + +void draw() { + background(0); + ellipse(x, y, diameter, diameter); +} diff --git a/content/handbook_2e/examples/25 Objects/Ex_02/Ex_02.pde b/content/handbook_2e/examples/25 Objects/Ex_02/Ex_02.pde new file mode 100644 index 000000000..f5d520180 --- /dev/null +++ b/content/handbook_2e/examples/25 Objects/Ex_02/Ex_02.pde @@ -0,0 +1,20 @@ +Spot sp; // Declare the object + +void setup() { + size(100, 100); + noStroke(); + sp = new Spot(); // Construct the object + sp.x = 33; // Assign 33 to the x field + sp.y = 50; // Assign 50 to the y field + sp.diameter = 30; // Assign 30 to the diameter field +} + +void draw() { + background(0); + ellipse(sp.x, sp.y, sp.diameter, sp.diameter); +} + +class Spot { + float x, y; // The x- and y-coordinate + float diameter; // Diameter of the circle +} diff --git a/content/handbook_2e/examples/25 Objects/Ex_03/Ex_03.pde b/content/handbook_2e/examples/25 Objects/Ex_03/Ex_03.pde new file mode 100644 index 000000000..06de862cc --- /dev/null +++ b/content/handbook_2e/examples/25 Objects/Ex_03/Ex_03.pde @@ -0,0 +1,23 @@ +Spot sp; // Declare the object + +void setup() { + size(100, 100); + noStroke(); + sp = new Spot(); // Construct the object + sp.x = 33; + sp.y = 50; + sp.diameter = 30; +} + +void draw() { + background(0); + sp.display(); +} + +class Spot { + float x, y, diameter; + + void display() { + ellipse(x, y, diameter, diameter); + } +} diff --git a/content/handbook_2e/examples/25 Objects/Ex_04/Ex_04.pde b/content/handbook_2e/examples/25 Objects/Ex_04/Ex_04.pde new file mode 100644 index 000000000..7da8f1d4e --- /dev/null +++ b/content/handbook_2e/examples/25 Objects/Ex_04/Ex_04.pde @@ -0,0 +1,26 @@ +Spot sp; // Declare the object + +void setup() { + size(100, 100); + noStroke(); + sp = new Spot(33, 50, 30); // Construct the object +} + +void draw() { + background(0); + sp.display(); +} + +class Spot { + float x, y, diameter; + + Spot(float xpos, float ypos, float dia) { + x = xpos; // Assign 33 to x + y = ypos; // Assign 50 to y + diameter = dia; // Assign 30 to diameter + } + + void display() { + ellipse(x, y, diameter, diameter); + } +} diff --git a/content/handbook_2e/examples/25 Objects/Ex_05/Ex_05.pde b/content/handbook_2e/examples/25 Objects/Ex_05/Ex_05.pde new file mode 100644 index 000000000..fe60a0035 --- /dev/null +++ b/content/handbook_2e/examples/25 Objects/Ex_05/Ex_05.pde @@ -0,0 +1,25 @@ +class Spot { + float x, y; // X-coordinate, y-coordinate + float diameter; // Diameter of the circle + float speed; // Distance moved each frame + int direction = 1; // Direction of motion (1 is down, -1 is up) + + // Constructor + Spot(float xpos, float ypos, float dia, float sp) { + x = xpos; + y = ypos; + diameter = dia; + speed = sp; + } + + void move() { + y += (speed * direction); + if ((y > (height - diameter/2)) || (y < diameter/2)) { + direction *= -1; + } + } + + void display() { + ellipse(x, y, diameter, diameter); + } +} diff --git a/content/handbook_2e/examples/25 Objects/Ex_06/Ex_06.pde b/content/handbook_2e/examples/25 Objects/Ex_06/Ex_06.pde new file mode 100644 index 000000000..ddbc6ba17 --- /dev/null +++ b/content/handbook_2e/examples/25 Objects/Ex_06/Ex_06.pde @@ -0,0 +1,41 @@ +Spot sp; // Declare the object + +void setup() { + size(100, 100); + noStroke(); + sp = new Spot(33, 50, 30, 1.5); // Construct the object +} + +void draw() { + fill(0, 15); + rect(0, 0, width, height); + fill(255); + sp.move(); + sp.display(); +} + +class Spot { + float x, y; // X-coordinate, y-coordinate + float diameter; // Diameter of the circle + float speed; // Distance moved each frame + int direction = 1; // Direction of motion (1 is down, -1 is up) + + // Constructor + Spot(float xpos, float ypos, float dia, float sp) { + x = xpos; + y = ypos; + diameter = dia; + speed = sp; + } + + void move() { + y += (speed * direction); + if ((y > (height - diameter/2)) || (y < diameter/2)) { + direction *= -1; + } + } + + void display() { + ellipse(x, y, diameter, diameter); + } +} diff --git a/content/handbook_2e/examples/25 Objects/Ex_07/Ex_07.pde b/content/handbook_2e/examples/25 Objects/Ex_07/Ex_07.pde new file mode 100644 index 000000000..3dd64ecfa --- /dev/null +++ b/content/handbook_2e/examples/25 Objects/Ex_07/Ex_07.pde @@ -0,0 +1,47 @@ +Spot sp1, sp2, sp3; // Declare the objects + +void setup() { + size(100, 100); + noStroke(); + sp1 = new Spot(20, 50, 40, 0.5); // Construct sp1 + sp2 = new Spot(50, 50, 10, 2.0); // Construct sp2 + sp3 = new Spot(80, 50, 30, 1.5); // Construct sp3 +} + +void draw() { + fill(0, 15); + rect(0, 0, width, height); + fill(255); + sp1.move(); + sp2.move(); + sp3.move(); + sp1.display(); + sp2.display(); + sp3.display(); +} + +class Spot { + float x, y; // X-coordinate, y-coordinate + float diameter; // Diameter of the circle + float speed; // Distance moved each frame + int direction = 1; // Direction of motion (1 is down, -1 is up) + + // Constructor + Spot(float xpos, float ypos, float dia, float sp) { + x = xpos; + y = ypos; + diameter = dia; + speed = sp; + } + + void move() { + y += (speed * direction); + if ((y > (height - diameter/2)) || (y < diameter/2)) { + direction *= -1; + } + } + + void display() { + ellipse(x, y, diameter, diameter); + } +} diff --git a/content/handbook_2e/examples/25 Objects/Ex_08/Ex_08.pde b/content/handbook_2e/examples/25 Objects/Ex_08/Ex_08.pde new file mode 100644 index 000000000..33ed9b405 --- /dev/null +++ b/content/handbook_2e/examples/25 Objects/Ex_08/Ex_08.pde @@ -0,0 +1,36 @@ +class Egg { + float x, y; // X-coordinate, y-coordinate + float tilt; // Left and right angle offset + float angle; // Used to define the tilt + float scalar; // Height of the egg + + // Constructor + Egg(int xpos, int ypos, float t, float s) { + x = xpos; + y = ypos; + tilt = t; + scalar = s / 100.0; + } + + void wobble() { + tilt = cos(angle) / 8; + angle += 0.1; + } + + void display() { + noStroke(); + fill(255); + pushMatrix(); + translate(x, y); + rotate(tilt); + scale(scalar); + beginShape(); + vertex(0, -100); + bezierVertex(25, -100, 40, -65, 40, -40); + bezierVertex(40, -15, 25, 0, 0, 0); + bezierVertex(-25, 0, -40, -15, -40, -40); + bezierVertex(-40, -65, -25, -100, 0, -100); + endShape(); + popMatrix(); + } +} diff --git a/content/handbook_2e/examples/25 Objects/Ex_09/Ex_09.pde b/content/handbook_2e/examples/25 Objects/Ex_09/Ex_09.pde new file mode 100644 index 000000000..af0e5174d --- /dev/null +++ b/content/handbook_2e/examples/25 Objects/Ex_09/Ex_09.pde @@ -0,0 +1,50 @@ +Egg humpty; // Declare the object + +void setup() { + size(100, 100); + // Inputs: x-coordinate, y-coordinate, tilt, height + humpty = new Egg(50, 100, PI/32, 80); +} + +void draw() { + background(0); + humpty.wobble(); + humpty.display(); +} + +class Egg { + float x, y; // X-coordinate, y-coordinate + float tilt; // Left and right angle offset + float angle; // Used to define the tilt + float scalar; // Height of the egg + + // Constructor + Egg(int xpos, int ypos, float t, float s) { + x = xpos; + y = ypos; + tilt = t; + scalar = s / 100.0; + } + + void wobble() { + tilt = cos(angle) / 8; + angle += 0.1; + } + + void display() { + noStroke(); + fill(255); + pushMatrix(); + translate(x, y); + rotate(tilt); + scale(scalar); + beginShape(); + vertex(0, -100); + bezierVertex(25, -100, 40, -65, 40, -40); + bezierVertex(40, -15, 25, 0, 0, 0); + bezierVertex(-25, 0, -40, -15, -40, -40); + bezierVertex(-40, -65, -25, -100, 0, -100); + endShape(); + popMatrix(); + } +} diff --git a/content/handbook_2e/examples/25 Objects/Ex_10/Ex_10.pde b/content/handbook_2e/examples/25 Objects/Ex_10/Ex_10.pde new file mode 100644 index 000000000..53cb75838 --- /dev/null +++ b/content/handbook_2e/examples/25 Objects/Ex_10/Ex_10.pde @@ -0,0 +1,32 @@ +class Ring { + float x, y; // X-coordinate, y-coordinate + float diameter; // Diameter of the ring + boolean on = false; // Turns the display on and off + + void start(float xpos, float ypos) { + x = xpos; + y = ypos; + + diameter = 1; + on = true; + } + + void grow() { + if (on == true) { + diameter += 0.5; + if (diameter > 400) { + on = false; + diameter = 1; + } + } + } + + void display() { + if (on == true) { + noFill(); + strokeWeight(4); + stroke(204, 153); + ellipse(x, y, diameter, diameter); + } + } +} diff --git a/content/handbook_2e/examples/25 Objects/Ex_11/Ex_11.pde b/content/handbook_2e/examples/25 Objects/Ex_11/Ex_11.pde new file mode 100644 index 000000000..4b5de85e8 --- /dev/null +++ b/content/handbook_2e/examples/25 Objects/Ex_11/Ex_11.pde @@ -0,0 +1,50 @@ +Ring r; + +void setup() { + size(100, 100); + r = new Ring(); +} + +void draw() { + background(0); + r.grow(); + r.display(); +} + +void mousePressed() { + r.start(mouseX, mouseY); +} + + +class Ring { + float x, y; // X-coordinate, y-coordinate + float diameter; // Diameter of the ring + boolean on = false; // Turns the display on and off + + void start(float xpos, float ypos) { + x = xpos; + y = ypos; + + diameter = 1; + on = true; + } + + void grow() { + if (on == true) { + diameter += 0.5; + if (diameter > 400) { + on = false; + diameter = 1; + } + } + } + + void display() { + if (on == true) { + noFill(); + strokeWeight(4); + stroke(204, 153); + ellipse(x, y, diameter, diameter); + } + } +} diff --git a/content/handbook_2e/examples/25 Objects/Ex_12/Ex_12.pde b/content/handbook_2e/examples/25 Objects/Ex_12/Ex_12.pde new file mode 100644 index 000000000..a2b075e10 --- /dev/null +++ b/content/handbook_2e/examples/25 Objects/Ex_12/Ex_12.pde @@ -0,0 +1,39 @@ +Spot sp1, sp2; + +void setup() { + size(100, 100); + noLoop(); + // Run the constructor without parameters + sp1 = new Spot(); + // Run the constructor with three parameters + sp2 = new Spot(66, 50, 20); +} + +void draw() { + sp1.display(); + sp2.display(); +} + +class Spot { + float x, y, diameter; + + // First version of the Spot constructor; + // the fields are assigned default values + Spot() { + x = 33; + y = 50; + diameter = 8; + } + + // Second version of the Spot constructor; + // the fields are assigned with parameters + Spot(float xpos, float ypos, float d) { + x = xpos; + y = ypos; + diameter = d; + } + + void display() { + ellipse(x, y, diameter, diameter); + } +} diff --git a/content/handbook_2e/examples/25 Objects/Ex_13/Egg.pde b/content/handbook_2e/examples/25 Objects/Ex_13/Egg.pde new file mode 100644 index 000000000..33ed9b405 --- /dev/null +++ b/content/handbook_2e/examples/25 Objects/Ex_13/Egg.pde @@ -0,0 +1,36 @@ +class Egg { + float x, y; // X-coordinate, y-coordinate + float tilt; // Left and right angle offset + float angle; // Used to define the tilt + float scalar; // Height of the egg + + // Constructor + Egg(int xpos, int ypos, float t, float s) { + x = xpos; + y = ypos; + tilt = t; + scalar = s / 100.0; + } + + void wobble() { + tilt = cos(angle) / 8; + angle += 0.1; + } + + void display() { + noStroke(); + fill(255); + pushMatrix(); + translate(x, y); + rotate(tilt); + scale(scalar); + beginShape(); + vertex(0, -100); + bezierVertex(25, -100, 40, -65, 40, -40); + bezierVertex(40, -15, 25, 0, 0, 0); + bezierVertex(-25, 0, -40, -15, -40, -40); + bezierVertex(-40, -65, -25, -100, 0, -100); + endShape(); + popMatrix(); + } +} diff --git a/content/handbook_2e/examples/25 Objects/Ex_13/EggRing.pde b/content/handbook_2e/examples/25 Objects/Ex_13/EggRing.pde new file mode 100644 index 000000000..e69de29bb diff --git a/content/handbook_2e/examples/25 Objects/Ex_13/Ex_13.pde b/content/handbook_2e/examples/25 Objects/Ex_13/Ex_13.pde new file mode 100644 index 000000000..14cfa961d --- /dev/null +++ b/content/handbook_2e/examples/25 Objects/Ex_13/Ex_13.pde @@ -0,0 +1,19 @@ +class EggRing { + Egg ovoid; + Ring circle = new Ring(); + + EggRing(int x, int y, float t, float sp) { + ovoid = new Egg(x, y, t, sp); + circle.start(x, y - sp/2); + } + + void transmit() { + ovoid.wobble(); + ovoid.display(); + circle.grow(); + circle.display(); + if (circle.on == false) { + circle.on = true; + } + } +} diff --git a/content/handbook_2e/examples/25 Objects/Ex_13/Ring.pde b/content/handbook_2e/examples/25 Objects/Ex_13/Ring.pde new file mode 100644 index 000000000..53cb75838 --- /dev/null +++ b/content/handbook_2e/examples/25 Objects/Ex_13/Ring.pde @@ -0,0 +1,32 @@ +class Ring { + float x, y; // X-coordinate, y-coordinate + float diameter; // Diameter of the ring + boolean on = false; // Turns the display on and off + + void start(float xpos, float ypos) { + x = xpos; + y = ypos; + + diameter = 1; + on = true; + } + + void grow() { + if (on == true) { + diameter += 0.5; + if (diameter > 400) { + on = false; + diameter = 1; + } + } + } + + void display() { + if (on == true) { + noFill(); + strokeWeight(4); + stroke(204, 153); + ellipse(x, y, diameter, diameter); + } + } +} diff --git a/content/handbook_2e/examples/25 Objects/Ex_14/Egg.pde b/content/handbook_2e/examples/25 Objects/Ex_14/Egg.pde new file mode 100644 index 000000000..33ed9b405 --- /dev/null +++ b/content/handbook_2e/examples/25 Objects/Ex_14/Egg.pde @@ -0,0 +1,36 @@ +class Egg { + float x, y; // X-coordinate, y-coordinate + float tilt; // Left and right angle offset + float angle; // Used to define the tilt + float scalar; // Height of the egg + + // Constructor + Egg(int xpos, int ypos, float t, float s) { + x = xpos; + y = ypos; + tilt = t; + scalar = s / 100.0; + } + + void wobble() { + tilt = cos(angle) / 8; + angle += 0.1; + } + + void display() { + noStroke(); + fill(255); + pushMatrix(); + translate(x, y); + rotate(tilt); + scale(scalar); + beginShape(); + vertex(0, -100); + bezierVertex(25, -100, 40, -65, 40, -40); + bezierVertex(40, -15, 25, 0, 0, 0); + bezierVertex(-25, 0, -40, -15, -40, -40); + bezierVertex(-40, -65, -25, -100, 0, -100); + endShape(); + popMatrix(); + } +} diff --git a/content/handbook_2e/examples/25 Objects/Ex_14/EggRing.pde b/content/handbook_2e/examples/25 Objects/Ex_14/EggRing.pde new file mode 100644 index 000000000..14cfa961d --- /dev/null +++ b/content/handbook_2e/examples/25 Objects/Ex_14/EggRing.pde @@ -0,0 +1,19 @@ +class EggRing { + Egg ovoid; + Ring circle = new Ring(); + + EggRing(int x, int y, float t, float sp) { + ovoid = new Egg(x, y, t, sp); + circle.start(x, y - sp/2); + } + + void transmit() { + ovoid.wobble(); + ovoid.display(); + circle.grow(); + circle.display(); + if (circle.on == false) { + circle.on = true; + } + } +} diff --git a/content/handbook_2e/examples/25 Objects/Ex_14/Ex_14.pde b/content/handbook_2e/examples/25 Objects/Ex_14/Ex_14.pde new file mode 100644 index 000000000..911b45f7b --- /dev/null +++ b/content/handbook_2e/examples/25 Objects/Ex_14/Ex_14.pde @@ -0,0 +1,15 @@ +EggRing er1, er2; + +void setup() { + size(100, 100); + + er1 = new EggRing(33, 66, 0.1, 33); + er2 = new EggRing(66, 90, 0.05, 66); +} + +void draw() { + background(0); + er1.transmit(); + er2.transmit(); +} + diff --git a/content/handbook_2e/examples/25 Objects/Ex_14/Ring.pde b/content/handbook_2e/examples/25 Objects/Ex_14/Ring.pde new file mode 100644 index 000000000..53cb75838 --- /dev/null +++ b/content/handbook_2e/examples/25 Objects/Ex_14/Ring.pde @@ -0,0 +1,32 @@ +class Ring { + float x, y; // X-coordinate, y-coordinate + float diameter; // Diameter of the ring + boolean on = false; // Turns the display on and off + + void start(float xpos, float ypos) { + x = xpos; + y = ypos; + + diameter = 1; + on = true; + } + + void grow() { + if (on == true) { + diameter += 0.5; + if (diameter > 400) { + on = false; + diameter = 1; + } + } + } + + void display() { + if (on == true) { + noFill(); + strokeWeight(4); + stroke(204, 153); + ellipse(x, y, diameter, diameter); + } + } +} diff --git a/content/handbook_2e/examples/25 Objects/Ex_15/Ex_15.pde b/content/handbook_2e/examples/25 Objects/Ex_15/Ex_15.pde new file mode 100644 index 000000000..69baccd0e --- /dev/null +++ b/content/handbook_2e/examples/25 Objects/Ex_15/Ex_15.pde @@ -0,0 +1,14 @@ +class Spin { + float x, y, speed; + float angle = 0.0; + + Spin(float xpos, float ypos, float s) { + x = xpos; + y = ypos; + speed = s; + } + + void update() { + angle += speed; + } +} diff --git a/content/handbook_2e/examples/25 Objects/Ex_16/Ex_16.pde b/content/handbook_2e/examples/25 Objects/Ex_16/Ex_16.pde new file mode 100644 index 000000000..2b642bfe1 --- /dev/null +++ b/content/handbook_2e/examples/25 Objects/Ex_16/Ex_16.pde @@ -0,0 +1,17 @@ +class SpinArm extends Spin { + + SpinArm(float x, float y, float s) { + super(x, y, s); + } + + void display() { + strokeWeight(1); + stroke(0); + pushMatrix(); + translate(x, y); + angle += speed; + rotate(angle); + line(0, 0, 100, 0); + popMatrix(); + } +} diff --git a/content/handbook_2e/examples/25 Objects/Ex_16/Spin.pde b/content/handbook_2e/examples/25 Objects/Ex_16/Spin.pde new file mode 100644 index 000000000..69baccd0e --- /dev/null +++ b/content/handbook_2e/examples/25 Objects/Ex_16/Spin.pde @@ -0,0 +1,14 @@ +class Spin { + float x, y, speed; + float angle = 0.0; + + Spin(float xpos, float ypos, float s) { + x = xpos; + y = ypos; + speed = s; + } + + void update() { + angle += speed; + } +} diff --git a/content/handbook_2e/examples/25 Objects/Ex_17/Ex_17.pde b/content/handbook_2e/examples/25 Objects/Ex_17/Ex_17.pde new file mode 100644 index 000000000..f86f7a0cd --- /dev/null +++ b/content/handbook_2e/examples/25 Objects/Ex_17/Ex_17.pde @@ -0,0 +1,19 @@ +class SpinSpots extends Spin { + float dim; + + SpinSpots(float x, float y, float s, float d) { + super(x, y, s); + dim = d; + } + + void display() { + noStroke(); + pushMatrix(); + translate(x, y); + angle += speed; + rotate(angle); + ellipse(-dim/2, 0, dim, dim); + ellipse(dim/2, 0, dim, dim); + popMatrix(); + } +} diff --git a/content/handbook_2e/examples/25 Objects/Ex_17/Spin.pde b/content/handbook_2e/examples/25 Objects/Ex_17/Spin.pde new file mode 100644 index 000000000..69baccd0e --- /dev/null +++ b/content/handbook_2e/examples/25 Objects/Ex_17/Spin.pde @@ -0,0 +1,14 @@ +class Spin { + float x, y, speed; + float angle = 0.0; + + Spin(float xpos, float ypos, float s) { + x = xpos; + y = ypos; + speed = s; + } + + void update() { + angle += speed; + } +} diff --git a/content/handbook_2e/examples/25 Objects/Ex_18/Ex_18.pde b/content/handbook_2e/examples/25 Objects/Ex_18/Ex_18.pde new file mode 100644 index 000000000..a02a6059c --- /dev/null +++ b/content/handbook_2e/examples/25 Objects/Ex_18/Ex_18.pde @@ -0,0 +1,18 @@ +SpinSpots spots; +SpinArm arm; + +void setup() { + size(100, 100); + arm = new SpinArm(width/2, height/2, 0.01); + spots = new SpinSpots(width/2, height/2, -0.02, 33.0); +} + +void draw() { + background(204); + arm.update(); + arm.display(); + spots.update(); + spots.display(); +} + + diff --git a/content/handbook_2e/examples/25 Objects/Ex_18/Spin.pde b/content/handbook_2e/examples/25 Objects/Ex_18/Spin.pde new file mode 100644 index 000000000..69baccd0e --- /dev/null +++ b/content/handbook_2e/examples/25 Objects/Ex_18/Spin.pde @@ -0,0 +1,14 @@ +class Spin { + float x, y, speed; + float angle = 0.0; + + Spin(float xpos, float ypos, float s) { + x = xpos; + y = ypos; + speed = s; + } + + void update() { + angle += speed; + } +} diff --git a/content/handbook_2e/examples/25 Objects/Ex_18/SpinArm.pde b/content/handbook_2e/examples/25 Objects/Ex_18/SpinArm.pde new file mode 100644 index 000000000..2b642bfe1 --- /dev/null +++ b/content/handbook_2e/examples/25 Objects/Ex_18/SpinArm.pde @@ -0,0 +1,17 @@ +class SpinArm extends Spin { + + SpinArm(float x, float y, float s) { + super(x, y, s); + } + + void display() { + strokeWeight(1); + stroke(0); + pushMatrix(); + translate(x, y); + angle += speed; + rotate(angle); + line(0, 0, 100, 0); + popMatrix(); + } +} diff --git a/content/handbook_2e/examples/25 Objects/Ex_18/SpinSpots.pde b/content/handbook_2e/examples/25 Objects/Ex_18/SpinSpots.pde new file mode 100644 index 000000000..f86f7a0cd --- /dev/null +++ b/content/handbook_2e/examples/25 Objects/Ex_18/SpinSpots.pde @@ -0,0 +1,19 @@ +class SpinSpots extends Spin { + float dim; + + SpinSpots(float x, float y, float s, float d) { + super(x, y, s); + dim = d; + } + + void display() { + noStroke(); + pushMatrix(); + translate(x, y); + angle += speed; + rotate(angle); + ellipse(-dim/2, 0, dim, dim); + ellipse(dim/2, 0, dim, dim); + popMatrix(); + } +} diff --git a/content/handbook_2e/examples/26 Synthesis 3/Ex_01/Ex_01.pde b/content/handbook_2e/examples/26 Synthesis 3/Ex_01/Ex_01.pde new file mode 100644 index 000000000..b3eeeccad --- /dev/null +++ b/content/handbook_2e/examples/26 Synthesis 3/Ex_01/Ex_01.pde @@ -0,0 +1,22 @@ +int paddleX; +int paddleY; +int paddleHeight = 100; +int paddleWidth = 20; + +void setup() { + size(600, 600); + paddleX = width-paddleWidth*2; +} + +void draw() { + background(0); + + // Update paddle + paddleY = mouseY - paddleHeight/2; + paddleY = constrain(paddleY, 0, height-paddleHeight); + + // Draw paddle + fill(102); + noStroke(); + rect(paddleX, paddleY, paddleWidth, paddleHeight); +} diff --git a/content/handbook_2e/examples/26 Synthesis 3/Ex_02/Ex_02.pde b/content/handbook_2e/examples/26 Synthesis 3/Ex_02/Ex_02.pde new file mode 100644 index 000000000..3bf798dc3 --- /dev/null +++ b/content/handbook_2e/examples/26 Synthesis 3/Ex_02/Ex_02.pde @@ -0,0 +1,42 @@ +float ballX; +float ballY; +float ballSpeedX = random(3, 5); +float ballSpeedY = random(-2, 2); +float ballDiameter = 20.0; +float ballRadius = ballDiameter/2; + +void setup() { + size(600, 600); + ballX = -ballRadius; + ballY = height/2; +} + +void draw() { + background(0); + + // Draw ball + fill(255); + noStroke(); + ellipse(ballX, ballY, ballDiameter, ballDiameter); + + // Update ball location + ballX = ballX + ballSpeedX; + ballY = ballY + ballSpeedY; + + // Reset position if ball leaves the screen + if (ballX > width + ballRadius) { + ballX = -ballRadius; + ballY = random(height*0.25, height*0.75); + ballSpeedX = random(3, 5); + ballSpeedY = random(-6, 6); + } + + // If ball hits top or bottom, change direction of Y + if (ballY > height - ballRadius) { + ballY = height - ballRadius; + ballSpeedY = ballSpeedY * -1; + } else if (ballY < ballRadius) { + ballY = ballRadius; + ballSpeedY = ballSpeedY * -1; + } +} diff --git a/content/handbook_2e/examples/26 Synthesis 3/Ex_03/Ex_03.pde b/content/handbook_2e/examples/26 Synthesis 3/Ex_03/Ex_03.pde new file mode 100644 index 000000000..839c59456 --- /dev/null +++ b/content/handbook_2e/examples/26 Synthesis 3/Ex_03/Ex_03.pde @@ -0,0 +1,60 @@ +float ballX = 300.0; +float ballY = 300.0; +float ballDiameter = 200.0; + +int paddleX; +int paddleY; +int paddleHeight = 150; +int paddleWidth = 50; + +void setup() { + size(600, 600); + noCursor(); +} + +void draw() { + background(0); + + // Update paddle + paddleX = mouseX; + paddleY = mouseY; + + // Draw paddle + fill(102); + noStroke(); + rect(paddleX, paddleY, paddleWidth, paddleHeight); + + // Draw ball + fill(255); + noStroke(); + ellipse(ballX, ballY, ballDiameter, ballDiameter); + + // Set variable to true if shapes are overlapping, false if not + boolean collision = hitPaddle(paddleX, paddleY, paddleWidth, paddleHeight, + ballX, ballY, ballDiameter/2); + + if (collision == true) { + stroke(204); + strokeWeight(10); + line(0, 0, width, height); + line(0, width, height, 0); + } +} + +boolean hitPaddle(int rx, int ry, int rw, int rh, float cx, float cy, float cr) { + + float circleDistanceX = abs(cx - rx - rw/2); + float circleDistanceY = abs(cy - ry - rh/2); + + if (circleDistanceX > (rw/2 + cr)) { return false; } + if (circleDistanceY > (rh/2 + cr)) { return false; } + if (circleDistanceX <= rw/2) { return true; } + if (circleDistanceY <= rh/2) { return true; } + + float cornerDistance = pow(circleDistanceX - rw/2, 2) + pow(circleDistanceY - rh/2, 2); + if (cornerDistance <= pow(cr, 2)) { + return true; + } else { + return false; + } +} diff --git a/content/handbook_2e/examples/26 Synthesis 3/Ex_04/Ex_04.pde b/content/handbook_2e/examples/26 Synthesis 3/Ex_04/Ex_04.pde new file mode 100644 index 000000000..dcfddae1c --- /dev/null +++ b/content/handbook_2e/examples/26 Synthesis 3/Ex_04/Ex_04.pde @@ -0,0 +1,93 @@ +float ballX; +float ballY; +float ballSpeedX = random(3, 5); +float ballSpeedY = random(-2, 2); +float ballDiameter = 20.0; +float ballRadius = ballDiameter/2; + +int paddleX; +int paddleY; +int paddleHeight = 100; +int paddleWidth = 20; + +void setup() { + size(600, 600); + paddleX = width-paddleWidth*2; + ballX = -ballRadius; + ballY = height/2; + noCursor(); +} + +void draw() { + background(0); + + // Update paddle + paddleY = mouseY - paddleHeight/2; + paddleY = constrain(paddleY, 0, height-paddleHeight); + + // Draw paddle + fill(102); + noStroke(); + rect(paddleX, paddleY, paddleWidth, paddleHeight); + + // Draw ball + fill(255); + noStroke(); + ellipse(ballX, ballY, ballDiameter, ballDiameter); + + // Update ball location + ballX = ballX + ballSpeedX; + ballY = ballY + ballSpeedY; + + // Reset position if ball leaves the screen + if (ballX > width + ballRadius) { + ballX = -ballRadius; + ballY = random(height*0.25, height*0.75); + ballSpeedX = random(3, 5); + ballSpeedY = random(-6, 6); + } + + // If ball hits the left edge, change directino of X + if (ballX < ballRadius) { + ballX = ballRadius; + ballSpeedX = ballSpeedX * -1; + } + + // If ball hits top or bottom, change direction of Y + if (ballY > height - ballRadius) { + ballY = height - ballRadius; + ballSpeedY = ballSpeedY * -1; + } else if (ballY < ballRadius) { + ballY = ballRadius; + ballSpeedY = ballSpeedY * -1; + } + + // Set variable to true if shapes are overlapping, false if not + boolean collision = hitPaddle(paddleX, paddleY, paddleWidth, paddleHeight, + ballX, ballY, ballDiameter/2); + + // Change ball direction when paddle is hit + // and bump it back to the edge of the paddle + if (collision == true) { + ballSpeedX = ballSpeedX * -1; + ballX += ballSpeedX; + } +} + +boolean hitPaddle(int rx, int ry, int rw, int rh, float cx, float cy, float cr) { + + float circleDistanceX = abs(cx - rx - rw/2); + float circleDistanceY = abs(cy - ry - rh/2); + + if (circleDistanceX > (rw/2 + cr)) { return false; } + if (circleDistanceY > (rh/2 + cr)) { return false; } + if (circleDistanceX <= rw/2) { return true; } + if (circleDistanceY <= rh/2) { return true; } + + float cornerDistance = pow(circleDistanceX - rw/2, 2) + pow(circleDistanceY - rh/2, 2); + if (cornerDistance <= pow(cr, 2)) { + return true; + } else { + return false; + } +} diff --git a/content/handbook_2e/examples/26 Synthesis 3/Ex_05/Ball.pde b/content/handbook_2e/examples/26 Synthesis 3/Ex_05/Ball.pde new file mode 100644 index 000000000..0e924edfb --- /dev/null +++ b/content/handbook_2e/examples/26 Synthesis 3/Ex_05/Ball.pde @@ -0,0 +1,59 @@ +class Ball { + + float x; // X-coordinate of the ball + float y; // Y-coordinate of the ball + float diameter = 20.0; // Diameter of the ball + float radius = diameter/2; // Radius of the ball + float speedX = random(3, 5); // Speed along the x-axis + float speedY = random(-2, 2); // Speed along the y-axis + + Ball() { + x = -radius; + y = height/2; + } + + // Change ball position + void update() { + // Update ball coordinates + x = x + speedX; + y = y + speedY; + + // Reset position if ball leaves the screen + if (x > width + radius) { + x = -radius; + y = random(height*0.25, height*0.75); + speedX = random(5, 15); + speedY = random(-6, 6); + } + + // If ball hits the left edge, change direction of X + if (x < radius) { + x = radius; + speedX = speedX * -1; + } + + // If ball hits top or bottom, change direction of Y + if (y > height - radius) { + y = height - radius; + speedY = speedY * -1; + } else if (y < radius) { + y = radius; + speedY = speedY * -1; + } + } + + // Draw ball to the display window + void display() { + fill(255); + noStroke(); + ellipse(x, y, diameter, diameter); + } + + // Change ball direction when paddle is hit + // and bump it back to the edge of the paddle + void hit(Paddle p) { + speedX = speedX * -1; + x += speedX; + } + +} diff --git a/content/handbook_2e/examples/26 Synthesis 3/Ex_05/Ex_05.pde b/content/handbook_2e/examples/26 Synthesis 3/Ex_05/Ex_05.pde new file mode 100644 index 000000000..dd46029c8 --- /dev/null +++ b/content/handbook_2e/examples/26 Synthesis 3/Ex_05/Ex_05.pde @@ -0,0 +1,45 @@ +Ball ball; +Paddle paddle; + +void setup() { + size(600, 600); + paddle = new Paddle(); + ball = new Ball(); + noCursor(); +} + +void draw() { + background(0); + + paddle.update(); // Update paddle + paddle.display(); // Draw paddle + + ball.update(); // Update ball + ball.display(); // Draw ball + + // Set variable to true if shapes are overlapping, false if not + boolean collision = hitPaddle(paddle, ball); + + if (collision == true) { + ball.hit(paddle); + } +} + +boolean hitPaddle(Paddle p, Ball b) { + + float circleDistanceX = abs(b.x - p.x - p.w/2); + float circleDistanceY = abs(b.y - p.y - p.h/2); + + if (circleDistanceX > (p.w/2 + b.radius)) { return false; } + if (circleDistanceY > (p.h/2 + b.radius)) { return false; } + if (circleDistanceX <= p.w/2) { return true; } + if (circleDistanceY <= p.h/2) { return true; } + + float cornerDistance = pow(circleDistanceX - p.w/2, 2) + pow(circleDistanceY - p.h/2, 2); + if (cornerDistance <= pow(b.radius, 2)) { + return true; + } else { + return false; + } +} + diff --git a/content/handbook_2e/examples/26 Synthesis 3/Ex_05/Paddle.pde b/content/handbook_2e/examples/26 Synthesis 3/Ex_05/Paddle.pde new file mode 100644 index 000000000..c30b91956 --- /dev/null +++ b/content/handbook_2e/examples/26 Synthesis 3/Ex_05/Paddle.pde @@ -0,0 +1,27 @@ +class Paddle { + + int x; // X-coordinate of the paddle + int y; // Y-coordinate of the paddle + int w = 20; // Width of the paddle + int h = 100; // Height of the paddle + + + Paddle() { + x = width-w*2; + y = height/2; + } + + // Change paddle position with cursor + void update() { + y = mouseY - h/2; + y = constrain(y, 0, height-h); + } + + // Draw paddle to the display window + void display() { + fill(102); + noStroke(); + rect(x, y, w, h); + } + +} diff --git a/content/handbook_2e/examples/28 Arrays/Ex_01/Ex_01.pde b/content/handbook_2e/examples/28 Arrays/Ex_01/Ex_01.pde new file mode 100644 index 000000000..22a8362a6 --- /dev/null +++ b/content/handbook_2e/examples/28 Arrays/Ex_01/Ex_01.pde @@ -0,0 +1,22 @@ +int x0 = 50; +int x1 = 61; +int x2 = 83; +int x3 = 69; +int x4 = 71; +int x5 = 50; +int x6 = 29; +int x7 = 31; +int x8 = 17; +int x9 = 39; + +fill(0); +rect(0, 0, x0, 8); +rect(0, 10, x1, 8); +rect(0, 20, x2, 8); +rect(0, 30, x3, 8); +rect(0, 40, x4, 8); +rect(0, 50, x5, 8); +rect(0, 60, x6, 8); +rect(0, 70, x7, 8); +rect(0, 80, x8, 8); +rect(0, 90, x9, 8); diff --git a/content/handbook_2e/examples/28 Arrays/Ex_02/Ex_02.pde b/content/handbook_2e/examples/28 Arrays/Ex_02/Ex_02.pde new file mode 100644 index 000000000..ae7ae2684 --- /dev/null +++ b/content/handbook_2e/examples/28 Arrays/Ex_02/Ex_02.pde @@ -0,0 +1,7 @@ +int[] x = { 50, 61, 83, 69, 71, 50, 29, 31, 17, 39 }; + +fill(0); +// Reads one array element every time through the block +for (int i = 0; i < x.length; i++) { + rect(0, i*10, x[i], 8); +} diff --git a/content/handbook_2e/examples/28 Arrays/Ex_03/Ex_03.pde b/content/handbook_2e/examples/28 Arrays/Ex_03/Ex_03.pde new file mode 100644 index 000000000..1224cbb6f --- /dev/null +++ b/content/handbook_2e/examples/28 Arrays/Ex_03/Ex_03.pde @@ -0,0 +1,11 @@ +int[] data; // Declare + +void setup() { + size(100, 100); + data = new int[5]; // Create + data[0] = 19; // Assign + data[1] = 40; + data[2] = 75; + data[3] = 76; + data[4] = 90; +} diff --git a/content/handbook_2e/examples/28 Arrays/Ex_04/Ex_04.pde b/content/handbook_2e/examples/28 Arrays/Ex_04/Ex_04.pde new file mode 100644 index 000000000..d3dd8e468 --- /dev/null +++ b/content/handbook_2e/examples/28 Arrays/Ex_04/Ex_04.pde @@ -0,0 +1,10 @@ +int[] data = new int[5]; // Declare, create + +void setup() { + size(100, 100); + data[0] = 19; // Assign + data[1] = 40; + data[2] = 75; + data[3] = 76; + data[4] = 90; +} diff --git a/content/handbook_2e/examples/28 Arrays/Ex_05/Ex_05.pde b/content/handbook_2e/examples/28 Arrays/Ex_05/Ex_05.pde new file mode 100644 index 000000000..49598ce83 --- /dev/null +++ b/content/handbook_2e/examples/28 Arrays/Ex_05/Ex_05.pde @@ -0,0 +1,5 @@ +int[] data = { 19, 40, 75, 76, 90 }; // Declare, create, assign + +void setup() { + size(100, 100); +} diff --git a/content/handbook_2e/examples/28 Arrays/Ex_06/Ex_06.pde b/content/handbook_2e/examples/28 Arrays/Ex_06/Ex_06.pde new file mode 100644 index 000000000..fe4415a07 --- /dev/null +++ b/content/handbook_2e/examples/28 Arrays/Ex_06/Ex_06.pde @@ -0,0 +1,7 @@ +int[] data; // Declare +data = new int[5]; // Create +data[0] = 19; // Assign +data[1] = 40; +data[2] = 75; +data[3] = 76; +data[4] = 90; diff --git a/content/handbook_2e/examples/28 Arrays/Ex_07/Ex_07.pde b/content/handbook_2e/examples/28 Arrays/Ex_07/Ex_07.pde new file mode 100644 index 000000000..dcc3959c1 --- /dev/null +++ b/content/handbook_2e/examples/28 Arrays/Ex_07/Ex_07.pde @@ -0,0 +1,6 @@ +int[] data = new int[5]; // Declare, create +data[0] = 19; // Assign +data[1] = 40; +data[2] = 75; +data[3] = 76; +data[4] = 90; diff --git a/content/handbook_2e/examples/28 Arrays/Ex_08/Ex_08.pde b/content/handbook_2e/examples/28 Arrays/Ex_08/Ex_08.pde new file mode 100644 index 000000000..c0e289750 --- /dev/null +++ b/content/handbook_2e/examples/28 Arrays/Ex_08/Ex_08.pde @@ -0,0 +1 @@ +int[] data = { 19, 40, 75, 76, 90 }; // Declare, create, assign diff --git a/content/handbook_2e/examples/28 Arrays/Ex_09/Ex_09.pde b/content/handbook_2e/examples/28 Arrays/Ex_09/Ex_09.pde new file mode 100644 index 000000000..e1db4d56c --- /dev/null +++ b/content/handbook_2e/examples/28 Arrays/Ex_09/Ex_09.pde @@ -0,0 +1,6 @@ +int[] data = { 19, 40, 75, 76, 90 }; +line(data[0], 0, data[0], 100); +line(data[1], 0, data[1], 100); +line(data[2], 0, data[2], 100); +line(data[3], 0, data[3], 100); +line(data[4], 0, data[4], 100); diff --git a/content/handbook_2e/examples/28 Arrays/Ex_10/Ex_10.pde b/content/handbook_2e/examples/28 Arrays/Ex_10/Ex_10.pde new file mode 100644 index 000000000..7a9a26a3a --- /dev/null +++ b/content/handbook_2e/examples/28 Arrays/Ex_10/Ex_10.pde @@ -0,0 +1,4 @@ +int[] data = { 19, 40, 75, 76, 90 }; +println(data[0]); // Prints 19 to the console +println(data[2]); // Prints 75 to the console +println(data[5]); // ERROR! The last element of the array is 4 diff --git a/content/handbook_2e/examples/28 Arrays/Ex_11/Ex_11.pde b/content/handbook_2e/examples/28 Arrays/Ex_11/Ex_11.pde new file mode 100644 index 000000000..f69530a5e --- /dev/null +++ b/content/handbook_2e/examples/28 Arrays/Ex_11/Ex_11.pde @@ -0,0 +1,6 @@ +int[] data1 = { 19, 40, 75, 76, 90 }; +int[] data2 = { 19, 40 }; +int[] data3 = new int[127]; +println(data1.length); // Prints "5" to the console +println(data2.length); // Prints "2" to the console +println(data3.length); // Prints "127" to the console diff --git a/content/handbook_2e/examples/28 Arrays/Ex_12/Ex_12.pde b/content/handbook_2e/examples/28 Arrays/Ex_12/Ex_12.pde new file mode 100644 index 000000000..350aa9d92 --- /dev/null +++ b/content/handbook_2e/examples/28 Arrays/Ex_12/Ex_12.pde @@ -0,0 +1,4 @@ +int[] data = { 19, 40, 75, 76, 90 }; +for (int i = 0; i < data.length; i++) { + line(data[i], 0, data[i], 100); +} diff --git a/content/handbook_2e/examples/28 Arrays/Ex_13/Ex_13.pde b/content/handbook_2e/examples/28 Arrays/Ex_13/Ex_13.pde new file mode 100644 index 000000000..c78e06575 --- /dev/null +++ b/content/handbook_2e/examples/28 Arrays/Ex_13/Ex_13.pde @@ -0,0 +1,13 @@ +float[] sineWave = new float[width]; + +for (int i = 0; i < sineWave.length; i++) { + // Fill the array with values from sin() + float r = map(i, 0, width, 0, TWO_PI); + sineWave[i] = abs(sin(r)); +} + +for (int i = 0; i < sineWave.length; i++) { + // Set the stroke values to numbers read from the array + stroke(sineWave[i] * 255); + line(i, 0, i, height); +} diff --git a/content/handbook_2e/examples/28 Arrays/Ex_14/Ex_14.pde b/content/handbook_2e/examples/28 Arrays/Ex_14/Ex_14.pde new file mode 100644 index 000000000..3d3b8848f --- /dev/null +++ b/content/handbook_2e/examples/28 Arrays/Ex_14/Ex_14.pde @@ -0,0 +1,2 @@ +int[] data = { 19, 40, 75, 76, 90 }; +printArray(data); // Prints diff --git a/content/handbook_2e/examples/28 Arrays/Ex_15/Ex_15.pde b/content/handbook_2e/examples/28 Arrays/Ex_15/Ex_15.pde new file mode 100644 index 000000000..084e05955 --- /dev/null +++ b/content/handbook_2e/examples/28 Arrays/Ex_15/Ex_15.pde @@ -0,0 +1,21 @@ +int[] y; + +void setup() { + size(100, 100); + y = new int[width]; +} + +void draw() { + background(204); + // Read the array from the end to the + // beginning to avoid overwriting the data + for (int i = y.length-1; i > 0; i--) { + y[i] = y[i-1]; + } + // Add new values to the beginning + y[0] = mouseY; + // Display each pair of values as a line + for (int i = 1; i < y.length; i++) { + line(i, y[i], i-1, y[i-1]); + } +} diff --git a/content/handbook_2e/examples/28 Arrays/Ex_16/Ex_16.pde b/content/handbook_2e/examples/28 Arrays/Ex_16/Ex_16.pde new file mode 100644 index 000000000..b115a2068 --- /dev/null +++ b/content/handbook_2e/examples/28 Arrays/Ex_16/Ex_16.pde @@ -0,0 +1,25 @@ +int num = 50; +int[] x = new int[num]; +int[] y = new int[num]; + +void setup() { + size(100, 100); + noStroke(); + fill(255, 102); +} + +void draw() { + background(0); + // Shift the values to the right + for (int i = num-1; i > 0; i--) { + x[i] = x[i-1]; + y[i] = y[i-1]; + } + // Add the new values to the beginning of the array + x[0] = mouseX; + y[0] = mouseY; + // Draw the circles + for (int i = 0; i < num; i++) { + ellipse(x[i], y[i], i/2.0, i/2.0); + } +} diff --git a/content/handbook_2e/examples/28 Arrays/Ex_17/Ex_17.pde b/content/handbook_2e/examples/28 Arrays/Ex_17/Ex_17.pde new file mode 100644 index 000000000..2fdd2137d --- /dev/null +++ b/content/handbook_2e/examples/28 Arrays/Ex_17/Ex_17.pde @@ -0,0 +1,13 @@ +String[] trees = { "ash", "oak" }; +append(trees, "maple"); // INCORRECT! Does not change the array +printArray(trees); // Prints [0] "ash", [1] "oak" +println(); +trees = append(trees, "maple"); // Add "maple" to the end +printArray(trees); // Prints [0] "ash", [1] "oak", [2] "maple" +println(); +// Add "beech" to the end of the trees array, and creates a new +// array to store the change +String[] moretrees = append(trees, "beech"); +// Prints [0] "ash", [1] "oak", [2] "maple", [3] "beech" +printArray(moretrees); + diff --git a/content/handbook_2e/examples/28 Arrays/Ex_18/Ex_18.pde b/content/handbook_2e/examples/28 Arrays/Ex_18/Ex_18.pde new file mode 100644 index 000000000..1bc7264b8 --- /dev/null +++ b/content/handbook_2e/examples/28 Arrays/Ex_18/Ex_18.pde @@ -0,0 +1,14 @@ +String[] trees = { "ash", "oak" }; +append(trees, "maple"); // INCORRECT! Does not change the array +printArray(trees); // Prints [0] "ash", [1] "oak" +println(); + +trees = append(trees, "maple"); // Add "maple" to the end +printArray(trees); // Prints [0] "ash", [1] "oak", [2] "maple" +println(); + +// Add "beech" to the end of the trees array, and creates a new +// array to store the change +String[] moretrees = append(trees, "beech"); +// Prints [0] "ash", [1] "oak", [2] "maple", [3] "beech" +printArray(moretrees); diff --git a/content/handbook_2e/examples/28 Arrays/Ex_19/Ex_19.pde b/content/handbook_2e/examples/28 Arrays/Ex_19/Ex_19.pde new file mode 100644 index 000000000..bba886358 --- /dev/null +++ b/content/handbook_2e/examples/28 Arrays/Ex_19/Ex_19.pde @@ -0,0 +1,8 @@ +String[] trees = { "lychee", "coconut", "fig"}; + +trees = shorten(trees); // Remove the last element from the array +printArray(trees); // Prints [0] "lychee", [1] "coconut" +println(); + +trees = shorten(trees); // Remove the last element from the array +printArray(trees); // Prints [0] "lychee" diff --git a/content/handbook_2e/examples/28 Arrays/Ex_20/Ex_20.pde b/content/handbook_2e/examples/28 Arrays/Ex_20/Ex_20.pde new file mode 100644 index 000000000..3e76aec7d --- /dev/null +++ b/content/handbook_2e/examples/28 Arrays/Ex_20/Ex_20.pde @@ -0,0 +1,15 @@ +int[] x = new int[100]; // Array to store x-coordinates +int count = 0; // Positions stored in the array + +void setup() { + size(100, 100); +} + +void draw() { + x[count] = mouseX; // Assign new x-coordinate to the array + count++; // Increment the counter + if (count == x.length) { // If the x array is full, + x = expand(x); // double the size of x + println(x.length); // Write the new size to the console + } +} diff --git a/content/handbook_2e/examples/28 Arrays/Ex_21/Ex_21.pde b/content/handbook_2e/examples/28 Arrays/Ex_21/Ex_21.pde new file mode 100644 index 000000000..2337735d2 --- /dev/null +++ b/content/handbook_2e/examples/28 Arrays/Ex_21/Ex_21.pde @@ -0,0 +1,9 @@ +String[] north = { "OH", "IN", "MI" }; +String[] south = { "GA", "FL", "NC" }; +arraycopy(north, south); // Copy from north array to south array +printArray(south); // Prints [0] "OH", [1] "IN", [3] "MI" +println(); +String[] east = { "MA", "NY", "RI" }; +String[] west = new String[east.length]; // Create a new array +arraycopy(east, west); // Copy from east array to west array +printArray(west); // Prints [0] "MA", [1] "NY", [2] "RI" diff --git a/content/handbook_2e/examples/28 Arrays/Ex_22/Ex_22.pde b/content/handbook_2e/examples/28 Arrays/Ex_22/Ex_22.pde new file mode 100644 index 000000000..33ae4cb1f --- /dev/null +++ b/content/handbook_2e/examples/28 Arrays/Ex_22/Ex_22.pde @@ -0,0 +1,16 @@ +float[] data = { 19.0, 40.0, 75.0, 76.0, 90.0 }; + +void setup() { + halve(data); + println(data[0]); // Prints "9.5" + println(data[1]); // Prints "20.0" + println(data[2]); // Prints "37.5" + println(data[3]); // Prints "38.0" + println(data[4]); // Prints "45.0" +} + +void halve(float[] d) { + for (int i = 0; i < d.length; i++) { // For each array element, + d[i] = d[i] / 2.0; // divide the value by 2 + } +} diff --git a/content/handbook_2e/examples/28 Arrays/Ex_23/Ex_23.pde b/content/handbook_2e/examples/28 Arrays/Ex_23/Ex_23.pde new file mode 100644 index 000000000..2daf4b297 --- /dev/null +++ b/content/handbook_2e/examples/28 Arrays/Ex_23/Ex_23.pde @@ -0,0 +1,20 @@ +float[] data = { 19.0, 40.0, 75.0, 76.0, 90.0 }; +float[] halfData; + +void setup() { + halfData = halve(data); // Run the halve() function + println(data[0], halfData[0]); // Prints "19.0, 9.5" + println(data[1], halfData[1]); // Prints "40.0, 20.0" + println(data[2], halfData[2]); // Prints "75.0, 37.5" + println(data[3], halfData[3]); // Prints "76.0, 38.0" + println(data[4], halfData[4]); // Prints "90.0, 45.0" +} + +float[] halve(float[] d) { + float[] numbers = new float[d.length]; // Create a new array + arrayCopy(d, numbers); + for (int i = 0; i < numbers.length; i++) { // For each element, + numbers[i] = numbers[i] / 2.0; // divide the value by 2 + } + return numbers; // Return the new array +} diff --git a/content/handbook_2e/examples/28 Arrays/Ex_24/Ex_24.pde b/content/handbook_2e/examples/28 Arrays/Ex_24/Ex_24.pde new file mode 100644 index 000000000..7b0a0250c --- /dev/null +++ b/content/handbook_2e/examples/28 Arrays/Ex_24/Ex_24.pde @@ -0,0 +1,28 @@ +Ring[] rings; // Declare the array +int numRings = 50; +int currentRing = 0; + +void setup() { + size(100, 100); + rings = new Ring[numRings]; // Create the array + for (int i = 0; i < numRings; i++) { + rings[i] = new Ring(); // Create each object + } +} + +void draw() { + background(0); + for (int i = 0; i < numRings; i++) { + rings[i].grow(); + rings[i].display(); + } +} + +// Click to create a new Ring +void mousePressed() { + rings[currentRing].start(mouseX, mouseY); + currentRing++; + if (currentRing >= numRings) { + currentRing = 0; + } +} diff --git a/content/handbook_2e/examples/28 Arrays/Ex_24/Ring.pde b/content/handbook_2e/examples/28 Arrays/Ex_24/Ring.pde new file mode 100644 index 000000000..53cb75838 --- /dev/null +++ b/content/handbook_2e/examples/28 Arrays/Ex_24/Ring.pde @@ -0,0 +1,32 @@ +class Ring { + float x, y; // X-coordinate, y-coordinate + float diameter; // Diameter of the ring + boolean on = false; // Turns the display on and off + + void start(float xpos, float ypos) { + x = xpos; + y = ypos; + + diameter = 1; + on = true; + } + + void grow() { + if (on == true) { + diameter += 0.5; + if (diameter > 400) { + on = false; + diameter = 1; + } + } + } + + void display() { + if (on == true) { + noFill(); + strokeWeight(4); + stroke(204, 153); + ellipse(x, y, diameter, diameter); + } + } +} diff --git a/content/handbook_2e/examples/28 Arrays/Ex_25/Ex_25.pde b/content/handbook_2e/examples/28 Arrays/Ex_25/Ex_25.pde new file mode 100644 index 000000000..870c99097 --- /dev/null +++ b/content/handbook_2e/examples/28 Arrays/Ex_25/Ex_25.pde @@ -0,0 +1,26 @@ +Spot[] spots; // Declare array + +void setup() { + size(700, 100); + int numSpots = 70; // Number of objects + int dia = width/numSpots; // Calculate diameter + spots = new Spot[numSpots]; // Create array + for (int i = 0; i < spots.length; i++) { + float x = dia/2 + i*dia; + float rate = random(0.1, 2.0); + // Create each object + spots[i] = new Spot(x, 50, dia, rate); + } + noStroke(); +} + +void draw() { + fill(0, 12); + rect(0, 0, width, height); + fill(255); + for (int i=0; i < spots.length; i++) { + spots[i].move(); // Move each object + spots[i].display(); // Display each object + } +} + diff --git a/content/handbook_2e/examples/28 Arrays/Ex_25/Spot.pde b/content/handbook_2e/examples/28 Arrays/Ex_25/Spot.pde new file mode 100644 index 000000000..fe60a0035 --- /dev/null +++ b/content/handbook_2e/examples/28 Arrays/Ex_25/Spot.pde @@ -0,0 +1,25 @@ +class Spot { + float x, y; // X-coordinate, y-coordinate + float diameter; // Diameter of the circle + float speed; // Distance moved each frame + int direction = 1; // Direction of motion (1 is down, -1 is up) + + // Constructor + Spot(float xpos, float ypos, float dia, float sp) { + x = xpos; + y = ypos; + diameter = dia; + speed = sp; + } + + void move() { + y += (speed * direction); + if ((y > (height - diameter/2)) || (y < diameter/2)) { + direction *= -1; + } + } + + void display() { + ellipse(x, y, diameter, diameter); + } +} diff --git a/content/handbook_2e/examples/28 Arrays/Ex_26/Ex_26.pde b/content/handbook_2e/examples/28 Arrays/Ex_26/Ex_26.pde new file mode 100644 index 000000000..343ca478d --- /dev/null +++ b/content/handbook_2e/examples/28 Arrays/Ex_26/Ex_26.pde @@ -0,0 +1,8 @@ +int[][] x = { {50, 0}, {61,204}, {83,51}, {69,102}, {71, 0}, + {50,153}, {29, 0}, {31,51}, {17,102}, {39,204} }; + +println(x[0][0]); // Prints "50" +println(x[0][1]); // Prints "0" +println(x[4][2]); // ERROR! This element is outside the array +println(x[3][0]); // Prints "69" +println(x[9][1]); // Prints "204" diff --git a/content/handbook_2e/examples/28 Arrays/Ex_27/Ex_27.pde b/content/handbook_2e/examples/28 Arrays/Ex_27/Ex_27.pde new file mode 100644 index 000000000..017582072 --- /dev/null +++ b/content/handbook_2e/examples/28 Arrays/Ex_27/Ex_27.pde @@ -0,0 +1,14 @@ +int[][] x = { {50, 0}, {61,204}, {83,51}, {69,102}, {71, 0}, + {50,153}, {29, 0}, {31,51}, {17,102}, {39,204} }; + +void setup() { + size(100, 100); +} + +void draw() { + for (int i = 0; i < x.length; i++) { + fill(x[i][1]); + rect(0, i*10, x[i][0], 8); + } +} + diff --git a/content/handbook_2e/examples/29 Animation/Ex_01/Ex_01.pde b/content/handbook_2e/examples/29 Animation/Ex_01/Ex_01.pde new file mode 100644 index 000000000..f1b24d0f7 --- /dev/null +++ b/content/handbook_2e/examples/29 Animation/Ex_01/Ex_01.pde @@ -0,0 +1,28 @@ +int numFrames = 12; // The number of animation frames +int frame = 0; // The frame to display +PImage[] images = new PImage[numFrames]; // Image array + +void setup() { + size(100, 100); + frameRate(30); // Maximum 30 frames per second + images[0] = loadImage("ani-000.gif"); + images[1] = loadImage("ani-001.gif"); + images[2] = loadImage("ani-002.gif"); + images[3] = loadImage("ani-003.gif"); + images[4] = loadImage("ani-004.gif"); + images[5] = loadImage("ani-005.gif"); + images[6] = loadImage("ani-006.gif"); + images[7] = loadImage("ani-007.gif"); + images[8] = loadImage("ani-008.gif"); + images[9] = loadImage("ani-009.gif"); + images[10] = loadImage("ani-010.gif"); + images[11] = loadImage("ani-011.gif"); +} + +void draw() { + image(images[frame], 0, 0); + frame++; + if (frame == numFrames) { + frame = 0; + } +} diff --git a/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-000.gif b/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-000.gif new file mode 100644 index 000000000..1a62c89dd Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-000.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-001.gif b/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-001.gif new file mode 100644 index 000000000..8fa73ba5f Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-001.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-002.gif b/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-002.gif new file mode 100644 index 000000000..b9862cdb9 Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-002.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-003.gif b/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-003.gif new file mode 100644 index 000000000..78d757200 Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-003.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-004.gif b/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-004.gif new file mode 100644 index 000000000..bc9a90347 Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-004.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-005.gif b/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-005.gif new file mode 100644 index 000000000..55454e80f Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-005.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-006.gif b/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-006.gif new file mode 100644 index 000000000..ed3fd318f Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-006.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-007.gif b/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-007.gif new file mode 100644 index 000000000..b91b69d94 Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-007.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-008.gif b/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-008.gif new file mode 100644 index 000000000..b32af1571 Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-008.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-009.gif b/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-009.gif new file mode 100644 index 000000000..da247b92e Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-009.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-010.gif b/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-010.gif new file mode 100644 index 000000000..6752a466e Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-010.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-011.gif b/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-011.gif new file mode 100644 index 000000000..332652d91 Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_01/data/ani-011.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_02/Ex_02.pde b/content/handbook_2e/examples/29 Animation/Ex_02/Ex_02.pde new file mode 100644 index 000000000..c29f55f97 --- /dev/null +++ b/content/handbook_2e/examples/29 Animation/Ex_02/Ex_02.pde @@ -0,0 +1,19 @@ +int numFrames = 12; // The number of animation frames +PImage[] images = new PImage[numFrames]; // Image array + +void setup() { + size(100, 100); + frameRate(30); // Maximum 30 frames per second + // Automate the image loading + for (int i = 0; i < images.length; i++) { + // Construct the name of the image to load + String imageName = "ani-" + nf(i, 3) + ".gif"; + images[i] = loadImage(imageName); + } +} + +void draw() { + // Calculate the frame to display, use % to cycle through frames + int frame = frameCount % numFrames; + image(images[frame], 0, 0); +} diff --git a/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-000.gif b/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-000.gif new file mode 100644 index 000000000..1a62c89dd Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-000.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-001.gif b/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-001.gif new file mode 100644 index 000000000..8fa73ba5f Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-001.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-002.gif b/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-002.gif new file mode 100644 index 000000000..b9862cdb9 Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-002.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-003.gif b/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-003.gif new file mode 100644 index 000000000..78d757200 Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-003.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-004.gif b/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-004.gif new file mode 100644 index 000000000..bc9a90347 Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-004.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-005.gif b/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-005.gif new file mode 100644 index 000000000..55454e80f Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-005.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-006.gif b/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-006.gif new file mode 100644 index 000000000..ed3fd318f Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-006.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-007.gif b/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-007.gif new file mode 100644 index 000000000..b91b69d94 Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-007.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-008.gif b/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-008.gif new file mode 100644 index 000000000..b32af1571 Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-008.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-009.gif b/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-009.gif new file mode 100644 index 000000000..da247b92e Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-009.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-010.gif b/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-010.gif new file mode 100644 index 000000000..6752a466e Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-010.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-011.gif b/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-011.gif new file mode 100644 index 000000000..332652d91 Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_02/data/ani-011.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_03/Ex_03.pde b/content/handbook_2e/examples/29 Animation/Ex_03/Ex_03.pde new file mode 100644 index 000000000..b23f32816 --- /dev/null +++ b/content/handbook_2e/examples/29 Animation/Ex_03/Ex_03.pde @@ -0,0 +1,16 @@ +int numFrames = 5; // The number of animation frames +PImage[] images = new PImage[numFrames]; + +void setup() { + size(100, 100); + for (int i = 0; i < images.length; i++) { + String imageName = "ani-" + nf(i, 3) + ".gif"; + images[i] = loadImage(imageName); + } +} + +void draw() { + int frame = int(random(0, numFrames)); // The frame to display + image(images[frame], 0, 0); + frameRate(random(1, 60.0)); +} diff --git a/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-000.gif b/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-000.gif new file mode 100644 index 000000000..1a62c89dd Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-000.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-001.gif b/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-001.gif new file mode 100644 index 000000000..8fa73ba5f Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-001.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-002.gif b/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-002.gif new file mode 100644 index 000000000..b9862cdb9 Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-002.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-003.gif b/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-003.gif new file mode 100644 index 000000000..78d757200 Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-003.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-004.gif b/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-004.gif new file mode 100644 index 000000000..bc9a90347 Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-004.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-005.gif b/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-005.gif new file mode 100644 index 000000000..55454e80f Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-005.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-006.gif b/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-006.gif new file mode 100644 index 000000000..ed3fd318f Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-006.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-007.gif b/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-007.gif new file mode 100644 index 000000000..b91b69d94 Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-007.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-008.gif b/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-008.gif new file mode 100644 index 000000000..b32af1571 Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-008.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-009.gif b/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-009.gif new file mode 100644 index 000000000..da247b92e Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-009.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-010.gif b/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-010.gif new file mode 100644 index 000000000..6752a466e Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-010.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-011.gif b/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-011.gif new file mode 100644 index 000000000..332652d91 Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_03/data/ani-011.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_04/Ex_04.pde b/content/handbook_2e/examples/29 Animation/Ex_04/Ex_04.pde new file mode 100644 index 000000000..b342acb85 --- /dev/null +++ b/content/handbook_2e/examples/29 Animation/Ex_04/Ex_04.pde @@ -0,0 +1,24 @@ +int numFrames = 12; // The number of animation frames +int topFrame = 0; // The top frame to display +int bottomFrame = 0; // The bottom frame to display +PImage[] images = new PImage[numFrames]; +int lastTime = 0; + +void setup() { + size(100, 100); + frameRate(30); + for (int i = 0; i < images.length; i++) { + String imageName = "ani-" + nf(i, 3) + ".gif"; + images[i] = loadImage(imageName); + } +} + +void draw() { + image(images[bottomFrame], 0, 50); + topFrame = (topFrame + 1) % numFrames; + image(images[topFrame], 0, 0); + if ((millis() - lastTime) > 500) { + bottomFrame = (bottomFrame + 1) % numFrames; + lastTime = millis(); + } +} diff --git a/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-000.gif b/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-000.gif new file mode 100644 index 000000000..1a62c89dd Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-000.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-001.gif b/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-001.gif new file mode 100644 index 000000000..8fa73ba5f Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-001.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-002.gif b/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-002.gif new file mode 100644 index 000000000..b9862cdb9 Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-002.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-003.gif b/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-003.gif new file mode 100644 index 000000000..78d757200 Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-003.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-004.gif b/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-004.gif new file mode 100644 index 000000000..bc9a90347 Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-004.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-005.gif b/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-005.gif new file mode 100644 index 000000000..55454e80f Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-005.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-006.gif b/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-006.gif new file mode 100644 index 000000000..ed3fd318f Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-006.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-007.gif b/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-007.gif new file mode 100644 index 000000000..b91b69d94 Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-007.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-008.gif b/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-008.gif new file mode 100644 index 000000000..b32af1571 Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-008.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-009.gif b/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-009.gif new file mode 100644 index 000000000..da247b92e Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-009.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-010.gif b/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-010.gif new file mode 100644 index 000000000..6752a466e Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-010.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-011.gif b/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-011.gif new file mode 100644 index 000000000..332652d91 Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_04/data/ani-011.gif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_05/Ex_05.pde b/content/handbook_2e/examples/29 Animation/Ex_05/Ex_05.pde new file mode 100644 index 000000000..10a026ed5 --- /dev/null +++ b/content/handbook_2e/examples/29 Animation/Ex_05/Ex_05.pde @@ -0,0 +1,4 @@ +line(0, 0, width, height); +line(width, 0, 0, height); +// Saves the TIFF file "x.tif" to the current sketch's folder +save("x.tif"); diff --git a/content/handbook_2e/examples/29 Animation/Ex_06/Ex_06.pde b/content/handbook_2e/examples/29 Animation/Ex_06/Ex_06.pde new file mode 100644 index 000000000..fcc487470 --- /dev/null +++ b/content/handbook_2e/examples/29 Animation/Ex_06/Ex_06.pde @@ -0,0 +1,4 @@ +line(0, 0, width, height); +// Saves the TIFF file "line.tif" to the current sketch's folder +save("line.tif"); +line(width, 0, 0, height); diff --git a/content/handbook_2e/examples/29 Animation/Ex_06/line.tif b/content/handbook_2e/examples/29 Animation/Ex_06/line.tif new file mode 100644 index 000000000..bfd139366 Binary files /dev/null and b/content/handbook_2e/examples/29 Animation/Ex_06/line.tif differ diff --git a/content/handbook_2e/examples/29 Animation/Ex_07/Ex_07.pde b/content/handbook_2e/examples/29 Animation/Ex_07/Ex_07.pde new file mode 100644 index 000000000..5dc2204b7 --- /dev/null +++ b/content/handbook_2e/examples/29 Animation/Ex_07/Ex_07.pde @@ -0,0 +1,8 @@ +// Save the first 50 frames +void draw() { + background(0); + ellipse(mouseX, 50, 40, 40); + if (frameCount <= 50) { + saveFrame("circles-####.tif"); + } +} diff --git a/content/handbook_2e/examples/29 Animation/Ex_08/Ex_08.pde b/content/handbook_2e/examples/29 Animation/Ex_08/Ex_08.pde new file mode 100644 index 000000000..feb7e9e44 --- /dev/null +++ b/content/handbook_2e/examples/29 Animation/Ex_08/Ex_08.pde @@ -0,0 +1,8 @@ +// Save 24 frames, from x-1000.tif to x-1023.tif +void draw() { + background(204); + line(mouseX, mouseY, pmouseX, pmouseY); + if ((frameCount > 999) && (frameCount < 1024)) { + saveFrame("line-####.tif"); + } +} diff --git a/content/handbook_2e/examples/29 Animation/Ex_09/Ex_09.pde b/content/handbook_2e/examples/29 Animation/Ex_09/Ex_09.pde new file mode 100644 index 000000000..fb9c7912a --- /dev/null +++ b/content/handbook_2e/examples/29 Animation/Ex_09/Ex_09.pde @@ -0,0 +1,8 @@ +// Save every fifth frame (i.e., x-0005.tif, x-0010.tif, x-0015.tif) +void draw() { + background(204); + line(mouseX, mouseY, pmouseX, pmouseY); + if ((frameCount % 5) == 0) { + saveFrame("line-####.tif"); + } +} diff --git a/content/handbook_2e/examples/30 Dynamic Drawing/Ex_01/Ex_01.pde b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_01/Ex_01.pde new file mode 100644 index 000000000..be5f3aef7 --- /dev/null +++ b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_01/Ex_01.pde @@ -0,0 +1,8 @@ +void setup() { + size(100, 100); + noSmooth(); +} + +void draw() { + point(mouseX, mouseY); +} diff --git a/content/handbook_2e/examples/30 Dynamic Drawing/Ex_02/Ex_02.pde b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_02/Ex_02.pde new file mode 100644 index 000000000..ca3ee237a --- /dev/null +++ b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_02/Ex_02.pde @@ -0,0 +1,7 @@ +void setup() { + size(100, 100); +} + +void draw() { + line(mouseX, mouseY, pmouseX, pmouseY); +} diff --git a/content/handbook_2e/examples/30 Dynamic Drawing/Ex_03/Ex_03.pde b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_03/Ex_03.pde new file mode 100644 index 000000000..8d1b20035 --- /dev/null +++ b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_03/Ex_03.pde @@ -0,0 +1,9 @@ +void setup() { + size(100, 100); +} + +void draw() { + if (mousePressed == true) { + line(mouseX, mouseY, pmouseX, pmouseY); + } +} diff --git a/content/handbook_2e/examples/30 Dynamic Drawing/Ex_04/Ex_04.pde b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_04/Ex_04.pde new file mode 100644 index 000000000..7b005d27d --- /dev/null +++ b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_04/Ex_04.pde @@ -0,0 +1,12 @@ +void setup() { + size(100, 100); +} + +void draw() { + if (mousePressed == true) { // If mouse is pressed, + stroke(255); // set the stroke to white + } else { // Otherwise, + stroke(0); // set to black + } + line(mouseX, mouseY, pmouseX, pmouseY); +} diff --git a/content/handbook_2e/examples/30 Dynamic Drawing/Ex_05/Ex_05.pde b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_05/Ex_05.pde new file mode 100644 index 000000000..d5df95cb5 --- /dev/null +++ b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_05/Ex_05.pde @@ -0,0 +1,9 @@ +void setup() { + size(100, 100); +} + +void draw() { + for (int i = 0; i < 50; i += 2) { + point(mouseX+i, mouseY+i); + } +} diff --git a/content/handbook_2e/examples/30 Dynamic Drawing/Ex_06/Ex_06.pde b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_06/Ex_06.pde new file mode 100644 index 000000000..92258a0ec --- /dev/null +++ b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_06/Ex_06.pde @@ -0,0 +1,9 @@ +void setup() { + size(100, 100); +} + +void draw() { + for (int i = -14; i <= 14; i += 2) { + point(mouseX+i, mouseY); + } +} diff --git a/content/handbook_2e/examples/30 Dynamic Drawing/Ex_07/Ex_07.pde b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_07/Ex_07.pde new file mode 100644 index 000000000..1a4ecefd4 --- /dev/null +++ b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_07/Ex_07.pde @@ -0,0 +1,17 @@ +void setup() { + size(100, 100); + noStroke(); + fill(255, 40); + background(0); +} + +void draw() { + if (mousePressed == true) { + fill(0, 26); + } else { + fill(255, 26); + } + for (int i = 0; i < 6; i++) { + ellipse(mouseX + i*i, mouseY, i, i); + } +} diff --git a/content/handbook_2e/examples/30 Dynamic Drawing/Ex_08/Ex_08.pde b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_08/Ex_08.pde new file mode 100644 index 000000000..86fd763dd --- /dev/null +++ b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_08/Ex_08.pde @@ -0,0 +1,11 @@ +PImage lineImage; + +void setup() { + size(100, 100); + // This image is 100 pixels wide, but one pixel tall + lineImage = loadImage("imageline.jpg"); +} + +void draw() { + image(lineImage, mouseX-lineImage.width/2, mouseY); +} diff --git a/content/handbook_2e/examples/30 Dynamic Drawing/Ex_08/data/imageline.jpg b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_08/data/imageline.jpg new file mode 100644 index 000000000..cb7ad356e Binary files /dev/null and b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_08/data/imageline.jpg differ diff --git a/content/handbook_2e/examples/30 Dynamic Drawing/Ex_09/Ex_09.pde b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_09/Ex_09.pde new file mode 100644 index 000000000..ac6f926a2 --- /dev/null +++ b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_09/Ex_09.pde @@ -0,0 +1,14 @@ +PImage alphaImg; + +void setup() { + size(100, 100); + // This image is partially transparent + alphaImg = loadImage("dwp.png"); + background(0); +} + +void draw() { + int ix = mouseX - alphaImg.width/2; + int iy = mouseY - alphaImg.height/2; + image(alphaImg, ix, iy); +} diff --git a/content/handbook_2e/examples/30 Dynamic Drawing/Ex_09/data/dwp.png b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_09/data/dwp.png new file mode 100644 index 000000000..3ee0c99f9 Binary files /dev/null and b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_09/data/dwp.png differ diff --git a/content/handbook_2e/examples/30 Dynamic Drawing/Ex_10/Ex_10.pde b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_10/Ex_10.pde new file mode 100644 index 000000000..924248dbc --- /dev/null +++ b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_10/Ex_10.pde @@ -0,0 +1,15 @@ +PShape map; + +void setup() { + size(100, 100); + map = loadShape("antarctica.svg"); + map.disableStyle(); + stroke(255, 10); + noFill(); + background(0); + shapeMode(CENTER); +} + +void draw() { + shape(map, mouseX, mouseY); +} diff --git a/content/handbook_2e/examples/30 Dynamic Drawing/Ex_10/data/antarctica.svg b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_10/data/antarctica.svg new file mode 100644 index 000000000..b2e13775a --- /dev/null +++ b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_10/data/antarctica.svg @@ -0,0 +1,917 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/handbook_2e/examples/30 Dynamic Drawing/Ex_10/data/dwp.png b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_10/data/dwp.png new file mode 100644 index 000000000..3ee0c99f9 Binary files /dev/null and b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_10/data/dwp.png differ diff --git a/content/handbook_2e/examples/30 Dynamic Drawing/Ex_11/Ex_11.pde b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_11/Ex_11.pde new file mode 100644 index 000000000..57a61daa9 --- /dev/null +++ b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_11/Ex_11.pde @@ -0,0 +1,12 @@ +void setup() { + size(700, 100); + stroke(0, 102); +} + +void draw() { + if (mousePressed == true) { + float weight = dist(mouseX, mouseY, pmouseX, pmouseY); + strokeWeight(weight); + line(mouseX, mouseY, pmouseX, pmouseY); + } +} diff --git a/content/handbook_2e/examples/30 Dynamic Drawing/Ex_12/Ex_12.pde b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_12/Ex_12.pde new file mode 100644 index 000000000..810f78089 --- /dev/null +++ b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_12/Ex_12.pde @@ -0,0 +1,22 @@ +float x, y; +float px, py; +float easing = 0.1; + +void setup() { + size(600, 100); + stroke(0, 102); +} + +void draw() { + float targetX = mouseX; + float targetY = mouseY; + x += (targetX - x) * easing; + y += (targetY - y) * easing; + float weight = dist(x, y, px, py); + strokeWeight(weight); + if (mousePressed == true) { + line(x, y, px, py); + } + py = y; + px = x; +} diff --git a/content/handbook_2e/examples/30 Dynamic Drawing/Ex_13/Ex_13.pde b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_13/Ex_13.pde new file mode 100644 index 000000000..5f61fbccd --- /dev/null +++ b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_13/Ex_13.pde @@ -0,0 +1,14 @@ +void setup() { + size(700, 100); +} + +void draw() { + if (mousePressed == true) { + float angle = atan2(mouseY-height/2, mouseX-width/2); + pushMatrix(); + translate(mouseX, mouseY); + rotate(angle); + line(0, 0, 50, 0); + popMatrix(); + } +} diff --git a/content/handbook_2e/examples/30 Dynamic Drawing/Ex_14/Ex_14.pde b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_14/Ex_14.pde new file mode 100644 index 000000000..bc3689159 --- /dev/null +++ b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_14/Ex_14.pde @@ -0,0 +1,21 @@ +int clickX, clickY; + +void setup() { + size(700, 100); +} + +void draw() { + if (mousePressed == true) { + float angle = atan2(mouseY-clickY, mouseX-clickX); + pushMatrix(); + translate(mouseX, mouseY); + rotate(angle); + line(0, 0, 50, 0); + popMatrix(); + } +} + +void mousePressed() { + clickX = mouseX; + clickY = mouseY; +} diff --git a/content/handbook_2e/examples/30 Dynamic Drawing/Ex_15/Ex_15.pde b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_15/Ex_15.pde new file mode 100644 index 000000000..9826e3390 --- /dev/null +++ b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_15/Ex_15.pde @@ -0,0 +1,24 @@ +int angle = 0; + +void setup() { + size(700, 100); + noStroke(); + fill(0, 102); +} + +void draw() { + if (mousePressed == true) { + angle += 10; + float val = cos(radians(angle)) * 6.0; + // Draw an cluster of circles + for (int a = 0; a < 360; a += 75) { + float xoff = cos(radians(a)) * val; + float yoff = sin(radians(a)) * val; + fill(0); + ellipse(mouseX + xoff, mouseY + yoff, val/2, val/2); + } + fill(255); + ellipse(mouseX, mouseY, 2, 2); + } +} + diff --git a/content/handbook_2e/examples/30 Dynamic Drawing/Ex_16/Ex_16.pde b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_16/Ex_16.pde new file mode 100644 index 000000000..833b3f5f0 --- /dev/null +++ b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_16/Ex_16.pde @@ -0,0 +1,35 @@ +Blade diagonal; + +void setup() { + size(700, 100); + noSmooth(); + diagonal = new Blade(30, 80); +} + +void draw() { + diagonal.grow(); +} + +void mouseMoved() { + diagonal.seed(mouseX, mouseY); +} + +class Blade { + float x, y; + + Blade(int xpos, int ypos) { + x = xpos; + y = ypos; + } + + void seed(int xpos, int ypos) { + x = xpos; + y = ypos; + } + + void grow() { + x += 0.5; + y -= 1.0; + point(x, y); + } +} diff --git a/content/handbook_2e/examples/30 Dynamic Drawing/Ex_17/Ex_17.pde b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_17/Ex_17.pde new file mode 100644 index 000000000..3e81f984c --- /dev/null +++ b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_17/Ex_17.pde @@ -0,0 +1,17 @@ +float x1, y1, x2, y2; + +void setup() { + size(100, 100); + x1 = width / 4.0; + y1 = x1; + x2 = width - x1; + y2 = x2; +} +void draw() { + background(204); + x1 += random(-0.5, 0.5); + y1 += random(-0.5, 0.5); + x2 += random(-0.5, 0.5); + y2 += random(-0.5, 0.5); + line(x1, y1, x2, y2); +} diff --git a/content/handbook_2e/examples/30 Dynamic Drawing/Ex_18/Ex_18.pde b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_18/Ex_18.pde new file mode 100644 index 000000000..31d3aec53 --- /dev/null +++ b/content/handbook_2e/examples/30 Dynamic Drawing/Ex_18/Ex_18.pde @@ -0,0 +1,44 @@ +int numLines = 500; +MovingLine[] lines = new MovingLine[numLines]; +int currentLine = 0; + +void setup() { + size(300, 100); + for (int i = 0; i < numLines; i++) { + lines[i] = new MovingLine(); + } +} + +void draw() { + background(204); + for (int i = 0; i < currentLine; i++) { + lines[i].display(); + } +} + +void mouseDragged() { + lines[currentLine].setPosition(mouseX, mouseY, + pmouseX, pmouseY); + if (currentLine < numLines - 1) { + currentLine++; + } +} + +class MovingLine { + float x1, y1, x2, y2; + + void setPosition(int x, int y, int px, int py) { + x1 = x; + y1 = y; + x2 = px; + y2 = py; + } + + void display() { + x1 += random(-0.1, 0.1); + y1 += random(-0.1, 0.1); + x2 += random(-0.1, 0.1); + y2 += random(-0.1, 0.1); + line(x1, y1, x2, y2); + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_01/Ex_01.pde b/content/handbook_2e/examples/31 Simulate/Ex_01/Ex_01.pde new file mode 100644 index 000000000..c2e1e9b41 --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_01/Ex_01.pde @@ -0,0 +1,23 @@ +float y = 50.0; +float radius = 15.0; +float velocity = 0.0; +float acceleration = 0.01; + +void setup() { + size(100, 100); + + noStroke(); + ellipseMode(RADIUS); +} + +void draw() { + fill(0, 10); + rect(0, 0, width, height); + fill(255); + ellipse(33, y, radius, radius); + velocity += acceleration; // Increase the velocity + y += velocity; // Update the position + if (y > height+radius) { // If over the bottom edge, + y = -radius; // move to the top + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_02/Ex_02.pde b/content/handbook_2e/examples/31 Simulate/Ex_02/Ex_02.pde new file mode 100644 index 000000000..b109bc87a --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_02/Ex_02.pde @@ -0,0 +1,22 @@ +float y = 50.0; +float radius = 15.0; +float velocity = 9.0; +float acceleration = -0.05; + +void setup() { + size(100, 100); + noStroke(); + ellipseMode(RADIUS); +} + +void draw() { + fill(0, 12); + rect(0, 0, width, height); + fill(255); + ellipse(33, y, radius, radius); + velocity += acceleration; + y += velocity; + if (y > height+radius) { + y = -radius; + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_03/Ex_03.pde b/content/handbook_2e/examples/31 Simulate/Ex_03/Ex_03.pde new file mode 100644 index 000000000..e8d847b13 --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_03/Ex_03.pde @@ -0,0 +1,22 @@ +float y = 50.0; +float radius = 15.0; +float velocity = 8.0; +float friction = 0.98; + +void setup() { + size(100, 100); + noStroke(); + ellipseMode(RADIUS); +} + +void draw() { + fill(0, 12); + rect(0, 0, width, height); + fill(255); + ellipse(33, y, radius, radius); + velocity *= friction; + y += velocity; + if (y > height+radius) { + y = -radius; + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_04/Ex_04.pde b/content/handbook_2e/examples/31 Simulate/Ex_04/Ex_04.pde new file mode 100644 index 000000000..c7713df24 --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_04/Ex_04.pde @@ -0,0 +1,26 @@ +float x = 33; +float y = 5; +float velocity = 0.0; +float radius = 15.0; +float friction = 0.99; +float acceleration = 0.3; + +void setup() { + size(100, 100); + noStroke(); + ellipseMode(RADIUS); +} + +void draw() { + fill(0, 12); + rect(0, 0, width, height); + fill(255); + velocity += acceleration; + velocity *= friction; + y += velocity; + if (y > (height-radius)) { + y = height - radius; + velocity = -velocity; + } + ellipse(x, y, radius, radius); +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_05/Ex_05.pde b/content/handbook_2e/examples/31 Simulate/Ex_05/Ex_05.pde new file mode 100644 index 000000000..9efc5ff60 --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_05/Ex_05.pde @@ -0,0 +1,24 @@ +class Particle { + float x, y; // The x- and y-coordinates + float vx, vy; // The x- and y-velocities + float radius; // Particle radius + float gravity = 0.1; + + Particle(int xpos, int ypos, float velx, float vely, float r) { + x = xpos; + y = ypos; + vx = velx; + vy = vely; + radius = r; + } + + void update() { + vy += gravity; + y += vy; + x += vx; + } + + void display() { + ellipse(x, y, radius*2, radius*2); + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_06/Ex_06.pde b/content/handbook_2e/examples/31 Simulate/Ex_06/Ex_06.pde new file mode 100644 index 000000000..b1e65f492 --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_06/Ex_06.pde @@ -0,0 +1,17 @@ +// Requires Particle class + +Particle p; + +void setup() { + size(100, 100); + noStroke(); + p = new Particle(0, height, 2.2, -4.2, 20.0); +} + +void draw() { + fill(0, 12); + rect(0, 0, width, height); + fill(255); + p.update(); + p.display(); +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_06/Particle.pde b/content/handbook_2e/examples/31 Simulate/Ex_06/Particle.pde new file mode 100644 index 000000000..9efc5ff60 --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_06/Particle.pde @@ -0,0 +1,24 @@ +class Particle { + float x, y; // The x- and y-coordinates + float vx, vy; // The x- and y-velocities + float radius; // Particle radius + float gravity = 0.1; + + Particle(int xpos, int ypos, float velx, float vely, float r) { + x = xpos; + y = ypos; + vx = velx; + vy = vely; + radius = r; + } + + void update() { + vy += gravity; + y += vy; + x += vx; + } + + void display() { + ellipse(x, y, radius*2, radius*2); + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_07/Ex_07.pde b/content/handbook_2e/examples/31 Simulate/Ex_07/Ex_07.pde new file mode 100644 index 000000000..88abacd7c --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_07/Ex_07.pde @@ -0,0 +1,20 @@ +class GenParticle extends Particle { + float originX, originY; + + GenParticle(int xpos, int ypos, float velx, float vely, + float r, float ox, float oy) { + super(xpos, ypos, velx, vely, r); + originX = ox; + originY = oy; + } + + void regenerate() { + if ((x > width+radius) || (x < -radius) || + (y > height+radius) || (y < -radius)) { + x = originX; + y = originY; + vx = random(-1.0, 1.0); + vy = random(-4.0, -2.0); + } + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_07/Particle.pde b/content/handbook_2e/examples/31 Simulate/Ex_07/Particle.pde new file mode 100644 index 000000000..9efc5ff60 --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_07/Particle.pde @@ -0,0 +1,24 @@ +class Particle { + float x, y; // The x- and y-coordinates + float vx, vy; // The x- and y-velocities + float radius; // Particle radius + float gravity = 0.1; + + Particle(int xpos, int ypos, float velx, float vely, float r) { + x = xpos; + y = ypos; + vx = velx; + vy = vely; + radius = r; + } + + void update() { + vy += gravity; + y += vy; + x += vx; + } + + void display() { + ellipse(x, y, radius*2, radius*2); + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_08/Ex_08.pde b/content/handbook_2e/examples/31 Simulate/Ex_08/Ex_08.pde new file mode 100644 index 000000000..01fee05bd --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_08/Ex_08.pde @@ -0,0 +1,27 @@ +// Requires Particle and GenParticle classes + +int numParticles = 200; +GenParticle[] p = new GenParticle[numParticles]; + +void setup() { + size(100, 100); + noStroke(); + for (int i = 0; i < p.length; i++) { + float velX = random(-1, 1); + float velY = -i; + // Inputs: x, y, x-velocity, y-velocity, + // radius, origin x, origin y + p[i] = new GenParticle(width/2, height/2, velX, velY, 5.0, width/2, height/2); + } +} + +void draw() { + fill(0, 36); + rect(0, 0, width, height); + fill(255, 60); + for (GenParticle part : p) { + part.update(); + part.regenerate(); + part.display(); + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_08/GenParticle.pde b/content/handbook_2e/examples/31 Simulate/Ex_08/GenParticle.pde new file mode 100644 index 000000000..88abacd7c --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_08/GenParticle.pde @@ -0,0 +1,20 @@ +class GenParticle extends Particle { + float originX, originY; + + GenParticle(int xpos, int ypos, float velx, float vely, + float r, float ox, float oy) { + super(xpos, ypos, velx, vely, r); + originX = ox; + originY = oy; + } + + void regenerate() { + if ((x > width+radius) || (x < -radius) || + (y > height+radius) || (y < -radius)) { + x = originX; + y = originY; + vx = random(-1.0, 1.0); + vy = random(-4.0, -2.0); + } + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_08/Particle.pde b/content/handbook_2e/examples/31 Simulate/Ex_08/Particle.pde new file mode 100644 index 000000000..9efc5ff60 --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_08/Particle.pde @@ -0,0 +1,24 @@ +class Particle { + float x, y; // The x- and y-coordinates + float vx, vy; // The x- and y-velocities + float radius; // Particle radius + float gravity = 0.1; + + Particle(int xpos, int ypos, float velx, float vely, float r) { + x = xpos; + y = ypos; + vx = velx; + vy = vely; + radius = r; + } + + void update() { + vy += gravity; + y += vy; + x += vx; + } + + void display() { + ellipse(x, y, radius*2, radius*2); + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_09/Ex_09.pde b/content/handbook_2e/examples/31 Simulate/Ex_09/Ex_09.pde new file mode 100644 index 000000000..c62b36ed8 --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_09/Ex_09.pde @@ -0,0 +1,25 @@ +class LimitedParticle extends Particle { + float friction = 0.99; + + LimitedParticle(int xpos, int ypos, float velx, float vely, float r) { + super(xpos, ypos, velx, vely, r); + } + + void update() { + vx *= friction; + vy *= friction; + super.update(); + limit(); + } + + void limit() { + if ((x < radius) || (x > width-radius)) { + vx = -vx; + x = constrain(x, radius, width-radius); + } + if (y > height-radius) { + vy = -vy; + y = height-radius; + } + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_09/Particle.pde b/content/handbook_2e/examples/31 Simulate/Ex_09/Particle.pde new file mode 100644 index 000000000..9efc5ff60 --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_09/Particle.pde @@ -0,0 +1,24 @@ +class Particle { + float x, y; // The x- and y-coordinates + float vx, vy; // The x- and y-velocities + float radius; // Particle radius + float gravity = 0.1; + + Particle(int xpos, int ypos, float velx, float vely, float r) { + x = xpos; + y = ypos; + vx = velx; + vy = vely; + radius = r; + } + + void update() { + vy += gravity; + y += vy; + x += vx; + } + + void display() { + ellipse(x, y, radius*2, radius*2); + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_10/Ex_10.pde b/content/handbook_2e/examples/31 Simulate/Ex_10/Ex_10.pde new file mode 100644 index 000000000..cfd37722f --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_10/Ex_10.pde @@ -0,0 +1,29 @@ +// Requires Particle and LimitedParticle classes + +int num = 80; +LimitedParticle[] p = new LimitedParticle[num]; +float radius = 1.2; + +void setup() { + size(100, 100); + noStroke(); + for (int i = 0; i < p.length; i++) { + float velX = random(-2, 2); + float velY = -i; + // Inputs: x, y, x-velocity, y-velocity, radius + p[i] = new LimitedParticle(width/2, height/2, + velX, velY, 2.2); + } +} + +void draw() { + fill(0, 24); + rect(0, 0, width, height); + fill(255); + for (LimitedParticle part : p) { + part.update(); + part.display(); + } +} + + diff --git a/content/handbook_2e/examples/31 Simulate/Ex_10/LimitedParticle.pde b/content/handbook_2e/examples/31 Simulate/Ex_10/LimitedParticle.pde new file mode 100644 index 000000000..c62b36ed8 --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_10/LimitedParticle.pde @@ -0,0 +1,25 @@ +class LimitedParticle extends Particle { + float friction = 0.99; + + LimitedParticle(int xpos, int ypos, float velx, float vely, float r) { + super(xpos, ypos, velx, vely, r); + } + + void update() { + vx *= friction; + vy *= friction; + super.update(); + limit(); + } + + void limit() { + if ((x < radius) || (x > width-radius)) { + vx = -vx; + x = constrain(x, radius, width-radius); + } + if (y > height-radius) { + vy = -vy; + y = height-radius; + } + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_10/Particle.pde b/content/handbook_2e/examples/31 Simulate/Ex_10/Particle.pde new file mode 100644 index 000000000..9efc5ff60 --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_10/Particle.pde @@ -0,0 +1,24 @@ +class Particle { + float x, y; // The x- and y-coordinates + float vx, vy; // The x- and y-velocities + float radius; // Particle radius + float gravity = 0.1; + + Particle(int xpos, int ypos, float velx, float vely, float r) { + x = xpos; + y = ypos; + vx = velx; + vy = vely; + radius = r; + } + + void update() { + vy += gravity; + y += vy; + x += vx; + } + + void display() { + ellipse(x, y, radius*2, radius*2); + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_11/Ex_11.pde b/content/handbook_2e/examples/31 Simulate/Ex_11/Ex_11.pde new file mode 100644 index 000000000..30faf8021 --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_11/Ex_11.pde @@ -0,0 +1,26 @@ +class ArrowParticle extends Particle { + float angle = 0.0; + float shaftLength = 20.0; + + ArrowParticle(int xpos, int ypos, float velx, float vely, float r) { + super(xpos, ypos, velx, vely, r); + } + + void update() { + super.update(); + angle = atan2(vy, vx); + } + + void display() { + stroke(255); + pushMatrix(); + translate(x, y); + rotate(angle); + scale(shaftLength); + strokeWeight(1.0 / shaftLength); + line(0, 0, 1, 0); + line(1, 0, 0.7, -0.3); + line(1, 0, 0.7, 0.3); + popMatrix(); + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_11/Particle.pde b/content/handbook_2e/examples/31 Simulate/Ex_11/Particle.pde new file mode 100644 index 000000000..9efc5ff60 --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_11/Particle.pde @@ -0,0 +1,24 @@ +class Particle { + float x, y; // The x- and y-coordinates + float vx, vy; // The x- and y-velocities + float radius; // Particle radius + float gravity = 0.1; + + Particle(int xpos, int ypos, float velx, float vely, float r) { + x = xpos; + y = ypos; + vx = velx; + vy = vely; + radius = r; + } + + void update() { + vy += gravity; + y += vy; + x += vx; + } + + void display() { + ellipse(x, y, radius*2, radius*2); + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_12/ArrowParticle.pde b/content/handbook_2e/examples/31 Simulate/Ex_12/ArrowParticle.pde new file mode 100644 index 000000000..30faf8021 --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_12/ArrowParticle.pde @@ -0,0 +1,26 @@ +class ArrowParticle extends Particle { + float angle = 0.0; + float shaftLength = 20.0; + + ArrowParticle(int xpos, int ypos, float velx, float vely, float r) { + super(xpos, ypos, velx, vely, r); + } + + void update() { + super.update(); + angle = atan2(vy, vx); + } + + void display() { + stroke(255); + pushMatrix(); + translate(x, y); + rotate(angle); + scale(shaftLength); + strokeWeight(1.0 / shaftLength); + line(0, 0, 1, 0); + line(1, 0, 0.7, -0.3); + line(1, 0, 0.7, 0.3); + popMatrix(); + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_12/Ex_12.pde b/content/handbook_2e/examples/31 Simulate/Ex_12/Ex_12.pde new file mode 100644 index 000000000..6d5f905c3 --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_12/Ex_12.pde @@ -0,0 +1,23 @@ +// Requires Particle, ArrowParticle classes + +int num = 320; +ArrowParticle[] p = new ArrowParticle[num]; +float radius = 1.2; + +void setup() { + size(700, 100); + for (int i = 0; i < p.length; i++) { + float velX = random(1, 8); + float velY = random(-5, -1); + // Parameters: x, y, x-velocity, y-velocity, radius + p[i] = new ArrowParticle(0, height/2, velX, velY, 1.2); + } +} + +void draw() { + background(0); + for (ArrowParticle part : p) { + part.update(); + part.display(); + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_12/Particle.pde b/content/handbook_2e/examples/31 Simulate/Ex_12/Particle.pde new file mode 100644 index 000000000..9efc5ff60 --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_12/Particle.pde @@ -0,0 +1,24 @@ +class Particle { + float x, y; // The x- and y-coordinates + float vx, vy; // The x- and y-velocities + float radius; // Particle radius + float gravity = 0.1; + + Particle(int xpos, int ypos, float velx, float vely, float r) { + x = xpos; + y = ypos; + vx = velx; + vy = vely; + radius = r; + } + + void update() { + vy += gravity; + y += vy; + x += vx; + } + + void display() { + ellipse(x, y, radius*2, radius*2); + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_13/Ex_13.pde b/content/handbook_2e/examples/31 Simulate/Ex_13/Ex_13.pde new file mode 100644 index 000000000..e5f5f5513 --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_13/Ex_13.pde @@ -0,0 +1,21 @@ +float stiffness = 0.1; +float damping = 0.9; +float velocity = 0.0; +float targetY = 0.0; +float y = 0.0; + +void setup() { + size(100, 100); + noStroke(); +} + +void draw() { + fill(0, 12); + rect(0, 0, width, height); + fill(255); + float force = stiffness * (targetY - y); // f = -kx + velocity = damping * (velocity + force); + y += velocity; + rect(10, y, width-20, 12); + targetY = mouseY; +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_14/Ex_14.pde b/content/handbook_2e/examples/31 Simulate/Ex_14/Ex_14.pde new file mode 100644 index 000000000..239bacfe1 --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_14/Ex_14.pde @@ -0,0 +1,31 @@ +float y1, y2; +float velocity1, velocity2; +float mass1 = 1.0; +float mass2 = 6.0; +float stiffness = 0.1; +float damping = 0.9; + +void setup() { + size(100, 100); + noStroke(); +} + +void draw() { + fill(0, 12); + rect(0, 0, width, height); + fill(255); + + float targetY = mouseY; + + float forceA = stiffness * (targetY - y1); + float accelerationY1 = forceA / mass1; + velocity1 = damping * (velocity1 + accelerationY1); + y1 += velocity1; + rect(10, y1, 40, 15); + + float forceB = stiffness * (targetY - y2); + float accelerationY2 = forceB / mass2; + velocity2 = damping * (velocity2 + accelerationY2); + y2 += velocity2; + rect(50, y2, 40, 15); +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_15/Ex_15.pde b/content/handbook_2e/examples/31 Simulate/Ex_15/Ex_15.pde new file mode 100644 index 000000000..5c9a1f904 --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_15/Ex_15.pde @@ -0,0 +1,35 @@ +class Spring2D { + float vx, vy; // The x- and y-axis velocities + float x, y; // The x- and y-coordinates + float mass; + float gravity; + float radius = 10.0; + float stiffness = 0.2; + float damping = 0.7; + + Spring2D(float xpos, float ypos, float m, float g) { + x = xpos; + y = ypos; + mass = m; + gravity = g; + } + + void update(float targetX, float targetY) { + float forceX = (targetX - x) * stiffness; + float ax = forceX / mass; + vx = damping * (vx + ax); + x += vx; + float forceY = (targetY - y) * stiffness; + forceY += gravity; + float ay = forceY / mass; + vy = damping * (vy + ay); + y += vy; + } + + void display(float nx, float ny) { + noStroke(); + ellipse(x, y, radius*2, radius*2); + stroke(255); + line(x, y, nx, ny); + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_16/Ex_16.pde b/content/handbook_2e/examples/31 Simulate/Ex_16/Ex_16.pde new file mode 100644 index 000000000..ec4602eca --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_16/Ex_16.pde @@ -0,0 +1,22 @@ +// Requires Spring2D Class + +Spring2D s1, s2; +float gravity = 5.0; +float mass = 2.0; + +void setup() { + size(100, 100); + + fill(0); + // Inputs: x, y, mass, gravity + s1 = new Spring2D(0.0, width/2, mass, gravity); + s2 = new Spring2D(0.0, width/2, mass, gravity); +} + +void draw() { + background(204); + s1.update(mouseX, mouseY); + s1.display(mouseX, mouseY); + s2.update(s1.x, s1.y); + s2.display(s1.x, s1.y); +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_16/Spring2D.pde b/content/handbook_2e/examples/31 Simulate/Ex_16/Spring2D.pde new file mode 100644 index 000000000..66f741562 --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_16/Spring2D.pde @@ -0,0 +1,35 @@ +class Spring2D { + float vx, vy; // The x- and y-axis velocities + float x, y; // The x- and y-coordinates + float mass; + float gravity; + float radius = 10; + float stiffness = 0.2; + float damping = 0.7; + + Spring2D(float xpos, float ypos, float m, float g) { + x = xpos; + y = ypos; + mass = m; + gravity = g; + } + + void update(float targetX, float targetY) { + float forceX = (targetX - x) * stiffness; + float ax = forceX / mass; + vx = damping * (vx + ax); + x += vx; + float forceY = (targetY - y) * stiffness; + forceY += gravity; + float ay = forceY / mass; + vy = damping * (vy + ay); + y += vy; + } + + void display(float nx, float ny) { + noStroke(); + ellipse(x, y, radius*2, radius*2); + stroke(255); + line(x, y, nx, ny); + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_17/Ex_17.pde b/content/handbook_2e/examples/31 Simulate/Ex_17/Ex_17.pde new file mode 100644 index 000000000..d8e936fc8 --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_17/Ex_17.pde @@ -0,0 +1,24 @@ +// Requires Spring2D Class + +int numSprings = 12; +Spring2D[] s = new Spring2D[numSprings]; +float mass = 3.0; +float gravity = 5.0; + +void setup() { + size(100, 400); + fill(0); + for (int i = 0; i < s.length; i++) { + s[i] = new Spring2D(width/2, i*(height/numSprings), mass, gravity); + } +} + +void draw() { + background(204); + s[0].update(mouseX, mouseY); + s[0].display(mouseX, mouseY); + for (int i = 1; i < s.length; i++) { + s[i].update(s[i-1].x, s[i-1].y); + s[i].display(s[i-1].x, s[i-1].y); + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_17/Spring2D.pde b/content/handbook_2e/examples/31 Simulate/Ex_17/Spring2D.pde new file mode 100644 index 000000000..66f741562 --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_17/Spring2D.pde @@ -0,0 +1,35 @@ +class Spring2D { + float vx, vy; // The x- and y-axis velocities + float x, y; // The x- and y-coordinates + float mass; + float gravity; + float radius = 10; + float stiffness = 0.2; + float damping = 0.7; + + Spring2D(float xpos, float ypos, float m, float g) { + x = xpos; + y = ypos; + mass = m; + gravity = g; + } + + void update(float targetX, float targetY) { + float forceX = (targetX - x) * stiffness; + float ax = forceX / mass; + vx = damping * (vx + ax); + x += vx; + float forceY = (targetY - y) * stiffness; + forceY += gravity; + float ay = forceY / mass; + vy = damping * (vy + ay); + y += vy; + } + + void display(float nx, float ny) { + noStroke(); + ellipse(x, y, radius*2, radius*2); + stroke(255); + line(x, y, nx, ny); + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_18/Ex_18.pde b/content/handbook_2e/examples/31 Simulate/Ex_18/Ex_18.pde new file mode 100644 index 000000000..c21896d4a --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_18/Ex_18.pde @@ -0,0 +1,22 @@ +class FixedSpring extends Spring2D { + float springLength; + + FixedSpring (float xpos, float ypos, float m, float g, float s) { + super(xpos, ypos, m, g); + springLength = s; + } + + void update(float newX, float newY) { + // Calculate the target position + float dx = x - newX; + float dy = y - newY; + float angle = atan2(dy, dx); + float targetX = newX + cos(angle) * springLength; + float targetY = newY + sin(angle) * springLength; + // Activate update method from Spring2D + super.update(targetX, targetY); + // Constrain to display window + x = constrain(x, radius, width-radius); + y = constrain(y, radius, height-radius); + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_18/Spring2D.pde b/content/handbook_2e/examples/31 Simulate/Ex_18/Spring2D.pde new file mode 100644 index 000000000..66f741562 --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_18/Spring2D.pde @@ -0,0 +1,35 @@ +class Spring2D { + float vx, vy; // The x- and y-axis velocities + float x, y; // The x- and y-coordinates + float mass; + float gravity; + float radius = 10; + float stiffness = 0.2; + float damping = 0.7; + + Spring2D(float xpos, float ypos, float m, float g) { + x = xpos; + y = ypos; + mass = m; + gravity = g; + } + + void update(float targetX, float targetY) { + float forceX = (targetX - x) * stiffness; + float ax = forceX / mass; + vx = damping * (vx + ax); + x += vx; + float forceY = (targetY - y) * stiffness; + forceY += gravity; + float ay = forceY / mass; + vy = damping * (vy + ay); + y += vy; + } + + void display(float nx, float ny) { + noStroke(); + ellipse(x, y, radius*2, radius*2); + stroke(255); + line(x, y, nx, ny); + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_19/Ex_19.pde b/content/handbook_2e/examples/31 Simulate/Ex_19/Ex_19.pde new file mode 100644 index 000000000..797e60260 --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_19/Ex_19.pde @@ -0,0 +1,19 @@ +// Requires Spring2D and FixedSpring classes + +FixedSpring s; +float gravity = 0.5; + +void setup() { + size(100, 100); + + fill(0); + // Inputs: x, y, mass, gravity, length + s = new FixedSpring(0.0, 50.0, 1.0, gravity, 40.0); +} + +void draw() { + background(204); + s.update(mouseX, mouseY); + s.display(mouseX, mouseY); +} + diff --git a/content/handbook_2e/examples/31 Simulate/Ex_19/FixedSpring.pde b/content/handbook_2e/examples/31 Simulate/Ex_19/FixedSpring.pde new file mode 100644 index 000000000..c21896d4a --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_19/FixedSpring.pde @@ -0,0 +1,22 @@ +class FixedSpring extends Spring2D { + float springLength; + + FixedSpring (float xpos, float ypos, float m, float g, float s) { + super(xpos, ypos, m, g); + springLength = s; + } + + void update(float newX, float newY) { + // Calculate the target position + float dx = x - newX; + float dy = y - newY; + float angle = atan2(dy, dx); + float targetX = newX + cos(angle) * springLength; + float targetY = newY + sin(angle) * springLength; + // Activate update method from Spring2D + super.update(targetX, targetY); + // Constrain to display window + x = constrain(x, radius, width-radius); + y = constrain(y, radius, height-radius); + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_19/Spring2D.pde b/content/handbook_2e/examples/31 Simulate/Ex_19/Spring2D.pde new file mode 100644 index 000000000..66f741562 --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_19/Spring2D.pde @@ -0,0 +1,35 @@ +class Spring2D { + float vx, vy; // The x- and y-axis velocities + float x, y; // The x- and y-coordinates + float mass; + float gravity; + float radius = 10; + float stiffness = 0.2; + float damping = 0.7; + + Spring2D(float xpos, float ypos, float m, float g) { + x = xpos; + y = ypos; + mass = m; + gravity = g; + } + + void update(float targetX, float targetY) { + float forceX = (targetX - x) * stiffness; + float ax = forceX / mass; + vx = damping * (vx + ax); + x += vx; + float forceY = (targetY - y) * stiffness; + forceY += gravity; + float ay = forceY / mass; + vy = damping * (vy + ay); + y += vy; + } + + void display(float nx, float ny) { + noStroke(); + ellipse(x, y, radius*2, radius*2); + stroke(255); + line(x, y, nx, ny); + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_20/Ex_20.pde b/content/handbook_2e/examples/31 Simulate/Ex_20/Ex_20.pde new file mode 100644 index 000000000..ca01e202c --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_20/Ex_20.pde @@ -0,0 +1,24 @@ +// Requires Spring2D and FixedSpring classes + +FixedSpring s1, s2; +float gravity = 1.2; + +void setup() { + size(100, 100); + fill(0); + // Inputs: x, y, mass, gravity, length + s1 = new FixedSpring(45, 33, 1.5, gravity, 40.0); + s2 = new FixedSpring(55, 66, 1.5, gravity, 40.0); +} + +void draw() { + background(204); + s1.update(s2.x, s2.y); + s2.update(s1.x, s1.y); + s1.display(s2.x, s2.y); + s2.display(s1.x, s1.y); + if (mousePressed == true) { + s1.x = mouseX; + s1.y = mouseY; + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_20/FixedSpring.pde b/content/handbook_2e/examples/31 Simulate/Ex_20/FixedSpring.pde new file mode 100644 index 000000000..c21896d4a --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_20/FixedSpring.pde @@ -0,0 +1,22 @@ +class FixedSpring extends Spring2D { + float springLength; + + FixedSpring (float xpos, float ypos, float m, float g, float s) { + super(xpos, ypos, m, g); + springLength = s; + } + + void update(float newX, float newY) { + // Calculate the target position + float dx = x - newX; + float dy = y - newY; + float angle = atan2(dy, dx); + float targetX = newX + cos(angle) * springLength; + float targetY = newY + sin(angle) * springLength; + // Activate update method from Spring2D + super.update(targetX, targetY); + // Constrain to display window + x = constrain(x, radius, width-radius); + y = constrain(y, radius, height-radius); + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_20/Spring2D.pde b/content/handbook_2e/examples/31 Simulate/Ex_20/Spring2D.pde new file mode 100644 index 000000000..66f741562 --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_20/Spring2D.pde @@ -0,0 +1,35 @@ +class Spring2D { + float vx, vy; // The x- and y-axis velocities + float x, y; // The x- and y-coordinates + float mass; + float gravity; + float radius = 10; + float stiffness = 0.2; + float damping = 0.7; + + Spring2D(float xpos, float ypos, float m, float g) { + x = xpos; + y = ypos; + mass = m; + gravity = g; + } + + void update(float targetX, float targetY) { + float forceX = (targetX - x) * stiffness; + float ax = forceX / mass; + vx = damping * (vx + ax); + x += vx; + float forceY = (targetY - y) * stiffness; + forceY += gravity; + float ay = forceY / mass; + vy = damping * (vy + ay); + y += vy; + } + + void display(float nx, float ny) { + noStroke(); + ellipse(x, y, radius*2, radius*2); + stroke(255); + line(x, y, nx, ny); + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_21/Ex_21.pde b/content/handbook_2e/examples/31 Simulate/Ex_21/Ex_21.pde new file mode 100644 index 000000000..4475fbca0 --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_21/Ex_21.pde @@ -0,0 +1,42 @@ +int[] rules = { 0, 0, 0, 1, 1, 1, 1, 0 }; +int gen = 1; // Generation +color on = color(255); +color off = color(0); + +void setup() { + size(101, 101); + frameRate(8); // Slow down to 8 frames each second + background(0); + set(width/2, 0, on); // Set the top middle pixel to white +} + +void draw() { + // For each pixel, determine new state by examining current + // state and neighbor states and ignore edges that have only + // one neighbor + for (int x = 1; x < width-1; x++) { + int left = get(x-1, gen-1); // Left neighbor + int me = get(x, gen-1); // Current pixel + int right = get(x+1, gen-1); // Right neighbor + if (rules(left, me, right) == 1) { + set(x, gen, on); + } + } + gen++; // Increment the generation by 1 + if (gen > height-1) { // If reached the bottom of the screen, + noLoop(); // stop the program + } +} + +// Implement the rules +int rules(color a, color b, color c) { + if ((a == on ) && (b == on ) && (c == on )) { return rules[0]; } + if ((a == on ) && (b == on ) && (c == off)) { return rules[1]; } + if ((a == on ) && (b == off) && (c == on )) { return rules[2]; } + if ((a == on ) && (b == off) && (c == off)) { return rules[3]; } + if ((a == off) && (b == on ) && (c == on )) { return rules[4]; } + if ((a == off) && (b == on ) && (c == off)) { return rules[5]; } + if ((a == off) && (b == off) && (c == on )) { return rules[6]; } + if ((a == off) && (b == off) && (c == off)) { return rules[7]; } + return 0; +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_22/Ex_22.pde b/content/handbook_2e/examples/31 Simulate/Ex_22/Ex_22.pde new file mode 100644 index 000000000..ad5aef331 --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_22/Ex_22.pde @@ -0,0 +1,53 @@ +int[][] grid, futureGrid; + +void setup() { + size(540, 100); + frameRate(8); + grid = new int[width][height]; + futureGrid = new int[width][height]; + float density = 0.3 * width * height; + // Set a random initial state + for (int i = 0; i < density; i++) { + int rx = int(random(width)); + int ry = int(random(height)); + grid[rx][ry] = 1; + } + background(0); +} + +void draw() { + for (int x = 1; x < width-1; x++) { + for (int y = 1; y < height-1; y++) { + // Check the number of neighbors (adjacent cells) + int nb = neighbors(x, y); + if ((grid[x][y] == 1) && (nb < 2)) { + futureGrid[x][y] = 0; // Isolation death + set(x, y, color(0)); + } else if ((grid[x][y] == 1) && (nb > 3)) { + futureGrid[x][y] = 0; // Overpopulation death + set(x, y, color(0)); + } else if ((grid[x][y] == 0) && (nb == 3)) { + futureGrid[x][y] = 1; // Birth + set(x, y, color(255)); + } else { + futureGrid[x][y] = grid[x][y]; // No change + } + } + } + // Swap current and future grids + int[][] temp = grid; + grid = futureGrid; + futureGrid = temp; +} + +// Count the number of adjacent cells 'on' +int neighbors(int x, int y) { + return grid[x][y-1] + // North + grid[x+1][y-1] + // Northeast + grid[x+1][y] + // East + grid[x+1][y+1] + // Southeast + grid[x][y+1] + // South + grid[x-1][y+1] + // Southwest + grid[x-1][y] + // West + grid[x-1][y-1]; // Northwest +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_23/Ex_23.pde b/content/handbook_2e/examples/31 Simulate/Ex_23/Ex_23.pde new file mode 100644 index 000000000..884f289cb --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_23/Ex_23.pde @@ -0,0 +1,57 @@ +int[][] grid, futureGrid; + +void setup() { + size(540, 100); + frameRate(8); + grid = new int[width][height]; + futureGrid = new int[width][height]; + float density = 0.3 * width * height; + // Set a random initial state + for (int i = 0; i < density; i++) { + int rx = int(random(width)); + int ry = int(random(height)); + grid[rx][ry] = 1; + } + background(0); +} + +void draw() { + for (int x = 1; x < width-1; x++) { + for (int y = 1; y < height-1; y++) { + // Check the number of neighbors (adjacent cells) + int nb = neighbors(x, y); + if ((grid[x][y] == 1) && (nb < 2)) { + futureGrid[x][y] = 0; // Isolation death + set(x, y, color(0)); + } else if ((grid[x][y] == 1) && (nb > 3)) { + futureGrid[x][y] = 0; // Overpopulation death + set(x, y, color(0)); + } else if ((grid[x][y] == 0) && (nb == 3)) { + futureGrid[x][y] = 1; // Birth + set(x, y, color(255)); + } else { + futureGrid[x][y] = grid[x][y]; // No change + } + } + } + // Swap current and future grids + int[][] temp = grid; + grid = futureGrid; + futureGrid = temp; +} + +// Count the number of adjacent cells 'on' +int neighbors(int x, int y) { + int north = (y + height-1) % height; + int south = (y + 1) % height; + int east = (x + 1) % width; + int west = (x + width-1) % width; + return grid[x][north] + // North + grid[east][north] + // Northeast + grid[east][y] + // East + grid[east][south] + // Southeast + grid[x][south] + // South + grid[west][south] + // Southwest + grid[west][y] + // West + grid[west][north]; // Northwest +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_24/Ex_24.pde b/content/handbook_2e/examples/31 Simulate/Ex_24/Ex_24.pde new file mode 100644 index 000000000..c5722b6b6 --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_24/Ex_24.pde @@ -0,0 +1,58 @@ +int SOUTH = 0; // Direction numbers with names +int EAST = 1; // so that the code self-documents +int NORTH = 2; +int WEST = 3; +int direction = NORTH; // Current direction of the ant +int x, y; // Ant's current position + +color on = color(255); // Color for an 'on' pixel +color off = color(0); // Color for an 'off' pixel + +void setup() { + size(100, 100); + x = width/2; + y = height/2; + background(0); +} + +void draw() { + if (direction == SOUTH) { + y++; + if (y == height) { + y = 0; + } + } else if (direction == EAST) { + x++; + if (x == width) { + x = 0; + } + } else if (direction == NORTH) { + if (y == 0) { + y = height-1; + } else { + y--; + } + } else if (direction == WEST) { + if (x == 0) { + x = width-1; + } else { + x--; + } + } + + if (get(x, y) == on) { + set(x, y, off); + if (direction == SOUTH) { + direction = WEST; + } else { + direction--; + } + } else { + set(x, y, on); + if (direction == WEST) { + direction = SOUTH; + } else { + direction++; + } + } +} diff --git a/content/handbook_2e/examples/31 Simulate/Ex_25/Ex_25.pde b/content/handbook_2e/examples/31 Simulate/Ex_25/Ex_25.pde new file mode 100644 index 000000000..fcab27f6c --- /dev/null +++ b/content/handbook_2e/examples/31 Simulate/Ex_25/Ex_25.pde @@ -0,0 +1,50 @@ +int[][] angles = {{ 0, 1 }, { 1, 1 }, { 1, 0 }, { 1,-1 }, + { 0,-1 }, {-1,-1 }, {-1, 0 }, {-1, 1 }}; + +int numAngles = angles.length; +int x, y, nx, ny; +int dir = 0; +color black = color(0); +color white = color(255); + +void setup() { + size(100, 100); + background(255); + x = width/2; + nx = x; + y = height/2; + ny = y; + float woodDensity = width * height * 0.5; + // Set random distribution of wood chips + for (int i = 0; i < woodDensity; i++) { + int rx = int(random(width)); + int ry = int(random(height)); + set(rx, ry, black); + } +} + +void draw() { + int rand = int(random(-2, 2)); // -1, 0, or 1 + dir = (dir + rand + numAngles) % numAngles; + nx = (nx + angles[dir][0] + width) % width; + ny = (ny + angles[dir][1] + height) % height; + + if ((get(x,y) == black) && (get(nx,ny) == white)) { + // Move the chip one space + set(x, y, white); + set(nx, ny, black); + x = nx; + y = ny; + } else if ((get(x,y) == black) && (get(nx,ny) == black)) { + // Move in the opposite direction + dir = (dir + (numAngles/2)) % numAngles; + x = (x + angles[dir][0] + width) % width; + y = (y + angles[dir][1] + height) % height; + } else { + // Not carrying + x = nx; + y = ny; + } + nx = x; // Save the current position + ny = y; +} diff --git a/content/handbook_2e/examples/32 Data/Ex_01/Ex_01.pde b/content/handbook_2e/examples/32 Data/Ex_01/Ex_01.pde new file mode 100644 index 000000000..34e771b7b --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_01/Ex_01.pde @@ -0,0 +1,2 @@ +// Prints "tab space" +println("tab\tspace"); diff --git a/content/handbook_2e/examples/32 Data/Ex_02/Ex_02.pde b/content/handbook_2e/examples/32 Data/Ex_02/Ex_02.pde new file mode 100644 index 000000000..94abac201 --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_02/Ex_02.pde @@ -0,0 +1,5 @@ +// Prints each word after "\n" on a new line: +// line1 +// line2 +// line3 +println("line1\nline2\nline3"); diff --git a/content/handbook_2e/examples/32 Data/Ex_03/Ex_03.pde b/content/handbook_2e/examples/32 Data/Ex_03/Ex_03.pde new file mode 100644 index 000000000..d67e28d9d --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_03/Ex_03.pde @@ -0,0 +1,3 @@ +println(nf(200, 10)); // Prints "0000000200" +println(nf(40, 5)); // Prints "00040" +println(nf(90, 3)); // Prints "090" diff --git a/content/handbook_2e/examples/32 Data/Ex_04/Ex_04.pde b/content/handbook_2e/examples/32 Data/Ex_04/Ex_04.pde new file mode 100644 index 000000000..b7390db7e --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_04/Ex_04.pde @@ -0,0 +1,3 @@ +println(nf(200.94, 10, 4)); // Prints "0000000200.9400" +println(nf(40.2, 5, 3)); // Prints "00040.200" +println(nf(9.012, 0, 5)); // Prints "9.01200" diff --git a/content/handbook_2e/examples/32 Data/Ex_05/Ex_05.pde b/content/handbook_2e/examples/32 Data/Ex_05/Ex_05.pde new file mode 100644 index 000000000..6878ea048 --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_05/Ex_05.pde @@ -0,0 +1,36 @@ +int[] x = new int[0]; +int[] y = new int[0]; + +void setup() { + size(100, 100); +} + +void draw() { + background(204); + stroke(0); + noFill(); + beginShape(); + for (int i = 0; i < x.length; i++) { + vertex(x[i], y[i]); + } + endShape(); + // Show the next segment to be added + if (x.length >= 1) { + stroke(255); + line(mouseX, mouseY, x[x.length-1], y[x.length-1]); + } +} + +void mousePressed() { // Click to add a line segment + x = append(x, mouseX); + y = append(y, mouseY); +} + +void keyPressed() { // Press a key to save the data + String[] lines = new String[x.length]; + for (int i = 0; i < x.length; i++) { + lines[i] = x[i] + "\t" + y[i]; + } + saveStrings("lines.txt", lines); + exit(); // Stop the program +} diff --git a/content/handbook_2e/examples/32 Data/Ex_05/lines.txt b/content/handbook_2e/examples/32 Data/Ex_05/lines.txt new file mode 100644 index 000000000..39e3b2b35 --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_05/lines.txt @@ -0,0 +1,5 @@ +71 38 +29 86 +29 20 +43 44 +71 38 diff --git a/content/handbook_2e/examples/32 Data/Ex_06/Ex_06.pde b/content/handbook_2e/examples/32 Data/Ex_06/Ex_06.pde new file mode 100644 index 000000000..5355c115e --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_06/Ex_06.pde @@ -0,0 +1,23 @@ +PrintWriter output; + +void setup() { + size(100, 100); + // Create a new file in the sketch directory + output = createWriter("positions.txt"); + frameRate(12); +} + +void draw() { + if (mousePressed) { + point(mouseX, mouseY); + // Write the coordinate to a file with a + // "\t" (TAB character) between each entry + output.println(mouseX + "\t" + mouseY); + } +} + +void keyPressed() { // Press a key to save the data + output.flush(); // Write the remaining data + output.close(); // Finish the file + exit(); // Stop the program +} diff --git a/content/handbook_2e/examples/32 Data/Ex_06/positions.txt b/content/handbook_2e/examples/32 Data/Ex_06/positions.txt new file mode 100644 index 000000000..842af479a --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_06/positions.txt @@ -0,0 +1,102 @@ +35 45 +41 42 +46 37 +50 32 +57 27 +62 24 +65 23 +68 23 +69 26 +69 29 +69 32 +68 36 +67 39 +65 41 +64 45 +62 46 +59 48 +55 49 +53 52 +49 53 +47 56 +45 60 +45 61 +45 63 +47 65 +50 65 +52 66 +54 66 +56 66 +60 69 +62 72 +62 74 +62 76 +61 78 +59 80 +55 82 +52 82 +49 82 +45 82 +42 82 +39 82 +35 82 +33 82 +30 82 +30 81 +31 66 +28 66 +25 62 +23 59 +22 55 +22 52 +22 47 +23 42 +25 39 +27 36 +30 33 +33 31 +35 30 +38 29 +41 29 +42 30 +43 31 +45 34 +46 36 +48 39 +50 41 +53 43 +57 45 +60 46 +62 48 +63 50 +64 51 +64 53 +64 56 +64 58 +64 61 +63 65 +62 68 +60 69 +56 72 +52 73 +48 74 +44 74 +42 74 +40 74 +38 73 +36 72 +34 70 +33 69 +32 67 +31 65 +30 63 +30 21 +30 21 +34 21 +41 20 +46 19 +50 18 +51 17 +51 16 +58 27 +58 27 diff --git a/content/handbook_2e/examples/32 Data/Ex_07/Ex_07.pde b/content/handbook_2e/examples/32 Data/Ex_07/Ex_07.pde new file mode 100644 index 000000000..d6eb9bd02 --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_07/Ex_07.pde @@ -0,0 +1,28 @@ +String letters = ""; +PrintWriter output; + +void setup() { + size(100, 100); + fill(0); + // Create a new file in the sketch folder + output = createWriter("words.txt"); +} + +void draw() { + background(204); + text(letters, 5, 50); +} + +void keyPressed() { + if (key == ' ') { // Spacebar pressed + output.println(letters); // Write data to words.txt + letters = ""; // Clear the letter String + } else { + letters = letters + key; + } + if (key == ENTER) { + output.flush(); // Write the remaining data + output.close(); // Finish the file + exit(); // Stop the program + } +} diff --git a/content/handbook_2e/examples/32 Data/Ex_07/data/OpenSans-ExtraBoldItalic.ttf b/content/handbook_2e/examples/32 Data/Ex_07/data/OpenSans-ExtraBoldItalic.ttf new file mode 100644 index 000000000..31cb68834 Binary files /dev/null and b/content/handbook_2e/examples/32 Data/Ex_07/data/OpenSans-ExtraBoldItalic.ttf differ diff --git a/content/handbook_2e/examples/32 Data/Ex_08/Ex_08.pde b/content/handbook_2e/examples/32 Data/Ex_08/Ex_08.pde new file mode 100644 index 000000000..a6f540de3 --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_08/Ex_08.pde @@ -0,0 +1,22 @@ +String[] lines; +int index = 0; + +void setup() { + size(100, 100); + lines = loadStrings("positions.txt"); + noSmooth(); + frameRate(12); +} + +void draw() { + if (index < lines.length) { + String[] pieces = split(lines[index], '\t'); + if (pieces.length == 2) { + int x = int(pieces[0]); + int y = int(pieces[1]); + point(x, y); + } + // Go to the next line for the next run through draw() + index++; + } +} diff --git a/content/handbook_2e/examples/32 Data/Ex_08/data/positions.txt b/content/handbook_2e/examples/32 Data/Ex_08/data/positions.txt new file mode 100644 index 000000000..3b8ff2e23 --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_08/data/positions.txt @@ -0,0 +1,206 @@ +70 35 +69 35 +68 39 +67 42 +66 47 +64 51 +64 54 +63 57 +60 60 +58 64 +51 69 +48 72 +44 73 +39 75 +35 75 +30 75 +25 75 +21 75 +17 73 +13 69 +12 66 +11 61 +11 57 +10 49 +10 45 +10 38 +12 32 +13 29 +16 23 +20 19 +24 16 +27 15 +31 13 +33 13 +37 13 +40 15 +42 16 +45 19 +46 21 +47 24 +48 26 +48 29 +48 33 +47 39 +43 45 +42 47 +38 50 +35 51 +32 51 +30 51 +27 50 +27 50 +26 46 +26 41 +29 36 +30 34 +31 33 +31 33 +32 33 +33 33 +34 33 +34 33 +35 33 +37 33 +39 33 +42 32 +44 31 +46 29 +48 29 +49 27 +52 24 +53 23 +57 19 +61 16 +63 14 +67 13 +69 12 +69 12 +77 11 +77 11 +80 11 +86 16 +90 21 +93 25 +95 29 +95 32 +95 33 +95 37 +94 41 +93 44 +92 46 +91 49 +89 51 +87 55 +85 59 +82 62 +80 64 +79 67 +77 69 +74 71 +68 72 +65 73 +63 73 +62 73 +60 72 +58 69 +57 67 +57 66 +56 60 +56 56 +56 54 +58 49 +60 47 +62 47 +63 47 +67 48 +70 52 +73 55 +74 57 +74 58 +74 60 +74 62 +73 65 +70 68 +67 69 +65 70 +63 70 +62 70 +60 68 +57 65 +55 64 +50 62 +46 61 +40 60 +38 60 +36 60 +32 61 +30 62 +27 64 +26 68 +25 71 +25 77 +25 81 +26 84 +28 86 +31 87 +33 88 +36 88 +39 86 +41 85 +43 83 +44 81 +45 76 +45 74 +45 71 +40 67 +37 65 +34 63 +33 61 +33 61 +32 60 +33 49 +37 45 +41 41 +45 39 +47 38 +51 37 +54 37 +58 38 +61 41 +63 44 +65 46 +66 49 +66 51 +67 55 +67 58 +67 60 +66 62 +64 65 +63 66 +61 67 +60 68 +58 68 +55 69 +54 69 +51 69 +48 69 +46 68 +45 66 +44 65 +44 63 +44 61 +44 59 +44 56 +44 55 +45 53 +47 52 +49 50 +50 48 +51 47 +52 46 +54 46 +55 45 +55 45 +56 44 +57 44 diff --git a/content/handbook_2e/examples/32 Data/Ex_09/Ex_09.pde b/content/handbook_2e/examples/32 Data/Ex_09/Ex_09.pde new file mode 100644 index 000000000..cfeef2f85 --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_09/Ex_09.pde @@ -0,0 +1,4 @@ +String s = "a, b"; +String[] p = split(s, ", "); +println(p[0]); // Prints "a" +println(p[1]); // Prints "b" diff --git a/content/handbook_2e/examples/32 Data/Ex_10/Ex_10.pde b/content/handbook_2e/examples/32 Data/Ex_10/Ex_10.pde new file mode 100644 index 000000000..d051fbec7 --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_10/Ex_10.pde @@ -0,0 +1,19 @@ +Table xy; +int index = 0; + +void setup() { + size(100, 100); + xy = loadTable("positions.txt", "tsv"); + noSmooth(); + frameRate(12); +} + +void draw() { + if (index < xy.getRowCount()) { + int x = xy.getInt(index, 0); + int y = xy.getInt(index, 1); + point(x, y); + // Go to the next line for the next run through draw() + index++; + } +} diff --git a/content/handbook_2e/examples/32 Data/Ex_10/data/positions.txt b/content/handbook_2e/examples/32 Data/Ex_10/data/positions.txt new file mode 100644 index 000000000..3b8ff2e23 --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_10/data/positions.txt @@ -0,0 +1,206 @@ +70 35 +69 35 +68 39 +67 42 +66 47 +64 51 +64 54 +63 57 +60 60 +58 64 +51 69 +48 72 +44 73 +39 75 +35 75 +30 75 +25 75 +21 75 +17 73 +13 69 +12 66 +11 61 +11 57 +10 49 +10 45 +10 38 +12 32 +13 29 +16 23 +20 19 +24 16 +27 15 +31 13 +33 13 +37 13 +40 15 +42 16 +45 19 +46 21 +47 24 +48 26 +48 29 +48 33 +47 39 +43 45 +42 47 +38 50 +35 51 +32 51 +30 51 +27 50 +27 50 +26 46 +26 41 +29 36 +30 34 +31 33 +31 33 +32 33 +33 33 +34 33 +34 33 +35 33 +37 33 +39 33 +42 32 +44 31 +46 29 +48 29 +49 27 +52 24 +53 23 +57 19 +61 16 +63 14 +67 13 +69 12 +69 12 +77 11 +77 11 +80 11 +86 16 +90 21 +93 25 +95 29 +95 32 +95 33 +95 37 +94 41 +93 44 +92 46 +91 49 +89 51 +87 55 +85 59 +82 62 +80 64 +79 67 +77 69 +74 71 +68 72 +65 73 +63 73 +62 73 +60 72 +58 69 +57 67 +57 66 +56 60 +56 56 +56 54 +58 49 +60 47 +62 47 +63 47 +67 48 +70 52 +73 55 +74 57 +74 58 +74 60 +74 62 +73 65 +70 68 +67 69 +65 70 +63 70 +62 70 +60 68 +57 65 +55 64 +50 62 +46 61 +40 60 +38 60 +36 60 +32 61 +30 62 +27 64 +26 68 +25 71 +25 77 +25 81 +26 84 +28 86 +31 87 +33 88 +36 88 +39 86 +41 85 +43 83 +44 81 +45 76 +45 74 +45 71 +40 67 +37 65 +34 63 +33 61 +33 61 +32 60 +33 49 +37 45 +41 41 +45 39 +47 38 +51 37 +54 37 +58 38 +61 41 +63 44 +65 46 +66 49 +66 51 +67 55 +67 58 +67 60 +66 62 +64 65 +63 66 +61 67 +60 68 +58 68 +55 69 +54 69 +51 69 +48 69 +46 68 +45 66 +44 65 +44 63 +44 61 +44 59 +44 56 +44 55 +45 53 +47 52 +49 50 +50 48 +51 47 +52 46 +54 46 +55 45 +55 45 +56 44 +57 44 diff --git a/content/handbook_2e/examples/32 Data/Ex_11/Ex_11.pde b/content/handbook_2e/examples/32 Data/Ex_11/Ex_11.pde new file mode 100644 index 000000000..3c65b5b58 --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_11/Ex_11.pde @@ -0,0 +1,11 @@ +Table cars; + +void setup() { + size(100, 100); + cars = loadTable("cars.tsv", "header"); + for (TableRow row : cars.rows()) { + String id = row.getString("name"); + int mpg = row.getInt("mpg"); + println(id + ", " + mpg + " miles per gallon"); + } +} diff --git a/content/handbook_2e/examples/32 Data/Ex_11/data/cars.tsv b/content/handbook_2e/examples/32 Data/Ex_11/data/cars.tsv new file mode 100644 index 000000000..6382dca09 --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_11/data/cars.tsv @@ -0,0 +1 @@ +name mpg cylinders displacement horsepower weight acceleration year origin chevrolet chevelle malibu 18 8 307 130 3504 12 70 1 buick skylark 320 15 8 350 165 3693 11.5 70 1 plymouth satellite 18 8 318 150 3436 11 70 1 amc rebel sst 16 8 304 150 3433 12 70 1 ford torino 17 8 302 140 3449 10.5 70 1 ford galaxie 500 15 8 429 198 4341 10 70 1 chevrolet impala 14 8 454 220 4354 9 70 1 plymouth fury iii 14 8 440 215 4312 8.5 70 1 pontiac catalina 14 8 455 225 4425 10 70 1 amc ambassador dpl 15 8 390 190 3850 8.5 70 1 citroen ds-21 pallas NA 4 133 115 3090 17.5 70 2 chevrolet chevelle concours (sw) NA 8 350 165 4142 11.5 70 1 ford torino (sw) NA 8 351 153 4034 11 70 1 plymouth satellite (sw) NA 8 383 175 4166 10.5 70 1 amc rebel sst (sw) NA 8 360 175 3850 11 70 1 dodge challenger se 15 8 383 170 3563 10 70 1 plymouth 'cuda 340 14 8 340 160 3609 8 70 1 ford mustang boss 302 NA 8 302 140 3353 8 70 1 chevrolet monte carlo 15 8 400 150 3761 9.5 70 1 buick estate wagon (sw) 14 8 455 225 3086 10 70 1 toyota corona mark ii 24 4 113 95 2372 15 70 3 plymouth duster 22 6 198 95 2833 15.5 70 1 amc hornet 18 6 199 97 2774 15.5 70 1 ford maverick 21 6 200 85 2587 16 70 1 datsun pl510 27 4 97 88 2130 14.5 70 3 volkswagen 1131 deluxe sedan 26 4 97 46 1835 20.5 70 2 peugeot 504 25 4 110 87 2672 17.5 70 2 audi 100 ls 24 4 107 90 2430 14.5 70 2 saab 99e 25 4 104 95 2375 17.5 70 2 bmw 2002 26 4 121 113 2234 12.5 70 2 amc gremlin 21 6 199 90 2648 15 70 1 ford f250 10 8 360 215 4615 14 70 1 chevy c20 10 8 307 200 4376 15 70 1 dodge d200 11 8 318 210 4382 13.5 70 1 hi 1200d 9 8 304 193 4732 18.5 70 1 datsun pl510 27 4 97 88 2130 14.5 71 3 chevrolet vega 2300 28 4 140 90 2264 15.5 71 1 toyota corona 25 4 113 95 2228 14 71 3 ford pinto 25 4 98 NA 2046 19 71 1 volkswagen super beetle 117 NA 4 97 48 1978 20 71 2 amc gremlin 19 6 232 100 2634 13 71 1 plymouth satellite custom 16 6 225 105 3439 15.5 71 1 chevrolet chevelle malibu 17 6 250 100 3329 15.5 71 1 ford torino 500 19 6 250 88 3302 15.5 71 1 amc matador 18 6 232 100 3288 15.5 71 1 chevrolet impala 14 8 350 165 4209 12 71 1 pontiac catalina brougham 14 8 400 175 4464 11.5 71 1 ford galaxie 500 14 8 351 153 4154 13.5 71 1 plymouth fury iii 14 8 318 150 4096 13 71 1 dodge monaco (sw) 12 8 383 180 4955 11.5 71 1 ford country squire (sw) 13 8 400 170 4746 12 71 1 pontiac safari (sw) 13 8 400 175 5140 12 71 1 amc hornet sportabout (sw) 18 6 258 110 2962 13.5 71 1 chevrolet vega (sw) 22 4 140 72 2408 19 71 1 pontiac firebird 19 6 250 100 3282 15 71 1 ford mustang 18 6 250 88 3139 14.5 71 1 mercury capri 2000 23 4 122 86 2220 14 71 1 opel 1900 28 4 116 90 2123 14 71 2 peugeot 304 30 4 79 70 2074 19.5 71 2 fiat 124b 30 4 88 76 2065 14.5 71 2 toyota corolla 1200 31 4 71 65 1773 19 71 3 datsun 1200 35 4 72 69 1613 18 71 3 volkswagen model 111 27 4 97 60 1834 19 71 2 plymouth cricket 26 4 91 70 1955 20.5 71 1 toyota corona hardtop 24 4 113 95 2278 15.5 72 3 dodge colt hardtop 25 4 97.5 80 2126 17 72 1 volkswagen type 3 23 4 97 54 2254 23.5 72 2 chevrolet vega 20 4 140 90 2408 19.5 72 1 ford pinto runabout 21 4 122 86 2226 16.5 72 1 chevrolet impala 13 8 350 165 4274 12 72 1 pontiac catalina 14 8 400 175 4385 12 72 1 plymouth fury iii 15 8 318 150 4135 13.5 72 1 ford galaxie 500 14 8 351 153 4129 13 72 1 amc ambassador sst 17 8 304 150 3672 11.5 72 1 mercury marquis 11 8 429 208 4633 11 72 1 buick lesabre custom 13 8 350 155 4502 13.5 72 1 oldsmobile delta 88 royale 12 8 350 160 4456 13.5 72 1 chrysler newport royal 13 8 400 190 4422 12.5 72 1 mazda rx2 coupe 19 3 70 97 2330 13.5 72 3 amc matador (sw) 15 8 304 150 3892 12.5 72 1 chevrolet chevelle concours (sw) 13 8 307 130 4098 14 72 1 ford gran torino (sw) 13 8 302 140 4294 16 72 1 plymouth satellite custom (sw) 14 8 318 150 4077 14 72 1 volvo 145e (sw) 18 4 121 112 2933 14.5 72 2 volkswagen 411 (sw) 22 4 121 76 2511 18 72 2 peugeot 504 (sw) 21 4 120 87 2979 19.5 72 2 renault 12 (sw) 26 4 96 69 2189 18 72 2 ford pinto (sw) 22 4 122 86 2395 16 72 1 datsun 510 (sw) 28 4 97 92 2288 17 72 3 toyouta corona mark ii (sw) 23 4 120 97 2506 14.5 72 3 dodge colt (sw) 28 4 98 80 2164 15 72 1 toyota corolla 1600 (sw) 27 4 97 88 2100 16.5 72 3 buick century 350 13 8 350 175 4100 13 73 1 amc matador 14 8 304 150 3672 11.5 73 1 chevrolet malibu 13 8 350 145 3988 13 73 1 ford gran torino 14 8 302 137 4042 14.5 73 1 dodge coronet custom 15 8 318 150 3777 12.5 73 1 mercury marquis brougham 12 8 429 198 4952 11.5 73 1 chevrolet caprice classic 13 8 400 150 4464 12 73 1 ford ltd 13 8 351 158 4363 13 73 1 plymouth fury gran sedan 14 8 318 150 4237 14.5 73 1 chrysler new yorker brougham 13 8 440 215 4735 11 73 1 buick electra 225 custom 12 8 455 225 4951 11 73 1 amc ambassador brougham 13 8 360 175 3821 11 73 1 plymouth valiant 18 6 225 105 3121 16.5 73 1 chevrolet nova custom 16 6 250 100 3278 18 73 1 amc hornet 18 6 232 100 2945 16 73 1 ford maverick 18 6 250 88 3021 16.5 73 1 plymouth duster 23 6 198 95 2904 16 73 1 volkswagen super beetle 26 4 97 46 1950 21 73 2 chevrolet impala 11 8 400 150 4997 14 73 1 ford country 12 8 400 167 4906 12.5 73 1 plymouth custom suburb 13 8 360 170 4654 13 73 1 oldsmobile vista cruiser 12 8 350 180 4499 12.5 73 1 amc gremlin 18 6 232 100 2789 15 73 1 toyota carina 20 4 97 88 2279 19 73 3 chevrolet vega 21 4 140 72 2401 19.5 73 1 datsun 610 22 4 108 94 2379 16.5 73 3 maxda rx3 18 3 70 90 2124 13.5 73 3 ford pinto 19 4 122 85 2310 18.5 73 1 mercury capri v6 21 6 155 107 2472 14 73 1 fiat 124 sport coupe 26 4 98 90 2265 15.5 73 2 chevrolet monte carlo s 15 8 350 145 4082 13 73 1 pontiac grand prix 16 8 400 230 4278 9.5 73 1 fiat 128 29 4 68 49 1867 19.5 73 2 opel manta 24 4 116 75 2158 15.5 73 2 audi 100ls 20 4 114 91 2582 14 73 2 volvo 144ea 19 4 121 112 2868 15.5 73 2 dodge dart custom 15 8 318 150 3399 11 73 1 saab 99le 24 4 121 110 2660 14 73 2 toyota mark ii 20 6 156 122 2807 13.5 73 3 oldsmobile omega 11 8 350 180 3664 11 73 1 plymouth duster 20 6 198 95 3102 16.5 74 1 ford maverick 21 6 200 NA 2875 17 74 1 amc hornet 19 6 232 100 2901 16 74 1 chevrolet nova 15 6 250 100 3336 17 74 1 datsun b210 31 4 79 67 1950 19 74 3 ford pinto 26 4 122 80 2451 16.5 74 1 toyota corolla 1200 32 4 71 65 1836 21 74 3 chevrolet vega 25 4 140 75 2542 17 74 1 chevrolet chevelle malibu classic 16 6 250 100 3781 17 74 1 amc matador 16 6 258 110 3632 18 74 1 plymouth satellite sebring 18 6 225 105 3613 16.5 74 1 ford gran torino 16 8 302 140 4141 14 74 1 buick century luxus (sw) 13 8 350 150 4699 14.5 74 1 dodge coronet custom (sw) 14 8 318 150 4457 13.5 74 1 ford gran torino (sw) 14 8 302 140 4638 16 74 1 amc matador (sw) 14 8 304 150 4257 15.5 74 1 audi fox 29 4 98 83 2219 16.5 74 2 volkswagen dasher 26 4 79 67 1963 15.5 74 2 opel manta 26 4 97 78 2300 14.5 74 2 toyota corona 31 4 76 52 1649 16.5 74 3 datsun 710 32 4 83 61 2003 19 74 3 dodge colt 28 4 90 75 2125 14.5 74 1 fiat 128 24 4 90 75 2108 15.5 74 2 fiat 124 tc 26 4 116 75 2246 14 74 2 honda civic 24 4 120 97 2489 15 74 3 subaru 26 4 108 93 2391 15.5 74 3 fiat x1.9 31 4 79 67 2000 16 74 2 plymouth valiant custom 19 6 225 95 3264 16 75 1 chevrolet nova 18 6 250 105 3459 16 75 1 mercury monarch 15 6 250 72 3432 21 75 1 ford maverick 15 6 250 72 3158 19.5 75 1 pontiac catalina 16 8 400 170 4668 11.5 75 1 chevrolet bel air 15 8 350 145 4440 14 75 1 plymouth grand fury 16 8 318 150 4498 14.5 75 1 ford ltd 14 8 351 148 4657 13.5 75 1 buick century 17 6 231 110 3907 21 75 1 chevroelt chevelle malibu 16 6 250 105 3897 18.5 75 1 amc matador 15 6 258 110 3730 19 75 1 plymouth fury 18 6 225 95 3785 19 75 1 buick skyhawk 21 6 231 110 3039 15 75 1 chevrolet monza 2+2 20 8 262 110 3221 13.5 75 1 ford mustang ii 13 8 302 129 3169 12 75 1 toyota corolla 29 4 97 75 2171 16 75 3 ford pinto 23 4 140 83 2639 17 75 1 amc gremlin 20 6 232 100 2914 16 75 1 pontiac astro 23 4 140 78 2592 18.5 75 1 toyota corona 24 4 134 96 2702 13.5 75 3 volkswagen dasher 25 4 90 71 2223 16.5 75 2 datsun 710 24 4 119 97 2545 17 75 3 ford pinto 18 6 171 97 2984 14.5 75 1 volkswagen rabbit 29 4 90 70 1937 14 75 2 amc pacer 19 6 232 90 3211 17 75 1 audi 100ls 23 4 115 95 2694 15 75 2 peugeot 504 23 4 120 88 2957 17 75 2 volvo 244dl 22 4 121 98 2945 14.5 75 2 saab 99le 25 4 121 115 2671 13.5 75 2 honda civic cvcc 33 4 91 53 1795 17.5 75 3 fiat 131 28 4 107 86 2464 15.5 76 2 opel 1900 25 4 116 81 2220 16.9 76 2 capri ii 25 4 140 92 2572 14.9 76 1 dodge colt 26 4 98 79 2255 17.7 76 1 renault 12tl 27 4 101 83 2202 15.3 76 2 chevrolet chevelle malibu classic 17.5 8 305 140 4215 13 76 1 dodge coronet brougham 16 8 318 150 4190 13 76 1 amc matador 15.5 8 304 120 3962 13.9 76 1 ford gran torino 14.5 8 351 152 4215 12.8 76 1 plymouth valiant 22 6 225 100 3233 15.4 76 1 chevrolet nova 22 6 250 105 3353 14.5 76 1 ford maverick 24 6 200 81 3012 17.6 76 1 amc hornet 22.5 6 232 90 3085 17.6 76 1 chevrolet chevette 29 4 85 52 2035 22.2 76 1 chevrolet woody 24.5 4 98 60 2164 22.1 76 1 vw rabbit 29 4 90 70 1937 14.2 76 2 honda civic 33 4 91 53 1795 17.4 76 3 dodge aspen se 20 6 225 100 3651 17.7 76 1 ford granada ghia 18 6 250 78 3574 21 76 1 pontiac ventura sj 18.5 6 250 110 3645 16.2 76 1 amc pacer d/l 17.5 6 258 95 3193 17.8 76 1 volkswagen rabbit 29.5 4 97 71 1825 12.2 76 2 datsun b-210 32 4 85 70 1990 17 76 3 toyota corolla 28 4 97 75 2155 16.4 76 3 ford pinto 26.5 4 140 72 2565 13.6 76 1 volvo 245 20 4 130 102 3150 15.7 76 2 plymouth volare premier v8 13 8 318 150 3940 13.2 76 1 peugeot 504 19 4 120 88 3270 21.9 76 2 toyota mark ii 19 6 156 108 2930 15.5 76 3 mercedes-benz 280s 16.5 6 168 120 3820 16.7 76 2 cadillac seville 16.5 8 350 180 4380 12.1 76 1 chevy c10 13 8 350 145 4055 12 76 1 ford f108 13 8 302 130 3870 15 76 1 dodge d100 13 8 318 150 3755 14 76 1 honda accord cvcc 31.5 4 98 68 2045 18.5 77 3 buick opel isuzu deluxe 30 4 111 80 2155 14.8 77 1 renault 5 gtl 36 4 79 58 1825 18.6 77 2 plymouth arrow gs 25.5 4 122 96 2300 15.5 77 1 datsun f-10 hatchback 33.5 4 85 70 1945 16.8 77 3 chevrolet caprice classic 17.5 8 305 145 3880 12.5 77 1 oldsmobile cutlass supreme 17 8 260 110 4060 19 77 1 dodge monaco brougham 15.5 8 318 145 4140 13.7 77 1 mercury cougar brougham 15 8 302 130 4295 14.9 77 1 chevrolet concours 17.5 6 250 110 3520 16.4 77 1 buick skylark 20.5 6 231 105 3425 16.9 77 1 plymouth volare custom 19 6 225 100 3630 17.7 77 1 ford granada 18.5 6 250 98 3525 19 77 1 pontiac grand prix lj 16 8 400 180 4220 11.1 77 1 chevrolet monte carlo landau 15.5 8 350 170 4165 11.4 77 1 chrysler cordoba 15.5 8 400 190 4325 12.2 77 1 ford thunderbird 16 8 351 149 4335 14.5 77 1 volkswagen rabbit custom 29 4 97 78 1940 14.5 77 2 pontiac sunbird coupe 24.5 4 151 88 2740 16 77 1 toyota corolla liftback 26 4 97 75 2265 18.2 77 3 ford mustang ii 2+2 25.5 4 140 89 2755 15.8 77 1 chevrolet chevette 30.5 4 98 63 2051 17 77 1 dodge colt m/m 33.5 4 98 83 2075 15.9 77 1 subaru dl 30 4 97 67 1985 16.4 77 3 volkswagen dasher 30.5 4 97 78 2190 14.1 77 2 datsun 810 22 6 146 97 2815 14.5 77 3 bmw 320i 21.5 4 121 110 2600 12.8 77 2 mazda rx-4 21.5 3 80 110 2720 13.5 77 3 volkswagen rabbit custom diesel 43.1 4 90 48 1985 21.5 78 2 ford fiesta 36.1 4 98 66 1800 14.4 78 1 mazda glc deluxe 32.8 4 78 52 1985 19.4 78 3 datsun b210 gx 39.4 4 85 70 2070 18.6 78 3 honda civic cvcc 36.1 4 91 60 1800 16.4 78 3 oldsmobile cutlass salon brougham 19.9 8 260 110 3365 15.5 78 1 dodge diplomat 19.4 8 318 140 3735 13.2 78 1 mercury monarch ghia 20.2 8 302 139 3570 12.8 78 1 pontiac phoenix lj 19.2 6 231 105 3535 19.2 78 1 chevrolet malibu 20.5 6 200 95 3155 18.2 78 1 ford fairmont (auto) 20.2 6 200 85 2965 15.8 78 1 ford fairmont (man) 25.1 4 140 88 2720 15.4 78 1 plymouth volare 20.5 6 225 100 3430 17.2 78 1 amc concord 19.4 6 232 90 3210 17.2 78 1 buick century special 20.6 6 231 105 3380 15.8 78 1 mercury zephyr 20.8 6 200 85 3070 16.7 78 1 dodge aspen 18.6 6 225 110 3620 18.7 78 1 amc concord d/l 18.1 6 258 120 3410 15.1 78 1 chevrolet monte carlo landau 19.2 8 305 145 3425 13.2 78 1 buick regal sport coupe (turbo) 17.7 6 231 165 3445 13.4 78 1 ford futura 18.1 8 302 139 3205 11.2 78 1 dodge magnum xe 17.5 8 318 140 4080 13.7 78 1 chevrolet chevette 30 4 98 68 2155 16.5 78 1 toyota corona 27.5 4 134 95 2560 14.2 78 3 datsun 510 27.2 4 119 97 2300 14.7 78 3 dodge omni 30.9 4 105 75 2230 14.5 78 1 toyota celica gt liftback 21.1 4 134 95 2515 14.8 78 3 plymouth sapporo 23.2 4 156 105 2745 16.7 78 1 oldsmobile starfire sx 23.8 4 151 85 2855 17.6 78 1 datsun 200-sx 23.9 4 119 97 2405 14.9 78 3 audi 5000 20.3 5 131 103 2830 15.9 78 2 volvo 264gl 17 6 163 125 3140 13.6 78 2 saab 99gle 21.6 4 121 115 2795 15.7 78 2 peugeot 604sl 16.2 6 163 133 3410 15.8 78 2 volkswagen scirocco 31.5 4 89 71 1990 14.9 78 2 honda accord lx 29.5 4 98 68 2135 16.6 78 3 pontiac lemans v6 21.5 6 231 115 3245 15.4 79 1 mercury zephyr 6 19.8 6 200 85 2990 18.2 79 1 ford fairmont 4 22.3 4 140 88 2890 17.3 79 1 amc concord dl 6 20.2 6 232 90 3265 18.2 79 1 dodge aspen 6 20.6 6 225 110 3360 16.6 79 1 chevrolet caprice classic 17 8 305 130 3840 15.4 79 1 ford ltd landau 17.6 8 302 129 3725 13.4 79 1 mercury grand marquis 16.5 8 351 138 3955 13.2 79 1 dodge st. regis 18.2 8 318 135 3830 15.2 79 1 buick estate wagon (sw) 16.9 8 350 155 4360 14.9 79 1 ford country squire (sw) 15.5 8 351 142 4054 14.3 79 1 chevrolet malibu classic (sw) 19.2 8 267 125 3605 15 79 1 chrysler lebaron town @ country (sw) 18.5 8 360 150 3940 13 79 1 vw rabbit custom 31.9 4 89 71 1925 14 79 2 maxda glc deluxe 34.1 4 86 65 1975 15.2 79 3 dodge colt hatchback custom 35.7 4 98 80 1915 14.4 79 1 amc spirit dl 27.4 4 121 80 2670 15 79 1 mercedes benz 300d 25.4 5 183 77 3530 20.1 79 2 cadillac eldorado 23 8 350 125 3900 17.4 79 1 peugeot 504 27.2 4 141 71 3190 24.8 79 2 oldsmobile cutlass salon brougham 23.9 8 260 90 3420 22.2 79 1 plymouth horizon 34.2 4 105 70 2200 13.2 79 1 plymouth horizon tc3 34.5 4 105 70 2150 14.9 79 1 datsun 210 31.8 4 85 65 2020 19.2 79 3 fiat strada custom 37.3 4 91 69 2130 14.7 79 2 buick skylark limited 28.4 4 151 90 2670 16 79 1 chevrolet citation 28.8 6 173 115 2595 11.3 79 1 oldsmobile omega brougham 26.8 6 173 115 2700 12.9 79 1 pontiac phoenix 33.5 4 151 90 2556 13.2 79 1 vw rabbit 41.5 4 98 76 2144 14.7 80 2 toyota corolla tercel 38.1 4 89 60 1968 18.8 80 3 chevrolet chevette 32.1 4 98 70 2120 15.5 80 1 datsun 310 37.2 4 86 65 2019 16.4 80 3 chevrolet citation 28 4 151 90 2678 16.5 80 1 ford fairmont 26.4 4 140 88 2870 18.1 80 1 amc concord 24.3 4 151 90 3003 20.1 80 1 dodge aspen 19.1 6 225 90 3381 18.7 80 1 audi 4000 34.3 4 97 78 2188 15.8 80 2 toyota corona liftback 29.8 4 134 90 2711 15.5 80 3 mazda 626 31.3 4 120 75 2542 17.5 80 3 datsun 510 hatchback 37 4 119 92 2434 15 80 3 toyota corolla 32.2 4 108 75 2265 15.2 80 3 mazda glc 46.6 4 86 65 2110 17.9 80 3 dodge colt 27.9 4 156 105 2800 14.4 80 1 datsun 210 40.8 4 85 65 2110 19.2 80 3 vw rabbit c (diesel) 44.3 4 90 48 2085 21.7 80 2 vw dasher (diesel) 43.4 4 90 48 2335 23.7 80 2 audi 5000s (diesel) 36.4 5 121 67 2950 19.9 80 2 mercedes-benz 240d 30 4 146 67 3250 21.8 80 2 honda civic 1500 gl 44.6 4 91 67 1850 13.8 80 3 renault lecar deluxe 40.9 4 85 NA 1835 17.3 80 2 subaru dl 33.8 4 97 67 2145 18 80 3 vokswagen rabbit 29.8 4 89 62 1845 15.3 80 2 datsun 280-zx 32.7 6 168 132 2910 11.4 80 3 mazda rx-7 gs 23.7 3 70 100 2420 12.5 80 3 triumph tr7 coupe 35 4 122 88 2500 15.1 80 2 ford mustang cobra 23.6 4 140 NA 2905 14.3 80 1 honda accord 32.4 4 107 72 2290 17 80 3 plymouth reliant 27.2 4 135 84 2490 15.7 81 1 buick skylark 26.6 4 151 84 2635 16.4 81 1 dodge aries wagon (sw) 25.8 4 156 92 2620 14.4 81 1 chevrolet citation 23.5 6 173 110 2725 12.6 81 1 plymouth reliant 30 4 135 84 2385 12.9 81 1 toyota starlet 39.1 4 79 58 1755 16.9 81 3 plymouth champ 39 4 86 64 1875 16.4 81 1 honda civic 1300 35.1 4 81 60 1760 16.1 81 3 subaru 32.3 4 97 67 2065 17.8 81 3 datsun 210 mpg 37 4 85 65 1975 19.4 81 3 toyota tercel 37.7 4 89 62 2050 17.3 81 3 mazda glc 4 34.1 4 91 68 1985 16 81 3 plymouth horizon 4 34.7 4 105 63 2215 14.9 81 1 ford escort 4w 34.4 4 98 65 2045 16.2 81 1 ford escort 2h 29.9 4 98 65 2380 20.7 81 1 volkswagen jetta 33 4 105 74 2190 14.2 81 2 renault 18i 34.5 4 100 NA 2320 15.8 81 2 honda prelude 33.7 4 107 75 2210 14.4 81 3 toyota corolla 32.4 4 108 75 2350 16.8 81 3 datsun 200sx 32.9 4 119 100 2615 14.8 81 3 mazda 626 31.6 4 120 74 2635 18.3 81 3 peugeot 505s turbo diesel 28.1 4 141 80 3230 20.4 81 2 saab 900s NA 4 121 110 2800 15.4 81 2 volvo diesel 30.7 6 145 76 3160 19.6 81 2 toyota cressida 25.4 6 168 116 2900 12.6 81 3 datsun 810 maxima 24.2 6 146 120 2930 13.8 81 3 buick century 22.4 6 231 110 3415 15.8 81 1 oldsmobile cutlass ls 26.6 8 350 105 3725 19 81 1 ford granada gl 20.2 6 200 88 3060 17.1 81 1 chrysler lebaron salon 17.6 6 225 85 3465 16.6 81 1 chevrolet cavalier 28 4 112 88 2605 19.6 82 1 chevrolet cavalier wagon 27 4 112 88 2640 18.6 82 1 chevrolet cavalier 2-door 34 4 112 88 2395 18 82 1 pontiac j2000 se hatchback 31 4 112 85 2575 16.2 82 1 dodge aries se 29 4 135 84 2525 16 82 1 pontiac phoenix 27 4 151 90 2735 18 82 1 ford fairmont futura 24 4 140 92 2865 16.4 82 1 amc concord dl 23 4 151 NA 3035 20.5 82 1 volkswagen rabbit l 36 4 105 74 1980 15.3 82 2 mazda glc custom l 37 4 91 68 2025 18.2 82 3 mazda glc custom 31 4 91 68 1970 17.6 82 3 plymouth horizon miser 38 4 105 63 2125 14.7 82 1 mercury lynx l 36 4 98 70 2125 17.3 82 1 nissan stanza xe 36 4 120 88 2160 14.5 82 3 honda accord 36 4 107 75 2205 14.5 82 3 toyota corolla 34 4 108 70 2245 16.9 82 3 honda civic 38 4 91 67 1965 15 82 3 honda civic (auto) 32 4 91 67 1965 15.7 82 3 datsun 310 gx 38 4 91 67 1995 16.2 82 3 buick century limited 25 6 181 110 2945 16.4 82 1 oldsmobile cutlass ciera (diesel) 38 6 262 85 3015 17 82 1 chrysler lebaron medallion 26 4 156 92 2585 14.5 82 1 ford granada l 22 6 232 112 2835 14.7 82 1 toyota celica gt 32 4 144 96 2665 13.9 82 3 dodge charger 2.2 36 4 135 84 2370 13 82 1 chevrolet camaro 27 4 151 90 2950 17.3 82 1 ford mustang gl 27 4 140 86 2790 15.6 82 1 vw pickup 44 4 97 52 2130 24.6 82 2 dodge rampage 32 4 135 84 2295 11.6 82 1 ford ranger 28 4 120 79 2625 18.6 82 1 chevy s-10 31 4 119 82 2720 19.4 82 1 \ No newline at end of file diff --git a/content/handbook_2e/examples/32 Data/Ex_12/Ex_12.pde b/content/handbook_2e/examples/32 Data/Ex_12/Ex_12.pde new file mode 100644 index 000000000..1bd28fc38 --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_12/Ex_12.pde @@ -0,0 +1,7 @@ +XML xml; + +void setup() { + xml = loadXML("mammals.xml"); + XML[] animals = xml.getChildren("animal"); + println(animals.length); +} diff --git a/content/handbook_2e/examples/32 Data/Ex_12/data/mammals.xml b/content/handbook_2e/examples/32 Data/Ex_12/data/mammals.xml new file mode 100644 index 000000000..752da754b --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_12/data/mammals.xml @@ -0,0 +1,6 @@ + + + Goat + Leopard + Zebra + \ No newline at end of file diff --git a/content/handbook_2e/examples/32 Data/Ex_13/Ex_13.pde b/content/handbook_2e/examples/32 Data/Ex_13/Ex_13.pde new file mode 100644 index 000000000..172a85578 --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_13/Ex_13.pde @@ -0,0 +1,11 @@ +XML xml; + +void setup() { + xml = loadXML("mammals.xml"); + for (XML a : xml.getChildren("animal")) { + String name = a.getContent(); + String species = a.getString("species"); + println(name + ", " + species); + } +} + diff --git a/content/handbook_2e/examples/32 Data/Ex_13/data/mammals.xml b/content/handbook_2e/examples/32 Data/Ex_13/data/mammals.xml new file mode 100644 index 000000000..752da754b --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_13/data/mammals.xml @@ -0,0 +1,6 @@ + + + Goat + Leopard + Zebra + \ No newline at end of file diff --git a/content/handbook_2e/examples/32 Data/Ex_14/Ex_14.pde b/content/handbook_2e/examples/32 Data/Ex_14/Ex_14.pde new file mode 100644 index 000000000..7c10f6d13 --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_14/Ex_14.pde @@ -0,0 +1,26 @@ +XML cambridge; // Data for Cambridge, MA + +int[] lows = new int[0]; +int[] highs = new int[0]; + +void setup() { + cambridge = loadXML("cambridge.xml"); + for (XML temps : cambridge.getChildren("temperature")) { + String type = temps.getString("type"); + if (type.equals("maximum")) { + for (XML val : temps.getChildren("value")) { + int t = int(val.getContent()); + highs = append(highs, t); + } + } + else { + for (XML val : temps.getChildren("value")) { + int t = int(val.getContent()); + lows = append(lows, t); + } + } + } + printArray(lows); + printArray(highs); +} + diff --git a/content/handbook_2e/examples/32 Data/Ex_14/data/cambridge.xml b/content/handbook_2e/examples/32 Data/Ex_14/data/cambridge.xml new file mode 100644 index 000000000..5887180d5 --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_14/data/cambridge.xml @@ -0,0 +1,27 @@ + + + + Cambridge, MA + + + + Daily Maximum Temperature + 29 + 26 + 32 + 27 + 33 + 38 + 36 + + + Daily Minimum Temperature + 18 + 13 + 23 + 18 + 11 + 25 + 24 + + \ No newline at end of file diff --git a/content/handbook_2e/examples/32 Data/Ex_14/data/marinadelrey.xml b/content/handbook_2e/examples/32 Data/Ex_14/data/marinadelrey.xml new file mode 100644 index 000000000..faad13578 --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_14/data/marinadelrey.xml @@ -0,0 +1,27 @@ + + + + Marina Del Rey, CA + + + + Daily Maximum Temperature + 70 + 64 + 72 + 71 + 75 + 75 + 70 + + + Daily Minimum Temperature + 46 + 46 + 48 + 49 + 50 + 49 + 47 + + \ No newline at end of file diff --git a/content/handbook_2e/examples/32 Data/Ex_15/Ex_15.pde b/content/handbook_2e/examples/32 Data/Ex_15/Ex_15.pde new file mode 100644 index 000000000..b652dea75 --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_15/Ex_15.pde @@ -0,0 +1,44 @@ +XML cambridge; // Data for Cambridge, MA + +int[] lows = new int[0]; +int[] highs = new int[0]; + +void setup() { + size(700, 100); + cambridge = loadXML("cambridge.xml"); + lows = getData(cambridge, "minimum"); + highs = getData(cambridge, "maximum"); +} + +void draw() { + background(204); + // Shape defined by daily highs and lows + noStroke(); + fill(0); + beginShape(QUAD_STRIP); + for (int i = 0; i < lows.length; i++) { + float x = map(i, 0, lows.length-1, 0, width); + vertex(x, height-lows[i]); + vertex(x, height-highs[i]*2); + } + endShape(); + // Lines for temperatures, 0 (bottom) to 50 (top) + stroke(255, 153); + for (int y = height-1; y > 0; y -= 10) { + line(0, y, width, y); + } +} + +int[] getData(XML city, String minOrMax) { + int[] values = new int[0]; + for (XML temps : city.getChildren("temperature")) { + String type = temps.getString("type"); + if (type.equals(minOrMax)) { + for (XML val : temps.getChildren("value")) { + int t = int(val.getContent()); + values = append(values, t); + } + } + } + return values; +} diff --git a/content/handbook_2e/examples/32 Data/Ex_15/data/cambridge.xml b/content/handbook_2e/examples/32 Data/Ex_15/data/cambridge.xml new file mode 100644 index 000000000..5887180d5 --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_15/data/cambridge.xml @@ -0,0 +1,27 @@ + + + + Cambridge, MA + + + + Daily Maximum Temperature + 29 + 26 + 32 + 27 + 33 + 38 + 36 + + + Daily Minimum Temperature + 18 + 13 + 23 + 18 + 11 + 25 + 24 + + \ No newline at end of file diff --git a/content/handbook_2e/examples/32 Data/Ex_15/data/marinadelrey.xml b/content/handbook_2e/examples/32 Data/Ex_15/data/marinadelrey.xml new file mode 100644 index 000000000..faad13578 --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_15/data/marinadelrey.xml @@ -0,0 +1,27 @@ + + + + Marina Del Rey, CA + + + + Daily Maximum Temperature + 70 + 64 + 72 + 71 + 75 + 75 + 70 + + + Daily Minimum Temperature + 46 + 46 + 48 + 49 + 50 + 49 + 47 + + \ No newline at end of file diff --git a/content/handbook_2e/examples/32 Data/Ex_16/Ex_16.pde b/content/handbook_2e/examples/32 Data/Ex_16/Ex_16.pde new file mode 100644 index 000000000..f6dcfad81 --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_16/Ex_16.pde @@ -0,0 +1,6 @@ +JSONArray animals; + +void setup() { + animals = loadJSONArray("animals.json"); + println(animals.size()); +} diff --git a/content/handbook_2e/examples/32 Data/Ex_16/data/animals.json b/content/handbook_2e/examples/32 Data/Ex_16/data/animals.json new file mode 100644 index 000000000..9385a3271 --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_16/data/animals.json @@ -0,0 +1,17 @@ +[ + { + "id": 0, + "species": "Capra hircus", + "name": "Goat" + }, + { + "id": 1, + "species": "Panthera pardus", + "name": "Leopard" + }, + { + "id": 2, + "species": "Equus zebra", + "name": "Zebra" + } +] \ No newline at end of file diff --git a/content/handbook_2e/examples/32 Data/Ex_17/Ex_17.pde b/content/handbook_2e/examples/32 Data/Ex_17/Ex_17.pde new file mode 100644 index 000000000..9b04ac8fc --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_17/Ex_17.pde @@ -0,0 +1,11 @@ +JSONArray animals; + +void setup() { + animals = loadJSONArray("animals.json"); + for (int i = 0; i < animals.size(); i++) { + JSONObject a = animals.getJSONObject(i); + String name = a.getString("name"); + String species = a.getString("species"); + println(name + ", " + species); + } +} diff --git a/content/handbook_2e/examples/32 Data/Ex_17/data/animals.json b/content/handbook_2e/examples/32 Data/Ex_17/data/animals.json new file mode 100644 index 000000000..9385a3271 --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_17/data/animals.json @@ -0,0 +1,17 @@ +[ + { + "id": 0, + "species": "Capra hircus", + "name": "Goat" + }, + { + "id": 1, + "species": "Panthera pardus", + "name": "Leopard" + }, + { + "id": 2, + "species": "Equus zebra", + "name": "Zebra" + } +] \ No newline at end of file diff --git a/content/handbook_2e/examples/32 Data/Ex_18/Ex_18.pde b/content/handbook_2e/examples/32 Data/Ex_18/Ex_18.pde new file mode 100644 index 000000000..691a28b9d --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_18/Ex_18.pde @@ -0,0 +1,14 @@ +JSONArray bookData; + +void setup() { + bookData = loadJSONArray("books.json"); + for (int i = 0; i < bookData.size(); i++) { + JSONObject b = bookData.getJSONObject(i); + String title = b.getString("title"); + JSONArray dims = b.getJSONArray("dimensions"); + float w = dims.getFloat(0); + float h = dims.getFloat(1); + float d = dims.getFloat(2); + println(title, w, h, d); + } +} diff --git a/content/handbook_2e/examples/32 Data/Ex_18/data/books.json b/content/handbook_2e/examples/32 Data/Ex_18/data/books.json new file mode 100644 index 000000000..5ad2f6c93 --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_18/data/books.json @@ -0,0 +1,14 @@ +[ + { + "title": "Six Years", + "author": "Lippard", + "ISBN-10": 0520210131, + "dimensions": [ 7.0, 8.0, 0.8 ] + }, + { + "title": "Beyond Modern", + "author": "Burnham", + "ISBN-10": 0987654321, + "dimensions": [ 7.6, 9.2, 1 ] + } +] \ No newline at end of file diff --git a/content/handbook_2e/examples/32 Data/Ex_19/Book.pde b/content/handbook_2e/examples/32 Data/Ex_19/Book.pde new file mode 100644 index 000000000..d0cfbecbe --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_19/Book.pde @@ -0,0 +1,29 @@ +class Book { + + String title; + String author; + int isbn; + float w, h, d; + + Book(JSONObject b) { + title = b.getString("title"); + author = b.getString("author"); + isbn = b.getInt("ISBN-10"); + JSONArray dims = b.getJSONArray("dimensions"); + w = dims.getFloat(0); + h = dims.getFloat(1); + d = dims.getFloat(2); + println(title, author, isbn, w, h, d); + } + + float getDepth() { + return d; + } + + void display() { + fill(0); + stroke(255); + box(w, d, h); + } +} + diff --git a/content/handbook_2e/examples/32 Data/Ex_19/Ex_19.pde b/content/handbook_2e/examples/32 Data/Ex_19/Ex_19.pde new file mode 100644 index 000000000..7566bdae5 --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_19/Ex_19.pde @@ -0,0 +1,25 @@ +JSONArray bookData; +Book[] books; + +void setup() { + size(100, 100, P3D); + bookData = loadJSONArray("books.json"); + books = new Book[bookData.size()]; + for (int i = 0; i < books.length; i++) { + JSONObject b = bookData.getJSONObject(i); + books[i] = new Book(b); + } +} + +void draw() { + background(204); + translate(50, 20, -50); + scale(10); + strokeWeight(0.1); + float angle = map(mouseX, 0, width, -1, 1); + rotateY(angle); // Rotate with mouseX + for (Book b : books) { + b.display(); + translate(0, b.getDepth(), 0); + } +} diff --git a/content/handbook_2e/examples/32 Data/Ex_19/data/books.json b/content/handbook_2e/examples/32 Data/Ex_19/data/books.json new file mode 100644 index 000000000..c3a381f05 --- /dev/null +++ b/content/handbook_2e/examples/32 Data/Ex_19/data/books.json @@ -0,0 +1,50 @@ +[ + { + "title": "Six Years", + "author": "Lippard", + "ISBN-10": 0520210131, + "dimensions": [ 7.0, 8.0, 0.8 ] + }, + { + "title": "Beyond Modern", + "author": "Burnham", + "ISBN-10": 0987654321, + "dimensions": [ 7.6, 9.2, 1 ] + }, + { + "title": "Relational Aesthetics", + "author": "Bourriaud", + "ISBN-10": 2840660601, + "dimensions": [ 5.8, 8.2, 0.3 ] + }, + { + "title": "The Open Work", + "author": "Eco", + "ISBN-10": 0674639766, + "dimensions": [ 5.9, 8.9, 1 ] + }, + { + "title": "Open Systems", + "author": "De Salvo", + "ISBN-10": 1854375652, + "dimensions": [ 9, 10.6, 0.6 ] + }, + { + "title": "Designing Programmes", + "author": "Gerstner", + "ISBN-10": 3037780932, + "dimensions": [ 7.2, 9.2, 0.6 ] + }, + { + "title": "Typographie", + "author": "Ruder", + "ISBN-10": 3721200438, + "dimensions": [ 8.8, 9.2, 1.2 ] + }, + { + "title": "Conditional Design", + "author": "Maurer et al.", + "ISBN-10": 9078088583, + "dimensions": [ 8.2, 11.8, 1.1 ] + } +] \ No newline at end of file diff --git a/content/handbook_2e/examples/33 Interface/Ex_01/Ex_01.pde b/content/handbook_2e/examples/33 Interface/Ex_01/Ex_01.pde new file mode 100644 index 000000000..8513a3abb --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_01/Ex_01.pde @@ -0,0 +1,25 @@ +class OverCircle { + int x, y; // The x- and y-coordinates + int diameter; // Diameter of the circle + int gray; // Gray value + + OverCircle(int xp, int yp, int d) { + x = xp; + y = yp; + diameter = d; + gray = 0; + } + + void update(int mx, int my) { + if (dist(mx, my, x, y) < diameter/2) { + gray = 255; + } else { + gray = 0; + } + } + + void display() { + fill(gray); + ellipse(x, y, diameter, diameter); + } +} diff --git a/content/handbook_2e/examples/33 Interface/Ex_02/Ex_02.pde b/content/handbook_2e/examples/33 Interface/Ex_02/Ex_02.pde new file mode 100644 index 000000000..0f9e59ada --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_02/Ex_02.pde @@ -0,0 +1,25 @@ +class OverRect { + int x, y; // The x- and y-coordinates + int size; // Dimension (width and height) of the rectangle + int gray; // Gray value + + OverRect(int xp, int yp, int s) { + x = xp; + y = yp; + size = s; + gray = 0; + } + + void update(int mx, int my) { + if ((mx > x) && (mx < x+size) && (my > y) && (my < y+size)) { + gray = 255; + } else { + gray = 0; + } + } + + void display() { + fill(gray); + rect(x, y, size, size); + } +} diff --git a/content/handbook_2e/examples/33 Interface/Ex_03/Ex_03.pde b/content/handbook_2e/examples/33 Interface/Ex_03/Ex_03.pde new file mode 100644 index 000000000..edbb22001 --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_03/Ex_03.pde @@ -0,0 +1,19 @@ +// Requires the OverRect and OverCircle classes + +OverRect r; +OverCircle c; + +void setup() { + size(100, 100); + r = new OverRect(9, 30, 36); + c = new OverCircle(72, 48, 40); + noStroke(); +} + +void draw() { + background(204); + r.update(mouseX, mouseY); + r.display(); + c.update(mouseX, mouseY); + c.display(); +} diff --git a/content/handbook_2e/examples/33 Interface/Ex_03/OverCircle.pde b/content/handbook_2e/examples/33 Interface/Ex_03/OverCircle.pde new file mode 100644 index 000000000..6d6d667d5 --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_03/OverCircle.pde @@ -0,0 +1,24 @@ +class OverCircle { + int x, y; // The x- and y-coordinates + int diameter; // Diameter of the circle + int gray; // Gray value + + OverCircle(int xp, int yp, int d) { + x = xp; + y = yp; + diameter = d; + gray = 0; + } + void update(int mx, int my) { + if (dist(mx, my, x, y) < diameter/2) { + gray = 255; + } else { + gray = 0; + } + } + + void display() { + fill(gray); + ellipse(x, y, diameter, diameter); + } +} diff --git a/content/handbook_2e/examples/33 Interface/Ex_03/OverRect.pde b/content/handbook_2e/examples/33 Interface/Ex_03/OverRect.pde new file mode 100644 index 000000000..0f9e59ada --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_03/OverRect.pde @@ -0,0 +1,25 @@ +class OverRect { + int x, y; // The x- and y-coordinates + int size; // Dimension (width and height) of the rectangle + int gray; // Gray value + + OverRect(int xp, int yp, int s) { + x = xp; + y = yp; + size = s; + gray = 0; + } + + void update(int mx, int my) { + if ((mx > x) && (mx < x+size) && (my > y) && (my < y+size)) { + gray = 255; + } else { + gray = 0; + } + } + + void display() { + fill(gray); + rect(x, y, size, size); + } +} diff --git a/content/handbook_2e/examples/33 Interface/Ex_04/Ex_04.pde b/content/handbook_2e/examples/33 Interface/Ex_04/Ex_04.pde new file mode 100644 index 000000000..0fa3b9d10 --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_04/Ex_04.pde @@ -0,0 +1,17 @@ +// Requires the OverRect and OverCircle classes + +OverRect r = new OverRect(9, 30, 36); +OverCircle c = new OverCircle(72, 48, 40); + +void setup() { + size(100, 100); + noStroke(); +} + +void draw() { + background(204); + r.update(mouseX, mouseY); + r.display(); + c.update(mouseX, mouseY); + c.display(); +} diff --git a/content/handbook_2e/examples/33 Interface/Ex_04/OverCircle.pde b/content/handbook_2e/examples/33 Interface/Ex_04/OverCircle.pde new file mode 100644 index 000000000..8f68d44c0 --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_04/OverCircle.pde @@ -0,0 +1,29 @@ +class OverCircle { + int x, y; // The x- and y-coordinates + int diameter; // Diameter of the circle + int gray; // Gray value + + OverCircle(int xp, int yp, int d) { + x = xp; + y = yp; + diameter = d; + gray = 0; + } + + void update(int mx, int my) { + if (dist(mx, my, x, y) < diameter/2) { + if (gray < 255) { + gray++; + } + } else { + if (gray > 0) { + gray--; + } + } +} + + void display() { + fill(gray); + ellipse(x, y, diameter, diameter); + } +} diff --git a/content/handbook_2e/examples/33 Interface/Ex_04/OverRect.pde b/content/handbook_2e/examples/33 Interface/Ex_04/OverRect.pde new file mode 100644 index 000000000..0f9e59ada --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_04/OverRect.pde @@ -0,0 +1,25 @@ +class OverRect { + int x, y; // The x- and y-coordinates + int size; // Dimension (width and height) of the rectangle + int gray; // Gray value + + OverRect(int xp, int yp, int s) { + x = xp; + y = yp; + size = s; + gray = 0; + } + + void update(int mx, int my) { + if ((mx > x) && (mx < x+size) && (my > y) && (my < y+size)) { + gray = 255; + } else { + gray = 0; + } + } + + void display() { + fill(gray); + rect(x, y, size, size); + } +} diff --git a/content/handbook_2e/examples/33 Interface/Ex_05/Ex_05.pde b/content/handbook_2e/examples/33 Interface/Ex_05/Ex_05.pde new file mode 100644 index 000000000..b163718df --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_05/Ex_05.pde @@ -0,0 +1,55 @@ +class Button { + int x, y; // The x- and y-coordinates + int size; // Dimension (width and height) + color baseGray; // Default gray value + color overGray; // Value when mouse is over the button + color pressGray; // Value when mouse is over and pressed + boolean over = false; // True when the mouse is over + boolean pressed = false; // True when the mouse is over and pressed + + Button(int xp, int yp, int s, color b, color o, color p) { + x = xp; + y = yp; + size = s; + baseGray = b; + overGray = o; + pressGray = p; + } + + // Updates the over field every frame + void update() { + if ((mouseX >= x) && (mouseX <= x+size) && + (mouseY >= y) && (mouseY <= y+size)) { + over = true; + } else { + over = false; + } + } + + // Respond to mousePressed() event + boolean press() { + if (over == true) { + pressed = true; + return true; + } else { + return false; + } + } + + // Respond to mouseReleased() event + void release() { + pressed = false; + } + + void display() { + if (pressed == true) { + fill(pressGray); + } else if (over == true) { + fill(overGray); + } else { + fill(baseGray); + } + stroke(255); + rect(x, y, size, size); + } +} diff --git a/content/handbook_2e/examples/33 Interface/Ex_06/Button.pde b/content/handbook_2e/examples/33 Interface/Ex_06/Button.pde new file mode 100644 index 000000000..b163718df --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_06/Button.pde @@ -0,0 +1,55 @@ +class Button { + int x, y; // The x- and y-coordinates + int size; // Dimension (width and height) + color baseGray; // Default gray value + color overGray; // Value when mouse is over the button + color pressGray; // Value when mouse is over and pressed + boolean over = false; // True when the mouse is over + boolean pressed = false; // True when the mouse is over and pressed + + Button(int xp, int yp, int s, color b, color o, color p) { + x = xp; + y = yp; + size = s; + baseGray = b; + overGray = o; + pressGray = p; + } + + // Updates the over field every frame + void update() { + if ((mouseX >= x) && (mouseX <= x+size) && + (mouseY >= y) && (mouseY <= y+size)) { + over = true; + } else { + over = false; + } + } + + // Respond to mousePressed() event + boolean press() { + if (over == true) { + pressed = true; + return true; + } else { + return false; + } + } + + // Respond to mouseReleased() event + void release() { + pressed = false; + } + + void display() { + if (pressed == true) { + fill(pressGray); + } else if (over == true) { + fill(overGray); + } else { + fill(baseGray); + } + stroke(255); + rect(x, y, size, size); + } +} diff --git a/content/handbook_2e/examples/33 Interface/Ex_06/Ex_06.pde b/content/handbook_2e/examples/33 Interface/Ex_06/Ex_06.pde new file mode 100644 index 000000000..b6739383c --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_06/Ex_06.pde @@ -0,0 +1,27 @@ +// Requires the Button class + +Button button; + +void setup() { + size(100, 100); + // Inputs: x, y, size, + // base color, over color, press color + button = new Button(25, 25, 50, + color(204), color(255), color(0)); +} + +void draw() { + background(204); + stroke(255); + button.update(); + button.display(); +} + +void mousePressed() { + button.press(); +} + +void mouseReleased() { + button.release(); +} + diff --git a/content/handbook_2e/examples/33 Interface/Ex_07/Button.pde b/content/handbook_2e/examples/33 Interface/Ex_07/Button.pde new file mode 100644 index 000000000..b163718df --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_07/Button.pde @@ -0,0 +1,55 @@ +class Button { + int x, y; // The x- and y-coordinates + int size; // Dimension (width and height) + color baseGray; // Default gray value + color overGray; // Value when mouse is over the button + color pressGray; // Value when mouse is over and pressed + boolean over = false; // True when the mouse is over + boolean pressed = false; // True when the mouse is over and pressed + + Button(int xp, int yp, int s, color b, color o, color p) { + x = xp; + y = yp; + size = s; + baseGray = b; + overGray = o; + pressGray = p; + } + + // Updates the over field every frame + void update() { + if ((mouseX >= x) && (mouseX <= x+size) && + (mouseY >= y) && (mouseY <= y+size)) { + over = true; + } else { + over = false; + } + } + + // Respond to mousePressed() event + boolean press() { + if (over == true) { + pressed = true; + return true; + } else { + return false; + } + } + + // Respond to mouseReleased() event + void release() { + pressed = false; + } + + void display() { + if (pressed == true) { + fill(pressGray); + } else if (over == true) { + fill(overGray); + } else { + fill(baseGray); + } + stroke(255); + rect(x, y, size, size); + } +} diff --git a/content/handbook_2e/examples/33 Interface/Ex_07/Ex_07.pde b/content/handbook_2e/examples/33 Interface/Ex_07/Ex_07.pde new file mode 100644 index 000000000..bad576777 --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_07/Ex_07.pde @@ -0,0 +1,49 @@ +// Requires the Button class + +Button button1, button2, button3; +int mode = 1; + +void setup() { + size(100, 100); + color gray = color(204); + color white = color(255); + color black = color(0); + button1 = new Button(10, 80, 10, gray, white, black); + button2 = new Button(25, 80, 10, gray, white, black); + button3 = new Button(40, 80, 10, gray, white, black); +} + +void draw() { + background(204); + manageButtons(); + noStroke(); + fill(0); + if (mode == 1) { + ellipse(0, 40, 60, 60); + } else if (mode == 2) { + ellipse(50, 40, 60, 60); + } else if (mode == 3) { + ellipse(100, 40, 60, 60); + } +} + +void manageButtons() { + button1.update(); + button2.update(); + button3.update(); + button1.display(); + button2.display(); + button3.display(); +} + +void mousePressed() { + if (button1.press() == true) { mode = 1; } + if (button2.press() == true) { mode = 2; } + if (button3.press() == true) { mode = 3; } +} + +void mouseReleased() { + button1.release(); + button2.release(); + button3.release(); +} diff --git a/content/handbook_2e/examples/33 Interface/Ex_08/Button.pde b/content/handbook_2e/examples/33 Interface/Ex_08/Button.pde new file mode 100644 index 000000000..b163718df --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_08/Button.pde @@ -0,0 +1,55 @@ +class Button { + int x, y; // The x- and y-coordinates + int size; // Dimension (width and height) + color baseGray; // Default gray value + color overGray; // Value when mouse is over the button + color pressGray; // Value when mouse is over and pressed + boolean over = false; // True when the mouse is over + boolean pressed = false; // True when the mouse is over and pressed + + Button(int xp, int yp, int s, color b, color o, color p) { + x = xp; + y = yp; + size = s; + baseGray = b; + overGray = o; + pressGray = p; + } + + // Updates the over field every frame + void update() { + if ((mouseX >= x) && (mouseX <= x+size) && + (mouseY >= y) && (mouseY <= y+size)) { + over = true; + } else { + over = false; + } + } + + // Respond to mousePressed() event + boolean press() { + if (over == true) { + pressed = true; + return true; + } else { + return false; + } + } + + // Respond to mouseReleased() event + void release() { + pressed = false; + } + + void display() { + if (pressed == true) { + fill(pressGray); + } else if (over == true) { + fill(overGray); + } else { + fill(baseGray); + } + stroke(255); + rect(x, y, size, size); + } +} diff --git a/content/handbook_2e/examples/33 Interface/Ex_08/Ex_08.pde b/content/handbook_2e/examples/33 Interface/Ex_08/Ex_08.pde new file mode 100644 index 000000000..cf0dce7d8 --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_08/Ex_08.pde @@ -0,0 +1,20 @@ +class DragButton extends Button { + int xoff, yoff; + + DragButton(int xp, int yp, int s, color b, color o, color p) { + super(xp, yp, s, b, o, p); + } + + boolean press() { + xoff = mouseX - x; // Store x-offset from shape origin + yoff = mouseY - y; // Store y-offset from shape origin + return super.press(); + } + + void drag() { + if (pressed == true) { + x = mouseX - xoff; // Apply x-offset + y = mouseY - yoff; // Apply y-offset + } + } +} diff --git a/content/handbook_2e/examples/33 Interface/Ex_09/Button.pde b/content/handbook_2e/examples/33 Interface/Ex_09/Button.pde new file mode 100644 index 000000000..b163718df --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_09/Button.pde @@ -0,0 +1,55 @@ +class Button { + int x, y; // The x- and y-coordinates + int size; // Dimension (width and height) + color baseGray; // Default gray value + color overGray; // Value when mouse is over the button + color pressGray; // Value when mouse is over and pressed + boolean over = false; // True when the mouse is over + boolean pressed = false; // True when the mouse is over and pressed + + Button(int xp, int yp, int s, color b, color o, color p) { + x = xp; + y = yp; + size = s; + baseGray = b; + overGray = o; + pressGray = p; + } + + // Updates the over field every frame + void update() { + if ((mouseX >= x) && (mouseX <= x+size) && + (mouseY >= y) && (mouseY <= y+size)) { + over = true; + } else { + over = false; + } + } + + // Respond to mousePressed() event + boolean press() { + if (over == true) { + pressed = true; + return true; + } else { + return false; + } + } + + // Respond to mouseReleased() event + void release() { + pressed = false; + } + + void display() { + if (pressed == true) { + fill(pressGray); + } else if (over == true) { + fill(overGray); + } else { + fill(baseGray); + } + stroke(255); + rect(x, y, size, size); + } +} diff --git a/content/handbook_2e/examples/33 Interface/Ex_09/DragButton.pde b/content/handbook_2e/examples/33 Interface/Ex_09/DragButton.pde new file mode 100644 index 000000000..cf0dce7d8 --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_09/DragButton.pde @@ -0,0 +1,20 @@ +class DragButton extends Button { + int xoff, yoff; + + DragButton(int xp, int yp, int s, color b, color o, color p) { + super(xp, yp, s, b, o, p); + } + + boolean press() { + xoff = mouseX - x; // Store x-offset from shape origin + yoff = mouseY - y; // Store y-offset from shape origin + return super.press(); + } + + void drag() { + if (pressed == true) { + x = mouseX - xoff; // Apply x-offset + y = mouseY - yoff; // Apply y-offset + } + } +} diff --git a/content/handbook_2e/examples/33 Interface/Ex_09/Ex_09.pde b/content/handbook_2e/examples/33 Interface/Ex_09/Ex_09.pde new file mode 100644 index 000000000..b2bd16a4f --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_09/Ex_09.pde @@ -0,0 +1,22 @@ +// Requires DragButton and Button classes + +DragButton icon; + +void setup() { + size(100, 100); + color gray = color(204); + color white = color(255); + color black = color(0); + icon = new DragButton(21, 42, 50, gray, white, black); +} + +void draw() { + background(204); + icon.update(); + icon.display(); +} + +void mousePressed() { icon.press(); } +void mouseReleased() { icon.release(); } +void mouseDragged() { icon.drag(); } + diff --git a/content/handbook_2e/examples/33 Interface/Ex_10/Ex_10.pde b/content/handbook_2e/examples/33 Interface/Ex_10/Ex_10.pde new file mode 100644 index 000000000..62d63d3c0 --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_10/Ex_10.pde @@ -0,0 +1,31 @@ +class Check { + int x, y; // The x- and y-coordinates + int size; // Dimension (width and height) + color baseGray; // Default gray value + boolean checked = false; // True when the check box is selected + + Check(int xp, int yp, int s, color b) { + x = xp; + y = yp; + size = s; + baseGray = b; + } + + // Updates the boolean variable checked + void press(float mx, float my) { + if ((mx >= x) && (mx <= x+size) && (my >= y) && (my <= y+size)) { + checked = !checked; // Toggle the check box on and off + } + } + + // Draws the box and an X inside if the checked variable is true + void display() { + stroke(255); + fill(baseGray); + rect(x, y, size, size); + if (checked == true) { + line(x, y, x+size, y+size); + line(x+size, y, x, y+size); + } + } +} diff --git a/content/handbook_2e/examples/33 Interface/Ex_11/Check.pde b/content/handbook_2e/examples/33 Interface/Ex_11/Check.pde new file mode 100644 index 000000000..62d63d3c0 --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_11/Check.pde @@ -0,0 +1,31 @@ +class Check { + int x, y; // The x- and y-coordinates + int size; // Dimension (width and height) + color baseGray; // Default gray value + boolean checked = false; // True when the check box is selected + + Check(int xp, int yp, int s, color b) { + x = xp; + y = yp; + size = s; + baseGray = b; + } + + // Updates the boolean variable checked + void press(float mx, float my) { + if ((mx >= x) && (mx <= x+size) && (my >= y) && (my <= y+size)) { + checked = !checked; // Toggle the check box on and off + } + } + + // Draws the box and an X inside if the checked variable is true + void display() { + stroke(255); + fill(baseGray); + rect(x, y, size, size); + if (checked == true) { + line(x, y, x+size, y+size); + line(x+size, y, x, y+size); + } + } +} diff --git a/content/handbook_2e/examples/33 Interface/Ex_11/Ex_11.pde b/content/handbook_2e/examples/33 Interface/Ex_11/Ex_11.pde new file mode 100644 index 000000000..050aca659 --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_11/Ex_11.pde @@ -0,0 +1,18 @@ +// Requires the Check class + +Check check; + +void setup() { + size(100, 100); + // Inputs: x, y, size, fill color + check = new Check(25, 25, 50, color(0)); +} + +void draw() { + background(204); + check.display(); +} + +void mousePressed() { + check.press(mouseX, mouseY); +} diff --git a/content/handbook_2e/examples/33 Interface/Ex_12/Check.pde b/content/handbook_2e/examples/33 Interface/Ex_12/Check.pde new file mode 100644 index 000000000..62d63d3c0 --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_12/Check.pde @@ -0,0 +1,31 @@ +class Check { + int x, y; // The x- and y-coordinates + int size; // Dimension (width and height) + color baseGray; // Default gray value + boolean checked = false; // True when the check box is selected + + Check(int xp, int yp, int s, color b) { + x = xp; + y = yp; + size = s; + baseGray = b; + } + + // Updates the boolean variable checked + void press(float mx, float my) { + if ((mx >= x) && (mx <= x+size) && (my >= y) && (my <= y+size)) { + checked = !checked; // Toggle the check box on and off + } + } + + // Draws the box and an X inside if the checked variable is true + void display() { + stroke(255); + fill(baseGray); + rect(x, y, size, size); + if (checked == true) { + line(x, y, x+size, y+size); + line(x+size, y, x, y+size); + } + } +} diff --git a/content/handbook_2e/examples/33 Interface/Ex_12/Ex_12.pde b/content/handbook_2e/examples/33 Interface/Ex_12/Ex_12.pde new file mode 100644 index 000000000..fd0a06ae8 --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_12/Ex_12.pde @@ -0,0 +1,31 @@ +// Requires the Check class + +int numChecks = 25; +Check[] checks = new Check[numChecks]; + +void setup() { + size(100, 100); + int x = 14; + int y = 14; + for (int i = 0; i < checks.length; i++) { + checks[i] = new Check(x, y, 12, color(0)); + x += 15; + if (x > 80) { + x = 14; + y += 15; + } + } +} + +void draw() { + background(0); + for (Check ch : checks) { + ch.display(); + } +} + +void mousePressed() { + for (Check ch : checks) { + ch.press(mouseX, mouseY); + } +} diff --git a/content/handbook_2e/examples/33 Interface/Ex_13/Ex_13.pde b/content/handbook_2e/examples/33 Interface/Ex_13/Ex_13.pde new file mode 100644 index 000000000..131a32f80 --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_13/Ex_13.pde @@ -0,0 +1,45 @@ +class Radio { + int x, y; // The x- and y-coordinates + int size, dotSize; // Dimension of circle, inner circle + color baseGray, dotGray; // Circle gray value, inner gray value + boolean checked = false; // True when the button is selected + int me; // ID number for this Radio object + Radio[] others; // Array of all objects in the group + + Radio(int xp, int yp, int s, color b, color d, int m, Radio[] o) { + x = xp; + y = yp; + size = s; + dotSize = size - size/3; + baseGray = b; + dotGray = d; + me = m; + others = o; + } + + // Updates the boolean value checked, returns true or false + boolean press(float mx, float my) { + if (dist(x, y, mx, my) < size/2) { + checked = true; + for (int i = 0; i < others.length; i++) { + if (i != me) { + others[i].checked = false; + } + } + return true; + } else { + return false; + } + } + + // Draws the element to the display window + void display() { + noStroke(); + fill(baseGray); + ellipse(x, y, size, size); + if (checked == true) { + fill(dotGray); + ellipse(x, y, dotSize, dotSize); + } + } +} diff --git a/content/handbook_2e/examples/33 Interface/Ex_14/Ex_14.pde b/content/handbook_2e/examples/33 Interface/Ex_14/Ex_14.pde new file mode 100644 index 000000000..43a7e3547 --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_14/Ex_14.pde @@ -0,0 +1,22 @@ +// Requires the Radio class + +Radio[] buttons = new Radio[2]; + +void setup() { + size(100, 100); + // Inputs: x, y, size, base color, fill color, + // id number, array of all radio buttons + buttons[0] = new Radio(33, 50, 30, color(255), color(0), 0, buttons); + buttons[1] = new Radio(66, 50, 30, color(255), color(0), 1, buttons); +} + +void draw() { + background(204); + buttons[0].display(); + buttons[1].display(); +} + +void mousePressed() { + buttons[0].press(mouseX, mouseY); + buttons[1].press(mouseX, mouseY); +} diff --git a/content/handbook_2e/examples/33 Interface/Ex_14/Radio.pde b/content/handbook_2e/examples/33 Interface/Ex_14/Radio.pde new file mode 100644 index 000000000..cc6794efe --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_14/Radio.pde @@ -0,0 +1,45 @@ +class Radio { + int x, y; // The x- and y-coordinates of the rect + int size, dotSize; // Dimension of circle, inner circle + color baseGray, dotGray; // Circle gray value, inner gray value + boolean checked = false; // True when the button is selected + int me; // ID number for this Radio object + Radio[] others; // Array of all other Radio objects + + Radio(int xp, int yp, int s, color b, color d, int m, Radio[] o) { + x = xp; + y = yp; + size = s; + dotSize = size - size/3; + baseGray = b; + dotGray = d; + me = m; + others = o; + } + + // Update the boolean value press, returns true or false + boolean press(float mx, float my) { + if (dist(x, y, mx, my) < size/2) { + checked = true; + for (int i = 0; i < others.length; i++) { + if (i != me) { + others[i].checked = false; + } + } + return true; + } else { + return false; + } + } + + // Draw the element to the display window + void display() { + noStroke(); + fill(baseGray); + ellipse(x, y, size, size); + if (checked == true) { + fill(dotGray); + ellipse(x, y, dotSize, dotSize); + } + } +} diff --git a/content/handbook_2e/examples/33 Interface/Ex_15/Ex_15.pde b/content/handbook_2e/examples/33 Interface/Ex_15/Ex_15.pde new file mode 100644 index 000000000..ad035acdc --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_15/Ex_15.pde @@ -0,0 +1,25 @@ +// Requires the Radio class + +int numButtons = 7; +Radio[] buttons = new Radio[numButtons]; + +void setup() { + size(100, 100); + for (int i = 0; i < buttons.length; i++) { + int x = 14 + i*12; + buttons[i] = new Radio(x, 50, 10, color(255), color(0), i, buttons); + } +} + +void draw() { + background(204); + for (Radio r : buttons) { + r.display(); + } +} + +void mousePressed() { + for (Radio r : buttons) { + r.press(mouseX, mouseY); + } +} diff --git a/content/handbook_2e/examples/33 Interface/Ex_15/Radio.pde b/content/handbook_2e/examples/33 Interface/Ex_15/Radio.pde new file mode 100644 index 000000000..cc6794efe --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_15/Radio.pde @@ -0,0 +1,45 @@ +class Radio { + int x, y; // The x- and y-coordinates of the rect + int size, dotSize; // Dimension of circle, inner circle + color baseGray, dotGray; // Circle gray value, inner gray value + boolean checked = false; // True when the button is selected + int me; // ID number for this Radio object + Radio[] others; // Array of all other Radio objects + + Radio(int xp, int yp, int s, color b, color d, int m, Radio[] o) { + x = xp; + y = yp; + size = s; + dotSize = size - size/3; + baseGray = b; + dotGray = d; + me = m; + others = o; + } + + // Update the boolean value press, returns true or false + boolean press(float mx, float my) { + if (dist(x, y, mx, my) < size/2) { + checked = true; + for (int i = 0; i < others.length; i++) { + if (i != me) { + others[i].checked = false; + } + } + return true; + } else { + return false; + } + } + + // Draw the element to the display window + void display() { + noStroke(); + fill(baseGray); + ellipse(x, y, size, size); + if (checked == true) { + fill(dotGray); + ellipse(x, y, dotSize, dotSize); + } + } +} diff --git a/content/handbook_2e/examples/33 Interface/Ex_16/Ex_16.pde b/content/handbook_2e/examples/33 Interface/Ex_16/Ex_16.pde new file mode 100644 index 000000000..081b6b4c3 --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_16/Ex_16.pde @@ -0,0 +1,76 @@ +class Scrollbar { + int x, y; // The x- and y-coordinates + float sw, sh; // Width and height of scrollbar + float pos; // Position of thumb + float posMin, posMax; // Min and max values of thumb + boolean rollover; // True when the mouse is over + boolean locked; // True when its the active scrollbar + float minVal, maxVal; // Min and max values for the thumb + + Scrollbar (int xp, int yp, int w, int h, float miv, float mav) { + x = xp; + y = yp; + sw = w; + sh = h; + minVal = miv; + maxVal = mav; + pos = x + sw/2 - sh/2; // Move thumb to middle + posMin = x; + posMax = x + sw - sh; + } + + // Update the boolean value over and the position of the thumb + void update(int mx, int my) { + if (over(mx, my) == true) { + rollover = true; + } else { + rollover = false; + } + if (locked == true) { + pos = constrain(mx-sh/2, posMin, posMax); + } + } + + // Lock the thumb so the mouse can move off and still update + void press(int mx, int my) { + if (rollover == true) { + locked = true; + } else { + locked = false; + } + } + + // Reset the scrollbar to neutral + void release() { + locked = false; + } + + // Return true if the cursor is over the scrollbar + boolean over(int mx, int my) { + if ((mx > x) && (mx < x+sw) && (my > y) && (my < y+sh)) { + return true; + } else { + return false; + } + } + + // Draw the scrollbar to the screen + void display() { + fill(255); + rect(x, y, sw, sh); // Draw bar + if ((rollover == true) || (locked == true)) { + fill(0); + } else { + fill(102); + } + rect(pos, y, sh, sh); // Draw thumb + } + + // Return the current value of the thumb + float getPos() { + float scalar = sw/(sw-sh); + float ratio = ((pos - x) * scalar) / sw; + float thumbPos = minVal + (ratio * (maxVal-minVal)); + return thumbPos; + } +} diff --git a/content/handbook_2e/examples/33 Interface/Ex_17/Ex_17.pde b/content/handbook_2e/examples/33 Interface/Ex_17/Ex_17.pde new file mode 100644 index 000000000..ecaafc409 --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_17/Ex_17.pde @@ -0,0 +1,38 @@ +// Requires Scrollbar class + +Scrollbar bar1, bar2; +PFont font; + +void setup() { + size(100, 100); + noStroke(); + // Inputs: x, y, width, height, minVal, maxVal + bar1 = new Scrollbar(10, 35, 80, 10, 0.0, 100.0); + bar2 = new Scrollbar(10, 55, 80, 10, 0.0, 1.0); + font = createFont("Courier New", 30); + textFont(font); + textAlign(CENTER); +} + +void draw() { + background(204); + fill(0); + int pos1 = int(bar1.getPos()); + text(nf(pos1, 2), 50, 30); + float pos2 = bar2.getPos(); + text(nf(pos2, 1, 2), 50, 90); + bar1.update(mouseX, mouseY); + bar2.update(mouseX, mouseY); + bar1.display(); + bar2.display(); +} + +void mousePressed() { + bar1.press(mouseX, mouseY); + bar2.press(mouseX, mouseY); +} + +void mouseReleased() { + bar1.release(); + bar2.release(); +} diff --git a/content/handbook_2e/examples/33 Interface/Ex_17/Scrollbar.pde b/content/handbook_2e/examples/33 Interface/Ex_17/Scrollbar.pde new file mode 100644 index 000000000..081b6b4c3 --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_17/Scrollbar.pde @@ -0,0 +1,76 @@ +class Scrollbar { + int x, y; // The x- and y-coordinates + float sw, sh; // Width and height of scrollbar + float pos; // Position of thumb + float posMin, posMax; // Min and max values of thumb + boolean rollover; // True when the mouse is over + boolean locked; // True when its the active scrollbar + float minVal, maxVal; // Min and max values for the thumb + + Scrollbar (int xp, int yp, int w, int h, float miv, float mav) { + x = xp; + y = yp; + sw = w; + sh = h; + minVal = miv; + maxVal = mav; + pos = x + sw/2 - sh/2; // Move thumb to middle + posMin = x; + posMax = x + sw - sh; + } + + // Update the boolean value over and the position of the thumb + void update(int mx, int my) { + if (over(mx, my) == true) { + rollover = true; + } else { + rollover = false; + } + if (locked == true) { + pos = constrain(mx-sh/2, posMin, posMax); + } + } + + // Lock the thumb so the mouse can move off and still update + void press(int mx, int my) { + if (rollover == true) { + locked = true; + } else { + locked = false; + } + } + + // Reset the scrollbar to neutral + void release() { + locked = false; + } + + // Return true if the cursor is over the scrollbar + boolean over(int mx, int my) { + if ((mx > x) && (mx < x+sw) && (my > y) && (my < y+sh)) { + return true; + } else { + return false; + } + } + + // Draw the scrollbar to the screen + void display() { + fill(255); + rect(x, y, sw, sh); // Draw bar + if ((rollover == true) || (locked == true)) { + fill(0); + } else { + fill(102); + } + rect(pos, y, sh, sh); // Draw thumb + } + + // Return the current value of the thumb + float getPos() { + float scalar = sw/(sw-sh); + float ratio = ((pos - x) * scalar) / sw; + float thumbPos = minVal + (ratio * (maxVal-minVal)); + return thumbPos; + } +} diff --git a/content/handbook_2e/examples/33 Interface/Ex_18/Ex_18.pde b/content/handbook_2e/examples/33 Interface/Ex_18/Ex_18.pde new file mode 100644 index 000000000..a5970ab17 --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_18/Ex_18.pde @@ -0,0 +1,28 @@ +// Requires Scrollbar class + +Scrollbar bar; +PImage img; + +void setup() { + size(100, 100); + noStroke(); + // Inputs: x, y, width, height, minVal, maxVal + bar = new Scrollbar(10, 45, 80, 10, -200.0, 0.0); + img = loadImage("landscape.jpg"); +} + +void draw() { + background(204); + int x = int(bar.getPos()); + image(img, x, 0); + bar.update(mouseX, mouseY); + bar.display(); +} + +void mousePressed() { + bar.press(mouseX, mouseY); +} + +void mouseReleased() { + bar.release(); +} diff --git a/content/handbook_2e/examples/33 Interface/Ex_18/Scrollbar.pde b/content/handbook_2e/examples/33 Interface/Ex_18/Scrollbar.pde new file mode 100644 index 000000000..081b6b4c3 --- /dev/null +++ b/content/handbook_2e/examples/33 Interface/Ex_18/Scrollbar.pde @@ -0,0 +1,76 @@ +class Scrollbar { + int x, y; // The x- and y-coordinates + float sw, sh; // Width and height of scrollbar + float pos; // Position of thumb + float posMin, posMax; // Min and max values of thumb + boolean rollover; // True when the mouse is over + boolean locked; // True when its the active scrollbar + float minVal, maxVal; // Min and max values for the thumb + + Scrollbar (int xp, int yp, int w, int h, float miv, float mav) { + x = xp; + y = yp; + sw = w; + sh = h; + minVal = miv; + maxVal = mav; + pos = x + sw/2 - sh/2; // Move thumb to middle + posMin = x; + posMax = x + sw - sh; + } + + // Update the boolean value over and the position of the thumb + void update(int mx, int my) { + if (over(mx, my) == true) { + rollover = true; + } else { + rollover = false; + } + if (locked == true) { + pos = constrain(mx-sh/2, posMin, posMax); + } + } + + // Lock the thumb so the mouse can move off and still update + void press(int mx, int my) { + if (rollover == true) { + locked = true; + } else { + locked = false; + } + } + + // Reset the scrollbar to neutral + void release() { + locked = false; + } + + // Return true if the cursor is over the scrollbar + boolean over(int mx, int my) { + if ((mx > x) && (mx < x+sw) && (my > y) && (my < y+sh)) { + return true; + } else { + return false; + } + } + + // Draw the scrollbar to the screen + void display() { + fill(255); + rect(x, y, sw, sh); // Draw bar + if ((rollover == true) || (locked == true)) { + fill(0); + } else { + fill(102); + } + rect(pos, y, sh, sh); // Draw thumb + } + + // Return the current value of the thumb + float getPos() { + float scalar = sw/(sw-sh); + float ratio = ((pos - x) * scalar) / sw; + float thumbPos = minVal + (ratio * (maxVal-minVal)); + return thumbPos; + } +} diff --git a/content/handbook_2e/examples/33 Interface/Ex_18/data/landscape.jpg b/content/handbook_2e/examples/33 Interface/Ex_18/data/landscape.jpg new file mode 100644 index 000000000..eb38d21a7 Binary files /dev/null and b/content/handbook_2e/examples/33 Interface/Ex_18/data/landscape.jpg differ diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_01/Ex_01.pde b/content/handbook_2e/examples/34 Image Processing/Ex_01/Ex_01.pde new file mode 100644 index 000000000..694cde0c6 --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_01/Ex_01.pde @@ -0,0 +1,5 @@ +strokeWeight(8); +line(0, 0, width, height); +line(0, height, width, 0); +PImage cross = get(); // Get the entire window +image(cross, 0, 50); // Draw the image in a new position diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_02/Ex_02.pde b/content/handbook_2e/examples/34 Image Processing/Ex_02/Ex_02.pde new file mode 100644 index 000000000..1b86578f1 --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_02/Ex_02.pde @@ -0,0 +1,7 @@ +strokeWeight(8); +line(0, 0, width, height); +line(0, height, width, 0); +noStroke(); +ellipse(18, 50, 16, 16); +PImage cross = get(); // Get the entire window +image(cross, 42, 30, 40, 40); // Resize to 40 x 40 pixels diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_03/Ex_03.pde b/content/handbook_2e/examples/34 Image Processing/Ex_03/Ex_03.pde new file mode 100644 index 000000000..2f5ff5d5a --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_03/Ex_03.pde @@ -0,0 +1,6 @@ +strokeWeight(8); +line(0, 0, width, height); +line(0, height, width, 0); +PImage slice = get(0, 0, 20, 100); // Get window section +image(slice, 18, 0); +image(slice, 50, 0); diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_04/Ex_04.pde b/content/handbook_2e/examples/34 Image Processing/Ex_04/Ex_04.pde new file mode 100644 index 000000000..2df793219 --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_04/Ex_04.pde @@ -0,0 +1,12 @@ +PImage trees, crop; + +void setup() { + size(100, 100); + trees = loadImage("topanga.jpg"); +} + +void draw() { + image(trees, 0, 0); + crop = get(); // Get the entire window + image(crop, 0, 50); // Draw the image in a new position +} diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_04/data/topanga.jpg b/content/handbook_2e/examples/34 Image Processing/Ex_04/data/topanga.jpg new file mode 100644 index 000000000..e78f93d08 Binary files /dev/null and b/content/handbook_2e/examples/34 Image Processing/Ex_04/data/topanga.jpg differ diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_05/Ex_05.pde b/content/handbook_2e/examples/34 Image Processing/Ex_05/Ex_05.pde new file mode 100644 index 000000000..703b1c499 --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_05/Ex_05.pde @@ -0,0 +1,13 @@ +PImage trees; + +void setup() { + trees = loadImage("topanga.jpg"); + noStroke(); +} + +void draw() { + image(trees, 0, 0); + color c = get(20, 30); // Get color at (20, 30) + fill(c); + rect(20, 30, 40, 40); +} diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_05/data/topanga.jpg b/content/handbook_2e/examples/34 Image Processing/Ex_05/data/topanga.jpg new file mode 100644 index 000000000..e78f93d08 Binary files /dev/null and b/content/handbook_2e/examples/34 Image Processing/Ex_05/data/topanga.jpg differ diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_06/Ex_06.pde b/content/handbook_2e/examples/34 Image Processing/Ex_06/Ex_06.pde new file mode 100644 index 000000000..79435d2bc --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_06/Ex_06.pde @@ -0,0 +1,14 @@ +PImage trees; + +void setup() { + size(100, 100); + noStroke(); + trees = loadImage("topangaCrop.jpg"); +} + +void draw() { + image(trees, 0, 0); + color c = get(mouseX, mouseY); + fill(c); + rect(50, 0, 50, 100); +} diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_06/data/topangaCrop.jpg b/content/handbook_2e/examples/34 Image Processing/Ex_06/data/topangaCrop.jpg new file mode 100644 index 000000000..4d5cba7be Binary files /dev/null and b/content/handbook_2e/examples/34 Image Processing/Ex_06/data/topangaCrop.jpg differ diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_07/Ex_07.pde b/content/handbook_2e/examples/34 Image Processing/Ex_07/Ex_07.pde new file mode 100644 index 000000000..f87ee88bc --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_07/Ex_07.pde @@ -0,0 +1,18 @@ +PImage trees; + +void setup() { + size(100, 100); + trees = loadImage("topangaCrop.jpg"); +} + +void draw() { + image(trees, 0, 0); + int y = constrain(mouseY, 0, 99); + for (int x = 0; x < 50; x++) { + color c = get(x, y); + stroke(c); + line(x+50, 0, x+50, 100); + } + stroke(255); + line(0, y, 49, y); +} diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_07/data/topangaCrop.jpg b/content/handbook_2e/examples/34 Image Processing/Ex_07/data/topangaCrop.jpg new file mode 100644 index 000000000..4d5cba7be Binary files /dev/null and b/content/handbook_2e/examples/34 Image Processing/Ex_07/data/topangaCrop.jpg differ diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_08/Ex_08.pde b/content/handbook_2e/examples/34 Image Processing/Ex_08/Ex_08.pde new file mode 100644 index 000000000..0de940fbc --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_08/Ex_08.pde @@ -0,0 +1,15 @@ +PImage trees, treesCrop; + +void setup() { + trees = loadImage("topanga.jpg"); + stroke(255); + strokeWeight(12); +} + +void draw() { + image(trees, 0, 0); + line(0, 0, width, height); + line(0, height, width, 0); + treesCrop = trees.get(20, 20, 60, 60); + image(treesCrop, 20, 20); +} diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_08/data/topanga.jpg b/content/handbook_2e/examples/34 Image Processing/Ex_08/data/topanga.jpg new file mode 100644 index 000000000..e78f93d08 Binary files /dev/null and b/content/handbook_2e/examples/34 Image Processing/Ex_08/data/topanga.jpg differ diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_09/Ex_09.pde b/content/handbook_2e/examples/34 Image Processing/Ex_09/Ex_09.pde new file mode 100644 index 000000000..d123ddb45 --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_09/Ex_09.pde @@ -0,0 +1,5 @@ +color black = color(0); +set(20, 80, black); +set(20, 81, black); +set(20, 82, black); +set(20, 83, black); diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_10/Ex_10.pde b/content/handbook_2e/examples/34 Image Processing/Ex_10/Ex_10.pde new file mode 100644 index 000000000..9b9f245ed --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_10/Ex_10.pde @@ -0,0 +1,6 @@ +for (int x = 0; x < 55; x++) { + for (int y = 0; y < 55; y++) { + color c = color((x+y) * 1.8); + set(30+x, 20+y, c); + } +} diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_11/Ex_11.pde b/content/handbook_2e/examples/34 Image Processing/Ex_11/Ex_11.pde new file mode 100644 index 000000000..136c5a833 --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_11/Ex_11.pde @@ -0,0 +1,11 @@ +PImage trees; + +void setup() { + size(100, 100); + trees = loadImage("topangaCrop.jpg"); +} + +void draw() { + int x = constrain(mouseX, 0, 50); + set(x, 0, trees); +} diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_11/data/topangaCrop.jpg b/content/handbook_2e/examples/34 Image Processing/Ex_11/data/topangaCrop.jpg new file mode 100644 index 000000000..4d5cba7be Binary files /dev/null and b/content/handbook_2e/examples/34 Image Processing/Ex_11/data/topangaCrop.jpg differ diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_12/Ex_12.pde b/content/handbook_2e/examples/34 Image Processing/Ex_12/Ex_12.pde new file mode 100644 index 000000000..1d8e907bc --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_12/Ex_12.pde @@ -0,0 +1,16 @@ +PImage trees; + +void setup() { + size(100, 100); + trees = loadImage("topangaCrop.jpg"); +} + +void draw() { + background(0); + color white = color(255); + trees.set(0, 50, white); + trees.set(1, 50, white); + trees.set(2, 50, white); + trees.set(3, 50, white); + image(trees, 20, 0); +} diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_12/data/topangaCrop.jpg b/content/handbook_2e/examples/34 Image Processing/Ex_12/data/topangaCrop.jpg new file mode 100644 index 000000000..4d5cba7be Binary files /dev/null and b/content/handbook_2e/examples/34 Image Processing/Ex_12/data/topangaCrop.jpg differ diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_13/Ex_13.pde b/content/handbook_2e/examples/34 Image Processing/Ex_13/Ex_13.pde new file mode 100644 index 000000000..1e406ad70 --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_13/Ex_13.pde @@ -0,0 +1,12 @@ +PImage img; + +void setup() { + size(100, 100); + img = loadImage("topanga.jpg"); +} + +void draw() { + background(204); + image(img, 0, 0); + copy(0, 0, 100, 50, 0, 50, 100, 50); +} diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_13/data/topanga.jpg b/content/handbook_2e/examples/34 Image Processing/Ex_13/data/topanga.jpg new file mode 100644 index 000000000..e78f93d08 Binary files /dev/null and b/content/handbook_2e/examples/34 Image Processing/Ex_13/data/topanga.jpg differ diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_14/Ex_14.pde b/content/handbook_2e/examples/34 Image Processing/Ex_14/Ex_14.pde new file mode 100644 index 000000000..c4ca2a006 --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_14/Ex_14.pde @@ -0,0 +1,14 @@ +PImage img1, img2; + +void setup() { + size(100, 100); + img1 = loadImage("topanga.jpg"); + img2 = loadImage("airport.jpg"); +} + +void draw() { + background(255); + image(img1, 0, 0); + int y = constrain(mouseY, 0, 67); + copy(img2, 0, y, 100, 33, 0, y, 100, 33); +} diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_14/data/airport.jpg b/content/handbook_2e/examples/34 Image Processing/Ex_14/data/airport.jpg new file mode 100644 index 000000000..366b3a19e Binary files /dev/null and b/content/handbook_2e/examples/34 Image Processing/Ex_14/data/airport.jpg differ diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_14/data/topanga.jpg b/content/handbook_2e/examples/34 Image Processing/Ex_14/data/topanga.jpg new file mode 100644 index 000000000..e78f93d08 Binary files /dev/null and b/content/handbook_2e/examples/34 Image Processing/Ex_14/data/topanga.jpg differ diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_15/Ex_15.pde b/content/handbook_2e/examples/34 Image Processing/Ex_15/Ex_15.pde new file mode 100644 index 000000000..668bdf571 --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_15/Ex_15.pde @@ -0,0 +1,11 @@ +PImage img; + +void setup() { + size(100, 100); + img = loadImage("airport.jpg"); +} + +void draw() { + img.copy(50, 0, 50, 100, 0, 0, 50, 100); + image(img, 0, 0); +} diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_15/data/airport.jpg b/content/handbook_2e/examples/34 Image Processing/Ex_15/data/airport.jpg new file mode 100644 index 000000000..ed42951c3 Binary files /dev/null and b/content/handbook_2e/examples/34 Image Processing/Ex_15/data/airport.jpg differ diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_16/Ex_16.pde b/content/handbook_2e/examples/34 Image Processing/Ex_16/Ex_16.pde new file mode 100644 index 000000000..ab74e2d80 --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_16/Ex_16.pde @@ -0,0 +1,10 @@ +color c1 = color(0, 126, 255); // Create a new color +float r = red(c1); // Assign 0.0 to r +float g = green(c1); // Assign 126.0 to g +float b = blue(c1); // Assign 255.0 to b +println(r, g, b); // Prints "0.0 126.0 255.0" +color c2 = color(102); // Create a new gray value +float r2 = red(c2); // Assign 102.0 to r2 +float g2 = green(c2); // Assign 102.0 to g2 +float b2 = blue(c2); // Assign 102.0 to b2 +println(r2, g2, b2); // Prints "102.0 102.0 102.0" diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_17/Ex_17.pde b/content/handbook_2e/examples/34 Image Processing/Ex_17/Ex_17.pde new file mode 100644 index 000000000..1f7c150f7 --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_17/Ex_17.pde @@ -0,0 +1,5 @@ +color c = color(0, 51, 102); // Create a new color +color g = color(0, 126, 255, 220); // Create a new color +float a = alpha(c); // Assign 255.0 to a +float b = alpha(g); // Assign 220.0 to b +println(a, b); // Prints "255.0 220.0" diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_18/Ex_18.pde b/content/handbook_2e/examples/34 Image Processing/Ex_18/Ex_18.pde new file mode 100644 index 000000000..720c28f5a --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_18/Ex_18.pde @@ -0,0 +1,6 @@ +colorMode(HSB, 360, 100, 100); // Set color mode to HSB +color c = color(210, 100, 40); // Create a new color +float h = hue(c); // Assign 210.0 to h +float s = saturation(c); // Assign 100.0 to s +float b = brightness(c); // Assign 40.0 to b +println(h, s, b); // Prints "210.0 100.0 40.0" diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_19/Ex_19.pde b/content/handbook_2e/examples/34 Image Processing/Ex_19/Ex_19.pde new file mode 100644 index 000000000..935cfde0e --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_19/Ex_19.pde @@ -0,0 +1,4 @@ +color c = color(217, 41, 117); // Create a new color +float r = red(c); // Assign 217.0 to r +float h = hue(c); // Assign 236.64774 to h +println(r, h); // Prints "217.0 236.64774" diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_20/Ex_20.pde b/content/handbook_2e/examples/34 Image Processing/Ex_20/Ex_20.pde new file mode 100644 index 000000000..e8bc03673 --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_20/Ex_20.pde @@ -0,0 +1,5 @@ +colorMode(RGB, 1.0); // Sets color mode to RGB +color c = color(0.2, 0.8, 1.0); // Creates a new color +float r = red(c); // Assign 0.2 to r +float h = hue(c); // Assign 0.5416667 to h +println(r, h); // Prints "0.2 0.5416667" diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_21/Ex_21.pde b/content/handbook_2e/examples/34 Image Processing/Ex_21/Ex_21.pde new file mode 100644 index 000000000..7dec36ed4 --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_21/Ex_21.pde @@ -0,0 +1,4 @@ +color c = color(118, 22, 24); // Create a new color +int r1 = red(c); // ERROR! red() returns a float +float r2 = red(c); // Assign 118.0 to r2 +int r3 = int(red(c)); // Assign 118 to r3 diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_22/Ex_22.pde b/content/handbook_2e/examples/34 Image Processing/Ex_22/Ex_22.pde new file mode 100644 index 000000000..2ee85a587 --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_22/Ex_22.pde @@ -0,0 +1,15 @@ +void setup() { + size(100, 100); + fill(204, 0, 0); +} + +void draw() { + background(0); + noStroke(); + ellipse(66, 46, 80, 80); + color c = get(mouseX, mouseY); + float r = red(c); // Extract red component + stroke(255-r); // Set the stroke based on red value + line(mouseX, 0, mouseX, height); + line(0, mouseY, width, mouseY); +} diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_23/Ex_23.pde b/content/handbook_2e/examples/34 Image Processing/Ex_23/Ex_23.pde new file mode 100644 index 000000000..720a615ae --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_23/Ex_23.pde @@ -0,0 +1,22 @@ +PImage img; + +void setup() { + size(100, 100); + img = loadImage("sample.png"); + stroke(255); +} + +void draw() { + image(img, 0, 0); + color c = get(mouseX, mouseY); + float r = red(c); // Extract red + float g = green(c); // Extract green + float b = blue(c); // Extract blue + fill(r, 0, 0); + rect(32, 20, 12, 60); // Red component + fill(0, g, 0); + rect(44, 20, 12, 60); // Green component + fill(0, 0, b); + rect(56, 20, 12, 60); // Blue component +} + diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_23/data/sample.png b/content/handbook_2e/examples/34 Image Processing/Ex_23/data/sample.png new file mode 100644 index 000000000..a21b1a077 Binary files /dev/null and b/content/handbook_2e/examples/34 Image Processing/Ex_23/data/sample.png differ diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_24/Ex_24.pde b/content/handbook_2e/examples/34 Image Processing/Ex_24/Ex_24.pde new file mode 100644 index 000000000..da6eb44e8 --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_24/Ex_24.pde @@ -0,0 +1,30 @@ +int num = 600; +float[] x = new float[num]; +float[] y = new float[num]; +PImage img; + +void setup() { + size(100, 100); + img = loadImage("figure.jpg"); + for (int i = 0; i < num; i++) { + x[i] = random(width); + y[i] = random(height); + } + stroke(255); + noSmooth(); +} + +void draw() { + background(0); + for (int i = 0; i < num; i++) { + color c = img.get(int(x[i]), int(y[i])); + float b = brightness(c) / 255.0; + float speed = pow(b, 2) + 0.05; + x[i] += speed; + if (x[i] > width) { + x[i] = 0; + y[i] = random(height); + } + point(x[i], y[i]); + } +} diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_24/data/figure.jpg b/content/handbook_2e/examples/34 Image Processing/Ex_24/data/figure.jpg new file mode 100644 index 000000000..997464157 Binary files /dev/null and b/content/handbook_2e/examples/34 Image Processing/Ex_24/data/figure.jpg differ diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_25/Ex_25.pde b/content/handbook_2e/examples/34 Image Processing/Ex_25/Ex_25.pde new file mode 100644 index 000000000..0618130e6 --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_25/Ex_25.pde @@ -0,0 +1,11 @@ +void setup() { + size(100, 100); +} + +void draw() { + float gray = map(second(), 0, 59, 0, 255); + int index = frameCount % (width*height); + loadPixels(); + pixels[index] = color(gray); + updatePixels(); +} diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_26/Ex_26.pde b/content/handbook_2e/examples/34 Image Processing/Ex_26/Ex_26.pde new file mode 100644 index 000000000..f25a3b705 --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_26/Ex_26.pde @@ -0,0 +1,4 @@ +// These 3 lines of code are equivalent to: set(25, 50, color(0)) +loadPixels(); +pixels[50*width + 25] = color(0); +updatePixels(); diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_27/Ex_27.pde b/content/handbook_2e/examples/34 Image Processing/Ex_27/Ex_27.pde new file mode 100644 index 000000000..1b416851b --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_27/Ex_27.pde @@ -0,0 +1,4 @@ +// These 3 lines are equivalent to: pixels[5075] = color(0) +int y = 5075 / width; +int x = 5075 % width; +set(x, y, color(0)); diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_28/Ex_28.pde b/content/handbook_2e/examples/34 Image Processing/Ex_28/Ex_28.pde new file mode 100644 index 000000000..5e42995cd --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_28/Ex_28.pde @@ -0,0 +1,12 @@ +void setup() { + size(100, 100); +} + +void draw() { + // Constrain to not exceed the boundary of the array + int x = constrain(mouseX, 0, 99); + int y = constrain(mouseY, 0, 99); + loadPixels(); + pixels[y*width + x] = color(0); + updatePixels(); +} diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_29/Ex_29.pde b/content/handbook_2e/examples/34 Image Processing/Ex_29/Ex_29.pde new file mode 100644 index 000000000..c41045439 --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_29/Ex_29.pde @@ -0,0 +1,18 @@ +PImage arch; + +void setup() { + size(100, 100); + noStroke(); + arch = loadImage("arch.jpg"); +} + +void draw() { + image(arch, 0, 0); + // Constrain to not exceed the boundary of the array + int x = constrain(mouseX, 0, 99); + int y = constrain(mouseY, 0, 99); + loadPixels(); + color c = pixels[y*width + x]; + fill(c); + rect(20, 20, 60, 60); +} diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_29/data/arch.jpg b/content/handbook_2e/examples/34 Image Processing/Ex_29/data/arch.jpg new file mode 100644 index 000000000..162531753 Binary files /dev/null and b/content/handbook_2e/examples/34 Image Processing/Ex_29/data/arch.jpg differ diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_30/Ex_30.pde b/content/handbook_2e/examples/34 Image Processing/Ex_30/Ex_30.pde new file mode 100644 index 000000000..20eb1e570 --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_30/Ex_30.pde @@ -0,0 +1,16 @@ +PImage arch; + +void setup() { + size(100, 100); + arch = loadImage("arch.jpg"); +} + +void draw() { + image(arch, 0, 0); + int x = constrain(mouseX, 0, 99); + int y = constrain(mouseY, 0, 99); + arch.loadPixels(); + arch.pixels[y*width + x] = color(0); + arch.updatePixels(); + image(arch, 50, 0); +} diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_30/data/arch.jpg b/content/handbook_2e/examples/34 Image Processing/Ex_30/data/arch.jpg new file mode 100644 index 000000000..162531753 Binary files /dev/null and b/content/handbook_2e/examples/34 Image Processing/Ex_30/data/arch.jpg differ diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_31/Ex_31.pde b/content/handbook_2e/examples/34 Image Processing/Ex_31/Ex_31.pde new file mode 100644 index 000000000..52287d361 --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_31/Ex_31.pde @@ -0,0 +1,9 @@ +PImage arch = loadImage("arch.jpg"); +size(arch.width, arch.height); +int count = width * height; +arch.loadPixels(); +loadPixels(); +for (int i = 0; i < count; i += 2) { + pixels[i] = arch.pixels[i]; +} +updatePixels(); diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_31/data/arch.jpg b/content/handbook_2e/examples/34 Image Processing/Ex_31/data/arch.jpg new file mode 100644 index 000000000..162531753 Binary files /dev/null and b/content/handbook_2e/examples/34 Image Processing/Ex_31/data/arch.jpg differ diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_32/Ex_32.pde b/content/handbook_2e/examples/34 Image Processing/Ex_32/Ex_32.pde new file mode 100644 index 000000000..e142d86bf --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_32/Ex_32.pde @@ -0,0 +1,9 @@ +PImage arch = loadImage("arch.jpg"); +size(arch.width, arch.height); +int count = width * height; +arch.loadPixels(); +loadPixels(); +for (int i = 0; i < count; i += 3) { + pixels[i] = arch.pixels[i]; +} +updatePixels(); diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_32/data/arch.jpg b/content/handbook_2e/examples/34 Image Processing/Ex_32/data/arch.jpg new file mode 100644 index 000000000..162531753 Binary files /dev/null and b/content/handbook_2e/examples/34 Image Processing/Ex_32/data/arch.jpg differ diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_33/Ex_33.pde b/content/handbook_2e/examples/34 Image Processing/Ex_33/Ex_33.pde new file mode 100644 index 000000000..68009914c --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_33/Ex_33.pde @@ -0,0 +1,9 @@ +PImage arch = loadImage("arch.jpg"); +size(arch.width, arch.height); +int count = width * height; +arch.loadPixels(); +loadPixels(); +for (int i = 0; i < count; i++) { + pixels[i] = arch.pixels[count - i - 1]; +} +updatePixels(); diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_33/data/arch.jpg b/content/handbook_2e/examples/34 Image Processing/Ex_33/data/arch.jpg new file mode 100644 index 000000000..162531753 Binary files /dev/null and b/content/handbook_2e/examples/34 Image Processing/Ex_33/data/arch.jpg differ diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_34/Ex_34.pde b/content/handbook_2e/examples/34 Image Processing/Ex_34/Ex_34.pde new file mode 100644 index 000000000..5ca6e8e14 --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_34/Ex_34.pde @@ -0,0 +1,9 @@ +PImage arch = loadImage("arch.jpg"); +size(arch.width, arch.height); +int count = width * height; +arch.loadPixels(); +loadPixels(); +for (int i = 0; i < count; i++) { + pixels[i] = arch.pixels[i/2]; +} +updatePixels(); diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_34/data/arch.jpg b/content/handbook_2e/examples/34 Image Processing/Ex_34/data/arch.jpg new file mode 100644 index 000000000..162531753 Binary files /dev/null and b/content/handbook_2e/examples/34 Image Processing/Ex_34/data/arch.jpg differ diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_35/Ex_35.pde b/content/handbook_2e/examples/34 Image Processing/Ex_35/Ex_35.pde new file mode 100644 index 000000000..fd4a6137c --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_35/Ex_35.pde @@ -0,0 +1,11 @@ +PImage arch = loadImage("arch.jpg"); +image(arch, 0, 0); +loadPixels(); +for (int i = 0; i < width*height; i++) { + color p = pixels[i]; // Grab pixel + float r = 255 - red(p); // Modify red value + float g = 255 - green(p); // Modify green value + float b = 255 - blue(p); // Modify blue value + pixels[i] = color(r, g, b); // Assign modified value +} +updatePixels(); diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_35/data/arch.jpg b/content/handbook_2e/examples/34 Image Processing/Ex_35/data/arch.jpg new file mode 100644 index 000000000..162531753 Binary files /dev/null and b/content/handbook_2e/examples/34 Image Processing/Ex_35/data/arch.jpg differ diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_36/Ex_36.pde b/content/handbook_2e/examples/34 Image Processing/Ex_36/Ex_36.pde new file mode 100644 index 000000000..f88cb7665 --- /dev/null +++ b/content/handbook_2e/examples/34 Image Processing/Ex_36/Ex_36.pde @@ -0,0 +1,22 @@ +PImage arch; + +void setup() { + size(100, 100); + arch = loadImage("arch.jpg"); +} + +void draw() { + image(arch, 0, 0); + loadPixels(); + for (int i = 0; i < width*height; i++) { + color p = pixels[i]; // Read color from screen + float r = red(p); + float g = green(p); + float b = blue(p); + float bw = (r + g + b) / 3.0; + bw = constrain(bw + mouseX, 0, 255); + pixels[i] = color(bw); // Assign modified value + } + updatePixels(); + line(mouseX, 0, mouseX, height); +} diff --git a/content/handbook_2e/examples/34 Image Processing/Ex_36/data/arch.jpg b/content/handbook_2e/examples/34 Image Processing/Ex_36/data/arch.jpg new file mode 100644 index 000000000..162531753 Binary files /dev/null and b/content/handbook_2e/examples/34 Image Processing/Ex_36/data/arch.jpg differ diff --git a/content/handbook_2e/examples/35 Render Techniques/Ex_01/Ex_01.pde b/content/handbook_2e/examples/35 Render Techniques/Ex_01/Ex_01.pde new file mode 100644 index 000000000..fce190a1d --- /dev/null +++ b/content/handbook_2e/examples/35 Render Techniques/Ex_01/Ex_01.pde @@ -0,0 +1,2 @@ +background(0); +ellipse(50, 50, 75, 75); diff --git a/content/handbook_2e/examples/35 Render Techniques/Ex_02/Ex_02.pde b/content/handbook_2e/examples/35 Render Techniques/Ex_02/Ex_02.pde new file mode 100644 index 000000000..8b441eb1d --- /dev/null +++ b/content/handbook_2e/examples/35 Render Techniques/Ex_02/Ex_02.pde @@ -0,0 +1,6 @@ +PGraphics circle = createGraphics(100, 100); +circle.beginDraw(); +circle.background(0); +circle.ellipse(50, 50, 75, 75); +circle.endDraw(); +image(circle, 0, 0); diff --git a/content/handbook_2e/examples/35 Render Techniques/Ex_03/Ex_03.pde b/content/handbook_2e/examples/35 Render Techniques/Ex_03/Ex_03.pde new file mode 100644 index 000000000..a2a2ee64f --- /dev/null +++ b/content/handbook_2e/examples/35 Render Techniques/Ex_03/Ex_03.pde @@ -0,0 +1,14 @@ +PGraphics circle; + +void setup() { + size(100, 100); + circle = createGraphics(100, 100); +} + +void draw() { + circle.beginDraw(); + circle.background(0); + circle.ellipse(50, 50, 75, 75); + circle.endDraw(); + image(circle, 0, 0); +} diff --git a/content/handbook_2e/examples/35 Render Techniques/Ex_04/Ex_04.pde b/content/handbook_2e/examples/35 Render Techniques/Ex_04/Ex_04.pde new file mode 100644 index 000000000..5c68bcda7 --- /dev/null +++ b/content/handbook_2e/examples/35 Render Techniques/Ex_04/Ex_04.pde @@ -0,0 +1,17 @@ +void setup() { + size(100, 100); + background(0); + noCursor(); +} + +void draw() { + stroke(255); + line(mouseX, 0, mouseX, height); + line(0, mouseY, width, mouseY); +} + +void mousePressed() { + noStroke(); + fill(255, 100); + ellipse(mouseX, mouseY, 40, 40); +} diff --git a/content/handbook_2e/examples/35 Render Techniques/Ex_05/Ex_05.pde b/content/handbook_2e/examples/35 Render Techniques/Ex_05/Ex_05.pde new file mode 100644 index 000000000..af2d210bb --- /dev/null +++ b/content/handbook_2e/examples/35 Render Techniques/Ex_05/Ex_05.pde @@ -0,0 +1,25 @@ +PGraphics circles; + +void setup() { + size(100, 100); + circles = createGraphics(width, height); + circles.beginDraw(); + circles.background(0); + circles.noStroke(); + circles.fill(255, 100); + circles.endDraw(); + noCursor(); +} + +void draw() { + image(circles, 0, 0); + stroke(255); + line(mouseX, 0, mouseX, height); + line(0, mouseY, width, mouseY); +} + +void mousePressed() { + circles.beginDraw(); + circles.ellipse(mouseX, mouseY, 40, 40); + circles.endDraw(); +} diff --git a/content/handbook_2e/examples/35 Render Techniques/Ex_06/Ex_06.pde b/content/handbook_2e/examples/35 Render Techniques/Ex_06/Ex_06.pde new file mode 100644 index 000000000..b3204bd0f --- /dev/null +++ b/content/handbook_2e/examples/35 Render Techniques/Ex_06/Ex_06.pde @@ -0,0 +1,28 @@ +PGraphics tile; + +void setup() { + size(600, 100); + tile = createGraphics(50, 50); + background(0); +} + +void draw() { + runTile(); + for (int y = 0; y < height; y += tile.height) { + for (int x = 0; x < width; x += tile.width) { + image(tile, x, y); + } + } +} + +void runTile() { + float x = random(20, tile.width-20); + float y = random(20, tile.height-20); + tile.beginDraw(); + tile.noStroke(); + tile.fill(0, 20); + tile.rect(0, 0, tile.width, tile.height); + tile.fill(255); + tile.ellipse(x, y, 10, 10); + tile.endDraw(); +} diff --git a/content/handbook_2e/examples/35 Render Techniques/Ex_07/Ex_07.pde b/content/handbook_2e/examples/35 Render Techniques/Ex_07/Ex_07.pde new file mode 100644 index 000000000..dd713672b --- /dev/null +++ b/content/handbook_2e/examples/35 Render Techniques/Ex_07/Ex_07.pde @@ -0,0 +1,24 @@ +PGraphics cube; + +void setup() { + size(100, 100, P3D); + cube = createGraphics(width, height, P3D); +} + +void draw() { + background(0); + drawCube(); + image(cube, 0, 0); +} + +void drawCube() { + cube.beginDraw(); + cube.lights(); + cube.background(0); + cube.noStroke(); + cube.translate(width/2, height/2); + cube.rotateX(frameCount/100.0); + cube.rotateY(frameCount/200.0); + cube.box(40); + cube.endDraw(); +} diff --git a/content/handbook_2e/examples/35 Render Techniques/Ex_08/Ex_08.pde b/content/handbook_2e/examples/35 Render Techniques/Ex_08/Ex_08.pde new file mode 100644 index 000000000..784f3e13c --- /dev/null +++ b/content/handbook_2e/examples/35 Render Techniques/Ex_08/Ex_08.pde @@ -0,0 +1,13 @@ +PGraphics cube; + +void setup() { + size(100, 100); + cube = createGraphics(width, height, P3D); // Error +} + +void draw() { + cube.beginDraw(); + cube.box(40); + cube.endDraw(); + image(cube, 0, 0); +} diff --git a/content/handbook_2e/examples/35 Render Techniques/Ex_09/Ex_09.pde b/content/handbook_2e/examples/35 Render Techniques/Ex_09/Ex_09.pde new file mode 100644 index 000000000..ef8261e06 --- /dev/null +++ b/content/handbook_2e/examples/35 Render Techniques/Ex_09/Ex_09.pde @@ -0,0 +1,44 @@ +PGraphics cubeA; +PGraphics cubeB; + +void setup() { + size(200, 200, P3D); + cubeA = createGraphics(width, height, P3D); + cubeB = createGraphics(width, height, P3D); +} + +void draw() { + background(0); + drawCubeA(); + drawCubeB(); + float alphaA = map(mouseX, 0, width, 0, 255); + float alphaB = map(mouseY, 0, height, 0, 255); + tint(255, alphaA); + image(cubeA, 0, 0); + tint(255, alphaB); + image(cubeB, 0, 0); +} + +void drawCubeA() { + cubeA.beginDraw(); + cubeA.lights(); + cubeA.clear(); + cubeA.noStroke(); + cubeA.translate(width/2, height/2); + cubeA.rotateX(frameCount/100.0); + cubeA.rotateY(frameCount/200.0); + cubeA.box(80); + cubeA.endDraw(); +} + +void drawCubeB() { + cubeB.beginDraw(); + cubeB.lights(); + cubeB.clear(); + cubeB.noStroke(); + cubeB.translate(width/2, height/2); + cubeB.rotateX(frameCount/150.0); + cubeB.rotateY(frameCount/250.0); + cubeB.box(80); + cubeB.endDraw(); +} diff --git a/content/handbook_2e/examples/35 Render Techniques/Ex_10/Ex_10.pde b/content/handbook_2e/examples/35 Render Techniques/Ex_10/Ex_10.pde new file mode 100644 index 000000000..256741e17 --- /dev/null +++ b/content/handbook_2e/examples/35 Render Techniques/Ex_10/Ex_10.pde @@ -0,0 +1,32 @@ +PGraphics cubeA; +PGraphics cubeB; + +void setup() { + size(200, 200, P3D); + cubeA = createGraphics(width, height, P3D); + cubeB = createGraphics(width, height, P3D); +} + +void draw() { + background(0); + drawCube(cubeA, 100, 200); + drawCube(cubeB, 150, 250); + float alphaA = map(mouseX, 0, width, 0, 255); + float alphaB = map(mouseY, 0, height, 0, 255); + tint(255, alphaA); + image(cubeA, 0, 0); + tint(255, alphaB); + image(cubeB, 0, 0); +} + +void drawCube(PGraphics cube, float xd, float yd) { + cube.beginDraw(); + cube.lights(); + cube.clear(); + cube.noStroke(); + cube.translate(cube.width/2, cube.height/2); + cube.rotateX(frameCount/xd); + cube.rotateY(frameCount/yd); + cube.box(80); + cube.endDraw(); +} diff --git a/content/handbook_2e/examples/35 Render Techniques/Ex_11/Ex_11.pde b/content/handbook_2e/examples/35 Render Techniques/Ex_11/Ex_11.pde new file mode 100644 index 000000000..53fdb37de --- /dev/null +++ b/content/handbook_2e/examples/35 Render Techniques/Ex_11/Ex_11.pde @@ -0,0 +1,29 @@ +PGraphics cubeA; +PGraphics cubeB; + +void setup() { + size(200, 200, P3D); + cubeA = createGraphics(width, height, P3D); + cubeB = createGraphics(width, height, P3D); + blendMode(DARKEST); +} + +void draw() { + background(255); + drawCube(cubeA, 100, 200); + drawCube(cubeB, 150, 250); + image(cubeA, 0, 0); + image(cubeB, 0, 0); +} + +void drawCube(PGraphics cube, float xd, float yd) { + cube.beginDraw(); + cube.lights(); + cube.clear(); + cube.noStroke(); + cube.translate(cube.width/2, cube.height/2); + cube.rotateX(frameCount/xd); + cube.rotateY(frameCount/yd); + cube.box(80); + cube.endDraw(); +} diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_01_Collage_1/Ex_01_Collage_1.pde b/content/handbook_2e/examples/36 Synthesis 4/Ex_01_Collage_1/Ex_01_Collage_1.pde new file mode 100644 index 000000000..35c5f2164 --- /dev/null +++ b/content/handbook_2e/examples/36 Synthesis 4/Ex_01_Collage_1/Ex_01_Collage_1.pde @@ -0,0 +1,21 @@ +PImage img; + +void setup() { + size(400, 400); + img = loadImage("nyt_13.jpg"); + noLoop(); +} + +void draw() { + float x = random(width); + float y = random(height); + float a = random(0, TWO_PI); + background(0); + translate(x, y); + rotate(a); + image(img, -img.width/2, -img.height/2); +} + +void mousePressed() { + redraw(); +} diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_01_Collage_1/data/nyt_13.jpg b/content/handbook_2e/examples/36 Synthesis 4/Ex_01_Collage_1/data/nyt_13.jpg new file mode 100644 index 000000000..67308080a Binary files /dev/null and b/content/handbook_2e/examples/36 Synthesis 4/Ex_01_Collage_1/data/nyt_13.jpg differ diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/Element.pde b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/Element.pde new file mode 100644 index 000000000..80e34ddfe --- /dev/null +++ b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/Element.pde @@ -0,0 +1,19 @@ +class Element { + float x, y, a; + PImage img; + + Element(String imageName) { + img = loadImage(imageName); + } + + void display() { + x = random(width); + y = random(height); + a = random(0, TWO_PI); + pushMatrix(); + translate(x, y); + rotate(a); + image(img, -img.width/2, -img.height/2); + popMatrix(); + } +} diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/Ex_02_Collage_2.pde b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/Ex_02_Collage_2.pde new file mode 100644 index 000000000..1bf42410c --- /dev/null +++ b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/Ex_02_Collage_2.pde @@ -0,0 +1,22 @@ +Element[] elements = new Element[29]; + +void setup() { + size(1200, 600); + for (int i = 0; i < elements.length; i++) { + String imageName = "nyt_" + nf(i+1, 2) + ".jpg"; + elements[i] = new Element(imageName); + } + noLoop(); +} + +void draw() { + background(0); + for (int i = 0; i < elements.length; i++) { + elements[i].display(); + } +} + +void mousePressed() { + redraw(); +} + diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_01.jpg b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_01.jpg new file mode 100644 index 000000000..2a3d5d626 Binary files /dev/null and b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_01.jpg differ diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_02.jpg b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_02.jpg new file mode 100644 index 000000000..6a6310f01 Binary files /dev/null and b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_02.jpg differ diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_03.jpg b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_03.jpg new file mode 100644 index 000000000..693b5f716 Binary files /dev/null and b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_03.jpg differ diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_04.jpg b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_04.jpg new file mode 100644 index 000000000..d8dedaf98 Binary files /dev/null and b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_04.jpg differ diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_05.jpg b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_05.jpg new file mode 100644 index 000000000..3ace213e4 Binary files /dev/null and b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_05.jpg differ diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_06.jpg b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_06.jpg new file mode 100644 index 000000000..a795a03c0 Binary files /dev/null and b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_06.jpg differ diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_07.jpg b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_07.jpg new file mode 100644 index 000000000..4b5d8360e Binary files /dev/null and b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_07.jpg differ diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_08.jpg b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_08.jpg new file mode 100644 index 000000000..be468cfa0 Binary files /dev/null and b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_08.jpg differ diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_09.jpg b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_09.jpg new file mode 100644 index 000000000..61d1e7988 Binary files /dev/null and b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_09.jpg differ diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_10.jpg b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_10.jpg new file mode 100644 index 000000000..9cc31a1a3 Binary files /dev/null and b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_10.jpg differ diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_11.jpg b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_11.jpg new file mode 100644 index 000000000..990b91934 Binary files /dev/null and b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_11.jpg differ diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_12.jpg b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_12.jpg new file mode 100644 index 000000000..684e3e9fa Binary files /dev/null and b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_12.jpg differ diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_13.jpg b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_13.jpg new file mode 100644 index 000000000..67308080a Binary files /dev/null and b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_13.jpg differ diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_14.jpg b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_14.jpg new file mode 100644 index 000000000..276d4bfd8 Binary files /dev/null and b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_14.jpg differ diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_15.jpg b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_15.jpg new file mode 100644 index 000000000..1ba35b2a3 Binary files /dev/null and b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_15.jpg differ diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_16.jpg b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_16.jpg new file mode 100644 index 000000000..431306bfd Binary files /dev/null and b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_16.jpg differ diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_17.jpg b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_17.jpg new file mode 100644 index 000000000..5fdff4e51 Binary files /dev/null and b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_17.jpg differ diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_18.jpg b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_18.jpg new file mode 100644 index 000000000..67ee70a81 Binary files /dev/null and b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_18.jpg differ diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_19.jpg b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_19.jpg new file mode 100644 index 000000000..779ce05be Binary files /dev/null and b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_19.jpg differ diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_20.jpg b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_20.jpg new file mode 100644 index 000000000..beebb8559 Binary files /dev/null and b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_20.jpg differ diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_21.jpg b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_21.jpg new file mode 100644 index 000000000..33abdf59d Binary files /dev/null and b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_21.jpg differ diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_22.jpg b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_22.jpg new file mode 100644 index 000000000..1d0d208b0 Binary files /dev/null and b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_22.jpg differ diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_23.jpg b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_23.jpg new file mode 100644 index 000000000..30872adcc Binary files /dev/null and b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_23.jpg differ diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_24.jpg b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_24.jpg new file mode 100644 index 000000000..e8df53c0f Binary files /dev/null and b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_24.jpg differ diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_25.jpg b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_25.jpg new file mode 100644 index 000000000..6048489d6 Binary files /dev/null and b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_25.jpg differ diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_26.jpg b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_26.jpg new file mode 100644 index 000000000..8bf138417 Binary files /dev/null and b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_26.jpg differ diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_27.jpg b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_27.jpg new file mode 100644 index 000000000..48e8a42c8 Binary files /dev/null and b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_27.jpg differ diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_28.jpg b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_28.jpg new file mode 100644 index 000000000..6a408b1e2 Binary files /dev/null and b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_28.jpg differ diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_29.jpg b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_29.jpg new file mode 100644 index 000000000..f4f7394f1 Binary files /dev/null and b/content/handbook_2e/examples/36 Synthesis 4/Ex_02_Collage_2/data/nyt_29.jpg differ diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_03_Waves_1/Ex_03_Waves_1.pde b/content/handbook_2e/examples/36 Synthesis 4/Ex_03_Waves_1/Ex_03_Waves_1.pde new file mode 100644 index 000000000..cbb62e457 --- /dev/null +++ b/content/handbook_2e/examples/36 Synthesis 4/Ex_03_Waves_1/Ex_03_Waves_1.pde @@ -0,0 +1,24 @@ +float curveWidth = 30.0; +float curveThickness = 50.0; + +void setup() { + size(200, 600); + noFill(); + stroke(0); +} + +void draw() { + background(255); + + float angleIncrement = map(mouseY, 0, height, 0.0, 0.1); + float angle = 0.0; + + beginShape(QUAD_STRIP); + for (int y = 0; y <= height; y += 10) { + float x = width/2 + (sin(angle)* curveWidth); + vertex(x, y); + vertex(x + curveThickness, y); + angle += angleIncrement; + } + endShape(); +} diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_04_Waves_2/Ex_04_Waves_2.pde b/content/handbook_2e/examples/36 Synthesis 4/Ex_04_Waves_2/Ex_04_Waves_2.pde new file mode 100644 index 000000000..07e0fc9e7 --- /dev/null +++ b/content/handbook_2e/examples/36 Synthesis 4/Ex_04_Waves_2/Ex_04_Waves_2.pde @@ -0,0 +1,28 @@ +float curveWidth = 30.0; +float curveThickness = 50.0; +float angleOffset = 0.9; + +void setup() { + size(200, 600); + noFill(); + stroke(0); +} + +void draw() { + background(255); + + float angleIncrement = map(mouseY, 0, height, 0.0, 0.1); + float angleA = 0.0; + float angleB = angleA + angleOffset; + + beginShape(QUAD_STRIP); + for (int y = 0; y <= height; y += 10) { + float x1 = width/2 + (sin(angleA)* curveWidth); + float x2 = width/2 + (sin(angleB)* curveWidth); + vertex(x1, y); + vertex(x2 + curveThickness, y); + angleA += angleIncrement; + angleB = angleA + angleOffset; + } + endShape(); +} diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_05_Waves_3/Ex_05_Waves_3.pde b/content/handbook_2e/examples/36 Synthesis 4/Ex_05_Waves_3/Ex_05_Waves_3.pde new file mode 100644 index 000000000..3e4afb9e0 --- /dev/null +++ b/content/handbook_2e/examples/36 Synthesis 4/Ex_05_Waves_3/Ex_05_Waves_3.pde @@ -0,0 +1,31 @@ +float curveWidth = 10.0; +float curveThickness = 10.0; +float angleOffset = 0.9; + +void setup() { + size(1200, 600); +} + +void draw() { + background(255); + + float angleIncrement = map(mouseY, 0, height, 0.0, 0.2); + float angleA = 0.0; + float angleB = angleA + angleOffset; + + for (int mx = 0; mx < width; mx += curveWidth*3) { + float gray = map(mx, 0, width, 0, 255); + noStroke(); + fill(gray); + beginShape(QUAD_STRIP); + for (int y = 0; y <= height; y += 10) { + float x1 = mx + (sin(angleA)* curveWidth); + float x2 = mx + (sin(angleB)* curveWidth); + vertex(x1, y); + vertex(x2 + curveThickness, y); + angleA += angleIncrement; + angleB = angleA + angleOffset; + } + endShape(); + } +} diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_06_3D_Letter_1/Ex_06_3D_Letter_1.pde b/content/handbook_2e/examples/36 Synthesis 4/Ex_06_3D_Letter_1/Ex_06_3D_Letter_1.pde new file mode 100644 index 000000000..216eb1c1b --- /dev/null +++ b/content/handbook_2e/examples/36 Synthesis 4/Ex_06_3D_Letter_1/Ex_06_3D_Letter_1.pde @@ -0,0 +1,23 @@ +PShape k; + +void setup() { + size(600, 600); + k = loadShape("K.svg"); // Load the file + k = k.getChild("Path"); // Get the path data +} + +void draw() { + background(204); + strokeWeight(2); + noFill(); + translate(width/2, height/2); + scale(1.5); + beginShape(); + for (int i = 0; i < k.getVertexCount(); i++) { + int offset = 200; + float x = k.getVertexX(i)-offset; + float y = k.getVertexY(i)-offset; + vertex(x, y); + } + endShape(); +} diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_06_3D_Letter_1/data/K.svg b/content/handbook_2e/examples/36 Synthesis 4/Ex_06_3D_Letter_1/data/K.svg new file mode 100644 index 000000000..28deeb9f8 --- /dev/null +++ b/content/handbook_2e/examples/36 Synthesis 4/Ex_06_3D_Letter_1/data/K.svg @@ -0,0 +1,8 @@ + + + + + + diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_07_3D_Letter_2/Ex_07_3D_Letter_2.pde b/content/handbook_2e/examples/36 Synthesis 4/Ex_07_3D_Letter_2/Ex_07_3D_Letter_2.pde new file mode 100644 index 000000000..ceb9653d1 --- /dev/null +++ b/content/handbook_2e/examples/36 Synthesis 4/Ex_07_3D_Letter_2/Ex_07_3D_Letter_2.pde @@ -0,0 +1,29 @@ +PShape k; + +void setup() { + size(600, 600, P3D); + k = loadShape("K.svg"); // Load the file + k = k.getChild("Path"); // Get the path data +} + +void draw() { + float ry = map(mouseY, 0, height, 0, TWO_PI); + float d = map(mouseX, 0, width, 2, 100); + + background(0); + lights(); + translate(width/2, height/2); + scale(1.5); + rotateY(ry); + + noStroke(); + beginShape(QUAD_STRIP); + for (int i = 0; i < k.getVertexCount(); i++) { + int offset = 200; + float x = k.getVertexX(i)-offset; + float y = k.getVertexY(i)-offset; + vertex(x, y, d); + vertex(x, y, -d); + } + endShape(); +} diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_07_3D_Letter_2/data/K-center.svg b/content/handbook_2e/examples/36 Synthesis 4/Ex_07_3D_Letter_2/data/K-center.svg new file mode 100644 index 000000000..af2d805b3 --- /dev/null +++ b/content/handbook_2e/examples/36 Synthesis 4/Ex_07_3D_Letter_2/data/K-center.svg @@ -0,0 +1,8 @@ + + + + + + diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_07_3D_Letter_2/data/K.svg b/content/handbook_2e/examples/36 Synthesis 4/Ex_07_3D_Letter_2/data/K.svg new file mode 100644 index 000000000..28deeb9f8 --- /dev/null +++ b/content/handbook_2e/examples/36 Synthesis 4/Ex_07_3D_Letter_2/data/K.svg @@ -0,0 +1,8 @@ + + + + + + diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_08_3D_Letter_3/Ex_08_3D_Letter_3.pde b/content/handbook_2e/examples/36 Synthesis 4/Ex_08_3D_Letter_3/Ex_08_3D_Letter_3.pde new file mode 100644 index 000000000..27727c715 --- /dev/null +++ b/content/handbook_2e/examples/36 Synthesis 4/Ex_08_3D_Letter_3/Ex_08_3D_Letter_3.pde @@ -0,0 +1,35 @@ +PShape k; // The letter K +PShape k3D; // Extruded letter K + +void setup() { + size(600, 600, P3D); + k = loadShape("K.svg"); // Load the file + k = k.getChild("Path"); // Get the path data + k3D = extrudeShape(k); // Construct 3D letter +} + +void draw() { + float ry = map(mouseX, 0, width, 0, TWO_PI); + background(0); + lights(); + translate(width/2, height/2); + scale(1.5); + rotateY(ry); + shape(k3D, 0, 0); +} + +PShape extrudeShape(PShape in) { + PShape out = createShape(); + out.beginShape(QUAD_STRIP); + out.noStroke(); + for (int i = 0; i < in.getVertexCount(); i++) { + int offset = 200; + float x = in.getVertexX(i)-offset; + float y = in.getVertexY(i)-offset; + out.vertex(x, y, 25); + out.vertex(x, y, -25); + } + out.endShape(CLOSE); + return out; +} + diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_08_3D_Letter_3/data/K.svg b/content/handbook_2e/examples/36 Synthesis 4/Ex_08_3D_Letter_3/data/K.svg new file mode 100644 index 000000000..28deeb9f8 --- /dev/null +++ b/content/handbook_2e/examples/36 Synthesis 4/Ex_08_3D_Letter_3/data/K.svg @@ -0,0 +1,8 @@ + + + + + + diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_09_Noise_1/Ex_09_Noise_1.pde b/content/handbook_2e/examples/36 Synthesis 4/Ex_09_Noise_1/Ex_09_Noise_1.pde new file mode 100644 index 000000000..5c53d4f56 --- /dev/null +++ b/content/handbook_2e/examples/36 Synthesis 4/Ex_09_Noise_1/Ex_09_Noise_1.pde @@ -0,0 +1,17 @@ +float xnoise = 0.0; +float ynoise = 0.0; +float inc = 0.05; + +background(0); +noSmooth(); +translate(20, 20); +for (int y = 0; y < 60; y++) { + for (int x = 0; x < 60; x++) { + float n = noise(xnoise, ynoise) * 255.0; + stroke(n); + point(x, y); + xnoise = xnoise + inc; + } + xnoise = 0.0; + ynoise = ynoise + inc; +} diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_10_Noise_2/Ex_10_Noise_2.pde b/content/handbook_2e/examples/36 Synthesis 4/Ex_10_Noise_2/Ex_10_Noise_2.pde new file mode 100644 index 000000000..1f1d89f67 --- /dev/null +++ b/content/handbook_2e/examples/36 Synthesis 4/Ex_10_Noise_2/Ex_10_Noise_2.pde @@ -0,0 +1,29 @@ +float xnoise = 0.0; +float ynoise = 0.0; +float inc = 0.05; +float yOffset = 0.0; +int gridSize = 10; + +void setup() { + size(600, 600); +} + +void draw() { + background(0); + + xnoise = 0.0; + ynoise = yOffset; + + for (int y = 0; y < 60; y++) { + for (int x = 0; x < 60; x++) { + float n = noise(xnoise, ynoise) * 255.0; + fill(n); + rect(x*gridSize, y*gridSize, gridSize, gridSize); + xnoise = xnoise + inc; + } + xnoise = 0.0; + ynoise = ynoise + inc; + } + + yOffset += inc/6.0; +} diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_11_Noise_3/Ex_11_Noise_3.pde b/content/handbook_2e/examples/36 Synthesis 4/Ex_11_Noise_3/Ex_11_Noise_3.pde new file mode 100644 index 000000000..fd787e49f --- /dev/null +++ b/content/handbook_2e/examples/36 Synthesis 4/Ex_11_Noise_3/Ex_11_Noise_3.pde @@ -0,0 +1,37 @@ +float xnoise = 0.0; +float ynoise = 0.0; +float inc = 0.05; +float yOffset = 0.0; +int gridSize = 10; + +void setup() { + size(600, 600, P3D); + strokeWeight(2); +} + +void draw() { + background(0); + + xnoise = 0.0; + ynoise = yOffset; + + translate(0, 120, -300); + rotateX(0.7); + + for (int y = 0; y < 60; y++) { + noFill(); + beginShape(); + for (int x = 0; x < 60; x++) { + float z = noise(xnoise, ynoise) * 255.0; + float alpha = map(y, 0, 60, 0, 255); + stroke(255, alpha); + vertex(x*gridSize, y*gridSize, z); + xnoise = xnoise + inc; + } + xnoise = 0.0; + ynoise = ynoise + inc; + endShape(); + } + + yOffset += inc/6.0; +} diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_12_Nodes_1/Ex_12_Nodes_1.pde b/content/handbook_2e/examples/36 Synthesis 4/Ex_12_Nodes_1/Ex_12_Nodes_1.pde new file mode 100644 index 000000000..39dff9580 --- /dev/null +++ b/content/handbook_2e/examples/36 Synthesis 4/Ex_12_Nodes_1/Ex_12_Nodes_1.pde @@ -0,0 +1,34 @@ +int x1, y1; +int x2, y2; +int radius = 50; + +void setup() { + size(300, 300); + ellipseMode(RADIUS); + x1 = width/2; + y1 = width/2; +} + +void draw() { + x2 = mouseX; + y2 = mouseY; + background(204); + noStroke(); + fill(0, 40); + ellipse(x1, y1, radius, radius); + ellipse(x2, y2, radius, radius); + if (overlap() == true) { + stroke(0); + line(x1, y1, x2, y2); + } +} + +boolean overlap() { + float distanceFromCenters = dist(x1, y1, x2, y2); + float diameter = radius*2; + if (distanceFromCenters < diameter) { + return true; + } else { + return false; + } +} diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_13_Nodes_2/Ex_13_Nodes_2.pde b/content/handbook_2e/examples/36 Synthesis 4/Ex_13_Nodes_2/Ex_13_Nodes_2.pde new file mode 100644 index 000000000..7a54b0918 --- /dev/null +++ b/content/handbook_2e/examples/36 Synthesis 4/Ex_13_Nodes_2/Ex_13_Nodes_2.pde @@ -0,0 +1,27 @@ +Node[] nodes = new Node[100]; +int nodeCount = 0; + +void setup() { + size(600, 600); + for (int i = 0; i < nodes.length; i++) { + // Each element stores the same reference to the nodes array + nodes[i] = new Node(i, nodes); + } +} + +void draw() { + background(0); + for (int i = 0; i < nodeCount; i++) { + nodes[i].display(); + nodes[i].displayNetwork(nodeCount); + } +} + +void mousePressed() { + if (nodeCount < nodes.length) { + nodes[nodeCount].setPosition(); + nodeCount++; + } +} + + diff --git a/content/handbook_2e/examples/36 Synthesis 4/Ex_13_Nodes_2/Node.pde b/content/handbook_2e/examples/36 Synthesis 4/Ex_13_Nodes_2/Node.pde new file mode 100644 index 000000000..9ca775e79 --- /dev/null +++ b/content/handbook_2e/examples/36 Synthesis 4/Ex_13_Nodes_2/Node.pde @@ -0,0 +1,47 @@ +class Node { + int x; // X-coordinate + int y; // Y-coordinate + int radius = 50; // Radius + int id; // The index within the array + Node[] otherNodes; // Reference to the array of Nodes + + Node(int tempId, Node[] tempOthers) { + id = tempId; + otherNodes = tempOthers; + } + + // Define the location + void setPosition() { + x = mouseX; + y = mouseY; + } + + // Draw to the display window + void display() { + ellipseMode(RADIUS); + noStroke(); + fill(255, 40); + ellipse(x, y, radius, radius); + } + + // Draw the lines between overlapping Nodes + void displayNetwork(int nodeCount) { + stroke(255); + for (int i = id+1; i < nodeCount; i++) { + if (overlap(otherNodes[i])) { + line(x, y, otherNodes[i].x, otherNodes[i].y); + } + } + } + + // Calculate if this Node is overlapping with another + boolean overlap(Node n) { + float distanceFromCenters = dist(x, y, n.x, n.y); + float diameter = radius + n.radius; + if (distanceFromCenters < diameter) { + return true; + } else { + return false; + } + } +} diff --git a/content/static/books.html b/content/static/books.html index 6d71a7438..fa7778968 100755 --- a/content/static/books.html +++ b/content/static/books.html @@ -3,42 +3,41 @@

    Books. Processing books cove

    - - + - + - - + + - - + - - - - + + + - + - - + +
    + The publisher says, "This book teaches the basic building blocks of programming needed to create cutting-edge graphics applications including interactive art, live video processing, and data visualization. A unique lab-style manual, this book gives graphic and web designers, artists, illustrators, and anyone interested in learning to code a jumpstart on working with the Processing programming environment by providing instruction on the basic principles of the language, followed by careful explanations of advanced techniques." +
    +
    + If you are an educator, you can request a desk/exam copy from the Elsevier website.
    + @@ -127,32 +119,80 @@

    Books. Processing books cove How can we capture the unpredictable evolutionary and emergent properties of nature in software? How can understanding the mathematical principles behind our physical world help us to create digital worlds? This book focuses on a range of programming strategies and techniques behind computer simulations of natural systems, from elementary concepts in mathematics and physics to more advanced algorithms that enable sophisticated visual results. Readers will progress from building a basic physics engine to creating intelligent moving objects and complex systems, setting the foundation for further experiments in generative design. Subjects covered include forces, trigonometry, fractals, cellular automata, self-organization, and genetic algorithms. - + +

    + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + - - + + Martin Wattenberg from the IBM Watson Research Center says, "This wonderfully detailed guide, by one of the masters of modern data graphics, tells you everything you need to know to code your own visualizations from scratch. Perhaps most valuable are the many examples where Fry demonstrates how to refine a bare-bones concept into a beautiful, effective finished piece. Read this book, and you'll never again be dependent on someone else's view of your data."
    + - @@ -164,14 +204,40 @@

    Books. Processing books cove

    + + + + + + + + + + + @@ -179,6 +245,34 @@

    Books. Processing books cove

    + + + + + + + + + + @@ -217,13 +311,11 @@

    Books. Processing books cove This book has a different perspective from the others because of Glassner's deep experience in computer graphics. His bio reads, "Dr. Andrew Glassner is a writer-director, and a consultant in story structure, interactive fiction, and computer graphics. He started working in 3D computer graphics in 1978, and has carried out research at the NYIT Computer Graphics Lab, Case Western Reserve University, the IBM TJ Watson Research Lab, the Delft University of Technology, Bell Communications Research, Xerox PARC, and Microsoft Research... He is also a well-known writer, and has published numerous technical papers and books on topics ranging from 3D modeling, rendering, and animation to digital sound synthesis. His book '3D Computer Graphics: A Handbook for Artists and Designers' has taught a generation of artists through two editions and three languages. Glassner created and edited the 'Graphics Gems' series and created and wrote several chapters in the book 'An Introduction to Ray Tracing'. He wrote the two-volume text 'Principles of Digital Image Synthesis'."

    - - - + - - - - - + The O'Reilly website says, "Make cool stuff. If you're a designer or artist without a lot of programming experience, this book will teach you to work with 2D and 3D graphics, sound, physical interaction, and electronic circuitry to create all sorts of interesting and compelling experiences -- online and off. Programming Interactivity explains programming and electrical engineering basics, and introduces three freely available tools created specifically for artists and designers: Processing, Arduino, and OpenFrameworks." + + - + + - - - + + - + + + @@ -308,21 +401,44 @@

    Books. Processing books cove

    - - - + + + - + - + + + + + + + - + @@ -368,7 +484,7 @@

    Books. Processing books cove -

    + @@ -430,20 +546,65 @@

    Books. Processing books cove

    + + + + + + + + - + + + + + + + + + + + @@ -461,7 +622,7 @@

    Books. Processing books cove Text in German.

    The OReilly.de site writes, "Processing ist eine auf Grafik, Simulation und Animation spezialisierte objektorientierte Programmiersprache, die besonders für Menschen mit wenig Programmiererfahrung geeignet ist. Deshalb eignet sie sich vor allem für Künstler, Bastler und Programmiereinsteiger. Die aus Java abgeleitete Sprache wurde geschaffen, um schnell und effektiv mit relativ wenig Aufwand zu beeindruckenden Ergebnissen zu kommen. Processing führt den Leser zügig in die Programmieressentials ein und geht dann unmittelbar zur Programmierung grafisch anspruchsvoller Anwendungen über. Spielerisch wird dem Leser die 2D- und 3D-Programierung, Textrendering, die Bildbearbeitung und sogar die Videomanipulation nahe gebracht." -

    + @@ -480,6 +641,7 @@

    Books. Processing books cove Processing - eine Einführung in die Programmierung
    Andres Wanner (Chapters by Hans Peter Wyss, Roland Broennimann and Roman Schnyder).
    Version 1.1, Published May 2010, Lulu Press. 83 pages. Softcover.
    + Text in German.
    Order from lulu.com
    Book website

    @@ -520,59 +682,69 @@

    Books. Processing books cove +

    + + + + + + + + + + + + There's additional information on the publisher's website. + + + + + + - - + - + Итак, представляю вашему вниманию книгу “Программирование для дизайнеров”. Книга вышла на русском языке при поддержке Европейского Союза, организации Темпус по проекту 544083 “Enhancement of Russian creative education: new Master program in Digital Arts in line with EU standards [ENMDA]”. Ее можно найти в библиотеках страны и несколько копий будет находиться в библиотеке политехнического университета. Выражаю благодарность кафедре инженерной графики и дизайна за помощь в издании, некоторые страницы печатного издания цветные, что приятно." + + +
    Processing: A Programming Handbook for Visual Designers (Second Edition)

    - Processing: A Programming Handbook for Visual Designers
    (Second Edition)

    + Processing: A Programming Handbook for Visual Designers,
    Second Edition

    Casey Reas and Ben Fry.
    Published December 2014, The MIT Press. 720 pages. Hardcover.
    - » Order from MIT Press
    + » Order from MIT Press
    » Order from Amazon

    The second edition of the Handbook has been thoroughly updated, influenced by the seven years of Processing being taught in classrooms, computer labs, and studios since the first edition. Every chapter has been revised, and added chapters introduce new ways to work with data and geometry. New “synthesis” chapters offer discussion and worked examples of such topics as sketching with code, modularity, and algorithms. Interviews have been added that cover a wider range of projects and history. “Extension” chapters are now offered online so they can be updated to keep pace with technological developments in such fields as computer vision and electronics.

    - If you are an educator, you can request a desk/exam copy from the MIT Press website.
    + If you are an educator, you can request a desk/exam copy from the MIT Press website.

     

     

    Getting Started with Processing
    Make: Getting Started with Processing, Second Edition

    - Getting Started with Processing
    + Make: Getting Started with Processing, Second Edition
    Casey Reas and Ben Fry.
    - Published June 2010, O'Reilly Media. 208 pages. Paperback.
    - » Order Print/EBook from O'Reilly
    - » Order Print from Amazon.com + Published September 2015, Maker Media. 238 pages. Paperback.
    + » Order Print/EBook from O'Reilly
    + » Order from Amazon.com
    - This casual, inexpensive book is a concise introduction to Processing and interactive computer graphics. Written by the founders of Processing, it takes you through the learning process one step at a time to help you grasp core programming concepts. You'll learn how to sketch with code -- creating a program with a few lines of code, observing the result, and then adding to it. It was written to help reader: + This casual book is a concise introduction to Processing and interactive computer graphics. Written by the founders of Processing, it takes you through the learning process one step at a time to help you grasp core programming concepts. You'll learn how to sketch with code -- creating a program with a few lines of code, observing the result, and then adding to it. It was written to help readers:

    • Quickly learn programming basics, from variables to objects
    • Understand the fundamentals of computer graphics
    • @@ -48,63 +47,56 @@

      Books. Processing books cove

     

     

     

     

    Visualizing Data - Visualizing Data
    - Ben Fry.
    - Published December 2007, O'Reilly. 384 pages. Paperback.
    - » Order from Amazon.com +
    Learning Processing, Second Edition: A Beginner's Guide to Programming Images, Animation, and InteractionLearning Processing, Second Edition: A Beginner's Guide to Programming Images, Animation, and Interaction
    + Daniel Shiffman.
    + Published August 2015, Morgan Kaufmann. 564 pages. Paperback.
    + » Order from Amazon.com +
    + The second edition of Learning Processing has been updated for compatibility with Processing 3 and includes several new chapters of content including video, sound, data visualization, and networking. For more, visit the Learning Processing website.

    - The O'Reilly website says, "How you can take advantage of data that you might otherwise never use? With the help of a powerful new programming environment [Processing], this book helps you represent data accurately on the Web and elsewhere, complete with user interaction, animation, and more. You'll learn basic visualization principles, how to choose the right kind of display for your purposes, and how to provide interactive features to design entire interfaces around large, complex data sets."
    + Dan Shiffman says, "This book tells a story. It's a story of liberation, of taking the first steps towards understanding the foundations of computing, writing your own code, and creating your own media without the bonds of existing software tools. This story is not reserved for computer scientists and engineers. This story is for you."
    - Martin Wattenberg from the IBM Watson Research Center says, "This wonderfully detailed guide, by one of the masters of modern data graphics, tells you everything you need to know to code your own visualizations from scratch. Perhaps most valuable are the many examples where Fry demonstrates how to refine a bare-bones concept into a beautiful, effective finished piece. Read this book, and you'll never again be dependent on someone else's view of your data."
    -

     

     

    Coding Art: The Four Steps to Creative Programming with the Processing LanguageCoding Art: The Four Steps to Creative Programming with the Processing Language
    + Yu Zhang, Mathias Funk.
    + Published January 2021, Apress. 280 pages. Paperback.
    + » Order from Apress
    + » Order from Amazon +
    +
    + The authors write, "Finally, a book on creative programming, written directly for artists and designers! Rather than following a computer science curriculum, this book is aimed at creatives who are working in the intersection of design, art, and education. In this book you'll learn to apply computation into the creative process by following a four-step process, and through this, land in the cross section of coding and art, with a focus on practical examples and relevant work structures. You'll follow a real-world use case of computation art and see how it relates back to the four key pillars, and addresses potential pitfalls and challenges in the creative process. All code examples are presented in a fully integrated Processing example library, making it easy for readers to get started." +

     

     

    Pro Processing for Images and Computer Vision with OpenCVPro Processing for Images and Computer Vision with OpenCV
    + Bryan WC Chung.
    + Published 2017, APress. Paperback, eBook.
    + » Order from APress +

    + The Publisher writes, "Pro Processing for Images and Computer Vision with OpenCV is a step-by-step training tool that guides you through a series of worked examples in linear order. Each chapter begins with a basic demonstration, including the code to recreate it on your own system. Then comes a creative challenge by which to engage and develop mastery of the chapter’s topic. The book also includes hints and tips relating to visual arts, interaction design, and industrial best practices. This book is intended for any developer of artistic and otherwise visual applications, such as in augmented reality and digital effects, with a need to manipulate images, and to recognize and manipulate objects within those images. The book is specifically targeted at those making use of the Processing language that is common in artistic fields, and to Java programmers because of Processing’s easy integration into the Java programming environment." +

     

     

    Programming 101: The How and Why of Programming Revealed Using the Processing Programming LanguageProgramming 101: The How and Why of Programming Revealed Using the Processing Programming Language
    + Jeanine Meyer.
    + Published 2018, APress. Paperback, eBook.
    + » Order from Apress +

    + The Publisher writes, "Understand the importance of programming, even if you’ve never programmed before! This book will teach you the basics of programming using the Processing programming language. You will create your own Processing sketches, using personal images, themes, or hobbies that you enjoy. The chapters in the book will demonstrate the process of programming, starting with formulating an idea, planning, building on past projects, and refining the work, similar to writing an essay or composing a song. This approach will guide you to make use of logic and mathematics to produce beautiful effects. The term for program in Processing is sketch, though the sketches featured in this book are far more than static drawings; they incorporate interaction, animation, video, audio, and accessing files on the local computer and on the Web. Technical features are introduced and explained in the context of complete examples: games (Snake, Hangman, jigsaw, slingshot), making a collage of family images and video clips, preparing directions for folding an origami model, rotating objects in 3D, and others." +

     

     

    Learning Processing: A Beginner's Guide to Programming Images, Animation, and InteractionLearning Processing: A Beginner's Guide to Programming Images, Animation, and Interaction
    - Daniel Shiffman.
    - Published August 2008, Morgan Kaufmann. 450 pages. Paperback.
    - » Order from Amazon.com -
    - Visit the Learning Processing website.
    -
    - Dan Shiffman says, "This book tells a story. It's a story of liberation, of taking the first steps towards understanding the foundations of computing, writing your own code, and creating your own media without the bonds of existing software tools. This story is not reserved for computer scientists and engineers. This story is for you." +
    Visualizing Data + Visualizing Data
    + Ben Fry.
    + Published December 2007, O'Reilly. 384 pages. Paperback.
    + » Order from Amazon.com
    + The O'Reilly website says, "How you can take advantage of data that you might otherwise never use? With the help of a powerful new programming environment [Processing], this book helps you represent data accurately on the Web and elsewhere, complete with user interaction, animation, and more. You'll learn basic visualization principles, how to choose the right kind of display for your purposes, and how to provide interactive features to design entire interfaces around large, complex data sets."

    - The publisher says, "This book teaches you the basic building blocks of programming needed to create cutting-edge graphics applications including interactive art, live video processing, and data visualization. A unique lab-style manual, the book gives graphic and web designers, artists, and illustrators of all stripes a jumpstart on working with the Processing programming environment by providing instruction on the basic principles of the language, followed by careful explanations of select advanced techniques." -

     

     

    Generative Design
    Hartmut Bohnacker, Benedikt Gross, Julia Laub, and Claudius Lazzeroni.
    August 2012, Princeton Architectural Press. 472 pages.
    - Originally published in German November 2009, Schmidt Hermann Verlag. 500 pages.
    + Originally published in German November 2009, Schmidt Hermann Verlag. 500 pages.
    » Order from Amazon.com
    This book is extraordinary; the design is clear and the production quality is fantastic. This is the design book about Processing that we've hoped for. Unlike most other Processing books, it doesn't discuss programming basics so it's free to start with exciting examples. The publisher promotes, "Generative design is a revolutionary new method of creating artwork, models, and animations from sets of rules, or algorithms. By using accessible programming languages such as Processing, artists and designers are producing extravagant, crystalline structures that can form the basis of anything from patterned textiles and typography to lighting, scientific diagrams, sculptures, films, and even fantastical buildings. Opening with a gallery of thirty-five illustrated case studies, Generative Design takes users through specific, practical instructions on how to create their own visual experiments by combining simple-to-use programming codes with basic design principles. A detailed handbook of advanced strategies provides visual artists with all the tools to achieve proficiency. Both a how-to manual and a showcase for recent work in this exciting new field, Generative Design is the definitive study and reference book that designers have been waiting for."

    More information about buying this book in German, as well as the complete source code for the examples, are at the book's website.

    -

     

     

    The SparkFun Guide to ProcessingThe SparkFun Guide to Processing
    + Derek Runberg.
    + 2015, No Starch Press. 232 pages. Paperback.
    + » Order from Amazon.com +
    + The publisher writes, "The SparkFun Guide to Processing teaches you to craft your own digital artwork and even combine it with hardware—no prior programming experience required. Over the course of the book, you’ll learn the basics by drawing simple shapes, move on to photo editing and video manipulation, and ultimately affect the physical world by using Processing with an Arduino."
    +
    + The publisher lists: +
      +
    • Make detailed pixel art and scale it to epic proportions
    • +
    • Write a maze game and build a MaKey MaKey controller with fruit buttons
    • +
    • Play, record, and sample audio to create your own soundboard
    • +
    • Fetch weather data from the Web and build a custom weather dashboard
    • +
    • Create visualizations that change based on sound, light, and temperature readings
    • +
    +

     

    Processing: An Introduction to ProgrammingProcessing: An Introduction to Programming
    + Jeffrey L. Nyhoff, Larry R. Nyhoff.
    + Published May 2017, CRC Press. 544 pages. eBook, Paperback.
    + » Order from CRC Press +
    + » Order from Amazon.com +

    + The publisher writes, "The book uses Processing’s capabilities for graphics and interactivity in order to create examples that are simple, illustrative, interesting, and fun. It is designed to appeal to a broad range of readers, including those who want to learn to program to create digital art, as well as those who seek to learn to program to process numerical information or data. It can be used by students and instructors in a first course on programming, as well as by anyone eager to teach them self to program."
    +
    + The publisher lists: +
      +
    • Provides a gentle and accessible introduction to programming using Processing
    • +
    • Includes traditional programming examples, as well as examples that use graphics, animation, and interactivity
    • +
    • Play, record, and sample audio to create your own soundboard
    • +
    • Covers all of the standard programming constructs
    • +
    • Presents the material in a fun, conversational, and approachable way
    • +
    +

     

     

    Processing: Creative Coding and Generative Art in Processing 2

     

     

    Processing: Creative Coding and Computational Art (Foundation) Processing: Creative Coding and Computational Art (Foundation)
    @@ -235,11 +327,10 @@

    Books. Processing books cove
    The Friends of Ed website says, "This book is written especially for artists, designers, and other creative professionals and students exploring code art, graphics programming, and computational aesthetics. The book provides a solid and comprehensive foundation in programming, including object-oriented principles, and introduces you to the easy-to-grasp Processing language, so no previous coding experience is necessary. The book then goes through using Processing to code lines, curves, shapes, and motion, continuing to the point where you'll have mastered Processing and can really start to unleash your creativity with realistic physics, interactivity, and 3D! In the final chapter, you'll even learn how to extend your Processing skills by working directly with the powerful Java programming language, the language Processing itself is built with." (Quote from the Friends of Ed website)

    -

     

     

    + Programming Interactivity: A Designer's Guide to Processing, Arduino, and openFrameworksProgramming Interactivity
    +
    Programming Interactivity
    Joshua Noble.
    Published January 2012, O'Reilly. 728 pages. Paperback.
    » Order from Amazon.com
    - The O'Reilly website says, "Make cool stuff. If you're a designer or artist without a lot of programming experience, this book will teach you to work with 2D and 3D graphics, sound, physical interaction, and electronic circuitry to create all sorts of interesting and compelling experiences -- online and off. Programming Interactivity explains programming and electrical engineering basics, and introduces three freely available tools created specifically for artists and designers: Processing, Arduino, and OpenFrameworks."

     

     

    Generative ArtGenerative Art
    +
    + Generative Art + + Generative Art
    Matt Pearson.
    Published March 2011, Manning Publications. 300 pages. Paperback.
    » Order from Amazon.com @@ -298,8 +390,9 @@

    Books. Processing books cove
  • Featuring the work of Robert Hodgin, Jared Tarbell, Aaron Koblin, Casey Reas and many more of the finest contemporary generative artists.
  • 32-page full-color section
  • Foreword by Marius Watz
  • -

    Algorithms for Visual Design Using the Processing LanguageAlgorithms for Visual Design Using the Processing Language
    - Kostas Terzidis.
    - Published May 2009, Wiley. 384 Pages. Hardcover.
    - » Order from Amazon.com -
    - The Wiley website says, "this book offers a series of generic procedures that can function as building blocks and encourages you to then use those building blocks to experiment, explore, and channel your thoughts, ideas, and principles into potential solutions. The book covers such topics as structured shapes, solid geometry, networking and databases, physical computing, image processing, graphic user interfaces, and more."
    + Algorithms for Visual Design Using the Processing Language + + Algorithms for Visual Design Using the Processing Language
    + Kostas Terzidis.
    + Published May 2009, Wiley. 384 Pages. Hardcover.
    + » Order from Amazon.com +
    + The Wiley website says, "this book offers a series of generic procedures that can function as building blocks and encourages you to then use those building blocks to experiment, explore, and channel your thoughts, ideas, and principles into potential solutions. The book covers such topics as structured shapes, solid geometry, networking and databases, physical computing, image processing, graphic user interfaces, and more." +

     

     

    + Data-driven Graphic Design: Creative Coding for Visual Communication + + Data-driven Graphic Design: Creative Coding for Visual Communication
    + Andrew Richardson.
    + Published January 2016, Bloomsbury. 224 Pages. Paperback.
    + » Order from Amazon.com +

    + The book description reads, "Data-driven Graphic Design introduces the creative potential of computational data and how it can be used to inform and create everything from typography, print and moving graphics to interactive design and physical installations. Using code as a creative environment allows designers to step outside the boundaries of commercial software tools, and create a set of unique, digitally informed pieces of work. The use of code offers a new way of thinking about and creating design for the digital environment." +

     

     

     

     

     

    Creating Procedural Artworks with Processing +

    + Creating Procedural Artworks with Processing
    A Holistic Guide

    + Penny de Byl
    + Published May 2017, CreateSpace Independent Publishing Platform, 386 pages. Paperback
    + » Order Print/eBook from Amazon
    + » Order from iBooks
    +
    + This book started as a set of tutorials for university level multimedia students to introduce them to computer programming through the development of artworks. It's therefore presented in a non-threatening way that will ease the reader into programming and has been written for absolute beginners who want to learn to program. It approaches coding through a unique combination of teaching programming while keeping in mind the principles of design and mathematics. +

    + The chapters are organised to weave together programming functionality and design principles presenting one concept at a time, with multiple hands on exercises in each chapter. +
    +
    + Additional information available at http://holistic3d.com/creating-procedural-artworks/

    + Experience an example of the artworks created at http://holistic3d.com/processing
    +

     

     

    O Código Transcendente: Uma Introdução Prática à Programação e Arte GerativaO Código Transcendente: Uma Introdução Prática à Programação e Arte Gerativa
    + Mateus Berruezo.
    + Published December 2019. 270 pages. PDF, Web.
    + Text in Portuguese.
    + » Download
    + » Read online +
    +
    + Este livro é um guia de programação com enfoque prático considerando o contexto da arte gerativa e do pensamento computacional. Ele conta com explicações e exemplos visuais cuidadosamente projetados para serem de valor tanto para programadores quanto artistas. As aplicações e estudos de caso foram direcionados para a linguagem Processing cuja própria filosofia segue o princípio da exploração do artístico através do código. +

     

     

    Einführung ins Programmieren mit Processing Einführung ins Programmieren mit Processing
    - Matthias Wolf.
    - Published August 2013. 178 pages. PDF, Paperback.
    - » Order Print/EBook from lulu.com
    -
    -

    Die eigenständige Programmiersprache Processing basiert auf Java und ähnelt diesem sehr, verbirgt aber gleichzeitig viel von dessen Komplexität. Dadurch ist Processing für den Programmieranfänger ideal geeignet, um sich Konzepte des Programmierens zu erschließen und bewahrt gleichzeitig die Möglichkeit eines späteren Umstiegs. Dennoch ist die Sprache keineswegs nur für triviale Anfängeraufgaben geeignet: speziell im Bereich der graphischen Datenverarbeitung spielt Processing seine Stärken aus.

    -

    Dieses Buch richtet sich in erster Linie an den Einsteiger, den es an die Bewältigung auch komplexerer Aufgaben heranführt, wobei grundlegende Konzepte der imperativen und der objektorientierten Programmierung vorgestellt werden. Auch notwendige theoretische Hintergründe kommen dabei nicht zu kurz. Ausführlich kommentierter Beispielcode erschließt Konzepte und Sprache. Aber auch der routinierte Programmierer, der sich "nur" eine neue Sprache erschließen will, wird fündig!

    -

    Aus dem Inhalt: Datentypen — Variablen — Arrays (ein- und mehrdiomensional) — Flusssteuerung — Methoden — Objektorientiertes Programmieren — 2D-Graphik — 3D-Graphik — Dateizugriff — PDF — QuickTimeTM — Arduino®-Mikrocontroller — Alphabetischer Index + Matthias Wolf.
    + Published August 2013. 178 pages. PDF, Paperback.
    + Text in German.
    + » Order Print/EBook from lulu.com
    +
    +

    Die eigenständige Programmiersprache Processing basiert auf Java und ähnelt diesem sehr, verbirgt aber gleichzeitig viel von dessen Komplexität. Dadurch ist Processing für den Programmieranfänger ideal geeignet, um sich Konzepte des Programmierens zu erschließen und bewahrt gleichzeitig die Möglichkeit eines späteren Umstiegs. Dennoch ist die Sprache keineswegs nur für triviale Anfängeraufgaben geeignet: speziell im Bereich der graphischen Datenverarbeitung spielt Processing seine Stärken aus.

    +

    Dieses Buch richtet sich in erster Linie an den Einsteiger, den es an die Bewältigung auch komplexerer Aufgaben heranführt, wobei grundlegende Konzepte der imperativen und der objektorientierten Programmierung vorgestellt werden. Auch notwendige theoretische Hintergründe kommen dabei nicht zu kurz. Ausführlich kommentierter Beispielcode erschließt Konzepte und Sprache. Aber auch der routinierte Programmierer, der sich "nur" eine neue Sprache erschließen will, wird fündig!

    +

    Aus dem Inhalt: Datentypen — Variablen — Arrays (ein- und mehrdiomensional) — Flusssteuerung — Methoden — Objektorientiertes Programmieren — 2D-Graphik — 3D-Graphik — Dateizugriff — PDF — QuickTimeTM — Arduino®-Mikrocontroller — Alphabetischer Index

    Il Codice dei Cibernetici: Introduzione alla Computer Art con Processing + Il Codice dei Cibernetici: Introduzione alla Computer Art con Processing
    + Antonio Rollo
    + Published December 2015, Oistros Edizioni. 320 pages. Softcover.
    + Text in Italian.
    +
    + During the 50‘s ”era of cybernetics“, computer entered into the history of art simultaneously in different parts of the world. Art and science were in great turmoil. Science, with its theories and experiments, was approaching artificially mimicking both natural phenomena, such as light and sound, and the human phenomena of language and communication. Art, with its aesthetic and exhibitions, had transcended the boundaries of the avant-garde. Now, with the computer, it was confronting a reality that challenged ”the where“ and ”the how“ of doing art and the very meaning of ”masterpiece“. Antonio Rollo takes us on a tour of these seminal works from his unique perspective of the artist, through the code! +
    +
    + There's additional information on the publisher's website. +

     

     

    Built with Processing Built with Processing
    Published March 2007, BNN. 232 pages. Softcover.
    - Text in Japanese
    + Text in Japanese.

    Note from Casey: "I received a copy of this book from the authors on a recent trip to Japan. It's a beautifully produced full-color book with sections introducing Processing, featuring work created with Processing (many are from the Exhibition section of the Processing website), and introducing programming through progressively complicated examples. The majority of the book is an introduction to programming. There are many good examples and the code is color-coded like in the Processing Environment. This book is less comprehensive than the Greenberg and Reas/Fry books, but it appears to be a good, brief introduction."

    - There's additional information on the publisher's website.

     

     

     

    - Processing is also discussed through examples and projects in the following books: - -
    - -
    - - 10 PRINT CHR$(205.5+RND(1)); : GOTO 10By Nick Montfort, Patsy Baudoin, John Bell, Ian Bogost, Jeremy Douglass, Mark C. Marino, Michael Mateas, Casey Reas, Mark Sample, Noah Vawter. Examples use Processing to explore a modern interpretation of a 1982 Commodore 64 program.
    - -
    - - Getting Started with Arduino
    By Massimo Banzi. Examples use Processing to communicate with an Arduino board.
    - -
    - - Building Wireless Sensor Networks: with ZigBee, XBee, Arduino, and Processing
    By Robert Faludi. Network examples use Processing.
    - -
    - - Physical Computing: Sensing and Controlling the Physical World with Computers
    - By Dan O'Sullivan and Tom Igoe. Examples using Processing for RS-232 communication and - computer vision.
    - +
    + Programming for Artists + + Programming for Artists
    + Pavel A. Orlov.
    + Published 2015. 248 Pages. PDF.
    + Text in Russian.
    + » Download the book
    - - Aesthetic Computing.
    - Edited by Paul Fishwick. Casey Reas and Ben Fry contributed a chapter entitled - "Processing Code: Programming within the Context of Visual Art and Design."
    - + The author's website reads, "Летом 2015 года мне удалось подготовить к выходу в свет новую книгу, посвященную программированию для художников и дизайнеров. Книга рассматривает среду Processing как одну из самых простых и доступных в освоении. Я акцентировал внимание на том, что каждый человек, знакомый с азами математики, может научиться использовать программирование для своих творческих задач. Конечно, я говорю про активных дизайнеров, которые не боятся использовать и изучать новые для себя инструменты.

    - - Hacking Roomba: ExtremeTech
    By Tod E. Kurt. Processing is introduced and used to design an application to control a Roomba (a robot vacuum cleaner).
    - + Часто я слышу вопросы: “Зачем художнику нужно программировать? Почему нельзя просто взять и нарисовать от руки? А что, фотошоп отменили? Неужели у художников есть математическая логика?” Мне эти вопросы кажутся замечательными и напоминают художника в момент появления фотографии, когда художники спорили с фотографами примерно теми же словами, разве что слова фотошоп еще не было. И сейчас у нас развивается искусство фотографии бурным потоком. Более развернутый ответ вы можете найти во вступительной статье.

    - Analog In, Digital Out
    By Brendan Dawes. Numerous projects created with Processing are illustrated and discussed.

    diff --git a/content/static/download.html b/content/static/download.html new file mode 100644 index 000000000..122db5e30 --- /dev/null +++ b/content/static/download.html @@ -0,0 +1,334 @@ +
    + +

    Download Processing. Processing is available for Linux, Mac OS X, and Windows. Select your choice to download the software below.

    + + +
    + + + + +
    + 4.0b1 + (9 August 2021) + +
    + + +
    + +
    + Read about the changes in 4.0. The list of revisions covers the differences between releases in detail. +
    +
    +
    + + +
    +

    Stable Releases

    +
  • + 4.0b1 + (9 August 2021) + Windows 64 + Linux 64 + macOS +
  • +
  • + 3.5.4 + (17 January 2020) + Win 32 + Win 64 + Linux 64 + Mac OS X +
  • + + +
  • + 2.2.1 + (19 May 2014) + Win 32 + Win 64 + Linux 32 + Linux 64 + Mac OS X +
  • + +
  • + 1.5.1 + (15 May 2011) + Win (standard) + Win (no Java) + Linux x86 + Mac OS X +
  • + +

    Earlier releases have been removed because we can only support the current versions of the software. To update old code, read the changes page. Changes for each release can be found in revisions.txt. If you have problems with the current release, please file a bug so that we can fix it. Older releases can also be built from the source. Read More about the releases and their numbering. To use Android Mode, Processing 3 or later is required.

    +
    + + +
    +

    Pre-Releases

    + +

    The changes document covers incremental updates between 4.x releases, and is especially important to read for pre-releases.

    +
    + + +
    + Processing is Open Source Software. The PDE (Processing Development Environment) is released under the GNU GPL (General Public License). The export libraries (also known as 'core') are released under the GNU LGPL (Lesser General Public License). There's more information about Processing and Open Source in the FAQ and more information about the GNU GPL and GNU LGPL at opensource.org. Please support Processing! +
    + +
    diff --git a/content/static/foundation-site/donate.html b/content/static/foundation-site/donate.html deleted file mode 100644 index f7ec3331c..000000000 --- a/content/static/foundation-site/donate.html +++ /dev/null @@ -1,38 +0,0 @@ -

    Donate

    - -

    - - - - -
    - - - -
    -

    diff --git a/content/static/foundation-site/fellowships.html b/content/static/foundation-site/fellowships.html deleted file mode 100644 index 8359f116c..000000000 --- a/content/static/foundation-site/fellowships.html +++ /dev/null @@ -1,57 +0,0 @@ -

    Fellowships

    - -

    - - - - - -
    - -

    -The Processing Foundation maintains a fellowship program that supports the development and expansion of Processing and its affiliated projects. Work done by fellows is supported through funding and mentorship from The Processing Foundation. The projects done so far have all been undertaken in parallel with each of the fellows’ practices as artists. - -

    -
    - -
    -
    -

    -Wilm Thoben (2013-14) -

    -

    -Thoben developed a new core Sound library from fall 2013 through winter 2014. This library is now released with Processing 3.0. -
    -
    -Wilm Thoben is a sound artist and researcher. He is currently working on his dissertation about the 1960s art and technology group E.A.T. His work deals with perception and definition of space or the abstraction of everyday life. See more of Thoben's work at wilmthoben.com. -

    -
    - -
    -
    -

    -Lauren McCarthy (2013) -

    -

    -McCarthy started the work that has now become p5.js in spring, summer, and fall 2013. p5.js is a JavaScript interpretation of Processing. -
    -
    -Lauren McCarthy is an artist and programmer based in Brooklyn, NY. She is adjunct faculty at RISD and NYU ITP, a researcher in residence at ITP, and recently a resident at Eyebeam. She holds an MFA from UCLA and a BS Computer Science and BS Art and Design from MIT. Her work explores the structures and systems of social interactions, identity, and self-representation, and the potential for technology to mediate, manipulate, and evolve these interactions. She is fascinated by the slightly uncomfortable moments when patterns are shifted, expectations are broken, and participants become aware of the system. See more of McCarthy's work at lauren-mccarthy.com. - -

    -
    - -
    -
    -

    -Greg Borenstein (2013) -

    -

    -Borenstein expanded and released the OpenCV library in spring and summer 2013. -
    -
    -Greg Borenstein is an artist, technologist, and teacher. He creates illusions for humans and machines. His work explores computer vision, machine learning, game design, visual effects, and drawing as media for storytelling and design. Greg is a graduate of the NYU Interactive Telecommunications Program and has worked for firms such as Makerbot and Berg London. He is the author of a book for O'Reilly about the Microsoft Kinect, titled: Making Things See: 3D vision with Kinect, Processing, Arduino, and MakerBot. He's currently a researcher in the Playful Systems Group at the MIT Media Lab. See more of Borenstein's work at gregborenstein.com. -

    - -
    -

    diff --git a/content/static/foundation-site/imgs/JH_bio.png b/content/static/foundation-site/imgs/JH_bio.png deleted file mode 100644 index 1bc2b1b1a..000000000 Binary files a/content/static/foundation-site/imgs/JH_bio.png and /dev/null differ diff --git a/content/static/foundation-site/imgs/ben_worksample_sm.png b/content/static/foundation-site/imgs/ben_worksample_sm.png deleted file mode 100644 index 23d723fe3..000000000 Binary files a/content/static/foundation-site/imgs/ben_worksample_sm.png and /dev/null differ diff --git a/content/static/foundation-site/imgs/dan_worksample_sm.png b/content/static/foundation-site/imgs/dan_worksample_sm.png deleted file mode 100644 index a29e3dba9..000000000 Binary files a/content/static/foundation-site/imgs/dan_worksample_sm.png and /dev/null differ diff --git a/content/static/foundation-site/imgs/greg_worksample1.png b/content/static/foundation-site/imgs/greg_worksample1.png deleted file mode 100644 index 61ab8c712..000000000 Binary files a/content/static/foundation-site/imgs/greg_worksample1.png and /dev/null differ diff --git a/content/static/foundation-site/imgs/greg_worksample2.png b/content/static/foundation-site/imgs/greg_worksample2.png deleted file mode 100644 index d1411648b..000000000 Binary files a/content/static/foundation-site/imgs/greg_worksample2.png and /dev/null differ diff --git a/content/static/foundation-site/imgs/greg_worksample3.png b/content/static/foundation-site/imgs/greg_worksample3.png deleted file mode 100644 index fb5a1e0ae..000000000 Binary files a/content/static/foundation-site/imgs/greg_worksample3.png and /dev/null differ diff --git a/content/static/foundation-site/imgs/john_worksample_sm.png b/content/static/foundation-site/imgs/john_worksample_sm.png deleted file mode 100644 index 21c3ad277..000000000 Binary files a/content/static/foundation-site/imgs/john_worksample_sm.png and /dev/null differ diff --git a/content/static/foundation-site/imgs/lauren_worksample1.png b/content/static/foundation-site/imgs/lauren_worksample1.png deleted file mode 100644 index c6aed5299..000000000 Binary files a/content/static/foundation-site/imgs/lauren_worksample1.png and /dev/null differ diff --git a/content/static/foundation-site/imgs/lauren_worksample2.png b/content/static/foundation-site/imgs/lauren_worksample2.png deleted file mode 100644 index 71a59024e..000000000 Binary files a/content/static/foundation-site/imgs/lauren_worksample2.png and /dev/null differ diff --git a/content/static/foundation-site/imgs/lauren_worksample3.png b/content/static/foundation-site/imgs/lauren_worksample3.png deleted file mode 100644 index dd32868d8..000000000 Binary files a/content/static/foundation-site/imgs/lauren_worksample3.png and /dev/null differ diff --git a/content/static/foundation-site/imgs/processing-foundation-logo.svg b/content/static/foundation-site/imgs/processing-foundation-logo.svg deleted file mode 100644 index 76b2e09a2..000000000 --- a/content/static/foundation-site/imgs/processing-foundation-logo.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - -Processing Foundation - diff --git a/content/static/foundation-site/imgs/processing-logo.svg b/content/static/foundation-site/imgs/processing-logo.svg deleted file mode 100644 index 6eaebe60a..000000000 --- a/content/static/foundation-site/imgs/processing-logo.svg +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/content/static/foundation-site/imgs/processing-site.png b/content/static/foundation-site/imgs/processing-site.png deleted file mode 100644 index 615c4b9c0..000000000 Binary files a/content/static/foundation-site/imgs/processing-site.png and /dev/null differ diff --git a/content/static/foundation-site/imgs/reas_worksample_sm.png b/content/static/foundation-site/imgs/reas_worksample_sm.png deleted file mode 100644 index cbf6befe7..000000000 Binary files a/content/static/foundation-site/imgs/reas_worksample_sm.png and /dev/null differ diff --git a/content/static/foundation-site/imgs/search-f.svg b/content/static/foundation-site/imgs/search-f.svg deleted file mode 100644 index 8066b89ab..000000000 --- a/content/static/foundation-site/imgs/search-f.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - diff --git a/content/static/foundation-site/imgs/wilm_worksample1.png b/content/static/foundation-site/imgs/wilm_worksample1.png deleted file mode 100644 index 74514bb21..000000000 Binary files a/content/static/foundation-site/imgs/wilm_worksample1.png and /dev/null differ diff --git a/content/static/foundation-site/imgs/wilm_worksample2.png b/content/static/foundation-site/imgs/wilm_worksample2.png deleted file mode 100644 index 33a021566..000000000 Binary files a/content/static/foundation-site/imgs/wilm_worksample2.png and /dev/null differ diff --git a/content/static/foundation-site/imgs/wilm_worksample3.png b/content/static/foundation-site/imgs/wilm_worksample3.png deleted file mode 100644 index f009d61fe..000000000 Binary files a/content/static/foundation-site/imgs/wilm_worksample3.png and /dev/null differ diff --git a/content/static/foundation-site/mission.html b/content/static/foundation-site/mission.html deleted file mode 100644 index b26fe4bd7..000000000 --- a/content/static/foundation-site/mission.html +++ /dev/null @@ -1,37 +0,0 @@ -

    Mission

    - -

    - - - - -
    - -

    - Since its inception in 2001, Processing has sought to bridge the traditionally divided cultures of the arts and the sciences. The mission of the Processing Foundation is to link these two cultures so they can be used within a diverse constituency, by way of developing the Processing software. For those with a tendency to think in numbers, Processing introduces a language of the visual arts through a more familiar computer science vocabulary. Likewise, the software is structured through an image-based framework, making it accessible to visual thinkers. Core computer science concepts like variables, functions, and conditionals are taught side by side with visual basics like image, shape, and color. -

    - -

    - The key to our philosophy is the merging between the two: we see software as a medium, or something that connects two things. We view it as a means for making, and see our role as providing a new medium to artists and users across a variety of fields. At a time when our society requires a literacy and sensitivity to media of all kinds, we see ourselves making this possible for a broad spectrum of constituencies. - -

    - -

    - Processing serves a wide range of communities in different contexts, from the university classroom to the tinkerer’s garage, used by everyone from the professional to the hobbyist. Within education at a university level, we have seen Processing leveraged as a classroom tool across disciplines as varied as computer science, English, art, architecture, design, and the digital humanities. In the last few years, it has begun to become a presence in high school and middle school classrooms, being particularly effective when used to teach science, math, and more generally, computer science. For example, the Kahn Academy now uses Processing’s tutorials and language in their beginning computer science instruction. In areas of professional development, Processing has become enfolded into the practices of interface and communication designers, artists and media artists, photographers, architects, and filmmakers. It also has a substantial role in the communities of makers and amateurs, and among hackerspaces and gatherings of hobbyists. - -

    - -

    - The growing use of Processing in the classroom over the last twelve years has pointed toward a direction to rethink the way students are taught to program. Instead of learning a specific vocational skill (such as any one certain programming language or software), the teaching of Processing follows from a philosophy that advocates for a more generalized and strategic way of thinking. Because technology changes at such a rapid pace, the goal of any education in software has to teach the fundamentals of programming. With knowledge of such a foundation, a student is able to learn any other piece of software. Processing was specifically designed to relate to other languages, so a working knowledge of it means that a student can become well-versed in others that are more domain-specific, in relatively little time. Also, it uses a visual framework, so as to be more accessible to people who don’t naturally think like mathematicians or computer scientists. This has opened the door for software to become part of an artist’s toolkit in a way never before seen. -

    - -

    - The use of Processing within the visual arts and design fields has grown continuously since the software was first released. Appearing at a critical moment when artists began introducing new media and technology into their practices, Processing has allowed for thousands of creative professionals to leverage it as a medium, changing the landscape of the arts at the beginning of the 21st century. Software is still a nascent medium for artists and designers, and part of The Processing Foundation’s mission is to nurture this trajectory to be both widely used and accepted. -

    - -

    - Within technology, Processing has made it possible to understand massive data sets in a visual and more accessible way. It has also helped foster the connection between engineering and visual design that has been pushed to the fore by Apple and others. -

    - -
    -

    diff --git a/content/static/foundation-site/overview.html b/content/static/foundation-site/overview.html deleted file mode 100644 index a7addf80c..000000000 --- a/content/static/foundation-site/overview.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - -
    - -

    - The Processing Foundation was founded in 2012 with the two-fold mission to promote software literacy within the visual arts, and visual literacy within technology-related fields. Our primary goal is to empower people of all interests and backgrounds to learn how to program, so as to facilitate a sophisticated way of thinking about and creating media at a time when such knowledge is crucial. We do this by developing and distributing a group of related software projects, which includes Processing (Java), p5.js (Javascript), and Processing.py (Python). -

    - -

    -We serve a growing community of artists, designers, educators, programmers, engineers, and anyone in between who has an inclination toward both the arts and technology. Core to our belief is that learning how to program is a process of learning how to think, rather than acquiring a certain skillset, so that this knowledge may be applied to any number of fields, from creating artworks to imagining new technologies. We view Processing as a means to bridge seemingly disparate disciplines, providing platforms for collaboration between communities that might not otherwise have had access to each other. We also envision Processing as a new tool for both artists and technologists to use in their work, as a medium and as a context. We see ourselves situated at the place of convergence between the arts and technology, facilitating the pursuit and literacy of both. -

    - -

    -Processing is primarily developed by a dedicated group affiliated with Fathom Information Design (Boston), the UCLA Arts Software Studio (Los Angeles), and ITP at NYU (New York City). -

    - -

    - The Processing Foundation supports a fellowship program to initiate and develop research projects for the Processing software. -

    - -

    -We are supported by our community and actively seek donations through downloads of Processing. -

    - -

    -Contact us at foundation@processing.org -

    - -
    diff --git a/content/static/foundation-site/patrons.html b/content/static/foundation-site/patrons.html deleted file mode 100644 index da4035913..000000000 --- a/content/static/foundation-site/patrons.html +++ /dev/null @@ -1,56 +0,0 @@ -

    Patrons

    - -

    - - - - - -
    - -

    - Individuals making $5 to $100 donations are the largest source of income for the Processing Foundation. We’re grateful to all who have donated and we’re proud to be supported by the community. You can donate when you download the software here. -

    - -

    - The University of Denver and the Emergent Digital Practices program sponsored a Processing 3.0 development meeting in November 2014. We thank Chris Coleman and Laleh Mehran for arranging this session and gracefully hosting us. -

    - -

    - The Google Summer of Code program has provided and excellent source of energy and new development through supporting students to work with us. This program has now supported Processing for four years, 2010 to 2014. It has provided the base for many important enhancements to the software. -

    - -

    - In 2013, O'Reilly Media and Arduino made donations to the Processing Foundation. -

    - -

    - Prior to incorporating as a Foundation, Processing received key funding and support from several organizations and companies. These commitments enabled a series of pivotal improvements to the software: -

    - -
      - -
    • - The Interactive Telecommunications Program (ITP) at New York University sponsored a Processing 2.0 development workshop in the summer of 2011. -
    • - -
    • - The Armstrong Institute for Interactive Media Studies at Miami University funded The Oxford Project, a series of Processing development workshops during the 2008-2009 academic year. These four-day meetings in Oxford, Ohio, enabled the November 2008 launch of Processing 1.0 and stimulated future development. -
    • - -
    • - Oblong Industries funded Ben Fry to develop Processing during the summer of 2008. This funding also assisted in the completion of the 1.0 release. -
    • -
    • - The Rockefeller Foundation awarded Ben Fry with a Media Arts Fellowship in 2006. The grant marked the first time that Ben was able to work on Processing as a funded project. This support led to further developments of the OpenGL and PDF rendering engines, as well as significant enhancements to other libraries and their integration. -
    • - -
    • - The Interaction Design Institute Ivrea funded four individuals' work on Processing in the summer of 2003. This resulted in Dan Mosedale's preprocessor using Antlr, Sami Arola's contributions to the graphics engine, and other contributions to the Processing Development Environment and 2D graphics engine. We are grateful to Interaction Ivrea director Gillian Crampton Smith for her encouragement and support. -
    • - -
    - - -
    -

    diff --git a/content/static/foundation-site/people.html b/content/static/foundation-site/people.html deleted file mode 100644 index 7717c41e3..000000000 --- a/content/static/foundation-site/people.html +++ /dev/null @@ -1,62 +0,0 @@ -

    Board of Directors

    - - - - - - - - - - - - - - - - - -
    - - - Ben Fry is principal of Fathom, a design and software consultancy located in Boston. He received his doctoral degree from the Aesthetics + Computation Group at the MIT Media Laboratory, where his research focused on combining fields such as computer science, statistics, graphic design, and data visualization as a means for understanding information. After completing his thesis, he spent time developing tools for visualization of genetic data as a postdoc with Eric Lander at the Eli and Edythe L. Broad Institute of MIT and Harvard. During the 2006-2007 school year, Ben was the Nierenberg Chair of Design for the Carnegie Mellon School of Design. In 2011, he won the National Design Award for Interaction Design from the Cooper-Hewitt. With Casey Reas, Fry initiated Processing in 2001. -
    - - - Casey Reas is an artist and educator based in Los Angeles. He has exhibited, screened, and performed his work internationally in galleries and museums around the world. Reas is a professor at the University of California, Los Angeles. He holds a masters degree from the Massachusetts Institute of Technology in Media Arts and Sciences as well as a bachelors degree from the School of Design, Architecture, Art, and Planning at the University of Cincinnati. With Ben Fry, Reas initiated Processing in 2001. -
    - - - Daniel Shiffman works as an Associate Arts Professor at the Interactive Telecommunications Program at NYU's Tisch School of the Arts. Originally from Baltimore, Daniel received a BA in Mathematics and Philosophy from Yale University and a Master's Degree from the Interactive Telecommunications Program. He works on developing tutorials, examples, and libraries for Processing, the open source programming language and environment created by Casey Reas and Ben Fry. He is the author of Learning Processing: A Beginner's Guide to Programming Images, Animation, and Interaction and The Nature of Code (self-published via Kickstarter), an open source book about simulating natural phenomenon in Processing. -
    - -

    Assistant Director

    - - - - - - - - -
    - - - Johanna Hedva is an artist and writer whose practice manifests in a wide range of projects, from performances of Ancient Greek plays rewritten to respond to feminist and queer political discourse, to poetry, novels, criticism, and theory. She's got an MA in Aesthetics and Politics, and an MFA in Art, from California Institute of the Arts, and has been an artist-in-residence at Headlands Center for the Arts, and writer-in-residence at the Armory Center for the Arts. Her work with the Processing Foundation is motivated by her political and social commitments to gender and racial diversity in technology and the arts; open-source philosophy and practice; and promoting the attenuation of the boundaries between creative and thought-making disciplines of all kinds. -
    - - -

    Advisor

    - - - - - - - - -
    - - - John Maeda is currently a Design Partner at Kleiner Perkins Caufield & Byers. He was the President of the Rhode Island School of Design from 2008 to 2013, is a recipient of the National Design Award, and is represented in the permanent collection of the Museum of Modern Art. Beginning in 1996, lasting for 13 years, he was a Professor at MIT, where he served as an Associate Director of Research at the MIT Media Lab and was responsible for managing research relationships with 70+ industrial organizations. He received a Ph.D. in Design Science from the University of Tsukuba Institute of Art and Design in Japan. In May 2003, he received an Honorary Doctorate of Fine Arts from the Maryland Institute of Contemporary Art. He received an MBA from Arizona State University in May 2006. -
    diff --git a/content/static/foundation-site/projects.html b/content/static/foundation-site/projects.html deleted file mode 100644 index 926060e62..000000000 --- a/content/static/foundation-site/projects.html +++ /dev/null @@ -1,49 +0,0 @@ -

    Projects

    - -

    - - - - -
    - -

    Processing

    - -

    - Processing is a programming language, development environment, and online community. Founded in 2001, Processing was initially created to serve as a software sketchbook and to teach computer programming fundamentals within a visual context. Processing has since evolved into a development tool for professionals, an educational tool used in classrooms around the country, and a new context and medium for artists. Today, there are tens of thousands of students, artists, designers, researchers, and hobbyists who use Processing for learning, prototyping, and production. -

    - -

    - It was designed to be a user’s first programming language, inspired by earlier languages like BASIC and Logo, as well as our experiences as students and teaching visual arts foundation curricula. It is now used in classrooms worldwide, often in art schools and visual arts programs in universities, but also in high schools, computer science programs, and humanities curricula. -

    - -

    - In addition to educational purposes, the Processing software is used by thousands of visual designers, artists, and architects to create their works. Projects created with Processing have been featured at the Museum of Modern Art in New York, the Victoria and Albert Museum in London, the Centre Georges Pompidou in Paris, and many other prominent venues. Processing is used to create projected stage designs for dance and music performances; to generate images for music videos and film; to export images for posters, magazines, and books; and to create interactive installations in galleries, in museums, and on the street. -

    - -
    - -

    p5.js

    - -

    - p5.js is a JavaScript library that starts with the original goal of Processing--to make coding accessible for artists, designers, educators, and beginners--and reinterprets this for today's web. Using the original metaphor of a software sketchbook, p5.js has a full set of drawing functionality for the entire browser page. For this, p5.js has addon libraries that streamline interaction with other HTML5 objects, including text, input, video, webcam, and sound. -

    - -

    - Having just been released, p5.js is in active development, with an official editing environment and other features coming soon. -

    - -
    - -

    Processing.py

    - -

    - Our most recent initiative: To write Processing code. In Python. -

    - -

    - We are thrilled to make available this public release of the Python Mode for Processing, and its associated documentation. If you'd like to help us improve the implementation of Python Mode and its documentation, please find us on Github. -

    - -
    -

    diff --git a/content/static/foundation-site/reports.html b/content/static/foundation-site/reports.html deleted file mode 100644 index bd1dff641..000000000 --- a/content/static/foundation-site/reports.html +++ /dev/null @@ -1,176 +0,0 @@ -

    Annual Reports

    - -

    - - - - - -
    - -

    2013 Report

    - -

    - We had a busy and productive 2013 with a wide range of activities: -

      -
    • Released Processing 2.0 and 2.1
    • -
        -
      • New OpenGL renderers for speed
      • -
      • Integrated GLSL shaders and API
      • -
      • New video library for faster capture and playback
      • -
      • Enhanced library manager for easy install
      • -
      • Enhanced modes infrastructure to make it easier to add new languages to the PDE
      • -
      • New features for working with XML and JSON
      • -
      • New classes for working with data
      • -
      • New features for working with SVN and OBJ
      • -
      -
    • Launched "Hello Processing" video tutorial
    • - -
    • Processing Fellows
    • -
        -
      • Lauren McCarthy, exploratory research led to p5.js
      • -
      • Greg Borenstein, released OpenCV library
      • -
      • Wilm Thoben, work started on new core Sound library
      • -
      -
    • Community Development
    • -
        -
      • Worked with community library authors to port and develop 109 libraries for 2.0
      • -
      • New templates developed for creating libraries and tools
      • -
      • 2.0 Processing Forum launched and 1.0 Forum archived
      • -
      • Website redesigned with simplified navigation and new tutorials
      • -
      - -
    • Thank you! This year, we're especially grateful to the following people and groups:
    • -
        -
      • Processing users who have donated through the Download page
      • -
      • O'Reilly Media for the December 2013 matching grant
      • -
      • Arduino for the generous donation in February 2013
      • -
      • The Google Summer of Code program for supporting students to work with us
      • -
      -
    -

    - -
    -
    -

    Google Summer of Code

    - -

    2014 Report

    - -

    - The Processing Foundation participated in Google Summer of Code for its fourth consecutive year in 2014, completing a total of eleven projects (summarized below) with a group of dedicated, innovative, and inspiring students. -

      -
    • “Android Mode for Processing 3.0” by Imil Ziyaztdinov, mentored by Andres Colubri
    • -
        -
      • Export signed package (with transparent handing of keystores)
      • -
      • Device selector
      • -
      • Automatic SDK download/installation
      • -
      • Target SDK selector
      • -
      • Fixed critical bugs, most notably the missing javac error during package building
      • -
      - -
    • “Contributions Manager: Reloaded” by Joel Moniz, mentored by Florian Jenett
    • -
        -
      • Addition, removal, and update of Tools and Modes without restart
      • -
      • New "examples-package"-type contribution
      • -
      -
    • “Loom” by Chris Johnson-Roberson, mentored by R. Luke DuBois
    • -
        -
      • Allows for creation and manipulation of patterns from timed events.
      • -
      -
    • New video library using GStreamer 1.x by Roland Elek, co-mentored by Levente Farkas and Andres Colubri
    • -
        -
      • Creates a set of Java bindings for the GStreamer 1.x series to use within Processing
      • -
      -
    • “ofSketch” by Brannon Dorsey, mentored by Christopher Baker -
    • -
        -
      • Browser-based IDE for openFrameworks
      • -
      • API specific autocomplete
      • -
      • Compilation feedback
      • -
      • Error reporting
      • -
      • Project export
      • -
      • Remote coding capabilities
      • -
      • Raspberry Pi support
      • -
      -
    • “p5.sound” by Jason Sigal, mentored by Evelyn Eastmond
    • -
        -
      • Audio input
      • -
      • Playback
      • -
      • Manipulation
      • -
      • Effects
      • -
      • Recording
      • -
      • Analysis
      • -
      • Synthesis
      • -
      • Built with syntax from Wilm Thoben's Sound for Processing library
      • -
      -
    • “p5 IDE” by Sam Lavigne, mentored by Lauren McCarthy -
    • -
        -
      • Easy to use desktop IDE for creating pg5.js projects
      • -
      - -
    • “PDE X for Processing 3.0” by Manindra Moharana, mentored by Daniel Shiffman -
    • -
        -
      • Easy to use desktop IDE for creating p5.js projects
      • -
      - -
    • “POculus” by Pratik Sharma, mentored by Elie Zananiri -
    • -
        -
      • Oculus Rift renderer for Processing
      • -
      • Runs any P3D sketch in an Oculus Rift
      • - -
      - -
    • “Sound for Processing 3.0” by Wilm Thoben, mentored by Casey Reas
    • -
        -
      • New lightweight sound library for Processing
      • -
      • Using enhanced version of the methcla sound engine
      • -
      • Low latency support
      • -
      • Synthesis objects, analyzers, and effects
      • -
      - -
    • “TweakMode” for Processing 3.0 by Gal Sasson, mentored by Daniel Shiffman
    • -
        -
      • Allows changing sketch parameters in real-time.
      • -
      -
    -

    - -
    -

    2013 Report

    - -

    - In 2013, our third year participating in Google Summer of Code, the Processing Foundation completed four projects in collaboration and mentorship with a group of talented students. -

      -
    • “GUI Library for Processing” by Martin Leopold
    • -
        -
      • Prototype for new graphical user interface for Processing
      • -
      - -
    • “PDE X” by Manindra Moharana
    • -
        -
      • Augments the Processing development
      • -
      • Code completion
      • -
      • Refactoring
      • -
      • Real-time error checking
      • -
      • Debugging
      • -
      -
    • “Serial Library for Processing” by Gottfried Haider
    • -
        -
      • Replaces existing RXTX-based serial library with one built on top of Java Simple Serial Connector
      • -
      • Improved corss platform support
      • -
      -
    • “Tweak Mode” by Gal Sasson
    • -
        -
      • Allows "tweaking" of hard-coded numbers in real-time through a GUI built into Processing's PDE
      • -
      -

      - - -
    -

    diff --git a/content/static/foundation.html b/content/static/foundation.html deleted file mode 100644 index caa4c380c..000000000 --- a/content/static/foundation.html +++ /dev/null @@ -1,121 +0,0 @@ -

    Foundation. The Processing Foundation is an organization that develops software tools for the visual arts.

    - -

    - - - - - -
    - - -

    Overview

    - -

    - The goal of the Processing Foundation is to promote software literacy, particularly within the visual arts, and to promote visual literacy within technology. Our primary charge is to develop and distribute the Processing software, both the core Application Programming Interface (API) and the programming environment, the Processing Development Environment (PDE). The board of directors for the Processing Foundation consists of Ben Fry, Casey Reas, and Dan Shiffman. The first member of the board of advisors is John Maeda. -

    - -

    - To succeed, the Foundation needs to raise money to support future versions of the Processing software and related initiatives. The Processing team, a small group of volunteers, has released over 200 versions of the software since 2001, leading to the 2.0 release in the spring of 2013.With almost no funding between the 1.0 and 2.0 releases, the software was written slowly while the developers managed full-time work and many other responsibilities. The 2.0 software release happened in an unsustainable way, at tremendous personal expense to the lead developers. The Foundation must raise funding for the initiative to continue. -

    - -

    - With the 2.0 software release, we're now asking for donations from individuals who use the software, and we're actively seeking larger gifts from individuals, companies, and other non-profit organizations. To learn more about why you might want to contribute, please read the 2013 status report below. The Processing Foundation was publicly announced in June 2013 with the release of the Processing 2.0 software. Our official non-profit status was was granted by the IRS on 6 March 2014, with our tax exception status retroactive to our date of formation, 14 June 2012. -

    -

    - - - -

    2013 Report

    - -

    - We had a busy and productive 2013 with a wide range of activities: -

      -
    • Released Processing 2.0 and 2.1
    • -
        -
      • New OpenGL renderers for speed
      • -
      • Integrated GLSL shaders and API
      • -
      • New video library for faster capture and playback
      • -
      • Enhanced library manager for easy install
      • -
      • Enhanced modes infrastructure to make it easier to add new languages to the PDE
      • -
      • New features for working with XML and JSON
      • -
      • New classes for working with data
      • -
      • New features for working with SVN and OBJ
      • -
      -
    • Launched "Hello Processing" video tutorial
    • - -
    • Processing Fellows
    • -
        -
      • Lauren McCarthy, exploratory research led to p5.js
      • -
      • Greg Borenstein, released OpenCV library
      • -
      • Wilm Thoben, work started on new core Sound library
      • -
      -
    • Community Development
    • -
        -
      • Worked with community library authors to port and develop 109 libraries for 2.0
      • -
      • New templates developed for creating libraries and tools
      • -
      • 2.0 Processing Forum launched and 1.0 Forum archived
      • -
      • Website redesigned with simplified navigation and new tutorials
      • -
      -
    • Google Summer of Code 2013. For the third year, we mentored a group of university students to explore their ideas for extended Processing. Please read our summary post.
    • -
        -
      • Manindra Moharana's PDEX brings code completion, debugging, and more to the PDE
      • -
      • Gal Sasson's Tweak Mode makes it easy to modify parameters while a program runs
      • -
      • Gottfried Haider's Serial library is a needed update to the core library
      • -
      • Martin Leopold's GUI library is a new approach to created interface elements
      • -
      -
    • Thank you! This year, we're especially grateful to the following people and groups:
    • -
        -
      • Processing users who have donated through the Download page
      • -
      • O'Reilly Media for the December 2013 matching grant
      • -
      • Arduino for the generous donation in February 2013
      • -
      • The Google Summer of Code program for supporting students to work with us
      • -
      -
    -

    - -

    - Despite the new fundraising goals, Processing remains almost entirely a volunteer organization pushed forward by a small group of people. In starting our fundraising push, the initial goal was to hire one full-time developer to maintain and build the Processing code base, while the current Processing team continues to volunteer time to the project. We've received a constant stream of donations through the Download page interface, but at the end of nine months the amount is about 10% of what we need to hire a developer. We're currently utilizing the donations to support Processing Fellows, short-term appointments to explore future directions for Processing and to produce essential libraries. For instance, we supported Lauren McCarthy to explore new ideas for integrating Processing with JavaScript and we supported Greg Borenstein to development the new OpenCV library. -

    - - - -

    Patrons

    - -

    - Individuals making $5 to $100 donations are the largest source of income for the Processing Foundation. We're grateful to all who have donated and we're proud to be supported by the community. -

    - -

    - In 2013, O'Reilly Media and Arduino made donations to the Processing Foundation. -

    - -

    - The Google Summer of Code program has provided and excellent source of energy and new development through supporting students to work with us. This program has now supported Processing for three years, 2010 to 2013. It has provided the base for many important enhancements to the software. -

    - -

    - Prior to incorporating as a Foundation, Processing received key funding and support from several organizations and companies. These commitments enabled a series of pivotal improvements to the software. -

    - -

    - The Interactive Telecommunications Program (ITP) at New York University sponsored a Processing 2.0 development workshop in the summer of 2011. -

    - -

    - The Armstrong Institute for Interactive Media Studies at Miami University funded The Oxford Project, a series of Processing development workshops during the 2008-2009 academic year. These four-day meetings in Oxford, Ohio, enabled the November 2008 launch of Processing 1.0 and stimulated future development. -

    - -

    - Oblong Industries funded Ben Fry to develop Processing during the summer of 2008. This funding also assisted in the completion of the 1.0 release. The Rockefeller Foundation awarded Ben Fry with a Media Arts Fellowship in 2006. The grant marked the first time that Ben was able to work on Processing as a funded project. This support led to further developments of the OpenGL and PDF rendering engines, as well as significant enhancements to other libraries and their integration. -

    - -

    - The Interaction Design Institute Ivrea funded four individuals' work on Processing in the summer of 2003. This resulted in Dan Mosedale's preprocessor using Antlr, Sami Arola's contributions to the graphics engine, and other contributions to the Processing Development Environment and 2D graphics engine. We are grateful to Interaction Ivrea director Gillian Crampton Smith for her encouragement and support. -

    - -
    -

    diff --git a/content/static/handbook.html b/content/static/handbook.html index facd7fdbc..27ef76ed6 100644 --- a/content/static/handbook.html +++ b/content/static/handbook.html @@ -6,13 +6,13 @@

    Processing: A Programming Handbook Published December 2014, The MIT Press.
    720 Pages. Hardcover.

    - » Order from MIT Press
    + » Order from MIT Press
    » Order from Amazon

    » Download Examples
    » Errata

    - If you are an educator, you can request a desk/exam copy from the MIT Press website. + If you are an educator, you can request a desk/exam copy from the MIT Press website.

    @@ -28,7 +28,7 @@

    Processing: A Programming Handbook

    - Interviews with SUE.C, Larry Cuba, Mark Hansen, Lynn Hershman Leeson, Jürg Lehni, LettError, Golan Levin and Zachary Lieberman, Benjamin Maus, Manfred Mohr, Ash Nehru, Josh On, Bob Sabiston, Jennifer Steinkamp, Jared Tarbell, Steph Thirion, and Robert Winter. + Interviews with SUE.C, Larry Cuba, Mark Hansen, Lynn Hershman Leeson, Jürg Lehni, LettError, Golan Levin and Zachary Lieberman, Benjamin Maus, Manfred Mohr, Ash Nehru, Josh On, Bob Sabiston, Jennifer Steinkamp, Jared Tarbell, Steph Thirion, and Robert Winter.

    @@ -46,17 +46,17 @@

    Extensions


    Extension 2: Network by Alexander Galloway
    -Explains the fundamental ideas and technologies behind the internet followed by basic examples that use the Processing Net library. +Explains the fundamental ideas and technologies behind the internet followed by examples that use the Processing Net library.

    -Extension 3: Sound by R. Luke Dubois and Wilm Thoben +Extension 3: Sound by R. Luke Dubois and Wilm Thoben
    -The basics of digital sound. +The basics of digital sound with examples for synthesis, playback, and analysis.

    Extension 4: Print by Casey Reas
    -Using Processing to output print quality images and documents. +Output print-resolution images and documents.

    Extension 5: Electronics by Hernando Berragán and Casey Reas diff --git a/content/static/media.zip b/content/static/media.zip index 7882d13a9..9104b6b08 100644 Binary files a/content/static/media.zip and b/content/static/media.zip differ diff --git a/content/static/overview.html b/content/static/overview.html index 13349191d..d5d3d30ff 100644 --- a/content/static/overview.html +++ b/content/static/overview.html @@ -6,14 +6,11 @@

    Overview. A short introducti

    - For the past fourteen years, Processing has promoted software literacy, particularly within the visual arts, and visual literacy within technology. Initially created to serve as a software sketchbook and to teach programming fundamentals within a visual context, Processing has also evolved into a development tool for professionals. The Processing software is free and open source, and runs on the Mac, Windows, and GNU/Linux platforms. - -

    - Processing continues to be an alternative to proprietary software tools with restrictive and expensive licenses, making it accessible to schools and individual students. Its open source status encourages the community participation and collaboration that is vital to Processing’s growth. Contributors share programs, contribute code, and build libraries, tools, and modes to extend the possibilities of the software. The Processing community has written more than a hundred libraries to facilitate computer vision, data visualization, music composition, networking, 3D file exporting, and programming electronics. + For the past sixteen years, Processing has promoted software literacy, particularly within the visual arts, and visual literacy within technology. Initially created to serve as a software sketchbook and to teach programming fundamentals within a visual context, Processing has also evolved into a development tool for professionals. The Processing software is free and open source, and runs on the Mac, Windows, and GNU/Linux platforms.

    - Processing is currently developed primarily in Boston (at Fathom Information Design), Los Angeles (at the UCLA Arts Software Studio), and New York City (at NYU’s ITP). + Processing continues to be an alternative to proprietary software tools with restrictive and expensive licenses, making it accessible to schools and individual students. Its open source status encourages the community participation and collaboration that is vital to Processing’s growth. Contributors share programs, contribute code, and build libraries, tools, and modes to extend the possibilities of the software. The Processing community has written more than a hundred libraries to facilitate computer vision, data visualization, music composition, networking, 3D file exporting, and programming electronics.

    Education

    @@ -27,7 +24,7 @@

    Education

    - The innovations in teaching through Processing have been adapted for the Khan Academy computer science tutorials, offered online for free. The tutorials begin with drawing, using most of the Processing functions for drawing. The Processing approach has also been applied to electronics through the Arduino and Wiring projects. Arduino uses a syntax inspired by that used with Processing, and continues to use a modified version of the Processing programming environment to make it easier for students to learn how to program robots and countless other electronics projects. + The innovations in teaching through Processing have been adapted for the Khan Academy computer science tutorials, offered online for free. The tutorials begin with drawing, using most of the Processing functions for drawing. The Processing approach has also been applied to electronics through the Arduino and Wiring projects. Arduino uses a syntax inspired by that used with Processing, and continues to use a modified version of the Processing programming environment to make it easier for students to learn how to program robots and countless other electronics projects.

    Culture

    @@ -45,21 +42,23 @@

    Research

    Foundation

    -The primary charge of the Foundation is to develop and distribute the Processing software. This includes the original Processing (Java), p5.js (Javascript), and Processing.py (Python). There is more information about the Foundation at http://foundation.processing.org/. +The primary charge of the Foundation is to develop and distribute the Processing software. This includes the original Processing (Java), p5.js (Javascript), and Processing.py (Python). There is more information about the Foundation at https://processingfoundation.org/.

    History

    - Processing was started by Ben Fry and Casey Reas in the spring of 2001, while both were graduate students at the MIT Media Lab within John Maeda's Aesthetics and Computation research group. Development continued in their free time while Casey pursued his artistic and teaching career and Ben pursued a Ph.D. and founded Fathom Information Design. Many of the ideas in Processing go back to Muriel Cooper's Visual Language Workshop, and it grew directly out of Maeda's Design By Numbers project, developed at the Media Lab and released in 1999. The Wiring and Arduino projects, in turn, grew out of Processing while Casey was teaching at the Interaction Design Institute Ivrea in Italy. Processing also prompted John Resig (jQuery) to build Processing.js, a JavaScript version that then inspired more related work such as the Khan Academy curriculum in computer science. Versions of Processing that use Python, Ruby, ActionScript, and Scala are also in development. Processing and its sister projects have inspired over twenty educational books. + Processing was started by Ben Fry and Casey Reas in the spring of 2001, while both were graduate students at the MIT Media Lab within John Maeda's Aesthetics and Computation research group. Development continued in their free time while Casey pursued his art and teaching career and Ben pursued a Ph.D. and founded Fathom Information Design. Many of the ideas in Processing go back to Muriel Cooper's Visual Language Workshop, and it grew directly out of Maeda's Design By Numbers project, developed at the Media Lab and released in 1999. The Wiring and Arduino projects, in turn, grew out of Processing while Casey was teaching at the Interaction Design Institute Ivrea in Italy.

    +

    For more information, please write to foundation@processing.org diff --git a/content/static/people.html b/content/static/people.html index 46138e4b6..d406b648c 100755 --- a/content/static/people.html +++ b/content/static/people.html @@ -1,95 +1,81 @@

    People. Processing is a community effort led by a small group of volunteers.

    - +
    - - -

    - Lead Developers
    + Project Leads
    Ben Fry and Casey Reas started Processing in Spring 2001 and continue to obsessively work on it. In 2012, they started the Processing Foundation along with Dan Shiffman, who formally joined as a third project lead.

    -

    - Senior Developers
    - Andres Colubri (Boston), OpenGL / Video
    - Florian Jenett (Frankfurt), Forum
    - Elie Zananiri (Montreal), Contributed Libraries / Tools
    - Scott Murray (San Francisco), Website / Reference
    -

    -

    Developers
    - Scott Garner (New York), Hello Processing Website
    - Gottfried Haider (Amsterdam), Serial Library Updates (64-bit)
    - Jamie Kosoy (San Francisco), Website
    - Manindra Moharana (Delhi), PDE / Core
    - James Grady (Boston), Visual Design
    + Andres Colubri (Boston), OpenGL / Video
    + Elie Zananiri (New York), Contributed Libraries / Tools
    + Samuel Pottinger (San Francisco), Processing Core

    -

    - Fellows
    - Lauren McCarthy (New York), Spring/Summer/Fall 2013
    - Greg Borenstein (New York), Spring/Summer 2013
    - Wilm Thoben (Los Angeles), Fall 2013/Winter 2014
    -

    - -

    - Google Summer of Code 2014
    - Roland Elek, GStreamer 1.x Java Bindings
    - Chris Johnson-Roberson, Loom: An Audiovisual Pattern Language
    - Manindra Moharana, PDE X
    - Joel Moniz, Git Manager Tool
    - Gal Sasson, PDE Improvements and Tweak Mode
    - Pratik Sharma, Oculus Rift Library
    - Wilm Thoben, Sound Library
    - Imil Ziyaztdinov, Android Mode Improvements
    -

    + -

    +

    Libraries, Tools
    - The core Processing software is augmented by libraries and tools contributed through the community. - These inventive extensions are a bright future for the project. We have a list of - Contributed Libraries and + The core Processing software is augmented by libraries and tools contributed through + the community. These inventive extensions are a bright future for the project. We have a + list of Contributed Libraries and Contributed Tools posted online. - These contributions can't be underestimated. For example, see how - Karsten Schmidt (London) has transformed Processing - through the toxiclibs library and how - Damien Di Fede (Austin) has extended the project - into programming sound through his minim - library.
    + These contributions can't be underestimated. For example, see how Karsten Schmidt (London) has + transformed Processing through the toxiclibs library and how Damien Di Fede (Austin) has extended + the project into programming sound through his minim library.

    - - - +

    - Developer Alumni
    - David Wicks, Reference Engine
    - Jon Gacnik, Website
    + Alumni
    + Jakub Valtar (Brno), Processing Core
    + Scott Garner (New York), Hello Processing Website
    + Scott Murray (San Francisco), Website / Reference / UI
    + Gottfried Haider (Los Angeles), Processing for Pi
    + Florian Jenett (Frankfurt), Forum
    + Jamie Kosoy (San Francisco), Website
    + Manindra Moharana (San Diego), PDE / Core
    + James Grady (Boston), Visual Design
    + + Patrick Hebron, Video Library (Summer 2011)
    Peter Kalauskas, Library/Tool/Mode Install Utility (Summer, Fall 2011)
    Andreas Schlegel, Libraries (Winter 2008 - Summer 2011)
    Harshani Nawarathna, Processing Development Environment (Summer 2011)
    Cindy Chi, Reference Editing (Summer 2011)
    - Jonathan Feinberg, Parsing & Android Hacking (Spring 2011)
    + Jonathan Feinberg, Parsing & Android Hacking (Spring 2011)
    Chris Lonnen, Processing Development Environment (Summer 2011)
    Eric Jordan, Graphics Weapon (2007 - 2009)
    Tom Carden, Processing Hacks Director (Summer 2005 - Fall 2008)
    @@ -125,13 +111,9 @@

    People. Processing is a comm Burak Arikan, Turkish

    -

    -   -

    -

    We offer a special "Thank You!" to Sami Arola for writing the base of the original P3D - and Simon Greenwold for incorporting camera and lights. Tom Carden contributed great + and Simon Greenwold for incorporating camera and lights. Tom Carden contributed great energy by co-creating Processing Hacks and maintaining Processing Blogs. Andreas Schlegel did amazing work for over three years organizing the Contributed Libraries and building templates and documentation. diff --git a/content/static/shop/index.html b/content/static/shop/index.html index a1760a39b..bcfd0ba95 100644 --- a/content/static/shop/index.html +++ b/content/static/shop/index.html @@ -60,15 +60,15 @@

    If you're interested in buying a book about Processing,
    - Getting Started with Processing   - Getting Started with Processing
    + Getting Started with Processing, Second Edition
    Casey Reas and Ben Fry
    » More info
    - » Order from Amazon.com + » Order from Amazon.com
    @@ -78,28 +78,8 @@

    If you're interested in buying a book about Processing,

      + @@ -109,7 +89,7 @@

    If you're interested in buying a book about Processing,

    - + + + + - - + + + + + + - - - @@ -456,17 +448,23 @@

    If you're interested in buying a book about Processing,   -

    @@ -551,9 +549,9 @@

    If you're interested in buying a book about Processing,

    diff --git a/content/static/support.html b/content/static/support.html new file mode 100644 index 000000000..2a8f77f05 --- /dev/null +++ b/content/static/support.html @@ -0,0 +1,48 @@ + + +

    + We need your help! Please support Processing by making a donation to the Processing Foundation. Your donation contributes to software development, education resources like code examples and tutorials, Fellowships, and community events. +

    + + + + + + + + + +
    + +
    + + + +

    + The Processing Foundation was established in 2012 after more than a decade of work with the Processing software. The Foundation’s mission is to promote software literacy within the visual arts, and visual literacy within technology-related fields — and to make these fields accessible to diverse communities. Our goal is to empower people of all interests and backgrounds to learn how to program and make creative work with code, especially those who might not otherwise have access to these tools and resources. You can read more about the history of Processing in the short essay "A Modern Prometheus." +

    diff --git a/content/static/tutorials/2darray/index.html b/content/static/tutorials/2darray/index.html index 9510790ed..43370fc01 100644 --- a/content/static/tutorials/2darray/index.html +++ b/content/static/tutorials/2darray/index.html @@ -1,176 +1,206 @@ -

    Two-Dimensional Arrays

    - -

    -

      - Processing: A Programming Handbook for Visual Designers and Artists (Second Edition)
    + Processing: A Programming Handbook for Visual Designers and Artists, Second Edition
    Casey Reas and Ben Fry
    » More info
    » Order from Amazon @@ -120,25 +100,25 @@

    If you're interested in buying a book about Processing,

    + +
    - Visualizing Data + Learning Processing, Second Edition: A Beginner's Guide to Programming Images, Animation, and Interaction   - Visualizing Data
    - Ben Fry
    - » More info
    - » Order from Amazon.com + Learning Processing, Second Edition: A Beginner's Guide to Programming Images, Animation, and Interaction
    + Daniel Shiffman
    + » More info
    + » Order from Amazon.com
    - -
      @@ -167,70 +147,80 @@

    If you're interested in buying a book about Processing,

    - Processing for Visual Artists: How to Create Expressive Images and Interactive Art + The SparkFun Guide to Processing   - Processing for Visual Artists: How to Create Expressive Images and Interactive Art
    - Andrew S. Glassner
    - » More info
    - » Order from Amazon.com + The SparkFun Guide to Processing
    + Derek Runberg
    + » More info
    + » Order from Amazon.com
      + + +
    - Learning Processing: A Beginner's Guide to Programming Images, Animation, and Interaction + Processing for Visual Artists: How to Create Expressive Images and Interactive Art   - Learning Processing: A Beginner's Guide to Programming Images, Animation, and Interaction
    - Daniel Shiffman
    - » More info
    - » Order from Amazon.com + Processing for Visual Artists: How to Create Expressive Images and Interactive Art
    + Andrew S. Glassner
    + » More info
    + » Order from Amazon.com
    -
    + +
    - The Essential Guide to Processing for Flash Developers + Visualizing Data   - The Essential Guide to Processing for Flash Developers
    - Ira Greenberg
    - » More info
    - » Order from Amazon.com + Visualizing Data
    + Ben Fry
    + » More info
    + » Order from Amazon.com
    - +
    @@ -280,23 +270,25 @@

    If you're interested in buying a book about Processing,

      - - - - - - -
    - Making Things Talk: Using Sensors, Networks, and Arduino to see, hear, and feel your world -   - Making Things Talk: Using Sensors, Networks, and Arduino to see, hear, and feel your world
    - Tom Igoe
    - » More info
    - » Order from Amazon.com -
    + +
    + + + + + + + +
    + The Essential Guide to Processing for Flash Developers +   + The Essential Guide to Processing for Flash Developers
    + Ira Greenberg
    + » More info
    + » Order from Amazon.com +
    +
    - - - - - - -
      -   -   -
    + +
    + + + + + + +
    + Making Things Talk: Using Sensors, Networks, and Arduino to see, hear, and feel your world +   + Making Things Talk: Using Sensors, Networks, and Arduino to see, hear, and feel your world
    + Tom Igoe
    + » More info
    + » Order from Amazon.com +
      - Getting Started with Arduino
    + Make: Getting Started with Arduino
    Massimo Banzi
    - » Order from Amazon.com + » Order from Amazon.com
    - - -

    This tutorial is for Processing version 1.1+. If you see any errors or have comments, please let us know. This tutorial is from the book, Learning Processing, by Daniel Shiffman, published by Morgan Kaufmann Publishers, Copyright © 2008 Elsevier Inc. All rights reserved.

    - -

     

    +
    + +
    + +

    + This tutorial is from the book Learning Processing by Daniel Shiffman, published by Morgan Kaufmann, © 2008 Elsevier Inc. All rights reserved. If you see any errors or have comments, please let us know. +

    + +

    Two-dimensional Arrays

    +

    Daniel Shiffman

    + -An array keeps track of multiple pieces of information in linear order, a one-dimensional list. However, the data associated with certain systems (a digital image, a board game, etc.) lives in two dimensions. To visualize this data, we need a multi-dimensional data structure, that is, a multi-dimensional array. -

    -A two-dimensional array is really nothing more than an array of arrays (a three-dimensional array is an array of arrays of arrays). Think of your dinner. You could have a one-dimensional list of everything you eat: -

    -(lettuce, tomatoes, salad dressing, steak, mashed potatoes, string beans, cake, ice cream, coffee) -

    -Or you could have a two-dimensional list of three courses, each containing three things you eat: -

    -(lettuce, tomatoes, salad dressing) and (steak, mashed potatoes, string beans) and (cake, ice cream, coffee) -

    -In the case of an array, our old-fashioned one-dimensional array looks like this: +

    + An array keeps track of multiple pieces of information in linear order, a one-dimensional list. However, the data associated with certain systems (a digital image, a board game, etc.) lives in two dimensions. To visualize this data, we need a multi-dimensional data structure, that is, a multi-dimensional array. A two-dimensional array is really nothing more than an array of arrays (a three-dimensional array is an array of arrays of arrays). Think of your dinner. You could have a one-dimensional list of everything you eat: +

    + +

    +

    (lettuce, tomatoes, steak, mashed potatoes, cake, ice cream)
    +

    + +

    +Or you could have a two-dimensional list of three courses, each containing two things you eat: +

    + +

    +

    (lettuce, tomatoes) and (steak, mashed potatoes) and (cake, ice cream)
    +

    + +

    + In the case of an array, our old-fashioned one-dimensional array looks like this:
    +

    +
    -int[] myArray = {0,1,2,3};
    +int[] myArray = {0,1,2,3};
     
    -
    -And a two-dimensional array looks like this: + +

    + And a two-dimensional array looks like this: +

    +
    -int[][] myArray = { {0,1,2,3}, {3,2,1,0}, {3,5,6,1}, {3,8,3,4} };     
    +int[][] myArray = { {0,1,2,3}, {3,2,1,0}, {3,5,6,1}, {3,8,3,4} };   
     
    -
    -For our purposes, it is better to think of the two-dimensional array as a matrix. A matrix can be thought of as a grid of numbers, arranged in rows and columns, kind of like a bingo board. We might write the two-dimensional array out as follows to illustrate this point: + +

    + For our purposes, it is better to think of the two-dimensional array as a matrix. A matrix can be thought of as a grid of numbers, arranged in rows and columns, kind of like a bingo board. We might write the two-dimensional array out as follows to illustrate this point:
    +

    +
    -int[][] myArray = {  {0, 1, 2, 3},
    -                     {3, 2, 1, 0},
    -                     {3, 5, 6, 1},
    -                     {3, 8, 3, 4}  };
    +int[][] myArray = {  {0, 1, 2, 3},
    +                     {3, 2, 1, 0},
    +                     {3, 5, 6, 1},
    +                     {3, 8, 3, 4}  };
     
    -
    -We can use this type of data structure to encode information about an image. For example, the following grayscale image could be represented by the -following array: -

    - -

    + +

    + We can use this type of data structure to encode information about an image. For example, the following grayscale image could be represented by the following array: +

    + + +
    -int[][] myArray = {  {236, 189, 189,   0},
    -                     {236,  80, 189, 189},
    -                     {236,   0, 189,  80},
    -                     {236, 189, 189,  80}  };
    +int[][] myArray = {  {236, 189, 189,   0},
    +                     {236,  80, 189, 189},
    +                     {236,   0, 189,  80},
    +                     {236, 189, 189,  80}  };
     
    -
    -To walk through every element of a one-dimensional array, we use a for loop, that is: + +

    + To walk through every element of a one-dimensional array, we use a for loop, that is: +

    +
     
    -int[] myArray = new int[10];
    -for (int i = 0; i < myArray.length; i++) {
    -  myArray[i] = 0;
    +int[] myArray = new int[10];
    +for (int i = 0; i < myArray.length; i++) {
    +  myArray[i] = 0;
     }
     
    -
    -For a two-dimensional array, in order to reference every element, we must use two nested loops. This gives us a counter variable for every column and every row in the matrix. + + +

    + For a two-dimensional array, in order to reference every element, we must use two nested loops. This gives us a counter variable for every column and every row in the matrix.
    +

    +
    -int cols = 10;
    -int rows = 10;
    -int[][] myArray = new int[cols][rows];
    -
    -// Two nested loops allow us to visit every spot in a 2D array.   
    -// For every column I, visit every row J.
    -for (int i = 0; i < cols; i++) {
    -  for (int j = 0; j < rows; j++) {
    -    myArray[i][j] = 0;
    -  }
    +int cols = 10;
    +int rows = 10;
    +int[][] myArray = new int[cols][rows];
    +
    +// Two nested loops allow us to visit every spot in a 2D array.   
    +// For every column I, visit every row J.
    +for (int i = 0; i < cols; i++) {
    +  for (int j = 0; j < rows; j++) {
    +    myArray[i][j] = 0;
    +  }
     }
     
    -
    -For example, we might write a program using a two-dimensional array to draw a grayscale image. -

    - + + +

    + For example, we might write a program using a two-dimensional array to draw a grayscale image. +

    + +

    + + +

    -// Example: 2D Array
    -size(200,200);
    -int cols = width;
    -int rows = height;
    -
    -// Declare 2D array
    -int[][] myArray = new int[cols][rows];
    -
    -// Initialize 2D array values
    -for (int i = 0; i < cols; i++) {
    -  for (int j = 0; j < rows; j++) {
    -    myArray[i][j] = int(random(255));
    -  }
    +size(200,200);
    +int cols = width;
    +int rows = height;
    +
    +// Declare 2D array
    +int[][] myArray = new int[cols][rows];
    +
    +// Initialize 2D array values
    +for (int i = 0; i < cols; i++) {
    +  for (int j = 0; j < rows; j++) {
    +    myArray[i][j] = int(random(255));
    +  }
     }
     
    -// Draw points
    -for (int i = 0; i < cols; i++) {
    -  for (int j = 0; j < rows; j++) {
    -    stroke(myArray[i][j]);
    -    point(i,j);
    -  }
    +// Draw points
    +for (int i = 0; i < cols; i++) {
    +  for (int j = 0; j < rows; j++) {
    +    stroke(myArray[i][j]);
    +    point(i,j);
    +  }
     }
     
    -
    -A two-dimensional array can also be used to store objects, which is especially convenient for programming sketches that involve some sort of "grid" or "board." The following example displays a grid of Cell objects stored in a two-dimensional array. Each cell is a rectangle whose brightness oscillates from 0-255 with a sine function. -

    - + +

    + A two-dimensional array can also be used to store objects, which is especially convenient for programming sketches that involve some sort of "grid" or "board." The following example displays a grid of Cell objects stored in a two-dimensional array. Each cell is a rectangle whose brightness oscillates from 0-255 with a sine function. +

    + + +
    -Example: 2D Array of Objects
    -// 2D Array of objects
    -Cell[][] grid;
    -
    -// Number of columns and rows in the grid
    -int cols = 10;
    -int rows = 10;
    -
    -void setup() {
    -  size(200,200);
    -  grid = new Cell[cols][rows];
    -  for (int i = 0; i < cols; i++) {
    -    for (int j = 0; j < rows; j++) {
    -      // Initialize each object
    -      grid[i][j] = new Cell(i*20,j*20,20,20,i+j);
    -    }
    -  }
    +// 2D Array of objects
    +Cell[][] grid;
    +
    +// Number of columns and rows in the grid
    +int cols = 10;
    +int rows = 10;
    +
    +void setup() {
    +  size(200,200);
    +  grid = new Cell[cols][rows];
    +  for (int i = 0; i < cols; i++) {
    +    for (int j = 0; j < rows; j++) {
    +      // Initialize each object
    +      grid[i][j] = new Cell(i*20,j*20,20,20,i+j);
    +    }
    +  }
     }
     
    -void draw() {
    -  background(0);
    -  // The counter variables i and j are also the column and row numbers and 
    -  // are used as arguments to the constructor for each object in the grid.  
    -  for (int i = 0; i < cols; i++) {
    -    for (int j = 0; j < rows; j++) {
    -      // Oscillate and display each object
    -      grid[i][j].oscillate();
    -      grid[i][j].display();
    -    }
    -  }
    +void draw() {
    +  background(0);
    +  // The counter variables i and j are also the column and row numbers and 
    +  // are used as arguments to the constructor for each object in the grid.  
    +  for (int i = 0; i < cols; i++) {
    +    for (int j = 0; j < rows; j++) {
    +      // Oscillate and display each object
    +      grid[i][j].oscillate();
    +      grid[i][j].display();
    +    }
    +  }
     }
     
    -// A Cell object
    -class Cell {
    -  // A cell object knows about its location in the grid as well as its size with the variables x,y,w,h.
    -  float x,y;   // x,y location
    -  float w,h;   // width and height
    -  float angle; // angle for oscillating brightness
    -
    -  // Cell Constructor
    -  Cell(float tempX, float tempY, float tempW, float tempH, float tempAngle) {
    -    x = tempX;
    -    y = tempY;
    -    w = tempW;
    -    h = tempH;
    -    angle = tempAngle;
    -  } 
    -  
    -  // Oscillation means increase angle
    -  void oscillate() {
    -    angle += 0.02; 
    -  }
    -
    -  void display() {
    -    stroke(255);
    -    // Color calculated using sine wave
    -    fill(127+127*sin(angle));
    -    rect(x,y,w,h); 
    -  }
    +// A Cell object
    +class Cell {
    +  // A cell object knows about its location in the grid 
    +  // as well as its size with the variables x,y,w,h
    +  float x,y;   // x,y location
    +  float w,h;   // width and height
    +  float angle; // angle for oscillating brightness
    +
    +  // Cell Constructor
    +  Cell(float tempX, float tempY, float tempW, float tempH, float tempAngle) {
    +    x = tempX;
    +    y = tempY;
    +    w = tempW;
    +    h = tempH;
    +    angle = tempAngle;
    +  } 
    +  
    +  // Oscillation means increase angle
    +  void oscillate() {
    +    angle += 0.02; 
    +  }
    +
    +  void display() {
    +    stroke(255);
    +    // Color calculated using sine wave
    +    fill(127+127*sin(angle));
    +    rect(x,y,w,h); 
    +  }
     }
     
    -

     

    - -

    This tutorial is for Processing version 1.1+. If you see any errors or have comments, please let us know. This tutorial is from the book, Learning Processing, by Daniel Shiffman, published by Morgan Kaufmann Publishers, Copyright © 2008 Elsevier Inc. All rights reserved.

    -

    + diff --git a/content/static/tutorials/anatomy/index.html b/content/static/tutorials/anatomy/index.html index 28cebf036..6fe27c928 100644 --- a/content/static/tutorials/anatomy/index.html +++ b/content/static/tutorials/anatomy/index.html @@ -1,356 +1,244 @@ -

    Anatomy of a Program

    - - +
    + -
    -

    This tutorial is for Processing version 2.0+. If you see any errors or have comments, please let us know. This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

    +

    + If you see any errors in this tutorial or have comments, please let us know. This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. +

    -

    You can download the files from this tutorial.

    +

    Anatomy of a Program

    +

    J David Eisenberg

    -

     

    +

     

    -

    -Many of the tutorials for Processing concentrate on what the language -can do (change colors, draw shapes, create arrays of objects) and which -function calls will let you accomplish these tasks. These are things you -need to know in order to write a program in Processing. -

    -

    -There’s one piece of -the puzzle that these tutorials don’t address: how do you analyze a -problem and break it down into steps that the computer can do? In this -tutorial, I’m going to show you what -went through my head as I took on the task of writing functions to draw -regular polygons and star-shaped figures in Processing. This is a good choice -because the task is not too big to get your mind around, but it’s not an -entirely trivial problem, either. -

    +

    + Many of the tutorials for Processing concentrate on what the language can do (change colors, draw shapes, create arrays of objects) and which function calls will let you accomplish these tasks. These are things you need to know in order to write a program in Processing. +

    -

    -Remember that what you are seeing here is my particular thought process and programming -style. There are many different approaches and styles. As you continue -programming, you will find your own. You can also see other people’s programming -stye (though not their thought process!) by looking at the source code for -the programs at openProcessing.org. -

    +

    + There’s one piece of the puzzle that these tutorials don’t address: how do you analyze a problem and break it down into steps that the computer can do? In this + tutorial, I’m going to show you what went through my head as I took on the task of writing functions to draw regular polygons and star-shaped figures in Processing. This is a good choice because the task is not too big to get your mind around, but it’s not an entirely trivial problem, either. +

    -

    Drawing Regular Polygons

    +

    + Remember that what you are seeing here is my particular thought process and programming style. There are many different approaches and styles. As you continue programming, you will find your own. You can also see other people’s programming stye (though not their thought process!) by looking at the source code for the programs at openProcessing.org. +

    -

    -You wouldn’t think of building a house without a blueprint, and you -shouldn’t think of writing a program without a plan of some sort. -Since Processing is such a visual language, -I always have to sketch out what I want as a result before I approach the -keyboard. So that’s where I started. -

    -

    Step 1: Planning on paper

    -

    -The first step was to draw a crude diagram to dredge up old memories of how regular -polygons work. The hexagon was the first one I drew. As you can see from the little loop -I drew inside the hexagon, the center angles of all the slices add up to a complete circle, or -360°, and the “radius” of the polygon is a line from the -center to each vertex. The angle between each of the radius lines is thus 360° divided -by the number of sides. -

    +

    Drawing Regular Polygons

    -

    Crude diagram of regular polygons with 3-6 sides

    +

    + You wouldn’t think of building a house without a blueprint, and you shouldn’t think of writing a program without a plan of some sort. Since Processing is such a visual language, I always have to sketch out what I want as a result before I approach the keyboard. So that’s where I started. +

    -

    -I just needed to get an idea of -what the task was, and a hand-drawn diagram did the job. I didn’t need -to generate the diagram in a drawing program. -

    -
    -

    Programming Hint: When you do your planning, do it away from the computer. If you are -sitting in front of the computer, the screen will whisper, “Look at me! -Look at me!” and the keyboard will whisper “Type something! -Type something!” Go to your kitchen table instead. -

    -
    - -

    Step 2: Some basic trigonometry

    -

    -So, if you have a line of length r starting at (0,0) at an angle theta (θ), -what are its coordinates in terms of x and y? If you know a little bit of -trigonometry, the answer is that the endpoint of the line is at -(r cos θ, r sin θ). If you don’t -know trigonometry, take a look at -this tutorial (a general and very light introduction to -trigonometry), -this tutorial (oriented towards Processing), -and -this -example from chapter 13 of Learning Processing. -In the following diagram, angles are drawn clockwise, which is how they are measured in -Processing. -

    -

    Diagram of angle showing relationship of cosine and sine

    +

    Step 1: Planning on paper

    -

    Step 3: Design Decisions

    -

    -It looks like this is a job for a for loop that runs from 0 to -n (the number of sides), calculating the points for each vertex and drawing -lines connecting them. At each step, the angle at which we draw is increased -by 360°/n. -

    +

    + The first step was to draw a crude diagram to dredge up old memories of how regular polygons work. The hexagon was the first one I drew. As you can see from the little loop I drew inside the hexagon, the center angles of all the slices add up to a complete circle, or 360°, and the “radius” of the polygon is a line from the center to each vertex. The angle between each of the radius lines is thus 360° divided by the number of sides. +

    -

    The problem with drawing a group of lines is that they are just lines—you -don’t get a true shape that you can fill, like rect() -or triangle(). Luckily, Processing lets you create your own shapes -with the beginShape(), -vertex(), and -endShape() functions. -The first example on the reference page for beginShape() is the model -to follow. So the next design decision is to make polygons as true shapes.

    - -

    Since you probably want to draw many polygons during a program, it makes sense -to have a polygon() function. What parameters does it need? -Four come to mind: the number of sides, the center x and y -coordinate, and the radius. Here’s the code. I wrote several different -calls to polygon() in the setup() function. -Although I calculated angle in degrees, sine and cosine measure -angles in radians, so I had to use the radians() function to -do a conversion. -

    -polygon tests
    -void setup()
    -{
    -  size(300, 300);
    -  background(255);
    -  smooth();
    -
    -  noFill();
    -  polygon(3, 50, 75, 50);
    -  polygon(4, 170, 75, 50);
    -
    -  fill(255, 204, 255);
    -  stroke(128, 0, 128);
    -  polygon(5, 50, 180, 50);
    -
    -  noFill();
    -  stroke(0);
    -  polygon(6, 170, 180, 50);
    -}
    +    Crude diagram of regular polygons with 3-6 sides
     
    -void polygon(int n, float cx, float cy, float r)
    -{
    -  float angle = 360.0 / n;
    +    

    + I just needed to get an idea of what the task was, and a hand-drawn diagram did the job. I didn’t need to generate the diagram in a drawing program. +

    - beginShape(); - for (int i = 0; i < n; i++) - { - vertex(cx + r * cos(radians(angle * i)), - cy + r * sin(radians(angle * i))); - } - endShape(CLOSE); -} +
    +

    Programming Hint: When you do your planning, do it away from the computer. If you are sitting in front of the computer, the screen will whisper, “Look at me! Look at me!” and the keyboard will whisper “Type something! Type something!” Go to your kitchen table instead. +

    +
    -
    -

    Two Steps Forward, One Step Back

    -

    -The program works, so it’s time to see if there are things that -could be added or changed. First, the triangle and pentagon seem -somehow wrong; they are usually drawn pointing upwards instead of -to the side. The reason they look odd is that the first vertex -(at 0°) points to the right instead of straight up. It -would be nice to have an extra parameter that gives the starting -angle for the first vertex. (Another solution is to leave things -as they are and let programmers use rotate() -[see this -tutorial], but I made the design decision -to use an extra parameter.) Should the angle be given in degrees -or in radians? The answer: radians, in order to be consistent -with everything else that Processing does. -

    -

    -My next thought was that it would be nice to be able to specify a -width and height for the polygon, much as you do with an -ellipse() or rectangle(). I already -knew what the formula would be, but I wanted to make a drawing -to check it out. As a preliminary -experiment, I tried drawing a pentagon into a square using a protractor and straightedge, -and ended up with the awful drawing at the left. How come the sides -weren’t equal length? I realized that I was trying to make -the drawing fit my preconceptions, rather than making an accurate -drawing and seeing where that led me. The drawing on the right -was done much more carefully. After a little thinking, I realized -that the pentagon wouldn’t fit the square exactly, because -the angles weren’t multiples of 90 degrees. The regular -polygon fits in a circle, not in a square! -

    +

    Step 2: Some basic trigonometry

    -
    -pentagon with unequal sides -pentagon with equal sides -
    - -

    -Well, that was a dead end. That sort of thing happens in programming all -the time, so I didn’t spend too much time worrying about it. -It was time for another approach. Since I didn't have an accurate way of -drawing ellipses, I had to think about the problem a different way. Presume -you have a circle drawn on a square sheet of rubber, and you stretch it out -so that it’s twice as wide but the same height. The vertical position of -the points on the circle does not change, but the horizontal positions are now -twice as far away from the center as they used to be. The same idea applies -if you stretch the sheet vertically. The -following crude drawings seemed to bear this out, -so it was time to rewrite the polygon() function. -

    +

    + So, if you have a line of length r starting at (0,0) at an angle theta (θ), what are its coordinates in terms of x and y? If you know a little bit of + trigonometry, the answer is that the endpoint of the line is at (r cos θ, r sin θ). If you don’t + know trigonometry, take a look at this tutorial (a general and very light introduction to + trigonometry), this tutorial (oriented towards Processing), and this example from chapter 13 of Learning Processing. In the following diagram, angles are drawn clockwise, which is how they are measured in Processing. +

    + + Diagram of angle showing relationship of cosine and sine + + + +

    Step 3: Design Decisions

    + +

    + It looks like this is a job for a for loop that runs from 0 to n (the number of sides), calculating the points for each vertex and drawing lines connecting them. At each step, the angle at which we draw is increased by 360°/n. +

    + +

    + The problem with drawing a group of lines is that they are just lines—you don’t get a true shape that you can fill, like rect() or triangle(). Luckily, Processing lets you create your own shapes with the beginShape(), vertex(), and endShape() functions. The first example on the reference page for beginShape() is the model to follow. So the next design decision is to make polygons as true shapes.

    + +

    + Since you probably want to draw many polygons during a program, it makes sense to have a polygon() function. What parameters does it need? Four come to mind: the number of sides, the center x and y coordinate, and the radius. Here’s the code. I wrote several different calls to polygon() in the setup() function. Although I calculated angle in degrees, sine and cosine measure angles in radians, so I had to use the radians() function to do a conversion. +

    -

    -diagrams showing stretched circle -

    -more complex polygon tests + polygon tests +
    -void setup( )
    -{
    -  size(300, 300);
    -  background(255);
    -  smooth();
    -
    -  noFill();
    -  polygon(3, 50, 75, 100, 100, -PI / 2.0); // -90 degrees
    -  polygon(4, 170, 75, 50, 125, -PI / 4.0); // -45 degrees
    -
    -  fill(255, 204, 255);
    -  stroke(128, 0, 128);
    -  polygon(5, 50, 200, 75, 50, -PI / 2.0); // -90 degrees
    -
    -  noFill();
    -  stroke(0);
    -  polygon(6, 170, 200, 50, 100, 0);
    -
    -  stroke(128);
    -  // draw enclosing ellipses to make sure we did it right
    -  ellipse(50, 75, 100, 100);
    -  ellipse(170, 75, 50, 125);
    -  ellipse(50, 200, 75, 50);
    -  ellipse(170, 200, 50, 100);
    -}
    +void setup() {
    +  size(300, 300);
    +  background(255);
     
    -void polygon(int n, float cx, float cy, float w, float h, float startAngle)
    -{
    -  float angle = TWO_PI/ n;
    +  noFill();
    +  polygon(3, 50, 75, 50);
    +  polygon(4, 170, 75, 50);
     
    -  /* The horizontal "radius" is one half the width;
    -     the vertical "radius" is one half the height */
    -  w = w / 2.0;
    -  h = h / 2.0;
    +  fill(255, 204, 255);
    +  stroke(128, 0, 128);
    +  polygon(5, 50, 180, 50);
     
    -  beginShape();
    -  for (int i = 0; i < n; i++)
    -  {
    -    vertex(cx + w * cos(startAngle + angle * i),
    -      cy + h * sin(startAngle + angle * i));
    -  }
    -  endShape(CLOSE);
    +  noFill();
    +  stroke(0);
    +  polygon(6, 170, 180, 50);
     }
     
    +void polygon(int n, float cx, float cy, float r) {
    +  float angle = 360.0 / n;
    +
    +  beginShape();
    +  for (int i = 0; i < n; i++) {
    +    vertex(cx + r * cos(radians(angle * i)),
    +      cy + r * sin(radians(angle * i)));
    +  }
    +  endShape(CLOSE);
    +}
     
    -

    -Since everything was in radians, I now described -angles in terms of PI and TWO_PI (2π), since -2π radians equals 360°. -In addition to the code in setup() to test the new -features, I drew ellipses with the same center and width and height as -the polygons to make sure that -the vertices were within the proper area. -

    -

    Too Many Parameters

    -

    -I now had a much more flexible function for drawing polygons, but -it came at the expense of more parameters. It would be nice to be -able to draw the ordinary case (equal width and height, start angle -of zero) without having to specify all those parameters. The solution -is to overload the function. In Processing, you can have -two functions with the same name, as long as they have different -numbers of parameters and/or types of parameters. An example of -this is Processing’s stroke() function, which is -overloaded so that you can call it with one number for grayscale, -three numbers for color, or four numbers for color with opacity. -Processing looks at the number of arguments you provide and figures -out which version of stroke() to call. -

    +

    Two Steps Forward, One Step Back

    -

    -Here is the code to add to the previous example. When you give -polygon() only four numbers, it will call the following -function, which calls the “big” version of the -function with width and height equal to twice your desired -radius, and a start angle of zero. -

    +

    + The program works, so it’s time to see if there are things that could be added or changed. First, the triangle and pentagon seem somehow wrong; they are usually drawn pointing upwards instead of to the side. The reason they look odd is that the first vertex (at 0°) points to the right instead of straight up. It would be nice to have an extra parameter that gives the starting angle for the first vertex. (Another solution is to leave things as they are and let programmers use rotate() [see this tutorial], but I made the design decision to use an extra parameter.) Should the angle be given in degrees or in radians? The answer: radians, in order to be consistent with everything else that Processing does. +

    + +

    + My next thought was that it would be nice to be able to specify a width and height for the polygon, much as you do with an ellipse() or rectangle(). I already knew what the formula would be, but I wanted to make a drawing to check it out. As a preliminary experiment, I tried drawing a pentagon into a square using a protractor and straightedge, and ended up with the awful drawing at the left. How come the sides weren’t equal length? I realized that I was trying to make the drawing fit my preconceptions, rather than making an accurate drawing and seeing where that led me. The drawing on the right was done much more carefully. After a little thinking, I realized that the pentagon wouldn’t fit the square exactly, because the angles weren’t multiples of 90 degrees. The regular polygon fits in a circle, not in a square! +

    + +
    + pentagon with unequal sides + pentagon with equal sides +
    + +

    + Well, that was a dead end. That sort of thing happens in programming all the time, so I didn’t spend too much time worrying about it. It was time for another approach. Since I didn't have an accurate way of drawing ellipses, I had to think about the problem a different way. Presume you have a circle drawn on a square sheet of rubber, and you stretch it out so that it’s twice as wide but the same height. The vertical position of the points on the circle does not change, but the horizontal positions are now twice as far away from the center as they used to be. The same idea applies if you stretch the sheet vertically. The following crude drawings seemed to bear this out, so it was time to rewrite the polygon() function. +

    + +

    + diagrams showing stretched circle +

    + + more complex polygon tests
    -void polygon(int n, float cx, float cy, float r)
    -{
    -  polygon(n, cx, cy, r * 2.0, r * 2.0, 0.0);
    +void setup() {
    +  size(300, 300);
    +  background(255);
    +
    +  noFill();
    +  polygon(3, 50, 75, 100, 100, -PI / 2.0); // -90 degrees
    +  polygon(4, 170, 75, 50, 125, -PI / 4.0); // -45 degrees
    +
    +  fill(255, 204, 255);
    +  stroke(128, 0, 128);
    +  polygon(5, 50, 200, 75, 50, -PI / 2.0); // -90 degrees
    +
    +  noFill();
    +  stroke(0);
    +  polygon(6, 170, 200, 50, 100, 0);
    +
    +  stroke(128);
    +  // Draw enclosing ellipses to make sure we did it right
    +  ellipse(50, 75, 100, 100);
    +  ellipse(170, 75, 50, 125);
    +  ellipse(50, 200, 75, 50);
    +  ellipse(170, 200, 50, 100);
     }
     
    +void polygon(int n, float cx, float cy, float w, float h, float startAngle) {
    +  float angle = TWO_PI/ n;
    +
    +  // The horizontal "radius" is one half the width,
    +  // the vertical "radius" is one half the height
    +  w = w / 2.0;
    +  h = h / 2.0;
    +
    +  beginShape();
    +  for (int i = 0; i < n; i++) {
    +    vertex(cx + w * cos(startAngle + angle * i), 
    +      cy + h * sin(startAngle + angle * i));
    +  }
    +  endShape(CLOSE);
    +}
     
    -

    -And here is some code to test the overloaded function. -

    +

    + Since everything was in radians, I now described angles in terms of PI and TWO_PI (2π), since 2π radians equals 360°. In addition to the code in setup() to test the new features, I drew ellipses with the same center and width and height as the polygons to make sure that the vertices were within the proper area. +

    + + + + +

    Too Many Parameters

    + +

    + I now had a much more flexible function for drawing polygons, but it came at the expense of more parameters. It would be nice to be able to draw the ordinary case (equal width and height, start angle of zero) without having to specify all those parameters. The solution is to overload the function. In Processing, you can have two functions with the same name, as long as they have different numbers of parameters and/or types of parameters. An example of this is Processing’s stroke() function, which is overloaded so that you can call it with one number for grayscale, three numbers for color, or four numbers for color with opacity. Processing looks at the number of arguments you provide and figures out which version of stroke() to call. +

    + +

    + Here is the code to add to the previous example. When you give polygon() only four numbers, it will call the following function, which calls the “big” version of the function with width and height equal to twice your desired radius, and a start angle of zero. +

    -regular triangle and diamond using overloaded functions
    -void setup()
    -{
    -  size(300, 300);
    -  background(255);
    -  smooth();
    -  
    -  noFill();
    -  polygon(3, 70, 75, 50); // use the defaults
    -  polygon(4, 170, 75, 25);
    -  
    -  stroke(128);
    -  // draw enclosing ellipses to make sure we did it right
    -  ellipse(70, 75, 100, 100);
    -  ellipse(170, 75, 50, 50);
    +void polygon(int n, float cx, float cy, float r) {
    +  polygon(n, cx, cy, r * 2.0, r * 2.0, 0.0);
     }
    +
    + +

    + And here is some code to test the overloaded function. +

    + regular triangle and diamond using overloaded functions + +
    +void setup() {
    +  size(300, 300);
    +  background(255);
    +  smooth();
    +  
    +  noFill();
    +  polygon(3, 70, 75, 50); // use the defaults
    +  polygon(4, 170, 75, 25);
    +  
    +  stroke(128);
    +  // draw enclosing ellipses to make sure we did it right
    +  ellipse(70, 75, 100, 100);
    +  ellipse(170, 75, 50, 50);
    +}
     
    -

    Safe Computing

    -

    -What happens if someone tries to draw a polygon with 2 sides, 1 side, -or worse, 0 sides? The first two will generate a line and a point, -but the third one will cause a division by zero error when trying to -figure out the angle. And what would happen with negative numbers? -Since polygons with fewer than three sides -don’t make a lot of sense, I wrapped the body of the -polygon() function inside of an if statement. -Now, when someone specifies two or fewer sides, the function just -won’t draw anything. -

    + + +

    Safe Computing

    + +

    + What happens if someone tries to draw a polygon with 2 sides, 1 side, or worse, 0 sides? The first two will generate a line and a point, but the third one will cause a division by zero error when trying to figure out the angle. And what would happen with negative numbers? Since polygons with fewer than three sides don’t make a lot of sense, I wrapped the body of the polygon() function inside of an if statement. Now, when someone specifies two or fewer sides, the function just won’t draw anything. +

    -void polygon(int n, float cx, float cy, float w, float h, float startAngle)
    -{
    -  if (n > 2)
    -  {
    +void polygon(int n, float cx, float cy, float w, float h, float startAngle) {
    +  if (n > 2) {
         float angle = TWO_PI/ n;
         .
         .
    @@ -360,294 +248,300 @@ 

    Safe Computing

    endShape(CLOSE); } } -
    -

    Drawing Stars

    -

    -Now that I was satisfied with the polygon() function, it was time -to move on to drawing stars. From some playing around with a crude sketch, I -figured that it would be possible to draw a star by figuring out where all the -diagonals of a polygon intersect. -

    -
    -Stars drawn by intersections of diagonals -
    +

    Drawing Stars

    + +

    + Now that I was satisfied with the polygon() function, it was time to move on to drawing stars. From some playing around with a crude sketch, I figured that it would be possible to draw a star by figuring out where all the diagonals of a polygon intersect. +

    -

    -I saw two problems here. First, finding the intersection point of two lines is +

    + Stars drawn by intersections of diagonals +
    + +

    + I saw two problems here. First, finding the intersection point of two lines is a lot of calculation. Not particularly hard calculation, but a lot of it, and it gets tricky when you have vertical lines. Second, I couldn't have a four-sided or three-sided arrow shape; there weren’t enough diagonals. -

    +

    -

    -Then, I had another idea. I can’t tell you where the idea came from -or how I arrived at it; it just hit me. That’s a part of the process -that I don’t think can be taught. Here was the idea: -What if you had a -polygon cut out of cookie dough and you sort of pushed in the sides -to make a star shape? That is a method that works for squares and triangles. -

    +

    + Then, I had another idea. I can’t tell you where the idea came from or how I arrived at it; it just hit me. That’s a part of the process that I don’t think can be taught. Here was the idea: What if you had a polygon cut out of cookie dough and you sort of pushed in the sides to make a star shape? That is a method that works for squares and triangles. +

    -
    -Stars drawn by pushing in the sides -
    +
    + Stars drawn by pushing in the sides +
    -

    -When you push in the sides, you push them in at the midpoint so that -you get a nice symmetric cookie. From there, it wasn’t a big -leap to figure out: “what if I had a shorter radius at half -of every slice of the polygon?” -

    +

    + When you push in the sides, you push them in at the midpoint so that you get a nice symmetric cookie. From there, it wasn’t a big leap to figure out: “what if I had a shorter radius at half of every slice of the polygon?” +

    -
    -Stars drawn by pushing in the sides -
    - -

    -This code would be fairly easy to write. I would need one extra -parameter: the proportion of the small radius to the -big radius. In the following code, an if statement -controls whether to use the short radius or the long radius. -I also put in an overloaded version that draws a star with -equal width and height and a start angle of zero. For the -test, I made the short radius one half the long radius. -

    +
    + Stars drawn by pushing in the sides +
    + +

    + This code would be fairly easy to write. I would need one extra parameter: the proportion of the small radius to the big radius. In the following code, an if statement controls whether to use the short radius or the long radius. I also put in an overloaded version that draws a star with equal width and height and a start angle of zero. For the test, I made the short radius one half the long radius. +

    + + 3, 4, 5, and 6-sided stars -3, 4, 5, and 6-sided stars
    -void setup( )
    -{
    -  size(300, 300);
    -  background(255);
    -  smooth();
    -
    -  noFill();
    -  star(3, 60, 75, 100, 100, -PI / 2.0, 0.50); // -90 degrees
    -  star(4, 170, 75, 25, 0.50);  // use simpler call
    -
    -  fill(255, 204, 255);
    -  stroke(128, 0, 128);
    -  star(5, 60, 200, 75, 50, -PI / 2.0, 0.50); // -90 degrees
    -
    -  noFill();
    -  stroke(0);
    -  star(6, 170, 200, 50, 100, 0, 0.50);
    -  stroke(128);
    -  
    -  // draw enclosing ellipses to make sure we did it right
    -  ellipse(60, 75, 100, 100);
    -  ellipse(170, 75, 50, 50);
    -  ellipse(60, 200, 75, 50);
    -  ellipse(170, 200, 50, 100);
    +void setup() {
    +  size(300, 300);
    +  background(255);
    +  smooth();
    +
    +  noFill();
    +  star(3, 60, 75, 100, 100, -PI / 2.0, 0.50); // -90 degrees
    +  star(4, 170, 75, 25, 0.50);  // use simpler call
    +
    +  fill(255, 204, 255);
    +  stroke(128, 0, 128);
    +  star(5, 60, 200, 75, 50, -PI / 2.0, 0.50); // -90 degrees
    +
    +  noFill();
    +  stroke(0);
    +  star(6, 170, 200, 50, 100, 0, 0.50);
    +  stroke(128);
    +  
    +  // draw enclosing ellipses to make sure we did it right
    +  ellipse(60, 75, 100, 100);
    +  ellipse(170, 75, 50, 50);
    +  ellipse(60, 200, 75, 50);
    +  ellipse(170, 200, 50, 100);
     }
     
    -void star(int n, float cx, float cy, float r, float proportion)
    -{
    -  star(n, cx, cy, 2.0 * r, 2.0 * r, 0.0, proportion);
    +void star(int n, float cx, float cy, float r, float proportion) {
    +  star(n, cx, cy, 2.0 * r, 2.0 * r, 0.0, proportion);
     }
     
    -void star(int n, float cx, float cy, float w, float h,
    -  float startAngle, float proportion)
    -{
    -  if (n > 2)
    -  {
    -    float angle = TWO_PI/ (2 *n);  // twice as many sides
    -    float dw; // draw width
    -    float dh; // draw height
    -    
    -    w = w / 2.0;
    -    h = h / 2.0;
    -    
    -    beginShape();
    -    for (int i = 0; i < 2 * n; i++)
    -    {
    -      dw = w;
    -      dh = h;
    -      if (i % 2 == 1) // for odd vertices, use short radius
    -      {
    -        dw = w * proportion;
    -        dh = h * proportion;
    -      }
    -      vertex(cx + dw * cos(startAngle + angle * i),
    -        cy + dh * sin(startAngle + angle * i));
    -    }
    -    endShape(CLOSE);
    -  }
    +void star(int n, float cx, float cy, float w, float h,
    +  float startAngle, float proportion) {
    +
    +  if (n > 2) {
    +    float angle = TWO_PI/ (2 *n);  // twice as many sides
    +    float dw; // draw width
    +    float dh; // draw height
    +    
    +    w = w / 2.0;
    +    h = h / 2.0;
    +    
    +    beginShape();
    +    for (int i = 0; i < 2 * n; i++) {
    +      dw = w;
    +      dh = h;
    +      if (i % 2 == 1) { // for odd vertices, use short radius
    +      
    +        dw = w * proportion;
    +        dh = h * proportion;
    +      }
    +      vertex(cx + dw * cos(startAngle + angle * i),
    +        cy + dh * sin(startAngle + angle * i));
    +    }
    +    endShape(CLOSE);
    +  }
     }
    -
     
    -

    What Went Wrong?

    -

    -When I ran this program, I just freaked out. Everything looked great, -except for the three-sided star. How come I didn’t -get a star from it? The code sure looks correct, so I decided to see -what would happen if I drew the diagram by hand. I measured -the angles with my protractor, -and I drew the long radius lines with a length of two inches in black -and the short radius lines with a length of one inch in red. Sure -enough, it just so happens that the endpoints of the short radius lines -are right on the lines of the main triangle. The program is drawing a -star, with the sides pushed in by zero. -

    -
    -triangular star drawn by hand -
    - -

    -While wondering why this happened, I remembered that the -cosine of the angle between the lines, 60° (π/3) comes out to 0.5, -and I strongly suspected that this had something to do with it. To -test my hypothesis, I changed the square to use a proportion of -cosine of 45° (π/4), the pentagon to cosine of 36° -(π/5), and the -hexagon to cosine of 30° (π/6). Sure enough, they all came out -with no push-in. -

    -

    -So, if you are drawing a star -with n sides and you set the proportion for the -short radius to long radius to the cos(π/n), you get -a non-star star! I still can’t write a mathematical -proof of it, but it is an interesting result. -I don’t consider that side trip of writing the -test program to be wasted time; -I did learn something new and mildly interesting, and it -may turn out to be useful in the future.

    - -
    -

    -Programming Challenge: What happens if you set the -proportion to something greater than the “non-star” -ratio? Try it and find out. -

    -
    +

    What Went Wrong?

    + +

    + When I ran this program, I just freaked out. Everything looked great, except for the three-sided star. How come I didn’t get a star from it? The code sure looks correct, so I decided to see what would happen if I drew the diagram by hand. I measured the angles with my protractor, and I drew the long radius lines with a length of two inches in black and the short radius lines with a length of one inch in red. Sure enough, it just so happens that the endpoints of the short radius lines are right on the lines of the main triangle. The program is drawing a star, with the sides pushed in by zero. +

    -

    -Of course, the way to get a three-sided star is to set the proportion -to an amount less than 0.5, which I did in the following setup code, -with much better results. I also changed the proportions for the other -stars just to see what they would look like. -

    +
    + triangular star drawn by hand +
    + +

    + While wondering why this happened, I remembered that the cosine of the angle between the lines, 60° (π/3) comes out to 0.5, and I strongly suspected that this had something to do with it. To test my hypothesis, I changed the square to use a proportion of cosine of 45° (π/4), the pentagon to cosine of 36° (π/5), and the hexagon to cosine of 30° (π/6). Sure enough, they all came out with no push-in. +

    + +

    + So, if you are drawing a star with n sides and you set the proportion for the short radius to long radius to the cos(π/n), you get a non-star star! I still can’t write a mathematical proof of it, but it is an interesting result. I don’t consider that side trip of writing the test program to be wasted time; I did learn something new and mildly interesting, and it may turn out to be useful in the future. +

    + + +
    +

    + Programming Challenge: What happens if you set the + proportion to something greater than the “non-star” + ratio? Try it and find out. +

    +
    + + +

    + Of course, the way to get a three-sided star is to set the proportion + to an amount less than 0.5, which I did in the following setup code, + with much better results. I also changed the proportions for the other + stars just to see what they would look like. +

    + +3, 4, 5, and 6-sided stars -3, 4, 5, and 6-sided stars
    -void setup()
    -{
    -  size(300, 300);
    -  background(255);
    -  smooth();
    -
    -  noFill();
    -  star(3, 60, 75, 100, 100, -PI / 2.0, 0.3); // -90 degrees
    -  star(4, 170, 75, 25, 0.5);  // use simpler call
    -
    -  fill(255, 204, 255);
    -  stroke(128, 0, 128);
    -  star(5, 60, 200, 75, 50, -PI / 2.0, 0.75); // -90 degrees
    -
    -  noFill();
    -  stroke(0);
    -  star(6, 170, 200, 50, 100, 0, 0.4);
    -  stroke(128);
    -  
    -  // draw enclosing ellipses to make sure we did it right
    -  ellipse(60, 75, 100, 100);
    -  ellipse(170, 75, 50, 50);
    -  ellipse(60, 200, 75, 50);
    -  ellipse(170, 200, 50, 100);
    +void setup(){
    +  size(300, 300);
    +  background(255);
    +
    +  noFill();
    +  star(3, 60, 75, 100, 100, -PI / 2.0, 0.3); // -90 degrees
    +  star(4, 170, 75, 25, 0.5);  // use simpler call
    +
    +  fill(255, 204, 255);
    +  stroke(128, 0, 128);
    +  star(5, 60, 200, 75, 50, -PI / 2.0, 0.75); // -90 degrees
    +
    +  noFill();
    +  stroke(0);
    +  star(6, 170, 200, 50, 100, 0, 0.4);
    +  stroke(128);
    +  
    +  // Draw enclosing ellipses to make sure we did it right
    +  ellipse(60, 75, 100, 100);
    +  ellipse(170, 75, 50, 50);
    +  ellipse(60, 200, 75, 50);
    +  ellipse(170, 200, 50, 100);
    +}
    +
    +
    +void star(int n, float cx, float cy, float r, float proportion) {
    +  star(n, cx, cy, 2.0 * r, 2.0 * r, 0.0, proportion);
     }
     
    +void star(int n, float cx, float cy, float w, float h,
    +  float startAngle, float proportion) {
    +    
    +  if (n > 2) {
    +    float angle = TWO_PI/ (2 *n);  // twice as many sides
    +    float dw; // draw width
    +    float dh; // draw height
    +    
    +    w = w / 2.0;
    +    h = h / 2.0;
    +    
    +    beginShape();
    +    for (int i = 0; i < 2 * n; i++) {
    +      dw = w;
    +      dh = h;
    +      if (i % 2 == 1) {
    +        dw = w * proportion;
    +        dh = h * proportion;
    +      }
    +      vertex(cx + dw * cos(startAngle + angle * i),
    +        cy + dh * sin(startAngle + angle * i));
    +    }
    +    endShape(CLOSE);
    +  }
    +}
     
    -

    Using the Functions

    -

    -Finally, in order to use the functions in something other -than a test, I decided to write a program that -would randomly generate polygons and stars. The window is -300 by 300, and the stars or polygons have a radius of 24 dots, so I -have six rows and five columns (the extra dot is for spacing). -Remember how I said -that knowing the proportions that would create a star -“may turn out to be useful in the future”? Well, -they aren’t just useful for this program—they’re -vital. When I generate a star, I need to make sure it really has a -star shape, so I have to keep the proportion of short to long radius -less than the cosine of π divided by the number of sides. -

    +

    Using the Functions

    +

    + Finally, in order to use the functions in something other than a test, I decided to write a program that would randomly generate polygons and stars. The window is 300 by 300, and the stars or polygons have a radius of 24 dots, so I have six rows and five columns (the extra dot is for spacing). Remember how I said that knowing the proportions that would create a star “may turn out to be useful in the future”? Well, they aren’t just useful for this program—they’re vital. When I generate a star, I need to make sure it really has a star shape, so I have to keep the proportion of short to long radius less than the cosine of π divided by the number of sides. +

    -

    Here is the code for setup() and draw(); -I am not including the code for the polygon() and -star() functions here; it is the same as in the -examples. -

    +

    + Here is the code for setup() and draw(): +

    + +random polygons and stars -random polygons and stars
    -void setup()
    -{
    -  size(300, 300);
    -  background(255);
    -  frameRate(6);
    -  smooth();
    -  rectMode(CENTER);
    +void setup() {
    +  size(300, 300);
    +  background(255);
    +  frameRate(6);
    +  rectMode(CENTER);
     }
     
    -void draw()
    -{
    -  // choose a random stroke color
    -  int r = int(random(0, 255));
    -  int g = int(random(0, 255));
    -  int b = int(random(0, 255));
    -  // and fill opacity
    -  int opacity = int(random(100, 255));
    -  int nSides = int(random(3, 9));
    -  
    -  // determine the center x and y coordinates
    -  int cx = 25 + 50 * int(random(0, 6));
    -  int cy = 25 + 50 * int(random(0, 6));
    -  
    -  // if a random number (0 or 1) is 0, draw a polygon;
    -  // otherwise, draw a star
    -  boolean isPolygon = int(random(2)) == 0;
    -  
    -  // for stars, you need the proportion of short to long radius
    -  float proportion;
    -  
    -  stroke(255); // erase any previous drawing in this area
    -  fill(255);
    -  rect(cx, cy, 50, 50); 
    -    
    -  stroke(r, g, b);
    -  fill(r, g, b, opacity);
    -  if (isPolygon)
    -  {
    -    polygon(nSides, cx, cy, 24);
    -  }
    -  else
    -  {
    -    proportion = random(0.2, 0.8) * cos(PI / nSides);
    -    star(nSides, cx, cy, 24, proportion);
    -  }
    +void draw() {
    +  // Choose a random stroke color
    +  int r = int(random(0, 255));
    +  int g = int(random(0, 255));
    +  int b = int(random(0, 255));
    +  // Fill opacity
    +  int opacity = int(random(100, 255));
    +  int nSides = int(random(3, 9));
    +
    +  // Determine the center x and y coordinates
    +  int cx = 25 + 50 * int(random(0, 6));
    +  int cy = 25 + 50 * int(random(0, 6));
    +
    +  // If a random number (0 or 1) is 0, draw a polygon;
    +  // otherwise, draw a star
    +  boolean isPolygon = int(random(2)) == 0;
    +
    +  // For stars, you need the proportion of short to long radius
    +  float proportion;
    +
    +  stroke(255); // erase any previous drawing in this area
    +  fill(255);
    +  rect(cx, cy, 50, 50); 
    +
    +  stroke(r, g, b);
    +  fill(r, g, b, opacity);
    +  if (isPolygon) {
    +    polygon(nSides, cx, cy, 24);
    +  } else {
    +    proportion = random(0.2, 0.8) * cos(PI / nSides);
    +    star(nSides, cx, cy, 24, proportion);
    +  }
    +}
    +
    +void polygon(int n, float cx, float cy, float r) {
    +  float angle = 360.0 / n;
    +  beginShape();
    +  for (int i = 0; i < n; i++) {
    +    vertex(cx + r * cos(radians(angle * i)),
    +      cy + r * sin(radians(angle * i)));
    +  }
    +  endShape(CLOSE);
    +}
    +
    +void star(int n, float cx, float cy, float r, float proportion) {
    +  star(n, cx, cy, 2.0 * r, 2.0 * r, 0.0, proportion);
     }
     
    +void star(int n, float cx, float cy, float w, float h,
    +  float startAngle, float proportion) {
    +  if (n > 2) {
    +    float angle = TWO_PI/ (2 *n);  // twice as many sides
    +    float dw; // draw width
    +    float dh; // draw height
    +    
    +    w = w / 2.0;
    +    h = h / 2.0;
    +    
    +    beginShape();
    +    for (int i = 0; i < 2 * n; i++)
    +    {
    +      dw = w;
    +      dh = h;
    +      if (i % 2 == 1) // for odd vertices, use short radius
    +      {
    +        dw = w * proportion;
    +        dh = h * proportion;
    +      }
    +      vertex(cx + dw * cos(startAngle + angle * i),
    +        cy + dh * sin(startAngle + angle * i));
    +    }
    +    endShape(CLOSE);
    +  }
    +}
     

    Polygons and Stars as Objects

    -

    +

    Now that I have working functions for polygons and stars, it might be useful to make a Polygon and Star class so that I can treat them as objects. The method I would use is much @@ -658,7 +552,7 @@

    Polygons and Stars as Objects

    Summing Up

    -

    +

    This tutorial has shown you the things you never see in books. In a book, all the diagrams are picture perfect. You see a sample program, and it just works, and @@ -674,14 +568,10 @@

    Summing Up

    because we are all in this together.

    -

    +

    You can download the files from this tutorial.

    -

     

    - -

    This tutorial is for Processing version 2.0+. If you see any errors or have comments, please let us know. This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

    - -
    +
    diff --git a/content/static/tutorials/android/index.html b/content/static/tutorials/android/index.html index f339fd9ba..75a355092 100644 --- a/content/static/tutorials/android/index.html +++ b/content/static/tutorials/android/index.html @@ -121,7 +121,7 @@

    Step Three: Running the App on a Device

    Some helpful tips when you’re working with Processing & Android:

    - I know I’ve said this before, but be patient. Canceling a process (ie. the emulator load or a device compile) can cause problems. If you do this inadvertently, you’re best off restarting Processing.

    -

    - Make sure to check out the Processing Android Wiki, where you’ll find some troubleshooting advice, and some tips on how to get your sketches working properly on your device.

    +

    - Make sure to check out the Processing Android Wiki, where you’ll find some troubleshooting advice, and some tips on how to get your sketches working properly on your device.

    This tutorial is for Processing version 2.0+. If you see any errors or have comments, please let us know. This tutorial is adapted from 'Processing & Android: Mobile App Development Made (Very) Easy' by Jer Thorp

    diff --git a/content/static/tutorials/arraylist/index.html b/content/static/tutorials/arraylist/index.html index 613ffee6a..5f24a6ad5 100644 --- a/content/static/tutorials/arraylist/index.html +++ b/content/static/tutorials/arraylist/index.html @@ -1,4 +1,4 @@ -In truth, we could use a simple array to manage our Particle objects. Some particle systems might have a fixed number of particles, and arrays are magnificently efficient in those instances. Processing also offers expand(), contract(), subset(), splice() and other methods for resizing arrays. However, for these examples, the Java class ArrayList (found in the java.util package: http://download.oracle.com/javase/6/docs/api/java/util/ArrayList.html) will prove to be the best solution.

Using an ArrayList is conceptually similar to a standard array, but the syntax is different. Here is some code (that assumes the existence of a generic Particle class) demonstrating identical results: first with an array, and second with an ArrayList. +In truth, we could use a simple array to manage our Particle objects. Some particle systems might have a fixed number of particles, and arrays are magnificently efficient in those instances. Processing also offers expand(), contract(), subset(), splice() and other methods for resizing arrays. However, for these examples, the Java class ArrayList (found in the java.util package: https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html) will prove to be the best solution.

Using an ArrayList is conceptually similar to a standard array, but the syntax is different. Here is some code (that assumes the existence of a generic Particle class) demonstrating identical results: first with an array, and second with an ArrayList. // THE STANDARD ARRAY WAY int total = 10; diff --git a/content/static/tutorials/arrays/index.html b/content/static/tutorials/arrays/index.html index 01fdad22d..d380160dc 100644 --- a/content/static/tutorials/arrays/index.html +++ b/content/static/tutorials/arrays/index.html @@ -1,15 +1,19 @@ -
    - - -
    -

    Arrays

    -

    This tutorial is the Arrays chapter from the second edition of Processing: A Programming Handbook for Visual Designers and Artists, published by MIT Press. Copyright 2013 MIT Press. This tutorial is for Processing version 2.0+. If you see any errors or have comments, please let us know.

    - -
    -

    -The term array refers to a structured grouping or an imposing number: “The dinner buffet offers an array of choices,” “The city of Boston faces an array of problems.” In computer programming, an array is a set of data elements stored under the same name. Arrays can be created to hold any type of data, and each element can be individually assigned and read. There can be arrays of numbers, characters, sentences, boolean values, and so on. Arrays might store vertex data for complex shapes, recent keystrokes from the keyboard, or data read from a file. -For instance, an array can store five integers (1919, 1940, 1975, 1976, 1990), the years to date that the Cincinnati Reds won the World Series, rather than defining five separate variables. Let’s call this array “dates” and store the values in sequence: -

    + + + @@ -712,13 +716,6 @@

    Array of Objects

    rings[i].display(); } } -28-24 -9236_028.indd 426 10/16/2014 8: -43: -18 PM -PROPERTY OF THE MIT PRESS -FOR PROOFREADING, INDEXING, AND PROMOTIONAL PURPOSES ONLY -427 Arrays // Click to create a new Ring void mousePressed() { rings[currentRing].start(mouseX, mouseY); @@ -727,7 +724,38 @@

    Array of Objects

    currentRing = 0; } } -//Insert Ring Class +class Ring { + float x, y; // X-coordinate, y-coordinate + float diameter; // Diameter of the ring + boolean on = false; // Turns the display on and off + + void start(float xpos, float ypos) { + x = xpos; + y = ypos; + + diameter = 1; + on = true; + } + + void grow() { + if (on == true) { + diameter += 0.5; + if (diameter > 400) { + on = false; + diameter = 1; + } + } + } + + void display() { + if (on == true) { + noFill(); + strokeWeight(4); + stroke(204, 153); + ellipse(x, y, diameter, diameter); + } + } +} @@ -775,7 +803,31 @@

    Array of Objects

    spots[i].display(); // Display each object } } -// Insert Spot class +class Spot { + float x, y; // X-coordinate, y-coordinate + float diameter; // Diameter of the circle + float speed; // Distance moved each frame + int direction = 1; // Direction of motion (1 is down, -1 is up) + + // Constructor + Spot(float xpos, float ypos, float dia, float sp) { + x = xpos; + y = ypos; + diameter = dia; + speed = sp; + } + + void move() { + y += (speed * direction); + if ((y > (height - diameter/2)) || (y < diameter/2)) { + direction *= -1; + } + } + + void display() { + ellipse(x, y, diameter, diameter); + } +} @@ -862,4 +914,3 @@

    Two-dimensional Arrays

    + + +

    This tutorial is the Arrays chapter from Processing: A Programming Handbook for Visual Designers and Artists, Second Edition, published by MIT Press. © 2014 MIT Press. If you see any errors or have comments, please let us know.

    + +

    Arrays

    +

    Casey Reas and Ben Fry

    + + +

    + The term array refers to a structured grouping or an imposing number: “The dinner buffet offers an array of choices,” “The city of Boston faces an array of problems.” In computer programming, an array is a set of data elements stored under the same name. Arrays can be created to hold any type of data, and each element can be individually assigned and read. There can be arrays of numbers, characters, sentences, boolean values, and so on. Arrays might store vertex data for complex shapes, recent keystrokes from the keyboard, or data read from a file. For instance, an array can store five integers (1919, 1940, 1975, 1976, 1990), the years to date that the Cincinnati Reds won the World Series, rather than defining five separate variables. Let’s call this array “dates” and store the values in sequence: +

    + +
    - \ No newline at end of file diff --git a/content/static/tutorials/color/imgs/grayscale.svg b/content/static/tutorials/color/imgs/grayscale.svg new file mode 100644 index 000000000..ece2648ff --- /dev/null +++ b/content/static/tutorials/color/imgs/grayscale.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + +0 + +50 + +87 + +167 + +209 + +255 + diff --git a/content/static/tutorials/color/imgs/order.svg b/content/static/tutorials/color/imgs/order.svg new file mode 100644 index 000000000..38176b1bb --- /dev/null +++ b/content/static/tutorials/color/imgs/order.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + +background(150); stroke(0); line(0,0,100,100); stroke(255); noFill(); rect(25,25,50,50); + + + + + + + diff --git a/content/static/tutorials/color/index.html b/content/static/tutorials/color/index.html index d42c966cc..c609f8d15 100644 --- a/content/static/tutorials/color/index.html +++ b/content/static/tutorials/color/index.html @@ -1,175 +1,187 @@ -

    Color

    - -

    - - - -

    This tutorial is for Processing version 1.1+. If you see any errors or have comments, please let us know. This tutorial is from the book, Learning Processing, by Daniel Shiffman, published by Morgan Kaufmann Publishers, Copyright © 2008 Elsevier Inc. All rights reserved.

    - -

     

    - - -

    Grayscale Color

    - -In the digital world, when we want to talk about a color, precision is required. Saying "Hey, can you make that circle bluish-green?" will not do. Color, rather, is defined as a -range of numbers. Let's start with the simplest case: black & white or grayscale. 0 means black, 255 means white. In between, every other number - 50, 87, 162, 209, and so on - is a -shade of gray ranging from black to white. -

    - -

    -
    -
    Does 0-255 seem arbitrary to you?
    -Color for a given shape needs to be stored in the computer's memory. This memory is just a long sequence of 0's and 1's (a whole bunch of on or off switches.) -Each one of these switches is a bit, eight of them together is a byte. Imagine if we had eight bits (one byte) in sequence - how many ways can we -configure these switches? The answer is (and doing a little research into binary numbers will prove this point) 256 possibilities, or a range -of numbers between 0 and 255. We will use eight bit color for our grayscale range and 24 bit for full color (eight bits for each of the red, green, and blue color components). -
    -

    -By adding the stroke() and -fill() functions before something is drawn, we can set the color of any given shape. There is also the function -background(), which sets a background color for the window. Here's an example. - -

    + + + + -
    + +

    + This tutorial is from the book Learning Processing by Daniel Shiffman, published by Morgan Kaufmann, © 2008 Elsevier Inc. All rights reserved. If you see any errors or have comments, please let us know. +

    + +

    Color

    +

    Daniel Shiffman

    + +

    + In the digital world, when we want to talk about a color, precision is required. Saying "Hey, can you make that circle bluish-green?" will not do. Color, rather, is defined as a range of numbers. Let's start with the simplest case: black & white or grayscale. 0 means black, 255 means white. In between, every other number—50, 87, 162, 209, and so on—is a shade of gray ranging from black to white. +

    + + + +

    + Does 0-255 seem arbitrary to you?
    + Color for a given shape needs to be stored in the computer's memory. This memory is just a long sequence of 0's and 1's (a whole bunch of on or off switches.) Each one of these switches is a bit, eight of them together is a byte. Imagine if we had eight bits (one byte) in sequence—how many ways can we configure these switches? The answer is (and doing a little research into binary numbers will prove this point) 256 possibilities, or a range of numbers between 0 and 255. We will use eight bit color for our grayscale range and 24 bit for full color (eight bits for each of the red, green, and blue color components). +

    + +

    + By adding the stroke() and fill() functions before something is drawn, we can set the color of any given shape. There is also the function background(), which sets a background color for the window. Here's an example. +

    -background(255);    // Setting the background to white
    -stroke(0);          // Setting the outline (stroke) to black
    -fill(150);          // Setting the interior of a shape (fill) to grey 
    -rect(50,50,75,100); // Drawing the rectangle
    +size(200, 200);
    +background(255);    // Setting the background to white
    +stroke(0);          // Setting the outline (stroke) to black
    +fill(150);          // Setting the interior of a shape (fill) to grey 
    +rect(50,50,75,100); // Drawing the rectangle
     
    -

    - -Stroke or fill can be eliminated with the functions: noStroke() and noFill(). -Our instinct might be to say "stroke(0)" for no outline, however, it is important to remember that 0 is not "nothing", but rather denotes the color black. -Also, remember not to eliminate both - with noStroke() and noFill(), nothing will appear! -

    -In addition, if we draw two shapes, Processing will always use the most recently specified stroke and fill, reading the code from top to bottom. -

    - - -

    RGB Color

    -

    -Remember finger painting? By mixing three "primary" colors, any color could be generated. Swirling all colors together resulted in a muddy brown. The more paint you added, the darker it got. -Digital colors are also constructed by mixing three primary colors, but it works differently from paint. First, the primaries are diff erent: red, green, and blue (i.e., "RGB" color). -And with color on the screen, you are mixing light, not paint, so the mixing rules are different as well. -
    -
    -
    -

      -
    • Red + Green = Yellow
    • -
    • Red + Blue = Purple
    • -
    • Green + Blue = Cyan (blue-green)
    • -
    • Red + Green + Blue = White
    • -
    • no colors = Black
    • -
    -
    -This assumes that the colors are all as bright as possible, but of course, you have a range of color available, so some red plus some green plus some blue equals gray, and a bit of -red plus a bit of blue equals dark purple. While this may take some getting used to, the more you program and experiment with RGB color, the more it will become instinctive, -much like swirling colors with your fi ngers. And of course you can't say "Mix some red with a bit of blue," you have to provide an exact amount. As with grayscale, the individual color -elements are expressed as ranges from 0 (none of that color) to 255 (as much as possible), and they are listed in the order R, G, and B. You will get the hang of RGB color mixing -through experimentation, but next we will cover some code using some common colors. -

    - -

    -Example: RGB color + +

    + Stroke or fill can be eliminated with the functions: noStroke() and noFill(). Our instinct might be to say "stroke(0)" for no outline, however, it is important to remember that 0 is not "nothing", but rather denotes the color black. Also, remember not to eliminate both—with noStroke() and noFill(), nothing will appear! +

    + +

    + In addition, if we draw two shapes, Processing will always use the most recently specified stroke and fill, reading the code from top to bottom. +

    + + + + + +

    RGB Color

    + +

    + Remember finger painting? By mixing three "primary" colors, any color could be generated. Swirling all colors together resulted in a muddy brown. The more paint you added, the darker it got. Digital colors are also constructed by mixing three primary colors, but it works differently from paint. First, the primaries are diff erent: red, green, and blue (i.e., "RGB" color). And with color on the screen, you are mixing light, not paint, so the mixing rules are different as well. +

    + + + +
      +
    • Red + Green = Yellow
    • +
    • Red + Blue = Purple
    • +
    • Green + Blue = Cyan (blue-green)
    • +
    • Red + Green + Blue = White
    • +
    • No colors = Black
    • +
    + +

    + This assumes that the colors are all as bright as possible, but of course, you have a range of color available, so some red plus some green plus some blue equals gray, and a bit of red plus a bit of blue equals dark purple. While this may take some getting used to, the more you program and experiment with RGB color, the more it will become instinctive, much like swirling colors with your fi ngers. And of course you can't say "Mix some red with a bit of blue," you have to provide an exact amount. As with grayscale, the individual color elements are expressed as ranges from 0 (none of that color) to 255 (as much as possible), and they are listed in the order R, G, and B. You will get the hang of RGB color mixing through experimentation, but next we will cover some code using some common colors. +

    + + + + Example: RGB color +
    -background(255);  
    -noStroke(); 
    +background(255);  
    +noStroke(); 
     
    -// Bright red
    -fill(255,0,0);
    -ellipse(20,20,16,16);
    +// Bright red
    +fill(255,0,0);
    +ellipse(20,20,16,16);
     
    -// Dark red
    -fill(127,0,0);
    -ellipse(40,20,16,16);
    +// Dark red
    +fill(127,0,0);
    +ellipse(40,20,16,16);
     
    -// Pink (pale red)
    -fill(255,200,200);
    -ellipse(60,20,16,16);
    +// Pink (pale red)
    +fill(255,200,200);
    +ellipse(60,20,16,16);
     
    -
    -Processing also has a color selector to aid in choosing colors. Access this via TOOLS (from the menu bar) → COLOR SELECTOR. -

    - -

    -

    Color Transparency

    -

    -In addition to the red, green, and blue components of each color, there is an additional optional fourth component, referred to as the color's "alpha." Alpha means transparency and is particularly useful when you want to draw elements that appear partially see-through on top of one another. The alpha values for an image are sometimes referred to collectively as the "alpha channel" of an image. -

    -It is important to realize that pixels are not literally transparent, this is simply a convenient illusion that is accomplished by blending colors. Behind the scenes, Processing takes the color numbers and adds a percentage of one to a percentage of another, creating the optical perception of blending. (If you are interested in programming "rose-colored" glasses, this is where you would begin.) -

    -Alpha values also range from 0 to 255, with 0 being completely transparent (i.e., 0% opaque) and 255 completely opaque (i.e., 100% opaque). -

    - -

    -Example: Alpha transparency + +

    + Processing also has a color selector to aid in choosing colors. Access this via Tools (from the menu bar) → Color Selector. +

    + + + + + +

    Color Transparency

    + +

    + In addition to the red, green, and blue components of each color, there is an additional optional fourth component, referred to as the color's "alpha." Alpha means transparency and is particularly useful when you want to draw elements that appear partially see-through on top of one another. The alpha values for an image are sometimes referred to collectively as the "alpha channel" of an image. +

    + +

    + It is important to realize that pixels are not literally transparent, this is simply a convenient illusion that is accomplished by blending colors. Behind the scenes, Processing takes the color numbers and adds a percentage of one to a percentage of another, creating the optical perception of blending. (If you are interested in programming "rose-colored" glasses, this is where you would begin.) +

    + +

    + Alpha values also range from 0 to 255, with 0 being completely transparent (i.e., 0% opaque) and 255 completely opaque (i.e., 100% opaque). +

    + + + + Example: Alpha transparency +
    -size(200,200);
    -background(0);
    -noStroke();
    +size(200,200);
    +background(0);
    +noStroke();
     
    -// No fourth argument means 100% opacity.
    -fill(0,0,255);
    -rect(0,0,100,200);
    +// No fourth argument means 100% opacity.
    +fill(0,0,255);
    +rect(0,0,100,200);
     
    -// 255 means 100% opacity.
    -fill(255,0,0,255);
    -rect(0,0,200,40);
    +// 255 means 100% opacity.
    +fill(255,0,0,255);
    +rect(0,0,200,40);
     
    -// 75% opacity.
    -fill(255,0,0,191);
    -rect(0,50,200,40);
    +// 75% opacity.
    +fill(255,0,0,191);
    +rect(0,50,200,40);
     
    -// 55% opacity.
    -fill(255,0,0,127);
    -rect(0,100,200,40);
    +// 55% opacity.
    +fill(255,0,0,127);
    +rect(0,100,200,40);
     
    -// 25% opacity.
    -fill(255,0,0,63);
    -rect(0,150,200,40);
    +// 25% opacity.
    +fill(255,0,0,63);
    +rect(0,150,200,40);
     
    -

    Custom Color Ranges

    -

    -RGB color with ranges of 0 to 255 is not the only way you can handle color in Processing. Behind the scenes in the computer's memory, color is always -talked about as a series of 24 bits (or 32 in the case of colors with an alpha). However, Processing will let us think about color any way we like, and -translate our values into numbers the computer understands. For example, you might prefer to think of color as ranging from 0 to 100 (like a percentage). -You can do this by specifying a custom colorMode(). -
    + +

    Custom Color Ranges

    + +

    + RGB color with ranges of 0 to 255 is not the only way you can handle color in Processing. Behind the scenes in the computer's memory, color is always talked about as a series of 24 bits (or 32 in the case of colors with an alpha). However, Processing will let us think about color any way we like, and translate our values into numbers the computer understands. For example, you might prefer to think of color as ranging from 0 to 100 (like a percentage). You can do this by specifying a custom colorMode(). +

    +
    -colorMode(RGB,100);
    +colorMode(RGB,100);
     
    -
    -The above function says: "OK, we want to think about color in terms of red, green, and blue. The range of RGB values will be from 0 to 100." -

    -Although it is rarely convenient to do so, you can also have different ranges for each color component: -
    + +

    + The above function says: "OK, we want to think about color in terms of red, green, and blue. The range of RGB values will be from 0 to 100." +

    + +

    + Although it is rarely convenient to do so, you can also have different ranges for each color component: +

    +
    -colorMode(RGB,100,500,10,255);
    +colorMode(RGB,100,500,10,255);
     
    -
    -Now we are saying "Red values go from 0 to 100, green from 0 to 500, blue from 0 to 10, and alpha from 0 to 255." -

    -Finally, while you will likely only need RGB color for all of your programming needs, you can also specify colors in the HSB (hue, saturation, and brightness) mode. -Without getting into too much detail, HSB color works as follows: -

    - -
    -
      -
    • Hue - The color type, ranges from 0 to 255 by default.
    • -
    • Saturation - The vibrancy of the color, 0 to 255 by default.
    • -
    • Brightness - The, well, brightness of the color, 0 to 255 by default.
    • -
    -
    -With colorMode() you can set your own ranges for these values. Some prefer a range of 0-360 for hue (think of 360 degrees on a color wheel) and 0-100 for saturation and brightness (think of 0-100%). -

    - -

     

    - -

    This tutorial is for Processing version 1.1+. If you see any errors or have comments, please let us know. This tutorial is from the book, Learning Processing, by Daniel Shiffman, published by Morgan Kaufmann Publishers, Copyright © 2008 Elsevier Inc. All rights reserved.

    + +

    + Now we are saying "Red values go from 0 to 100, green from 0 to 500, blue from 0 to 10, and alpha from 0 to 255." +

    + +

    + Finally, while you will likely only need RGB color for all of your programming needs, you can also specify colors in the HSB (hue, saturation, and brightness) mode. Without getting into too much detail, HSB color works as follows: +

    + + + +
      +
    • Hue—The color type, ranges from 0 to 255 by default.
    • +
    • Saturation—The vibrancy of the color, 0 to 255 by default.
    • +
    • Brightness—The, well, brightness of the color, 0 to 255 by default.
    • +
    + +

    + With colorMode() you can set your own ranges for these values. Some prefer a range of 0-360 for hue (think of 360 degrees on a color wheel) and 0-100 for saturation and brightness (think of 0-100%). +

    + -
    -

    +
    + diff --git a/content/static/tutorials/curves/index.html b/content/static/tutorials/curves/index.html index 85b794639..c3a7cd59f 100644 --- a/content/static/tutorials/curves/index.html +++ b/content/static/tutorials/curves/index.html @@ -1,132 +1,121 @@ - -

    Curves

    - - - +
    +
    -

    This tutorial is for Processing version 1.1+. If you see any errors or have comments, please let us know. This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

    - -

    -Download the files from this tutorial. -

    - -

     

    - -

    -This tutorial introduces you to the three types of curves in Processing: -arcs, spline curves, and Bézier curves. -

    +

    If you see any errors in this tutorial or have comments, please let us know. This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

    + +

    Curves

    +

    J David Eisenberg

    + + + +

    + This short tutorial introduces you to the three types of curves in Processing: arcs, spline curves, and Bézier curves. +

    -

    Arcs

    +

    Arcs

    -

    -Arcs are the simplest curves to draw. Processing defines an arc as a section of an ellipse. -You call the function with these parameters: + +

    + Arcs are the simplest curves to draw. Processing defines an arc as a section of an ellipse. You call the function with these parameters:

    -
    arc(x, y, width, height, start, stop);
    -
    +
    +arc(x, y, width, height, start, stop);
     
    -

    -The first four parameters are the same as the ones for ellipse(); they define -the boundary box for your arc. The last two parameters are the starting and ending + +

    + The first four parameters are the same as the ones for ellipse(); they define the boundary box for your arc. The last two parameters are the starting and ending angle for the arc. These angles, as with all other angles in Processing, are given in radians. Remember that angles are measured clockwise, with zero degrees pointing east. Using the fact that PI radians equals 180°, here are some example arcs.

    -Sample arcs -
    void setup()
    -{
    -  size(300, 200);
    -  background(255);
    -  smooth();
    -  
    -  rectMode(CENTER); // show bounding boxes
    -  stroke(128);
    -  rect(35, 35, 50, 50);
    -  rect(105, 35, 50, 50);
    -  rect(175, 35, 50, 50);
    -  rect(105, 105, 100, 50);
    -  
    -  stroke(0);
    -  arc(35, 35, 50, 50, 0, PI / 2.0); // lower quarter circle 
    -  arc(105, 35, 50, 50, -PI, 0);  // upper half of circle
    -  arc(175, 35, 50, 50, -PI / 6, PI / 6); // 60 degrees
    -  arc(105, 105, 100, 50, PI / 2, 3 * PI / 2); // 180 degrees
    -}
    +Sample arcs
     
    +
    +void setup() {
    +  size(300, 200);
    +  background(255);
    +  smooth();
    +  
    +  rectMode(CENTER); // show bounding boxes
    +  stroke(128);
    +  rect(35, 35, 50, 50);
    +  rect(105, 35, 50, 50);
    +  rect(175, 35, 50, 50);
    +  rect(105, 105, 100, 50);
    +  
    +  stroke(0);
    +  arc(35, 35, 50, 50, 0, PI / 2.0); // lower quarter circle 
    +  arc(105, 35, 50, 50, -PI, 0);  // upper half of circle
    +  arc(175, 35, 50, 50, -PI / 6, PI / 6); // 60 degrees
    +  arc(105, 105, 100, 50, PI / 2, 3 * PI / 2); // 180 degrees
    +}
     
    -

    Spline Curves

    -

    -Arcs are fine, but they’re plain. The next function, -curve(), lets you draw curves that aren’t -necessarily part of an arc. This function draws what is -technically called a Rom-Catmull Spline. To -draw the curve, you have to specify the -(xy) coordinates of the points where the -curve starts and ends. You -must also specify two control points which determine -the direction and amount of curvature. A call to curve() -uses these parameters: -

    +

    Spline Curves

    + +

    + Arcs are fine, but they’re plain. The next function, curve(), lets you draw curves that aren’t necessarily part of an arc. This function draws what is technically called a Rom-Catmull Spline. To draw the curve, you have to specify the (xy) coordinates of the points where the curve starts and ends. You must also specify two control points which determine the direction and amount of curvature. A call to curve() uses these parameters: +

    -
    curve(cpx1, cpy1, x1, y1, x2, y2, cpx2, cpy2);
    +
    +  curve(cpx1, cpy1, x1, y1, x2, y2, cpx2, cpy2);
     
    - - - - - - - - - - - - - - - - - -
    cpx1, cpy1Coordinates of the first control point
    x1, y1Coordinates of the curve’s starting point
    x2, y2Coordinates of the curve’s ending point
    cpx2, cpy2Coordinates of the second control point
    - -

    + + + + + + + + + + + + + + + + + + +
    cpx1, cpy1Coordinates of the first control point
    x1, y1Coordinates of the curve’s starting point
    x2, y2Coordinates of the curve’s ending point
    cpx2, cpy2Coordinates of the second control point
    + +

    Here is an example that shows a curve(). The control points are shown in red and the curve points in blue.

    -gentle curve with control points -
    void setup()
    -{
    -  size(200, 200);
    -  background(255);
    -  smooth();
    -  stroke(0);
    -  curve(40, 40, 80, 60, 100, 100, 60, 120);
    -  
    -  noStroke();
    -  fill(255, 0, 0);
    -  ellipse(40, 40, 3, 3);
    -  fill(0, 0, 255, 192);
    -  ellipse(100, 100, 3, 3);
    -  ellipse(80, 60, 3, 3);
    -  fill(255, 0, 0);
    -  ellipse(60, 120, 3, 3);  
    -}
    +gentle curve with control points
     
    +
    +
    +void setup() {
    +  size(200, 200);
    +  background(255);
    +  smooth();
    +  stroke(0);
    +  curve(40, 40, 80, 60, 100, 100, 60, 120);
    +  noStroke();
    +  fill(255, 0, 0);
    +  ellipse(40, 40, 3, 3);
    +  fill(0, 0, 255, 192);
    +  ellipse(100, 100, 3, 3);
    +  ellipse(80, 60, 3, 3);
    +  fill(255, 0, 0);
    +  ellipse(60, 120, 3, 3);  
    +}
     
    -

    -curve showing relationship between control points -How do the control points affect the way the curve looks? Take a deep + + + +

    + How do the control points affect the way the curve looks? Take a deep breath, because this is somewhat complicated.

      @@ -140,7 +129,7 @@

      Spline Curves

    Continuous Spline Curves

    -

    +

    In isolation, a single curve() is not particularly appealing. To draw a continuous curve through several points, you are better off using the curveVertex() function. You can only use this @@ -148,237 +137,217 @@

    Continuous Spline Curves

    beginShape() and endShape() functions.

    -

    +

    Here is a curve connecting the points (40, 40), (80, 60), (100, 100), (60, 120), and (50, 150). In common usage, people use the first point of the curve as the first control point and the last point -of the curve as the last control point. The lower diagram -shows the tangents at the intermediate points. +of the curve as the last control point.

    -
    -curve showing vertices
    -curve showing vertices and tangents -
    -
    void setup()
    -{
    -  int[ ] coords = {
    -    40, 40, 80, 60, 100, 100, 60, 120, 50, 150
    -  };
    -  int i;
    -  
    -  size(200, 200);
    -  background(255);
    -  smooth();
    -
    -  noFill();
    -  stroke(0);
    -  beginShape();
    -  curveVertex(40, 40); // the first control point
    -  curveVertex(40, 40); // is also the start point of curve
    -  curveVertex(80, 60);
    -  curveVertex(100, 100);
    -  curveVertex(60, 120);
    -  curveVertex(50, 150); // the last point of curve
    -  curveVertex(50, 150); // is also the last control point
    -  endShape();
    -  
    -  // use the array to keep the code shorter;
    -  // you already know how to draw ellipses!
    -  fill(255, 0, 0);
    -  noStroke();
    -  for (i = 0; i < coords.length; i += 2)
    -  {
    -    ellipse(coords[i], coords[i + 1], 3, 3);
    -  }
    -  
    -}
     
    +curve showing vertices
    +
    +
    +
    +int[] coords = {
    +  40, 40, 80, 60, 100, 100, 60, 120, 50, 150
    +};
    +
    +void setup() {
    +  size(200, 200);
    +  background(255);
    +  smooth();
    +
    +  noFill();
    +  stroke(0);
    +  beginShape();
    +  curveVertex(40, 40); // the first control point
    +  curveVertex(40, 40); // is also the start point of curve
    +  curveVertex(80, 60);
    +  curveVertex(100, 100);
    +  curveVertex(60, 120);
    +  curveVertex(50, 150); // the last point of curve
    +  curveVertex(50, 150); // is also the last control point
    +  endShape();
    +
    +  // Use the array to keep the code shorter;
    +  // you already know how to draw ellipses!
    +  fill(255, 0, 0);
    +  noStroke();
    +  for (int i = 0; i < coords.length; i += 2) {
    +    ellipse(coords[i], coords[i + 1], 3, 3);
    +  }
    +}
     
    -

    Bézier Curves

    -

    -Though better than arcs, spline curves don’t seem to have those -graceful, swooping curves that say “art.” For those, -you need to draw Bézier curves with the -bezier() function. As with spline curves, the -bezier() function has eight parameters, but the order is different: -

    +

    Bézier Curves

    + + +

    + Though better than arcs, spline curves don’t seem to have those graceful, swooping curves that say “art.” For those, you need to draw Bézier curves with the bezier() function. As with spline curves, the bezier() function has eight parameters, but the order is different: +

    -
    bezier(x1, y1, cpx1, cpy1, cpx2, cpy2, x2, y2);
    +
    +bezier(x1, y1, cpx1, cpy1, cpx2, cpy2, x2, y2);
     
    - - - - - - - - - - - - - - - - - -
    x1, y1Coordinates of the curve’s starting point
    cpx1, cpy1Coordinates of the first control point
    cpx2, cpy2Coordinates of the second control point
    x2, y2Coordinates of the curve’s ending point
    - -

    -Here is a program that displays a Bézier curve -and its control points. -

    -Bézier curve with endpoints and control points marked + + + + + + + + + + + + + + + + + +
    x1, y1Coordinates of the curve’s starting point
    cpx1, cpy1Coordinates of the first control point
    cpx2, cpy2Coordinates of the second control point
    x2, y2Coordinates of the curve’s ending point
    + + +

    + Here is a program that displays a Bézier curve and its control points. +

    + + Bézier curve with endpoints and control points marked +
    -void setup( )
    -{
    -  size(150, 150);
    -  background(255);
    -  smooth();
    -
    -  ellipse(50, 75, 5, 5); // endpoints of curve
    -  ellipse(100, 75, 5, 5);
    -  fill(255, 0, 0);
    -  ellipse(25, 25, 5, 5);  // control points
    -  ellipse(125, 25, 5, 5); 
    -  noFill();
    -  stroke(0);
    -  bezier(50, 75, 25, 25, 125, 25, 100, 75);
    +void setup() {
    +  size(150, 150);
    +  background(255);
    +  ellipse(50, 75, 5, 5); // endpoints of curve
    +  ellipse(100, 75, 5, 5);
    +  fill(255, 0, 0);
    +  ellipse(25, 25, 5, 5);  // control points
    +  ellipse(125, 25, 5, 5); 
    +  noFill();
    +  stroke(0);
    +  bezier(50, 75, 25, 25, 125, 25, 100, 75);
     }
    -
     
    -

    -Bézier curve showing control points connected to curve -While it is difficult to visualize how the control points affect a -curve(), it is slightly easier to see how the control points affect -Bézier curves. Imagine two poles and several -rubber bands. The poles connect the control points -to the endpoints of the curve. A rubber band connects the tops of the -poles. Two more rubber bands connect the midpoints of the poles to the -midpoint of the first rubber band. One more rubber band -connects their midpoints. The center of that last rubber -band is tied to the curve. -

    +

    + While it is difficult to visualize how the control points affect a curve(), it is slightly easier to see how the control points affect Bézier curves. Imagine two poles and several rubber bands. The poles connect the control points to the endpoints of the curve. A rubber band connects the tops of the poles. Two more rubber bands connect the midpoints of the poles to the midpoint of the first rubber band. One more rubber band connects their midpoints. The center of that last rubber band is tied to the curve. This diagrams helps to explain: +

    + + Bézier curve showing control points connected to curve -

    Continuous Bézier Curves

    -

    -Just as curveVertex() allows you to make continuous -spline curves, bezierVertex() lets you make continuous -Bézier curves. -Again, you must be within a beginShape() / -endShape() sequence. You must use -vertex(startXstartY) to specify -the starting point of the curve. Subsequent points are specified -with a call to: -

    -
    bezierVertex(cpx1, cpy1, cpx2, cpy2, x, y);
     
    +    

    Continuous Bézier Curves

    + + +

    + Just as curveVertex() allows you to make continuous spline curves, bezierVertex() lets you make continuous Bézier curves. Again, you must be within a beginShape() / endShape() sequence. You must use vertex(startXstartY) to specify the starting point of the curve. Subsequent points are specified with a call to: +

    + +
    +  bezierVertex(cpx1, cpy1, cpx2, cpy2, x, y);
     
    - - - - - - - - - - - - - -
    cpx1, cpy1Coordinates of the first control point
    cpx2, cpy2Coordinates of the second control point
    x, yThe next point on the curve
    - -

    + + + + + + + + + + + + + + +
    + cpx1, cpy1 + + Coordinates of the first control point +
    + cpx2, cpy2 + + Coordinates of the second control point +
    + x, y + + The next point on the curve +
    + +

    So, to draw the previous example using bezierVertex(), you would do this:

    -
    void setup( )
    -{
    -  size(150, 150);
    -  background(255);
    -  smooth();
    -  // don't show where control points are
    -  noFill();
    -  stroke(0);
    -  beginShape();
    -  vertex(50, 75); // first point
    -  bezierVertex(25, 25, 125, 25, 100, 75);
    -  endShape();
    +
    +void setup() {
    +  size(150, 150);
    +  background(255);
    +  smooth();
    +  // Don't show where control points are
    +  noFill();
    +  stroke(0);
    +  beginShape();
    +  vertex(50, 75); // first point
    +  bezierVertex(25, 25, 125, 25, 100, 75);
    +  endShape();
     }
    -
     
    -

    -lumpy continuous bezier curve -Here is a continuous Bézier curve, but it doesn’t -join smoothly. +

    + Here is a continuous Bézier curve, but it doesn’t join smoothly. The diagram shows the control points, but only the relevant code for drawing the curve is here. -

    +

    -
    beginShape();
    -vertex(30, 70); // first point
    -bezierVertex(25, 25, 100, 50, 50, 100);
    -bezierVertex(50, 140, 75, 140, 120, 120);
    -endShape();
     
    +lumpy continuous bezier curve
    +
    +
    +size(200, 200);
    +background(255);
    +noFill();
    +beginShape();
    +vertex(30, 70); // first point
    +bezierVertex(25, 25, 100, 50, 50, 100);
    +bezierVertex(50, 140, 75, 140, 120, 120);
    +endShape();
     
    -
    +

    + In order to make two curves A and B smoothly continuous, the last control point of A, the last point of A, and the first control point of B have to be on a straight line. Here is an example that meets those conditions. The points that are in a line are shown in bold. +

    -smooth continuous bezier curve -

    -In order to make two curves A and B smoothly continuous, the last control -point of A, the last point of A, and the first control point of B -have to be on a straight line. Here is an example that -meets those conditions. The points that are in a line are -shown in bold. -

    +smooth continuous bezier curve -
    beginShape();
    -vertex(30, 70); // first point
    -bezierVertex(25, 25, 100, 50, 50, 100);
    -bezierVertex(20, 130, 75, 140, 120, 120);
    -endShape();
    +
    +size(200, 200);
    +background(255);
    +beginShape();
    +vertex(30, 70); // first point
    +bezierVertex(25, 25, 100, 50, 50, 100);
    +bezierVertex(20, 130, 75, 140, 120, 120);
    +endShape();
     
    -

    Summary

    -
      -
    • Use arc() when you need a segment of a circle -or an ellipse. You can’t make continuous arcs or use them as -part of a shape.
    • -
    • Use curve() when you need a small curve between -two points. Use curveVertex() to make a continuous series -of curves as part of a shape.
    • -
    • Use bezier() when you need long, smooth curves. -Use bezierVertex() to make a continuous series -of Bézier curves as part -of a shape.
    • +

      Summary

      + +
        +
      • Use arc() when you need a segment of a circle or an ellipse. You can’t make continuous arcs or use them as part of a shape.
      • +
      • Use curve() when you need a small curve between two points. Use curveVertex() to make a continuous series of curves as part of a shape.
      • +
      • Use bezier() when you need long, smooth curves. Use bezierVertex() to make a continuous series of Bézier curves as part of a shape.
      -

       

      - -

      This tutorial is for Processing version 1.1+. If you see any errors or have comments, please let us know. This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

      -
    diff --git a/content/static/tutorials/data/imgs/data_03_table.png b/content/static/tutorials/data/imgs/data_03_table.png index d0ff43b2d..961ac434c 100644 Binary files a/content/static/tutorials/data/imgs/data_03_table.png and b/content/static/tutorials/data/imgs/data_03_table.png differ diff --git a/content/static/tutorials/data/imgs/data_04_excel.jpg b/content/static/tutorials/data/imgs/data_04_excel.jpg index 1406af987..c004098da 100755 Binary files a/content/static/tutorials/data/imgs/data_04_excel.jpg and b/content/static/tutorials/data/imgs/data_04_excel.jpg differ diff --git a/content/static/tutorials/data/imgs/data_06_xml.jpg b/content/static/tutorials/data/imgs/data_06_xml.jpg index 7a1a18035..10cadd588 100755 Binary files a/content/static/tutorials/data/imgs/data_06_xml.jpg and b/content/static/tutorials/data/imgs/data_06_xml.jpg differ diff --git a/content/static/tutorials/data/imgs/data_07_weatherxml.jpg b/content/static/tutorials/data/imgs/data_07_weatherxml.jpg index bc65c1042..e0de2e503 100755 Binary files a/content/static/tutorials/data/imgs/data_07_weatherxml.jpg and b/content/static/tutorials/data/imgs/data_07_weatherxml.jpg differ diff --git a/content/static/tutorials/data/imgs/fig_18_01_user_input.png b/content/static/tutorials/data/imgs/fig_18_01_user_input.png new file mode 100755 index 000000000..e4b8f4797 Binary files /dev/null and b/content/static/tutorials/data/imgs/fig_18_01_user_input.png differ diff --git a/content/static/tutorials/data/imgs/fig_18_02_filetxt.png b/content/static/tutorials/data/imgs/fig_18_02_filetxt.png new file mode 100755 index 000000000..2e82a2f1d Binary files /dev/null and b/content/static/tutorials/data/imgs/fig_18_02_filetxt.png differ diff --git a/content/static/tutorials/data/imgs/fig_18_03_datatxt.png b/content/static/tutorials/data/imgs/fig_18_03_datatxt.png new file mode 100755 index 000000000..33a877bcb Binary files /dev/null and b/content/static/tutorials/data/imgs/fig_18_03_datatxt.png differ diff --git a/content/static/tutorials/data/imgs/fig_18_04_bargraph.png b/content/static/tutorials/data/imgs/fig_18_04_bargraph.png new file mode 100755 index 000000000..ef797f982 Binary files /dev/null and b/content/static/tutorials/data/imgs/fig_18_04_bargraph.png differ diff --git a/content/static/tutorials/data/imgs/fig_18_05_datacsv.png b/content/static/tutorials/data/imgs/fig_18_05_datacsv.png new file mode 100755 index 000000000..6c75a3c9c Binary files /dev/null and b/content/static/tutorials/data/imgs/fig_18_05_datacsv.png differ diff --git a/content/static/tutorials/data/imgs/fig_18_06_datacsv_grid.png b/content/static/tutorials/data/imgs/fig_18_06_datacsv_grid.png new file mode 100755 index 000000000..77de335e7 Binary files /dev/null and b/content/static/tutorials/data/imgs/fig_18_06_datacsv_grid.png differ diff --git a/content/static/tutorials/data/imgs/fig_18_07_tablebubbles.png b/content/static/tutorials/data/imgs/fig_18_07_tablebubbles.png new file mode 100755 index 000000000..64a8e5f79 Binary files /dev/null and b/content/static/tutorials/data/imgs/fig_18_07_tablebubbles.png differ diff --git a/content/static/tutorials/data/imgs/fig_18_08_rollover.png b/content/static/tutorials/data/imgs/fig_18_08_rollover.png new file mode 100644 index 000000000..7b823a954 Binary files /dev/null and b/content/static/tutorials/data/imgs/fig_18_08_rollover.png differ diff --git a/content/static/tutorials/data/imgs/fig_18_09_shaunsheep.png b/content/static/tutorials/data/imgs/fig_18_09_shaunsheep.png new file mode 100755 index 000000000..8d5398cf2 Binary files /dev/null and b/content/static/tutorials/data/imgs/fig_18_09_shaunsheep.png differ diff --git a/content/static/tutorials/data/imgs/fig_18_10_shaunsheep_sourc.png b/content/static/tutorials/data/imgs/fig_18_10_shaunsheep_sourc.png new file mode 100755 index 000000000..b4456ba92 Binary files /dev/null and b/content/static/tutorials/data/imgs/fig_18_10_shaunsheep_sourc.png differ diff --git a/content/static/tutorials/data/imgs/fig_18_11_parsing_imdb.png b/content/static/tutorials/data/imgs/fig_18_11_parsing_imdb.png new file mode 100755 index 000000000..61acef65d Binary files /dev/null and b/content/static/tutorials/data/imgs/fig_18_11_parsing_imdb.png differ diff --git a/content/static/tutorials/data/imgs/fig_18_12_traditional_arra.png b/content/static/tutorials/data/imgs/fig_18_12_traditional_arra.png new file mode 100644 index 000000000..402f9e213 Binary files /dev/null and b/content/static/tutorials/data/imgs/fig_18_12_traditional_arra.png differ diff --git a/content/static/tutorials/data/imgs/fig_18_13_associative_arra.png b/content/static/tutorials/data/imgs/fig_18_13_associative_arra.png new file mode 100644 index 000000000..82fe0b68f Binary files /dev/null and b/content/static/tutorials/data/imgs/fig_18_13_associative_arra.png differ diff --git a/content/static/tutorials/data/imgs/fig_18_14_concordance_viz.png b/content/static/tutorials/data/imgs/fig_18_14_concordance_viz.png new file mode 100755 index 000000000..f60db5375 Binary files /dev/null and b/content/static/tutorials/data/imgs/fig_18_14_concordance_viz.png differ diff --git a/content/static/tutorials/data/imgs/fig_18_15_xml_tree.png b/content/static/tutorials/data/imgs/fig_18_15_xml_tree.png new file mode 100755 index 000000000..8535f1b6e Binary files /dev/null and b/content/static/tutorials/data/imgs/fig_18_15_xml_tree.png differ diff --git a/content/static/tutorials/data/imgs/fig_18_16_rss.png b/content/static/tutorials/data/imgs/fig_18_16_rss.png new file mode 100755 index 000000000..1bdb2d482 Binary files /dev/null and b/content/static/tutorials/data/imgs/fig_18_16_rss.png differ diff --git a/content/static/tutorials/data/imgs/fig_18_17_weather.png b/content/static/tutorials/data/imgs/fig_18_17_weather.png new file mode 100755 index 000000000..f379ab30f Binary files /dev/null and b/content/static/tutorials/data/imgs/fig_18_17_weather.png differ diff --git a/content/static/tutorials/data/imgs/fig_18_18_xmlbubbles.png b/content/static/tutorials/data/imgs/fig_18_18_xmlbubbles.png new file mode 100755 index 000000000..b58ced2a2 Binary files /dev/null and b/content/static/tutorials/data/imgs/fig_18_18_xmlbubbles.png differ diff --git a/content/static/tutorials/data/imgs/fig_18_19_thread.png b/content/static/tutorials/data/imgs/fig_18_19_thread.png new file mode 100755 index 000000000..f79c43d28 Binary files /dev/null and b/content/static/tutorials/data/imgs/fig_18_19_thread.png differ diff --git a/content/static/tutorials/data/index-old.html b/content/static/tutorials/data/index-old.html new file mode 100644 index 000000000..6221a4a80 --- /dev/null +++ b/content/static/tutorials/data/index-old.html @@ -0,0 +1,527 @@ + + + + +
    + +

    + This tutorial is from the book Learning Processing by Daniel Shiffman, published by Morgan Kaufmann, © 2008 Elsevier Inc. All rights reserved. If you see any errors or have comments, please let us know. +

    + +

    Data

    +

    Daniel Shiffman

    + + +

    + This tutorial picks up where the Strings and Drawing Text tutorial leaves off and examines how to use String objects as the basis for reading and writing data. We'll start by learning more sophisticated methods for manipulating Strings, searching in them, chopping them up, and joining them together. Afterwards, we'll see how these skills allow us to use input from data sources, such as text files, web pages, xml feeds, and 3rd party APIs and take a step into the world of data visualization. +

    + +

    Manipulating Strings

    + +

    + In Strings and Drawing Text, we touched on a few of the basic functions available in the Java String class, such as charAt(), toUpperCase(), equals(), and length(). These functions are documented on the Processing reference page for Strings. Nevertheless, in order to perform some more advanced data parsing techniques, we'll need to explore some additional String manipulation functions documented in the Java API. +

    + +

    + Let's take a closer look at the following two String functions: indexOf() and substring(). indexOf() locates a sequence of characters within a String. It takes one argument, a search String, and returns a numeric value that corresponds to first occurrence of the search string inside of the string being searched. +

    + +
    +String search = "def";
    +String toBeSearched = "abcdefghi";
    +int index = toBeSearched.indexOf(search);  // The value of index in this example is 3.
    +
    + +

    + Strings are just like arrays, in that the first character is index number zero and the last character is the length of the string minus one. If the search string cannot be found, indexOf() returns -1. This is a good choice because -1 is not a legitimate index value and therefore can indicate "not found." After finding a search phrase within a String, we might want to separate out part of the string, saving it in a different variable. A part of a string is known as "substring." The substring() function which takes two arguments, a start index and an end index and returns the substring in between the two indices. +

    + +
    +String alphabet = "abcdefghi";
    +String sub = alphabet.substring(3,6);  // The String sub is now "def".
    +
    + +

    Note that the substring begins at the specified start index (the first argument) and extends to the character at end index (the second argument) minus one. I know. I know. Wouldn't it have been easier to just take the substring from the start index all the way to the end index? While this might initially seem true, it's actually quite convenient to stop at end index minus one. For example, if you ever want to make a substring that extends to the end of a string, you can simply go all the way to thestring.length(). In addition, with end index minus one marking the end, the length of the substring is easily calculated as end index minus begin index.

    + +

    Splitting and Joining Strings

    + +

    In Strings and Drawing Text, we saw how strings can be joined together (referred to as "concatenation") using the "+" operator. Let's review with a example that uses concatenation to get user input from a keyboard. Processing has two additional functions that make joining strings (or the reverse, splitting them up) easy. In sketches that involve parsing data from a file or the web, we will often be presented that data in the form of an array of strings or as one long string. Depending on what we want to accomplish, it's useful to know how to switch between these two modes of storage. This is where these two new functions, split() and join(), will come in handy.

    + +"one long string or array of strings" ←→ {"one", "long", "string", "or" ,"array", "of", "strings"} + +

    Let's take a look at the split() function. split() separates a longer string into an array of strings, based on a split character known as the delimiter. It takes two arguments, the string to be split and the delimiter. (The delimiter can be a single character or a string. Note that in the code below the period is not set as a delimiter and therefore will be included in the last string in the array: "dog."

    + +
    +// Splitting a String based on spaces
    +String spaceswords = "The quick brown fox jumps over the lazy dog.";
    +String[] list = split(spaceswords, " ");
    +for (int i = 0; i < list.length; i++) {
    +  println(list[i] + " " + i);
    +}
    +
    + +

    If you want to use more than one delimiter to split up a text, you must use the Processing function splitTokens(). splitTokens() works identically to split() with one exception: any character that appears in the String qualifies as a delimiter. In the code below, the period is set as a delimiter and therefore will not be included in the last spot in the array: "dog"

    + +
    +// Splitting a String based on a multiple delimiters
    +String stuff = "hats & apples, cars + phones % elephants dog.";
    +String[] list = splitTokens(stuff, " &,+.");
    +for (int i = 0; i < list.length; i++) {
    +  println(list[i] + " " + i);
    +}
    +
    + +

    If we are splitting numbers in a String the resulting array can be converted into an integer array with Processing's int() function. Numbers in a string are not numbers and cannot be used in mathematical operations unless we convert them first.

    + +
    +// Calculate sum of a list of numbers in a String
    +String numbers = "8,67,5,309";
    +// Converting the String array to an int array
    +int[] list = int(split(numbers, ',')); 
    +int sum = 0;
    +for (int i = 0; i < list.length; i++) {
    +  sum = sum + list[i];
    +}
    +println(sum); 
    +
    + +

    The reverse of split() is join(). join() takes an array of Strings and joins them together into one long string. The join() function also takes two arguments, the array to be joined and a separator. The separator can either be a single character or a String of characters.

    + +

    Consider the following array:

    + +
    +String[] lines = {"It", "was", "a", "dark", "and", "stormy", "night."};
    +
    + +

    Using the + operator along with a for loop, we can join an array of strings together as follows:

    
 + +
    +// Manual Concatenation
    +String onelongstring = "";
    +for (int i = 0; i < lines.length; i++) {
    +  onelongstring = onelongstring + lines[i] + " ";
    +}
    +
    + +

    The join() function, however, allows us to bypass this process achieving the same result in only one line of code.

    + +
    +// Using Processing's join()
    +String onelongstring = join(lines," ");
    +
    + +

    Reading and Writing Text Files

    + +

    Data can come from many different places: web sites, news feeds, databases, etc. To start, we'll demonstrate how to work with the simplest means of data retrieval data: reading from a text file.Text files can be used as a very simple database (we could store settings for a program, a list of high scores, numbers for a graph, etc.) or to simulate a more complex data source.

    + +

    In order to create a text file, you can use any simple text editor. Windows Notepad or Mac OSX TextEdit will do, just make sure you format the file as "plain text." It is also advisable to name the text files with the ".txt" extension, just to avoid any confusion. And just as with image files, these text files should be placed in the sketch's "data" directory in order for them to be recognized by the Processing sketch.

    + +

    Once the text file is in place, Processing's loadStrings() function is used to read the content of the file into an String array. The individual lines of text in the file each become an individual element in the array.

    + + + +
    +// This code will print all the lines from the source text file.
    +String[] lines = loadStrings("file.txt");
    +println("there are " + lines.length + " lines");
    +println(lines);
    +
    + +

    Text from a file can be used to generate a simple visualization. Take the following data file.

    + + + +

    Here, we can load the numbers separated by commas and split them into an array of ints used to set color and height of rectangles.

    + +
    +int[] data;
    +
    +void setup() {
    +  size(200,200);
    +  // Load text file as a string
    +  String[] stuff = loadStrings("data.txt");
    +  // Convert string into an array of integers using ',' as a delimiter
    +  data = int(split(stuff[0],','));
    +}
    +
    +void draw() {
    +  background(255);
    +  stroke(0);
    +  for (int i = 0; i < data.length; i++) {
    +    fill(data[i]);
    +    rect(i*20,0,20,data[i]);
    +  }
    +}
    +
    + +

    Text can also be written back to a data file with saveStrings(). saveStrings() writes an array of strings to a file, one line per string.

    + +
    +String words = "apple bear cat dog";
    +String[] list = split(words, ' ');
    +
    +// Writes the strings to a file, each on a separate line
    +saveStrings("nouns.txt", list);
    +
    + +

    There are cases, however, where you don't want to write a text file all at once. Rather, you want to continuously append to a file over time. This can be achieved with the PrintWriter class. Take the following example which writes saves mouseX and mouseY to a text file for each cycle through draw(), quitting when you press a key.

    + +
    +PrintWriter output;
    +
    +void setup() {
    +  // Create a new file in the sketch directory
    +  output = createWriter("positions.txt"); 
    +}
    +
    +void draw() {
    +  point(mouseX, mouseY);
    +  output.println(mouseX);  // Write the coordinate to the file
    +}
    +
    +void keyPressed() {
    +  output.flush();  // Writes the remaining data to the file
    +  output.close();  // Finishes the file
    +  exit();  // Stops the program
    +}
    +
    + +

    Tabular Data

    + +

    You may have noticed that the graphing example above loads a text file with numbers separated by commas. Processing includes a Table class which will load a comma-separated (CSV) or tab-separated (TSV) file and automatically parse the data into columns and rows for you. This is a great deal more convenient than struggling to manually parse large data files with split(). It works as follows. Let's say you have a data file that looks like:

    + + + +

    Instead of saying:

    + +
    +String[] stuff = loadStrings("data.csv");
    +
    + +

    We can now say: + +

    +Table table = loadTable("data.csv");
    +
    + +

    Now we've missed an important detail. Take a look at the data.csv text file above. Notice how the first line of text is not the data itself, but rather a "header row." This row includes labels that describe the data included in each subsequent row. The good news is that Processing can automatically interpret and store the headers for you, if you pass in the option "header" when loading the table. (In addition to "header" there are other options you can specify. For example if your file is called data.txt but is comma separated data you can pass in the option "csv". If it also has a header row, then you can specifiy both options like so: "header,csv"). A full list of options can be found on the loadTable() documentation page.

    + +
    +Table table = loadTable("data.csv","header");
    +
    + +

    Now that the table is loaded, we can look at how we grab individual pieces of data or iterate over the entire table. Let's look at the data visualized as a grid.

    + + + +

    In the above grid we can see that the data is organized in terms of rows and columns. One way to access the data would be to therefore request a value by its numeric row and column location (with zero being the first row or first column). This is similar to accessing a pixel color at a given (x, y) location though in this case the y position (i.e. row) comes first. The following code requests a piece of data at a given (row, column) location.

    + +
    +int val1 = table.getInt(2, 1);      // val now has the value 235
    +float val2 = table.getFloat(3, 2);  // val2 now has the value 44.758068
    +String s = table.getString(0, 3);   // s now has the value "Happy"
    +
    + +

    While the numeric index is sometimes useful, it's generally going to be more convenient to access each piece of data by the column name. For example, we could pull out a specific row from the Table.

    + +
    +TableRow row = table.getRow(2);  // Gets the third row (index 2)
    +
    + +Note in the above line of code that a Table object refers to the entire table of data while a TableRow object handles an individual row of data within the Table. + +Once we have the TableRow object, we can ask for data from some or all of the columns. + +
    +int x = row.getInt("x");             // x has the value 273
    +int y = row.getInt("y");             // y has the value 235
    +float d = row.getFloat("diameter");  // d has the value 61.14072
    +String s = row.getString("name");    // s has the value "Joyous"
    +
    + +The method getRow() returns a single row from the table. If you want to grab all the rows and iterate over them you can do so with the method rows(). + +
    +for (TableRow row : table.rows()) {
    +  float x = row.getFloat("x");
    +  float y = row.getFloat("y");
    +  float d = row.getFloat("diameter");
    +  String n = row.getString("name");
    +  // Do something with the data of each row
    +}
    +
    + +If you want to search for a select number of rows within the table, you can do so with findRows() and matchRows(). + +

    In addition to being read, Table objects can be altered or created on the fly while a sketch is running. Cell values can be adjusted, rows can be removed, and new rows can be added. For example, to set new values in a cell there are functions setInt(), setFloat(), and setString(). + +

    +// Update the value of column "x" to mouseX in a given TableRow.
    +row.setInt("x",mouseX);
    +
    + +

    To add a new row to a Table, simply call the method addRow() and set the values of each column.

    + +
    +// Create a new row
    +TableRow row = table.addRow();
    +// Set the values of that row
    +row.setFloat("x", mouseX);
    +row.setFloat("y", mouseY);
    +row.setFloat("diameter", random(40, 80));
    +row.setString("name", "new label");
    +
    + +

    To delete a row to a Table, simply call the method removeRow() and pass in the numeric index of the row you would like removed. The following code for example, removes the first row whenever the size of the table is greater than ten rows.

    + +
    +// If the table has more than 10 rows
    +if (table.getRowCount() > 10) {
    +  // Delete the first row
    +  table.removeRow(0);
    +}
    +
    + +

    For an example that creates objects from and saves objects to a Table, take a look at LoadSaveTable under Topics --> Advanced Data.

    + +

    XML Data

    + +

    For grabbing data from the web, an XML (Extensible Markup Language) feed is an excellent option (if available). Unlike HTML (which is designed to make content vieweable by a human's eyes) XML is designed to make content viewable by a computer and facilitate the sharing of data across different systems.

    + +

    XML organizes information in a tree structure. Let's imagine a list of students. Each student has an id number, name, address, e-mail, and telephone number. Each student's address has a city, state, and zip code. An XML tree for this dataset might look like the following:

    + +

    + +
    +<?xml version="1.0" encoding="UTF-8"?>
    +<students>
    +  <student>
    +    <id>001</id>
    +    <name>Daniel Shiffman</name>
    +    <phone>555-555-5555</phone>
    +    <email>daniel@shiffman.net</email>
    +    <address>
    +      <street>123 Processing Way</street>
    +      <city>Loops</city>
    +      <state>New York</state>
    +      <zip>01234</zip>
    +    </address>
    +  </student>
    +  <student>
    +    <id>002</id>
    +    <name>Zoog</name>
    +    <phone>555-555-5555</phone>
    +    <email>zoog@planetzoron.uni</email>
    +    <address>
    +      <street>45.3 Nebula 5</street>
    +      <city>Boolean City</city>
    +      <state&tt;Booles</state>
    +      <zip>12358</zip>
    +    </address>
    +  </student>
    +</students>
    +
    + +

    Note the similarities to object-oriented programming. We could think of the XML tree in the following terms. The XML document represents an array of student objects. Each student object has multiple pieces of information, an id, a name, a phone number, an e-mail address, and a mailing address. The mailing address is also an object that also has multiple pieces of data, such as street, city, state, and zip.

    + +

    Let's look at Yahoo's XML feed for weather data. Here is the raw XML source (Note I have edited it for simplification purposes).

    + +
    +<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
    +<rss version="2.0" xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0">
    +  <channel>
    +    <item>
    +      <title>Conditions for New York, NY at 3:51 pm EST</title>
    +      <geo:lat>40.67</geo:lat>
    +      <geo:long>-73.94</geo:long>
    +      <link>http://xml.weather.yahoo.com/forecast/USNY0996_f.html</link>
    +      <pubDate>Mon, 20 Feb 2006 3:51 pm EST</pubDate>
    +      <yweather:condition text="Fair" code="34" temp="35" date="Mon, 20 Feb 2006 3:51 pm EST"/>
    +      <yweather:forecast day="Mon" date="20 Feb 2006" low="25" high="37" text="Clear" code="31"/>
    +    </item>
    +  </channel>
    +</rss>
    +
    + +

    And here is the data mapped in the tree structure.

    + +

    + +

    You may be wondering what the top level "RSS" is all about. Yahoo's XML weather data is provided in RSS format. RSS stands for "Really Simple Syndication" and is a standardized XML format for syndicating web content (such as news articles, etc.)

    + +

    Now that we have a handle on the tree structure, we should look at the specifics inside that structure. With the exception of the first line (which simply indicates that this page is XML formatted), this XML document contains a nested list of elements, each with a start tag, i.e. <channel> and an end tag, i.e. </channel>. Some of these elements have content between the tags:

    + +
    +<title>Conditions for New York, NY at 3:51 pm EST</title>
    +
    + +

    and some have attributes (formatted by attribute name equals attribute value in quotes):

    + +
    +<yweather:condition text="Fair" code="34" temp="35" date="Mon, 20 Feb 2006 3:51 pm EST"/>
    +
    + +

    Knowing this format, we could certainly be clever with our use of split(), indexOf(), and substring() to find the pieces we want in the raw XML. The point here, however, is that because XML is a standard format, we don't have to do this. Rather, we can use an XML parser. In Processing, the XML parser is called just that: XML.

    + +
    +XML xml = loadXML("http://xml.weather.yahoo.com/forecastrss?p=10003");
    +
    + +

    Here, instead of loadStrings() or loadTable(), we're now calling loadXML() and passing in the address (URL or local file) of our XML document. An XML object represents one element of an XML tree. When a document is first loaded, that XML object is always the root element. Referring back to XML tree diagram, we see that we can find the current temperature via the following path:

    + +
      +
    1. The root of the tree is RSS.
    2. +
    3. RSS has a child named channel.
    4. +
    5. Channel has a child named item.
    6. +
    7. Item has a child named yweather:condition.
    8. +
    9. The temperature is stored in yweather:condition as the attribute temp.
    10. +
    + +

    We could translate the above into code as follows:

    + +
    +XML root        = loadXML("http://xml.weather.yahoo.com/forecastrss?p=10003"); // Step 1
    +XML channel     = root.getChild("channel");                                    // Step 2
    +XML item        = channel.getChild("item");                                    // Step 3
    +XML yweather    = item.getChild("yweather:condition");                         // Step 4
    +int temperature = yweather.getInt("temp");                                     // Step 5
    +
    + +

    This is a bit long-winded, however, and so can be compressed down into one (or three as below) lines of code.

    + +
    +XML root        = loadXML(http://xml.weather.yahoo.com/forecastrss?p=10003);                // Step 1
    +XML forecast    = root.getChild("channel").getChild("item").getChild("yweather:condition"); // Steps 2-4
    +int temperature = forecast.getInt("temp");                                                  // Step 5
    +
    + +Finally, the second line of code above can be further condensed to: + +
    +XML forecast = xml.getChild("channel/item/yweather:condition"); // Steps 2-4
    +
    + +

    It should also be noted that we're accessing the child nodes by their name (i.e. "channel", "item", etc.), but they can also be accessed numerically via an index (starting at zero, same as an array). This is convenient when looping over a list of children. In LoadSaveTable, we used a series of comma separated values in a text file to store information related to Bubble objects. An XML document can also be used in the same manner. Consider the following XML document:

    + +
    +<?xml version="1.0" encoding="UTF-8"?>
    +<bubbles>
    +  <bubble>
    +    <position x="160" y="103"/>
    +    <diameter>43.19838</diameter>
    +    <label>Happy</label>
    +  </bubble>
    +  <bubble>
    +    <position x="372" y="137"/>
    +    <diameter>52.42526</diameter>
    +    <label>Sad</label>
    +  </bubble>
    +  <bubble>
    +    <position x="273" y="235"/>
    +    <diameter>61.14072</diameter>
    +    <label>Joyous</label>
    +  </bubble>
    +  <bubble>
    +    <position x="121" y="179"/>
    +    <diameter>44.758068</diameter>
    +    <label>Melancholy</label>
    +  </bubble>
    +</bubbles>
    +
    + +

    In the above XML, the root element is "bubbles" which has four children. Each child "bubble" has 3 children, "position", "diameter", and "label." The "position" element has two attributes, "x" and "y." To access the list of all XML nodes "bubble" we can use the getChildren() method, passing in the name "bubble"

    + +
    +// Load an XML document
    +XML xml = loadXML("bubbles.xml");
    +
    +// Get all the child elements
    +XML[] children = xml.getChildren("bubble");
    +
    + +

    Once we have the array of XML objects, we can iterate over them, accessing the individual pieces of data for each "bubble". Notice how the syntax for getting XML attributes (in this case, "x" and "y" of the position element is slightly different than pulling content directly from an element (in this case, "diameter" and "label").

    + +
    +for (int i = 0; i < bubbles.length; i++) {
    +    
    +  // The position element has two attributes: x and y
    +  XML positionElement = children[i].getChild("position");
    +  // Note how with attributes we can get an integer or float via getInt() and getFloat()
    +  float x = positionElement.getInt("x");
    +  float y = positionElement.getInt("y");
    +    
    +  // The diameter is the content of the child named "diamater"
    +  XML diameterElement = children[i].getChild("diameter");
    +  // Note how with the content of an XML node, we retrieve via getIntContent() and getFloatContent()
    +  float diameter = diameterElement.getFloatContent();
    +
    +  // The label is the content of the child named "label"
    +  XML labelElement = children[i].getChild("label");
    +  String label = labelElement.getContent();
    +} 
    +
    + +

    XML elements can be added and removed from the XML tree with the addChild() and removeChild() methods.

    + +

    For the full example that creates objects from and saves objects to an XML document, take a look at LoadSaveXML under Topics --> Advanced Data.

    + +

    Threads

    + +

    You are likely familiar with the idea of writing a program that follows a specific sequence of steps -- setup() first then draw() over and over and over again! A Thread is also a series of steps with a beginning, a middle, and an end. A Processing sketch is a single thread, often referred to as the "Animation" thread. Other threads sequences, however, can run independently of the main Processing sketch. In fact, you can launch any number of threads at one time and they will all run concurrently.

    + +

    Processing does this all the time, whenever you write an event callback, such as serialEvent(), or captureEvent(), etc. these functions are triggered by a different thread running behind the scenes, and they alert Processing whenever they have something to report. This is useful whenever you need to perform a task that takes too long and would slow down the main animation's frame rate, such as grabbing data from the network (XML, database, etc.) If a separate thread gets stuck or has an error, the entire program won't grind to a halt, since the error only stops that individual thread. To create independent, asynchronous threads, you can use the thread() function built into Processing.

    + +
    +void setup() {
    +  size(200,200);
    +  thread("someFunction");
    +}
    + 
    +void draw() {
    + 
    +}
    + 
    +void someFunction() {
    +  // This function will run as a thread when called via
    +  // thread("someFunction") as it was in setup!
    +}
    +
    + +

    The thread() function receives a String as an argument. The String should match the name of the function you want to run as a thread. This is especially useful in sketches that grab data for the web. Rather than have the animation freeze while the sketch is waiting to retrieve data, the sketch can continue to loop through draw() updating the data when the thread is completed. In these cases, a boolean variable can be useful to track the status of the thread.

    + +
    +boolean loading = false;
    +
    + +

    The function that loads the data can then set loading equal to true at the start and false at the end.

    + +
    +void loadData() {
    +  loading = true;
    +
    +  ///////////////////////////////////
    +  // All of the data retrival code //
    +  ///////////////////////////////////
    +  
    +  loading = false;
    +}
    +
    + +

    In draw(), you can choose to display something to indicate the thread is running (when loading equals true).

    + +
    +void draw() {
    +  if (loading) {
    +    // Draw something to indicate loading
    +  }
    +}
    +
    + + +

    Two examples that follow this methodology can be found under Topics --> Advanced Data in the Processing examples.

    + +

    While using the thread() function is a very simple way of getting an independent thread, it should be noted that it is somewhat limited. Being able to make a thread object is a great deal more powerful, and this can be done by extending the Java Thread class.

    + + +
    + diff --git a/content/static/tutorials/data/index.html b/content/static/tutorials/data/index.html index 51a9dc35e..ebafcce92 100644 --- a/content/static/tutorials/data/index.html +++ b/content/static/tutorials/data/index.html @@ -1,287 +1,787 @@ -

    Data

    - -

    - - - -

    This tutorial is for Processing version 2.0+. If you see any errors or have comments, please let us know. This tutorial is from the book, Learning Processing, by Daniel Shiffman, published by Morgan Kaufmann Publishers, Copyright © 2008 Elsevier Inc. All rights reserved.

    - -

     

    +
    + + - -
    + +

    + This tutorial is from the book Learning Processing, 2nd Edition by Daniel Shiffman, published by Morgan Kaufmann, © 2015 Elsevier Inc. All rights reserved. If you see any errors or have comments, please let us know. +

    -

    This tutorial picks up where the Strings and Drawing Text tutorial leaves off and examines how to use String objects as the basis for reading and writing data. We'll start by learning more sophisticated methods for manipulating Strings, searching in them, chopping them up, and joining them together. Afterwards, we'll see how these skills allow us to use input from data sources, such as text files, web pages, xml feeds, and 3rd party APIs and take a step into the world of data visualization.

    +

    Data

    +

    Daniel Shiffman

    -

    Manipulating Strings

    -

    In Strings and Drawing Text, we touched on a few of the basic functions available in the Java String class, such as charAt(), toUpperCase(), equals(), and length(). These functions are documented on the Processing reference page for Strings. Nevertheless, in order to perform some more advanced data parsing techniques, we'll need to explore some additional String manipulation functions documented in the Java API.

    +

    + This tutorial picks up where the Strings and Drawing Text tutorial leaves off and examines how to use String objects as the basis for reading and writing data. We'll start by learning more sophisticated methods for manipulating Strings, searching in them, chopping them up, and joining them together. Afterwards, we'll see how these skills allow us to use input from data sources, such as text files, web pages, xml feeds, and 3rd party APIs and take a step into the world of data visualization. +

    -

    Let's take a closer look at the following two String functions: indexOf() and substring(). indexOf() locates a sequence of characters within a String. It takes one argument, a search String, and returns a numeric value that corresponds to first occurrence of the search string inside of the string being searched.

    +

    Manipulating Strings

    +

    + In Strings and Drawing Text, we touched on a few of the basic functions available in the Java String, such as charAt(), toUpperCase(), equals(), and length(). These functions are documented on the Processing reference page for Strings. Nevertheless, in order to perform some more advanced data parsing techniques, we'll need to explore some additional String manipulation functions documented in the Java API. +

    + Let's take a closer look at the following two String functions: indexOf() and substring().

    + indexOf() locates a sequence of characters within a string. It takes one argument — a search string — and returns a numeric value that corresponds to the first occurrence of the search string inside of the String object being searched.

     String search = "def";
     String toBeSearched = "abcdefghi";
     int index = toBeSearched.indexOf(search);  // The value of index in this example is 3.
     
    -

    Strings are just like arrays, in that the first character is index number zero and the last character is the length of the string minus one. If the search string cannot be found, indexOf() returns -1. This is a good choice because -1 is not a legitimate index value and therefore can indicate "not found." After finding a search phrase within a String, we might want to separate out part of the string, saving it in a different variable. A part of a string is known as "substring." The substring() function which takes two arguments, a start index and an end index and returns the substring in between the two indices.

    - + Strings are just like arrays, in that the first character is index number zero and the last character is the length of the string minus one. If the search string cannot be found, indexOf() returns -1. This is a good choice because -1 is not a legitimate index value in the string itself, and therefore can indicate "not found." There are no negative indices in a string of characters or in an array. +

    + After finding a search phrase within a string, we might want to separate out part of the string, saving it in a different variable. A part of a string is known as a substring and substrings are made with the substring() function which takes two arguments, a start index and an end index. substring() returns the substring in between the two indices.
    +
     String alphabet = "abcdefghi";
    -String sub = alphabet.substring(3,6);  // The String sub is now "def".
    +String sub = alphabet.substring(3, 6); // The String sub is now "def".
     
    - -

    Note that the substring begins at the specified start index (the first argument) and extends to the character at end index (the second argument) minus one. I know. I know. Wouldn't it have been easier to just take the substring from the start index all the way to the end index? While this might initially seem true, it's actually quite convenient to stop at end index minus one. For example, if you ever want to make a substring that extends to the end of a string, you can simply go all the way to thestring.length(). In addition, with end index minus one marking the end, the length of the substring is easily calculated as end index minus begin index.

    + Note that the substring begins at the specified start index (the first argument) and extends to the character at end index (the second argument) minus one. I know, I know. Wouldn’t it have been easier to just take the substring from the start index all the way to the end index? While this might initially seem true, it’s actually quite convenient to stop at end index minus one. For example, if you ever want to make a substring that extends to the end of a string, you can simply go all the way to thestring.length(). In addition, with end index minus one marking the end, the length of the substring is easily calculated as end index minus begin index. +

    Splitting and Joining Strings

    -

    In Strings and Drawing Text, we saw how strings can be joined together (referred to as "concatenation") using the "+" operator. Let's review with a example that uses concatenation to get user input from a keyboard. Processing has two additional functions that make joining strings (or the reverse, splitting them up) easy. In sketches that involve parsing data from a file or the web, we will often be presented that data in the form of an array of strings or as one long string. Depending on what we want to accomplish, it's useful to know how to switch between these two modes of storage. This is where these two new functions, split() and join(), will come in handy.

    - -"one long string or array of strings" ←→ {"one", "long", "string", "or" ,"array", "of", "strings"} - -

    Let's take a look at the split() function. split() separates a longer string into an array of strings, based on a split character known as the delimiter. It takes two arguments, the string to be split and the delimiter. (The delimiter can be a single character or a string. Note that in the code below the period is not set as a delimiter and therefore will be included in the last string in the array: "dog."

    - +

    + In Strings and Drawing Text, we saw how strings can be joined together (referred to as "concatenation") using the "+" operator. Let's review with a example that uses concatenation to get user input from a keyboard. +

    + +

    +PFont f;
    +		
    +// Variable to store text currently being typed
    +String typing = "";
    +// Variable to store saved text when return is hit
    +String saved = "";
    +		
    +void setup() {  
    +  size(300, 200);  
    +  f = createFont("Arial", 16);
    +}
    +		
    +void draw() {  
    +  background(255);  
    +  int indent = 25;  
    +
    +  // Set the font and fill for text  
    +  textFont(f);  
    +  fill(0);  
    +
    +  // Display everything  
    +  text("Click in this sketch and type. \nHit return to save what you typed.", indent, 40);  
    +  text(typing, indent, 90);  
    +  text(saved, indent, 130);
    +}
    +		
    +void keyPressed() {  
    +  // If the return key is pressed, save the String and clear it  
    +  if (key == '\n') {    
    +    saved = typing;    
    +    typing = "";  
    +    // Otherwise, concatenate the String  
    +  } else {    
    +    typing = typing + key;   
    +  }
    +}
    +
    + Processing has two additional functions that make joining strings (or the reverse, splitting them up) easy. In sketches that involve parsing data from a file or the web, you might get hold of that data in the form of an array of strings or as one long string. Depending on what you want to accomplish, it’s useful to know how to switch between these two modes of storage. This is where these two new functions, split() and join(), will come in handy. +

    + + "one long string or array of strings" ←→ {"one", "long", "string", "or" ,"array", "of", "strings"} + +

    + Let’s take a look at the split() function. split() separates a longer string into an array of strings, based on a split character known as the delimiter. It takes two arguments, the String object to be split and the delimiter. (The delimiter can be a single character or a string.) In the code below, the period is not set as a delimiter and therefore will be included in the last string in the array: “dog.” Note how printArray() can be used to print the contents of an array and their corresponding indices to the message console.

    -// Splitting a String based on spaces
    +// Splitting a string based on spaces
     String spaceswords = "The quick brown fox jumps over the lazy dog.";
     String[] list = split(spaceswords, " ");
    -for (int i = 0; i < list.length; i++) {
    -  println(list[i] + " " + i);
    -}
    +printArray(list);
     
    - -

    If you want to use more than one delimiter to split up a text, you must use the Processing function splitTokens(). splitTokens() works identically to split() with one exception: any character that appears in the String qualifies as a delimiter. In the code below, the period is set as a delimiter and therefore will not be included in the last spot in the array: "dog"

    - + Here is an example using a comma as the delimiter (this time passing in a single character: ','.) +
    -// Splitting a String based on a multiple delimiters
    -String stuff = "hats & apples, cars + phones % elephants dog.";
    -String[] list = splitTokens(stuff, " &,+.");
    -for (int i = 0; i < list.length; i++) {
    -  println(list[i] + " " + i);
    -}
    +// Splitting a string based on commas
    +String commaswords = "The,quick,brown,fox,jumps,over,the,lazy,dog.";
    +String[] list = split(commaswords, ",");
    +printArray(list);
     
    - -

    If we are splitting numbers in a String the resulting array can be converted into an integer array with Processing's int() function. Numbers in a string are not numbers and cannot be used in mathematical operations unless we convert them first.

    - + If you want to use more than one delimiter to split up a text, you must use the Processing function splitTokens(). splitTokens() works identically as split() with one exception: any character that appears in the passed string qualifies as a delimiter.) In the code below, the period is specified as a delimiter and therefore will not be included in the last string in the array: “dog”.
    +
    +// Splitting a String based on multiple delimiters
    +String stuff = "hats & apples, cars + phones % elephants dog."; 
    +String[] list = splitTokens(stuff, " &,+." );
    +printArray(list);
    +
    + If you are splitting numbers in a string, the resulting array can be converted into an integer array with Processing’s int() function. Numbers in a string are not numbers and cannot be used in mathematical operations unless you convert them first.
     // Calculate sum of a list of numbers in a String
     String numbers = "8,67,5,309";
     // Converting the String array to an int array
    -int[] list = int(split(numbers, ',')); 
    +int[] list = int(split(numbers, ','));
     int sum = 0;
    -for (int i = 0; i < list.length; i++) {
    +for (int i = 0; i<list.length; i++ ) {
       sum = sum + list[i];
     }
    -println(sum); 
    +println(sum);
     
    - -

    The reverse of split() is join(). join() takes an array of Strings and joins them together into one long string. The join() function also takes two arguments, the array to be joined and a separator. The separator can either be a single character or a String of characters.

    - -

    Consider the following array:

    - + The reverse of split() is join(). join() takes an array of strings and joins them together into one long String object. The join() function also takes two arguments, the array to be joined and a separator. The separator can either be a single character or a string of characters. +

    + +

    + Consider the following array:

     String[] lines = {"It", "was", "a", "dark", "and", "stormy", "night."};
     
    - -

    Using the + operator along with a for loop, we can join an array of strings together as follows:

    
 - + Using the “+” operator along with a for loop, you can join a string together as follows:
     // Manual Concatenation
     String onelongstring = "";
     for (int i = 0; i < lines.length; i++) {
    -  onelongstring = onelongstring + lines[i] + " ";
    +   onelongstring = onelongstring + lines[i] + " ";
     }
     
    - -

    The join() function, however, allows us to bypass this process achieving the same result in only one line of code.

    - + The join() function, however, allows you to bypass this process, achieving the same result in only one line of code.
     // Using Processing's join()
    -String onelongstring = join(lines," ");
    +String onelongstring = join(lines, " ");
     
    +

    -

    Reading and Writing Text Files

    - -

    Data can come from many different places: web sites, news feeds, databases, etc. To start, we'll demonstrate how to work with the simplest means of data retrieval data: reading from a text file.Text files can be used as a very simple database (we could store settings for a program, a list of high scores, numbers for a graph, etc.) or to simulate a more complex data source.

    - -

    In order to create a text file, you can use any simple text editor. Windows Notepad or Mac OSX TextEdit will do, just make sure you format the file as "plain text." It is also advisable to name the text files with the ".txt" extension, just to avoid any confusion. And just as with image files, these text files should be placed in the sketch's "data" directory in order for them to be recognized by the Processing sketch.

    - -

    Once the text file is in place, Processing's loadStrings() function is used to read the content of the file into an String array. The individual lines of text in the file each become an individual element in the array.

    +

    Dealing with Data

    - +

    + Data can come from many different places: websites, news feeds, spreadsheets, databases, and so on. Let's say you've decided to make a map of the world's flowers. After searching online you might find a PDF version of a flower encyclopedia, or a spreadsheet of flower genera, or a JSON feed of flower data, or a REST API that provides geolocated lat/lon coordinates, or some web page someone put together with beautiful flower photos, and so on and so forth. The question inevitably arises: “I found all this data; which should I use, and how do I get it into Processing?” +

    + +

    + If you are really lucky, you might find a Processing library that hands data to you directly with code. Maybe the answer is to just download this library and write some code like:
    +

    +import flowers.*;
     
    +void setup() {
    +  FlowerDatabase fdb = new FlowerDatabase();
    +  Flower sunflower = fdb.findFlower("sunflower");
    +  float h = sunflower.getAverageHeight();
    +}  
    +
    + In this case, someone else has done all the work for you. They've gathered data about flowers and built a Processing library with a set of functions that hands you the data in an easy-to-understand format. This library, sadly, does not exist (not yet), but there are some that do. For example, YahooWeather is a library by Marcel Schwittlick that grabs weather data from Yahoo for you, allowing you to write code like weather.getWindSpeed() or weather.getSunrise() and more. There is still plenty of work to do in the case of using a library. +

    + +

    + Let's take another scenario. Say you’re looking to build a visualization of Major League Baseball statistics. You can't find a Processing library to give you the data but you do see everything you’re looking for at mlb.com. If the data is online and your web browser can show it, shouldn't you be able to get the data in Processing? Passing data from one application (like a web application) to another (say, your Processing sketch) is something that comes up again and again in software engineering. A means for doing this is an API or “application programming interface”: a means by which two computer programs can talk to each other. Now that you know this, you might decide to search online for “MLB API”. Unfortunately, mlb.com does not provide its data via an API. In this case you would have to load the raw source of the website itself and manually search for the data you’re looking for. While possible, this solution is much less desirable given the considerable time required to read through the HTML source as well as program algorithms for parsing it. +

    + +

    + Each means of getting data comes with its own set of challenges. The ease of using a Processing library is dependent on the existence of clear documentation and examples. But in just about all cases, if you can find your data in a format designed for a computer (spreadsheets, XML, JSON, etc.), you'll be able to save some time in the day for a nice walk outside. +

    + +

    + One other note worth a mention about working with data. When developing an application that involves a data source, such as a data visualization, it’s sometimes useful to develop with “dummy” or “fake” data. You don't want to be debugging your data retrieval process at the same time as solving problems related to algorithms for drawing. In keeping with my one-step-at-a-time mantra, once the meat of the program is completed with dummy data, you can then focus solely on how to retrieve the actual data from the real source. You can always use random or hard-coded numbers into your code when you’re experimenting with a visual idea and connect the real data later.

    + +

    Working with Text Files

    + +

    + Let's begin by working with the simplest means of data retrieval: reading from a text file. Text files can be used as a very simple database (you could store settings for a program, a list of high scores, numbers for a graph, etc.) or to simulate a more complex data source. +

    + +

    + In order to create a text file, you can use any simple text editor. Windows Notepad or Mac OS X TextEdit will do; just make sure you format the file as “plain text.” It is also advisable to name the text files with the “.txt” extension, to avoid any confusion. And just as with image files, these text files should be placed in the sketch’s “data” directory in order for them to be recognized by the Processing sketch.

    + +

    + Once the text file is in place, Processing’s loadStrings() function is used to read the content of the file into a String array. The individual lines of text in the file each become an individual element in the array. +

    +

     // This code will print all the lines from the source text file.
     String[] lines = loadStrings("file.txt");
    -println("there are " + lines.length + " lines");
    -println(lines);
    +println("There are " + lines.length + " lines.");
    +printArray(lines);
     
    - -

    Text from a file can be used to generate a simple visualization. Take the following data file.

    - - - -

    Here, we can load the numbers separated by commas and split them into an array of ints used to set color and height of rectangles.

    - + To run the code, create a text file called “file.txt,” type a bunch of lines in that file, and place it in your sketch’s data directory.

    Text from a file can be used to generate a simple visualization. Take the following data file. +

    +

    + +The results of visualizing this data are shown below.

    + +

    +Graphing Comma-Separated Numbers from a Text File +

    +

     int[] data;
     
     void setup() {
    -  size(200,200);
    -  // Load text file as a string
    -  String[] stuff = loadStrings("data.txt");
    +  size(200, 200);
    +  // Load text file as a String
    +  String[] stuff = loadStrings("data.csv");
       // Convert string into an array of integers using ',' as a delimiter
    -  data = int(split(stuff[0],','));
    +  data = int(split(stuff[0], ','));
     }
     
     void draw() {
       background(255);
       stroke(0);
    -  for (int i = 0; i < data.length; i++) {
    -    fill(data[i]);
    -    rect(i*20,0,20,data[i]);
    +  for (int i = 0; i<data.length; i++) { 
    +  	// Use array of ints to set the color and height of each rectangle.
    +    rect(i*20, 0, 20, data[i]);
       }
    +  noLoop();
     }
     
    + Looking at how to parse a csv file with split() was a nice learning exercise. In truth, dealing with csv files (which can easily be generated from spreadsheet software such as Google docs) is such a common activity that Processing has an entire built-in class called Table to handle the parsing for you. +

    + +

    Tabular Data

    -

    Text can also be written back to a data file with saveStrings(). saveStrings() writes an array of strings to a file, one line per string.

    +

    + A table consists of data arranged as a set of rows and columns, also called “tabular data.” If you've ever used a spreadsheet, this is tabular data. Processing's loadTable() function takes comma-separated (csv) or tab-separated (tsv) values and automatically places the contents into a Table object storing the data in columns and rows. This is a great deal more convenient than struggling to manually parse large data files with split(). It works as follows. Let's say you have a data file that looks like: +

    +
    + + +

    + Instead of saying:
    +

    +String[] stuff = loadStrings("data.csv");
    +
    + We can now say:
    +
    +Table table = loadTable("data.csv");
    +
    + Now I've missed an important detail. Take a look again at the data.csv text file above. Notice how the first line of text is not the data itself, but rather a header row. This row includes labels that describe the data included in each subsequent row. The good news is that Processing can automatically interpret and store the headers for you, if you pass in the option "header" when loading the table. (In addition to "header", there are other options you can specify. For example, if your file is called data.txt but is comma separated data you can pass in the option "csv". If it also has a header row, then you can specifiy both options like so: "header,csv"). A full list of options can be found on the loadTable() documentation page.
    +
    +Table table = loadTable("data.csv", "header");
    +
    + Now that the table is loaded, I can show how you grab individual pieces of data or iterate over the entire table. Let's look at the data visualized as a grid. +
    + +
    + In the above grid you can see that the data is organized in terms of rows and columns. One way to access the data, therefore, would be to request a value by its numeric row and column location (with zero being the first row or first column). This is similar to accessing a pixel color at a given (x,y) location, though in this case the y position (row) comes first. The following code requests a piece of data at a given (row, column) location.
    +
    +int val1 = table.getInt(2, 1);      // val now has the value 235
    +
    +float val2 = table.getFloat(3, 2);  // val2 now has the value 44.758068
    +
    +String s = table.getString(0, 3);   // s now has the value “Happy”
    +
    + While the numeric index is sometimes useful, it’s generally going to be more convenient to access each piece of data by the column name. For example, I could pull out a specific row from the Table.
    +
    +TableRow row = table.getRow(2); // Gets the third row (index 2)
    +
    + Note in the above line of code that a Table object refers to the entire table of data while a TableRow object handles an individual row of data within the Table. +

    +

    + Once I have the TableRow object, I can ask for data from some or all of the columns.

    -String words = "apple bear cat dog";
    -String[] list = split(words, ' ');
    +int x = row.getInt("x"); // 	    // x has the value 273
     
    -// Writes the strings to a file, each on a separate line
    -saveStrings("nouns.txt", list);
    +int y = row.getInt("y");            // y has the value 235
    +
    +float d = row.getFloat("diameter"); // d has the value 61.14072
    +
    +String s = row.getString("name");   // s has the value “Joyous”
     
    + The method getRow() returns a single row from the table. If you want to grab all the rows and iterate over them you can do so in a loop with a counter accessing each row one at a time. The total number of available rows can be retrieved with getRowCount().
    +
    +for (int i = 0; i<table.getRowCount(); i++) {
     
    -

    There are cases, however, where you don't want to write a text file all at once. Rather, you want to continuously append to a file over time. This can be achieved with the PrintWriter class. Take the following example which writes saves mouseX and mouseY to a text file for each cycle through draw(), quitting when you press a key.

    + // Access each row of the table one at a time, in a loop. + TableRow row = table.getRow(i); + float x = row.getFloat("x"); + float y = row.getFloat("y"); + float d = row.getFloat("diameter"); + String n = row.getString("name"); + + // Do something with the data of each row +} +
    + If you want to search for a select number of rows within the table, you can do so with findRows() and matchRows(). +

    + +

    + In addition to being read, Table objects can be altered or created on the fly while a sketch is running. Cell values can be adjusted, rows can be removed, and new rows can be added. For example, to set new values in a cell there are functions setInt(), setFloat(), and setString().
    +

    +row.setInt("x", mouseX); // Update the value of column "x" to mouseX in a given TableRow.
    +
    + To add a new row to a Table, simply call the method addRow() and set the values of each column.
    +
    +//Create a new row.
    +TableRow row = table.addRow();
    +
    +//Set the values of all columns in that row.
    +row.setFloat("x", mouseX);
    +row.setFloat("y", mouseY);
    +row.setFloat("diameter", random(40, 80));
    +row.setString("name", "new label");
    +
    + To delete a row, simply call the method removeRow() and pass in the numeric index of the row you would like removed. For example, the following code removes the first row whenever the size of the table is greater than ten rows.
    +
    +// If the table has more than 10 rows
    +if (table.getRowCount()>10) {
    +
    +//Delete the first row (index 0).
    +  table.removeRow(0);
    +}
    +
    + The following example puts all of the above code together. Notice how each row of the table contains the data for a Bubble object. +

    + + +Loading and Saving Tabular Data +
    + + +
    -PrintWriter output;
    +// The data from the Table object will fill the array of Bubble objects
    +Table table;
    +Bubble[] bubbles;
     
     void setup() {
    -  // Create a new file in the sketch directory
    -  output = createWriter("positions.txt"); 
    +  size(480, 360);
    +  loadData();
     }
     
     void draw() {
    -  point(mouseX, mouseY);
    -  output.println(mouseX);  // Write the coordinate to the file
    +  background(255);
    +  // Display all bubbles
    +  for (int i = 0; i<bubbles.length; i++) {
    +    bubbles[i].display();
    +  }
     }
     
    -void keyPressed() {
    -  output.flush();  // Writes the remaining data to the file
    -  output.close();  // Finishes the file
    -  exit();  // Stops the program
    +void loadData() {
    +  // "header" indicates the file has header row. The size of the array 
    +  // is then determined by the number of rows in the table. 
    +  table = loadTable("data.csv", "header");
    +  bubbles = new Bubble[table.getRowCount()];
    +
    +
    +  for (int i = 0; i<table.getRowCount(); i++) {
    +    // Iterate over all the rows in a table.
    +    TableRow row = table.getRow(i);
    +
    +	
    +    // Access the fields via their column name (or index).
    +    float x = row.getFloat("x");
    +    float y = row.getFloat("y");
    +    float d = row.getFloat("diameter");
    +    String n = row.getString("name");
    +    // Make a Bubble object out of the data from each row.
    +    bubbles[i] = new Bubble(x, y, d, n);
    +  }
     }
    -
    -

    Tabular Data

    -

    You may have noticed that the graphing example above loads a text file with numbers separated by commas. Processing includes a Table class which will load a comma-separated (CSV) or tab-separated (TSV) file and automatically parse the data into columns and rows for you. This is a great deal more convenient than struggling to manually parse large data files with split(). It works as follows. Let's say you have a data file that looks like:

    +void mousePressed() { + // When the mouse is pressed, create a new row and set the values for each column of that row. + TableRow row = table.addRow(); + row.setFloat("x", mouseX); + row.setFloat("y", mouseY); + row.setFloat("diameter", random(40, 80)); + row.setString("name", "Blah"); - + // If the table has more than 10 rows, delete the oldest row. + if (table.getRowCount()>10) { + table.removeRow(0); + } -

    Instead of saying:

    + // This writes the table back to the original CSV file + // and reloads the file so that what's drawn matches. + saveTable(table, "data/data.csv"); + loadData(); +} -
    -String[] stuff = loadStrings("data.csv");
    +// This simple Bubble class draws a circle to the window 
    +// and displays a text label when the mouse hovers.
    +class Bubble {
    +  float x, y;
    +  float diameter;
    +  String name;
    +  
    +  boolean over = false;
    +  
    +  // Create the Bubble
    +  Bubble(float tempX, float tempY, float tempD, String s) {
    +    x = tempX;
    +    y = tempY;
    +    diameter = tempD;
    +    name = s;
    +  }
    +  
    +  // Checking if mouse is over the bubble
    +  void rollover(float px, float py) {
    +    float d = dist(px, py, x, y);
    +    if (d<diameter/2) {
    +      over = true; 
    +    } else {
    +      over = false;
    +    }
    +  }
    +  
    +  // Display the Bubble
    +  void display() {
    +    stroke(0);
    +    strokeWeight(2);
    +    noFill();
    +    ellipse(x, y, diameter, diameter);
    +    if (over) {
    +      fill(0);
    +      textAlign(CENTER);
    +      text(name, x, y+diameter/2+20);
    +    }
    +  }
    +}
     
    - -

    We can now say: + +

    + Here, the distance between a given point and a circle's center is compared to that circle's radius as depicted: +

    +
    + + +

    + In the code below, the function returns a boolean value (true or false) depending on whether the point (mx,my) is inside the circle. Notice how radius is equal to half the diameter. +

    -Table table = loadTable("data.csv");
    +boolean rollover(int mx, int my) {
    +  if (dist(mx, my, x, y)<diameter/2) {
    +    return true;
    +  } else {
    +    return false;
    +  }
    +}
     
    + +

    Data that is not in a Standardized Format

    -

    Now we've missed an important detail. Take a look at the data.csv text file above. Notice how the first line of text is not the data itself, but rather a "header row." This row includes labels that describe the data included in each subsequent row. The good news is that Processing can automatically interpret and store the headers for you, if you pass in the option "header" when loading the table. (In addition to "header" there are other options you can specify. For example if your file is called data.txt but is comma separated data you can pass in the option "csv". If it also has a header row, then you can specifiy both options like so: "header,csv"). A full list of options can be found on the loadTable() documentation page.

    - +

    + What if your data is not in a standard format like a table, how do you deal with it then? One of the nice features about loadStrings() is that in addition to pulling text from a file, you can also grab a URL. For example:
    +

    +String[] lines = loadStrings("http://www.yahoo.com");
    +
    + When you send a URL path into loadStrings(), you get back the raw HTML (Hypertext Markup Language) source of the requested web page. It’s the same stuff that appears upon selecting “View Source” from a browser’s menu options. You don’t need to be an HTML expert to follow this section, but if you are not familiar at all with HTML, you might want to read http://en.wikipedia.org/wiki/HTML. +

    + +

    + Unlike with the comma-delimited data from a text file that was specially formatted for use in a Processing sketch, it’s not practical to have the resulting raw HTML stored in an array of strings (each element representing one line from the source). Converting the array into one long string can make things a bit simpler. As you saw earlier in the chapter, this can be achieved using join().
    +

    +String onelongstring = join(lines, " ");
    +
    + When pulling raw HTML from a web page, it’s likely you do not want all of the source, but just a small piece of it. Perhaps you’re looking for weather information, a stock quote, or a news headline. You can take advantage of the text manipulation functions you learned — indexOf(), substring(), and length() — to find pieces of data within a large block of text. Take, for example, the following String object:
    +
    +String stuff = "Number of apples:62. Boy, do I like apples or what!";
    +
    +Let’s say I want to pull out the number of apples from the above text. My algorithm would be as follows: + +
      +
    1. +

      Find the end of the substring “apples:” Call it start.

      +
    2. +
    3. +

      Find the first period after “apples:” Call it end.

      +
    4. +
    5. +

      Make a substring of the characters between start and end.

      +
    6. +
    7. +

      Convert the string to a number (if I want to use it as such).

      +
    8. +

    + +

    + In code, this looks like:
    +

    +int start      = stuff.indexOf("apples:" ) + 7;  // STEP 1 
    +// The index where a string ends can be found by 
    +// searching for that string and adding its length (here, 8).
    +int end        = stuff.indexOf(".", start);      // STEP 2
    +String apples  = stuff.substring(start, end);    // STEP 3
    +int apple_no   = int(apples);                    // STEP 4
    +
    + The above code will do the trick, but I should be a bit more careful to make sure I don’t run into any errors if I do not find the string I am searching for. I can add some error checking and generalize the code into a function:
    -Table table = loadTable("data.csv","header");
    +// A function that returns a substring between two substrings. 
    +// If the beginning of end "tag" is not found, the function returns an empty string.
    +String giveMeTextBetween(String s, String startTag, String endTag) {
    +  // Find the index of the beginning tag
    +  int startIndex = s.indexOf(startTag);
    +  // If I don't find anything
    +  if (startIndex == -1) {
    +    return "";
    +  }
    +  // Move to the end of the beginning tag
    +  startIndex += startTag.length();
    +
    +  // Find the index of the end tag
    +  int endIndex = s.indexOf(endTag, startIndex);
    +  
    +  // If I don't find the end tag,
    +  if (endIndex == -1) {
    +    return "";
    +  }
    +  // Return the text in between
    +  return s.substring(startIndex, endIndex);
    +}
     
    + With this technique, you are ready to connect to a website from within Processing and grab data to use in your sketches. For example, you could read the HTML source from nytimes.com and look for today’s headlines, search finance.yahoo.com for stock quotes, count how many times the word “flower” appears on your favorite blog, and so on. However, HTML is an ugly, scary place with inconsistently formatted pages that are difficult to reverse engineer and parse effectively. Not to mention the fact that companies change the source code of web pages rather often, so any example that I might make while I am writing this paragraph might break by the time you read this paragraph. +

    + +

    + For grabbing data from the web, an XML (Extensible Markup Language) or JSON (JavaScript Object Notation) feed will prove to be more reliable and easier to parse. Unlike HTML (which is designed to make content viewable by a human’s eyes) XML and JSON are designed to make content viewable by a computer and facilitate the sharing of data across different systems. Most data (news, weather, and more) is available this way, and I will look at examples in #beginner_xml and #JSON. Though much less desirable, manual HTML parsing is still useful for a couple reasons. First, it never hurts to practice text manipulation techniques that reinforce key programming concepts. But more importantly, sometimes there is data you really want that is not available in an API format, and the only way to get it is with such a technique. (I should also mention that regular expressions, an incredibly powerful techinque in text pattern matching, could also be employed here. As much as I love regex, it’s unfortunately beyond the scope of this tutorial.) +

    + +

    + An example of data only available as HTML is the Internet Movie Database. IMDb contains information about movies sorted by year, genre, ratings, etc. For each movie, you can find the cast and crew list, a plot summary, running time, a movie poster image, the list goes on. However, IMDb has no API and does not provide its data as XML or JSON. Pulling the data into Processing therefore requires a bit of detective work. Let's look at the page for the Shaun the Sheep Movie +

    -

    Now that the table is loaded, we can look at how we grab individual pieces of data or iterate over the entire table. Let's look at the data visualized as a grid.

    + - +

    + Looking in the HTML source from the above URL, I find a giant mess of markup. +

    -

    In the above grid we can see that the data is organized in terms of rows and columns. One way to access the data would be to therefore request a value by its numeric row and column location (with zero being the first row or first column). This is similar to accessing a pixel color at a given (x, y) location though in this case the y position (i.e. row) comes first. The following code requests a piece of data at a given (row, column) location.

    - + + +

    + It’s up to me to pore through the raw source and find the data I am looking for. Let's say I want to know the running time of the movie and grab the movie poster image. After some digging, I find that the movie is 139 minutes long as listed in the following HTML.

    -int val1 = table.getInt(2, 1);      // val now has the value 235
    -float val2 = table.getFloat(3, 2);  // val2 now has the value 44.758068
    -String s = table.getString(0, 3);   // s now has the value "Happy"
    +<div class="txt-block">
    +  <h4 class="inline">Runtime:</h4> 
    +    <time itemprop="duration" datetime="PT139M">139 min</time>
    +</div>
    +
    + For any given movie, the running time itself will be variable, but the HTML structure of the page will stay the same. I can therefore deduce that running time will always appear in between:
    +
    +<time itemprop="duration" datetime="PT139M">
    +
    + and:
    +
    +</time>
     
    + Knowing where the data starts and ends, I can use giveMeTextBetween() to pull out the running time. A quote in Java marks the beginning or end of a string. So how do you include an actual quote in a String object? The answer is via an “escape” sequence. A quote can be included using a backward slash, followed by a quote. For example: String q = "This String has a quote \"in it";
    +
    +String url = "http://www.imdb.com/title/tt0058331";
    +String[] lines = loadStrings(url);
    +// Get rid of the array in order to search the whole page
    +String html = join(lines, " ");
     
    -

    While the numeric index is sometimes useful, it's generally going to be more convenient to access each piece of data by the column name. For example, we could pull out a specific row from the Table.

    +// Searching for running time +String start = "
    -

    + + + diff --git a/content/static/tutorials/drawing/imgs/A94665D2BBAE05CF._t_ b/content/static/tutorials/drawing/imgs/A94665D2BBAE05CF._t_ new file mode 100644 index 000000000..fb0b3bb08 --- /dev/null +++ b/content/static/tutorials/drawing/imgs/A94665D2BBAE05CF._t_ @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/drawing/imgs/A94665DD9FEE952C._t_ b/content/static/tutorials/drawing/imgs/A94665DD9FEE952C._t_ new file mode 100644 index 000000000..914fa8f46 --- /dev/null +++ b/content/static/tutorials/drawing/imgs/A94665DD9FEE952C._t_ @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + line (1,0,4,5); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/drawing/imgs/A94665F3686FB3E6._t_ b/content/static/tutorials/drawing/imgs/A94665F3686FB3E6._t_ new file mode 100644 index 000000000..011a3cd80 --- /dev/null +++ b/content/static/tutorials/drawing/imgs/A94665F3686FB3E6._t_ @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/drawing/imgs/drawing-01.svg b/content/static/tutorials/drawing/imgs/drawing-01.svg index 21f5e8796..bd50213f1 100644 --- a/content/static/tutorials/drawing/imgs/drawing-01.svg +++ b/content/static/tutorials/drawing/imgs/drawing-01.svg @@ -2,63 +2,146 @@ + viewBox="0 0 612 792" enable-background="new 0 0 612 792" xml:space="preserve"> - - - - - - - - - - - - -x -y -0 - -1 - -2 - -3 - -4 - - 5 - - 6 - - -6 -5 -4 -3 -2 -1 -0 - - - - - - - - - - - - - - - - - - - -B ( 4 , 5 ) -A ( 1 , 0 ) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/drawing/imgs/drawing-02.svg b/content/static/tutorials/drawing/imgs/drawing-02.svg index 53c5804ec..beb9935ab 100644 --- a/content/static/tutorials/drawing/imgs/drawing-02.svg +++ b/content/static/tutorials/drawing/imgs/drawing-02.svg @@ -2,34 +2,148 @@ + viewBox="0 0 612 792" enable-background="new 0 0 612 792" xml:space="preserve"> - - - - - - - - - line (1,0,4,5); + + + + + + + + + line (1,0,4,5); - Draw a line from ( 1 , 0 ) to ( 4 , 5 ). - - - - verb - - - - - object - - - object - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/drawing/imgs/drawing-03.svg b/content/static/tutorials/drawing/imgs/drawing-03.svg index 55a6fec35..b3c97fe3f 100644 --- a/content/static/tutorials/drawing/imgs/drawing-03.svg +++ b/content/static/tutorials/drawing/imgs/drawing-03.svg @@ -1,101 +1,300 @@ - + - - - - - - - - - - - - - - - - - x - y - - - - - - - Eight Grade - Computer - -2 - - -1 - - 0 1 - - 2 - 2 - 1 - -1 - -2 - - - - - - - - - - - - - - x - y - 0 - - 1 - - 2 - - 3 - - 4 - - 5 - - 6 - - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - - - - - - - - - - - - - - - - - - + width="1046px" height="600px" viewBox="-259.5 0 1046 600" enable-background="new -259.5 0 1046 600" xml:space="preserve"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/drawing/imgs/drawing-04.svg b/content/static/tutorials/drawing/imgs/drawing-04.svg index e8e78fca4..a819634e0 100644 --- a/content/static/tutorials/drawing/imgs/drawing-04.svg +++ b/content/static/tutorials/drawing/imgs/drawing-04.svg @@ -2,21 +2,100 @@ - - - - -Point - - - Line - - - Rectangle - - - - - Ellipse + viewBox="0 0 612 792" enable-background="new 0 0 612 792" xml:space="preserve"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/drawing/imgs/drawing-05.svg b/content/static/tutorials/drawing/imgs/drawing-05.svg index 76a79bf47..44653c110 100644 --- a/content/static/tutorials/drawing/imgs/drawing-05.svg +++ b/content/static/tutorials/drawing/imgs/drawing-05.svg @@ -1,64 +1,210 @@ - - - - - - - - - - - - - - - - - -x -y -0 - -1 - -2 - -3 - -4 - -5 - -6 - -0 -1 -2 -3 -4 -5 -6 - - - - - - - - - - - - - - - - - - -point ( x , y ) ; -Example: -A ( 4 , 5 ) ; -A ( 4 , 5 ) - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/drawing/imgs/drawing-06.svg b/content/static/tutorials/drawing/imgs/drawing-06.svg index 6c0dbeefa..b60a7c33e 100644 --- a/content/static/tutorials/drawing/imgs/drawing-06.svg +++ b/content/static/tutorials/drawing/imgs/drawing-06.svg @@ -2,70 +2,273 @@ + viewBox="0 0 612 792" enable-background="new 0 0 612 792" xml:space="preserve"> - - - - - - - - - - - - -x -y -0 - -1 - -2 - -3 - -4 - -5 - -6 - - -0 -1 -2 -3 -4 -5 -6 - - - - - - - - - - - - - - - - - - -line ( x1 , y1 , x2 , y2 ) ; - - Point A Point B -A ( 1 , 2 ) -B ( 5 , 2 ) - - - -Example: -line ( 1 , 2 , 5 , 2 ) ; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/drawing/imgs/drawing-07.svg b/content/static/tutorials/drawing/imgs/drawing-07.svg index 8f112e8ab..fe9206917 100644 --- a/content/static/tutorials/drawing/imgs/drawing-07.svg +++ b/content/static/tutorials/drawing/imgs/drawing-07.svg @@ -2,77 +2,291 @@ + viewBox="0 0 612 792" enable-background="new 0 0 612 792" xml:space="preserve"> - - - - - - - - - - - - -x -y -0 - -1 - -2 - -3 - -4 - -5 - -6 - -0 -1 -2 -3 -4 -5 -6 - - - - - - - - - - - - - - - - - - - - - - - - - - -rect( x , y , width , height ) ; -( 1 , 2 ) - - - - -Example: -rect ( 1 , 2 , 4 , 3 ) ; -width -height + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/drawing/imgs/drawing-08.svg b/content/static/tutorials/drawing/imgs/drawing-08.svg index c921208ee..f6b9defe9 100644 --- a/content/static/tutorials/drawing/imgs/drawing-08.svg +++ b/content/static/tutorials/drawing/imgs/drawing-08.svg @@ -1,1583 +1,297 @@ - - - - - - - - -]> - - - - - - - - - - - - - - - - - - - - - x - y - 0 1 2 3 4 5 6 - - 0123456 - - - - - - - - - - - - - - - - - - - rectMode ( CENTER ) ;rect( x , y , width , height ) ; - ( 3 , 2 ) - - - - - Example: rectMode ( CENTER ) ; rect ( 3 , 2 , 4 , 2 ) ; - - - - - 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 -VXJqrDj2hJPXbbgiet7d9Zf91v1vevOb3/T6V7/inv133hBesWHdyScc21hjxbGr1p59qbppz+xv -/uF7//JjD3784w9+7K8++EdvfOVL7r5JXXr22lUNNVYcu/rU84a3vXD6Nx/4s0987svf+Na//uu/ -fOMrX/j0xz741le95AXbhs87dXWqBsJvIDdWX/6WP/3kP33rke/96PEf//jxH/3g0X/7+sOf+NO3 -vLx6I9mQqgH4nLqBjhx89bv+z8Pf+u6P/vMnTz8Dn6d/+tQTP/jONx/+23e9+uAI3XBqjNWKlSes -PY+MTPzOBx766iM/fPKnh5/9mf48e/iZnz75w0e++tAHfmdihJy39gQ3VyuPP/ns4RsP/s6HPvPN -x55AcEdnWOenTzz2zc986HcO3jh89snHrXADWHfptuqrP/CZb33/yWdicFPn2Wee/P63PvOBV1e3 -XbrODmPl8UMb1Atf/q6Hvvn9pxrhdY2nvv/Nh971a3eJ89Ycv8J0cMYVN73kLX/71ceefKYRXFd5 -5snHvvKx35+8/rLTV+EoVhy/5jx192986PP/8cQzz+ZumWefeeI//vH9r7iTrj8JR7Fy1Wkbr6+/ -5ePf/OFPM/g4rH7yg6999I37ry2tBZwAozOHb3vZez/3yH/mImSQeuLfPv1H99y0CXCCCiet57/4 -Wx/+0vd+ko8QVjj81He/8MFXPH/zc048dsWK404+Nxy9/6Pf+NHTzTqAUfz0B1/5q1ffzdefhBXW -nHf1vjc9+K3Hm2IEXTz9o2987PWj4bmwdlBhw3P3v/nj//rj+So88/i/PPimfVvOW2MrHPjdT7So -8ON//fib9z93QzsVPvG7B46gQusxpFA6bwvM0r/MO0upQeM6vP5j865Dalpxpe9+9V995fs/bbrS -sHDfjxfu2BOfU7795R/4wnefPNyUlg4/+d0vfODlt5eRNIBaT7/sprl3fOrbP26K08+e/vG3P/WO -uZtwQ+B+WHvBNdX7P/Ll7z3VpAugve99+SP3V6+5AMkbyfXsYPevvuvT33786dwN8bNnn378259+ -16/uDs4+CTf1CthBl2zdf/9ffvE7/5m75Z595j+/88W/vH//1ktO01v0GJjY9cGuex948GuPZZiG -YRuPfe3BB+7dFay3fAb42Kmlq+9+5bs/9c3v5bKZ733zU+9+5d1Xl051nGzFcSeesWnHvld/4NPf -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 -kg5OnPP65IJq5btSzEaHkQfKQuZC4ZCDVcvlcOLCGFTGA9Ska8bJoLMw4g4VuQzN3+Yh6rXw0k77 -jtlafv+ZGCY61BLPZX2VHvU4q7SplKvdSWy/XEHwqdgA7Wy5Qv+9MCVsSRNFCyPk7hX5k19kkt3q -KWE2liTZ7fFl0BC6r0QJYMlo7m0gyTrjMuz8jr5i3tn+9BXFFQfFCpjzSWHQ4KM51HJ8KGbYDVQz -7Hak8qDFx9euZFBhhp2tPPZ+K2VjOVSS3RoBQjCoOAHsYAtZ94oZdoEfWORypZB35lDJsDMVRl7J -oOJ6fNV4Q2HQ4KPFX6e+lJLdhmrl4sxBtQy7YvPxVWHQcMnyvHgaKQ3aUq3HV6++KA+az3cL4l01 -09cVsJ+YTLyTM+GTtKMhdt6SzGE6esS+nNGMjnYAYtHtMc8LT7DqgV+qinJHODLiNKcWc89H2+q8 -9h8ANeAQnxFResObdNSxSui4qlm56JfASqK0LhPXndqTk40nVYy5urqSnJz2K397wy2V5MQCka4j -p1opTzecxJeeacZcqdRFw2TuEVeO61Ot+3ZbETlRV8JjMFqHuTK1cqs3Upe9cVplUhq1BvRMCUV2 -WbeXBVOqTEk+lPIKetlq3Zd/HuwK6eW+2XRyM+Q02Ltl08lp21zNlLtl08k5vJQ8vddn0wmWxrmc -VW+evCqbTi4AhD6vvGc23dleFQc7PXfdXJZNd53X+tJsOjlLTYDJd8qmc8nk0tG0f89sOo17FO+U -TSdnNytmcF+dTSc3L3SacNdsunPFcFqE58j3zaaTj7a9dzad3O7K2vs3ZdPJ5dKp1ku6KptOLpeO -qy14t2w6uf0Tx5DcI5tOLpdOXlO6JZtOris6v/Ke2XQaJ7x3yqaTy6W7GWJaOuFFENOfTacDYnfI -pmOJRphLx0mxu2XTyWnokkp5d8imk+uAP+G9VzadXC6dQpzSDdl0crlf8tbrLdl0crl0SnVFr8+m -k9shuVjr27Lp5HLpNOzKK7Lp5IAhc/J+YzadaEHSO+0vyaaTTEnbAJTJSJUk79ipvbTw7sfhW0PF -kKSHKUWn2/PGSxiOcuIT4hb6tQu99erkFB692oX+enVy4RPSenwa9er0wklS2VYuDlYnnDQVC8k9 -JCql3OQq0V4+JSaC6CK8VJ6SkvQ5zxTWgpOWBiA3pXMOg0reKYdSXDal2VE3h2kpWUQyJ8/rilgk -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 -P0t8vn34B5/AT1zyVKq6WxP+B3ON1jI= - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +(3,2) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/drawing/imgs/drawing-09.svg b/content/static/tutorials/drawing/imgs/drawing-09.svg index edb4a155b..07f865a8c 100644 --- a/content/static/tutorials/drawing/imgs/drawing-09.svg +++ b/content/static/tutorials/drawing/imgs/drawing-09.svg @@ -1,1596 +1,305 @@ - - - - - - - - -]> - - - - - - - - - - - - - - - - - - - - - x - y - 0 1 2 3 4 5 6 - - - 0123456 - - - - - - - - - - - - - - - - - - - rectMode ( CORNERS ) ;rect( x1 , y1 , x2 , y2 ) ; - ( 1 , 1 ) - ( 5 , 3 ) - - - - - Example: rectMode ( CORNERS ) ; rect ( 1 , 1 , 5 , 3 ) ; - - - - - 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 -a+WKc4q19QxmuNY3tdy/tXLCIVHcdjqKg1rqs58pzy/iNLyZSpbjU7OvPGjh6a0kN6jBjAAsKF4o -HrQpwSpgTWZ49Imh86hiO0Ymcy1junr0v9f1tbM3UDsuN4GqB2WiFhjHcLJ4Wom3TugnVhRHot1O -tqKBUFt1Su+Xa1i2Z4VNqlQx0wqFEXtIlLN//rSqmOmt8qUeiGk4I7VJM7RKb2WWt/w1oVUCOFmx -ADStSEh1OIlCqxQPBHVkpekPrdLKStOK0dRPT1s50rwgtid/bpRWaKdkWcBJ6Y0S1prScK98Y9uZ -WXeqUVrn8AsbpyUzpTQ9G6mdI74hxLOViKuBa3cLH/NnQVwz5QIfrI5b43TXfipcc24tkjCfhavd -y2Bp79f7xz4L5/u1ZPxjAOdXH1mLPMvydxDpywLUfwmt4l4JswBvdGUjpGS1OC3dJblZpXpMbcU5 -s6P7+p/WabUuCTOmTreyka9xBov9/EXVK4HPcwTAS8golZNEPTcPCX0q9M0QggCCktTPf0V2m4re -pueOCKz5Mny8JpEMP0eW3D92TVqUQHkT1bCT8cYqZ7fNFO850KWN45MSyfvLyuoh7+i0JJT3V6Ry -RmT1buGdkLpTAXvus4gBxfQqd6ZZQUvfvFAGRE/5bP3sRcqeD14KMXF9n6sgppkYdA7ENIv86F+k -XwViknRhqX7I8sslFfUMV2UB6s0BRFx5cRYgPwf1rCzDVVmAF/uTz8oC1JsDqFyBXU8WoLrlqxQN -dW4WoByG5HIAhZEq52YB6oWnYK88OwtQbw6gmo2snQWozxxVPn1TzwJkZiNZlUh74oryYTT2HyzK -p0zJqllbZxblU7QsblqUT8sLpztxWLUoH3fK8x8tyieykf9DRfn0eOGuL8qnlTNym6J8aBeDk/qP -FuVTvm9cDU51/7uS7tzVdzfUZXX99N0NdW1dPyaT62Z3Q8nX9VN3OStlPZ9b1092aTe4G0pY10/d -K6RyN9RZdf3Uq/pdfTcUU9dP3V2mI79SV10/XZHDV9f1Eyjskqp+TBWzWzh0Var6nZXJpVLXT93n -IM3kukkiUlJY1e/y+pXCun4X+i3PrOsnT59sVT/t6gz66vpdFaGqu66fVn7ljYp/qFb1E1Ly5XX9 -1Kv6yeljl9T1Oy8r7dK6fuJoJ2FVPzU/v47yAFxdv+uioPXW9VNPk7xNzjsqWqeSgHtWPb6LS9mK -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 -G/Avvx//wW/gJzZ5IlHbq3P/A2K8z5o= - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/drawing/imgs/drawing-10.svg b/content/static/tutorials/drawing/imgs/drawing-10.svg index 0b8f506f8..5cfcd3368 100644 --- a/content/static/tutorials/drawing/imgs/drawing-10.svg +++ b/content/static/tutorials/drawing/imgs/drawing-10.svg @@ -1,1584 +1,355 @@ - - - - - - - - -]> - - - - - - - - - - - - - - - - - - - - - x - y - 0 1 2 3 4 5 6 - - 0123456 - - - - - - - - - - - - - - - - - - - ellipseMode ( CENTER ) ;ellipse ( x , y , width , height ) ; - ( 3 , 3 ) - Example: ellipseMode ( CENTER ) ; ellipse ( 3 , 3 , 4 , 6 ) ; - - - - - - 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 -wxWh0Bn/o4iCqssFZrWjBFP+RZh7KMIEuCEjOmG5VnAjIhUq5RGmHo+yGTWTuUAoJj6HTpIPB2Ry -fxBSxmcHEnp/UOZBIl0QmiEZGF7m0JpXhWWZUR6nvtMWRiLPX6Px4RL9qTJjYZzFj8fVCC0Dr/U6 -O8v0mAPRiDfaGY1AiKhMJXDK4ICpfGNrgeUaUBmY0aHMFGRgMrOYQab1Woz2Z4YlpRPggorOwAoP -8jMseRgsMnDm7wJqvAzY4mnxp1+wEQTipo2l0zNfnVoavvam3Xe+4AV3/sJN11514WnJ79aW5M47 -xqbue9mv/drL7psau2OnuGAornjV1jsO3Ps/7v+9t7397W/9vdf9P/ceeP5/vdJVX7Np+wvrL7// -be/507/8yEc+/Kd/8tb7f23yBds3rTHfnnv1HROveOM7//Sjn/z7z3727z/5Nx965xtePv786Fz9 -5UlX7Kzc95oHPvSxT33+n7/0pS9+7qGPfvCB376vsvMKPRenk5H9L3vD//rfn/iHf/7qN77+1S9+ -9uN/8cdveNn+EaJHdnowUv3V1//xX3z8s1/8yte/9pV/+syDf/7O1/9q1X570qbrfmnut/7wfR/5 -5Gcf/uIXH/7sJ//6vW/5zblfum6TmeVz1K79/+21b3vvh//2kw899Mm//d/v+cPf/pX9u+Q5dkSX -XP0L++971Zvf8Z4P/fmff+g9b3/Tb9wztuvqi9e4AV8gbrp74ld+/bVv/v3ff/Prfv3QwRfdwM+P -J+uY0y6JbrpztD5336G5+ugdN6hLUhMNmF941bU37br99l03bLnqwuwqHXPMugsuufTSS85f12Kl -i356SnJ2lfRpJ/NUlBK4UXPHG86JZlfFnGw5cEvmZtu4p6OONuyuo642INQOOts27plsIg3dK7Eg -g7beWNo6N1svmZ1Ye2nieVW3U8bqe6t7cL/cunemOn1PdWzP86qH9hggmxp6c2MPDb+bRkrm/fP6 -9ETiHVUiTRPzgLSGIEFLEEZaglB6eXrQN07OzFYmR6t7kHftuXEHcIypJgMejgRsbYGvc5ks2b6D -q+GHsfpEaaaaYD9u1EfaziI14+bvSNtxk3yk7WRWAsnvuvuqo3PYanpdEhycAPhkfRJTRs73jtPC -8pO3eFjJH2PgK0hJ5ts8jXhU5jz9GE5Z0QQrkGhcNAIBu5BUlDRToomXfJBPBmHy3ROQSmGcAzZi -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 -n8NhJtdFEpHS0qp+p9evlNb1O9FveWRdP2X65Kr66VdnMFbX76wIVcN1/fTyKy9U/EOzqp+Ukk+v -66dd1U9JHzulrt9xWWmn1vWTRztJq/pp+fkNlAfg6/qdFwVttK6fdprkZXLecdE6jQTco+rxnVzK -VlaP72wOVK7qp3hidUJdP+0wN4W6CSfV9dO21PBpwgXq+mlbWJjGLlDXj0elYlU/xXU5oa4fD0Wx -qp+aH0Yz4HpyWNdPWx1UzUo7sq6f2kEBU9XPiG5pKO9Bs6qfYd7Xqet3TD2+8/MelKv6nVaP79gr -BdTq8Z2f9yCu6qd0xndKXT/Vsyt8wsmfvZ5Z109j4sCE0nrip9f1M5qVdl5dP0n+1kFVP105ZrCu -34na+JF1/VQIja3qd4l6fJqX6RxTj+/Mmz34enzns+FhVT+eCaWZKafX9dO2EjRu1Dmqrp+2Qa10 -w+Epdf2U8rcENUfNej22rp+2mmMyoui49ev6Gbq16ey6flw6onJVvxPq8Z0gNxXr8Z2QP6vQC2HM -Fjumrp/MnS1LhjdZVZ1aAoOcnQwvPk04p66ftl+LuYXm/Lp+kvSxg6p+ol3srLp+2mY7vy5n1vXT -Ntt5rjyzrp8EYwdV/U61K+V1/fTsShXBdWRdP/0szkvkPPGKoWJVPyZS5YSr3g6oRKuqH7JfLlHX -TzshVl0fO66un2ZCLMLYpRzIGlX9jtdhlOv6aR8uqNwOdHRdP0X+5Kv6GYi3NFTXT5si+Bt0jd6V -0gj6DjaHRlAjq5ur96p3iak9cBOb+WWuXc0zTHngvYiSlRIX5S4tqQ/LJmF7x0Ls8MKCWdjFmDQB -LgUqKnZ3S21RlBFmdrw492av337rCzRiN1yTxnazobY5s+t7c+/3WuO2wNNtKBcKu7c/Vf9qPzBZ -7ZVJNObKvNw8X5urO6c5Rz/4r/vv4fhN+8lStM6W7YZ98rP2htuNv4/IbNz4zs4+737qk3Ysdvda -+Xtsk+v6V/vnfjrvlv23+8ePstPx8VFwO3/7od/mouVOfJmsa/dzdrexth32zSZwY75eTVZ+K3Hz -k3A+N0aP7pj71pH+u1k0iLF1WdxsMvGW2fVWvjVT+ebcnRgFswRNZNIE3XmiibJldUeUm3c/m800 -493sf9L2rd1zNzRZ0dTNTCpgIv1Xcqeidy9oScw47Y0oPUY+NtvvmoXwNyeKsp1dFw== - - - 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 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/drawing/imgs/drawing-11.svg b/content/static/tutorials/drawing/imgs/drawing-11.svg index 83c1fcbec..de0a120cc 100644 --- a/content/static/tutorials/drawing/imgs/drawing-11.svg +++ b/content/static/tutorials/drawing/imgs/drawing-11.svg @@ -1,1587 +1,345 @@ - - - - - - - - -]> - - - - - - - - - - - - - - - - - - - - - x - y - 0 1 2 3 4 5 6 - - 0123456 - - - - - - - - - - - - - - - - - - - ellipseMode ( CORNER ) ;ellipse ( x , y , width , height ) ; - ( 1 , 1 ) - Example: ellipseMode ( CORNER ) ; ellipse ( 1 , 1 , 3 , 5 ) ; - - - - - - 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 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/drawing/imgs/drawing-12.svg b/content/static/tutorials/drawing/imgs/drawing-12.svg index e355c6648..757c3f04a 100644 --- a/content/static/tutorials/drawing/imgs/drawing-12.svg +++ b/content/static/tutorials/drawing/imgs/drawing-12.svg @@ -1,1593 +1,337 @@ - - - - - - - - -]> - - - - - - - - - - - - - - - - - - - - - x - y - 0 1 2 3 4 5 6 - - - 0123456 - - - - - - - - - - - - - - - - - - - ellipseMode ( CORNERS ) ;ellipse ( x1 , y1 , x2 , y2 ) ; - ( 1 , 1 ) - ( 4 , 5 ) - Example: ellipseMode ( CORNERS ) ; ellipse ( 1 , 1 , 4 , 5 ) ; - - - - - - eJzsvWmTJLlxKPgL8B9yP8iM/DBVAQSAQHDXZJanHp8NyTEeWr2VPRsrdtcM+6mPUR+kqF+/fuKI -QGZldQ/ZPVIVrI9CRiIAh8Pht//D//XN777aPn/zx/uvxpthY/7hH/Zv7+/ev3n7iw31bn758uWH -d+/fYtfPfvvzjZ1uBnho+8v0rTz4z/dv37148/oXG5tuBvrwhN/+2a923/x887Ofw++/f/H+5T30 -PH9795cXr7//yrqbd3/+/uf6Lvjy4e49PGBv3Xxrw2b8hR0221/h53ev/3z37t2L/8RP45hG6Nu9 -+fD6OQyze/Mfv9h85TbObWIIGx8jfPg/Xvz2/l37hL2ZQ5qTH6cAz96EIaQw4y8x+JtpGOwcRutw -gHAzp8HHNAUY6fDm2YdX96/ff/P2zbP7d+/2b16+efvuF5v9X+9eb3519z18crf5X/cvX775y2b3 -8u7Zv1VfOb15/R4e/f2f7n93//bFd1/9j2/CNy/vXryuHvn1/f3z++fnH9z+Mnx7evHyHkD56u79 -xo4I2O0vrft29+HFy+e//vDqj/dvEeTYO35Ls/vDO5gWzBD/j93Tt798BT2/u3//HoAB78G9+e0/ -7eoVQSe1n/3rb++/f0H7DNvxv38uw75988Oru7f/9o4fi37Y+DTwZ7+/f/XDS9g2AvLoho2DT+Vf -eQLmz1sQ0uYrnzZxipvgZMoFvvd/fnH/l19sfv3m9T0vfPv2/e94y70fBv6bP/nth5f3b//w+gVC -LWLXzEv/1Zvn9y/h+fz908u779/p4mz5mx/4/d3b7+/fA6a8efnhPeFu0jcAZL++++s9brXlF/zm -h/vXv3/zzzTHr6wNN2EDGAR/2421Q9pMwcM+0CumBDs15rfa8jcPjkPhQPqGCTbkG9ii37x98f2L -17/4yvp4Mw7DuPlqdPHGzQmmRT+W9/Of3r54XrYzDpvAf9HSbuRha2c3zG6+tmemnynakKx31/Qw -XADE79/fvxY4AWbuf1Wh2nDzq9/B6o6vn+/fvMJ9fodHF3DsNaDfyzff82f5//QJfP3DD+ZfzTjf -/vuHN+/v38FYL+83c7z9/u3dn+831qXb7fMX92/hk3e327fw8e3+2f3zFy9f3t0e7559eH9/++v3 -cDzub3+jj5nbP+Rv3PEjdzTa7d2zF28BBb97ef8ft3flGf7+HQ3+TAe/p2+a23v+6n311fv81Rc8 -/At+5kX1zIv8zGsa3ty+4Wff8LNvqmff5Gff8FQ+8KMf+NEP5VFz+yE/+/zu++/v394+hwne398+ -A3jfvnt///YlruLd/TNE8ts/fnj58v797Q93bxECP/zpFr7x6u718z++BCi9peMPoz2/ffbmh78C -Qv7p/S2Qg+f3SABueQ75dTev37x/fv/d7fZ4+5t3L+/e/cnkrh/gunj14vWH8pD++9f717evPiy7 -zeo5/ffN2+ff3cNQL17f4/9f3b179uEl/qIP3EG/vP3fP9y/w0U+f/OX17f3//Hs5d0r+i9g14tn -dy/hC/lb3wG9ePF6PY3vgbC+vH/1Bu6q796X3xgSQOhf/IArf/fD3bP72y1vxlaQTf453r5BHHn9 -HKZ0e/+K/iFEBhDToPoLj0m/lX7ufP7izy8QQTLQMsz/V/7fd2/veEePH96+oZnSScnzpt9oOHP7 -3QtYsKAHvPn2B3jPm+eIILTX5Zz98e7dfZ4g/QKPvv/Tmw/vAEXM7bZC0WP1/y1jxjFP7sig+SX3 -/7JG11/mh37JD/2GH/pNNZ6u+zf8xB/4iT/Uw/yBP3qOOwW8wW31bd6IV3fP3iK+w81Cj909owPB -R5pPtLn904fX39+9/fDq5d2H93AO4fL5t9tnd/A98/sjUevwP7/9/Tu4osrNNH5LZOr4+tkbZC9+ -sfl2dXN37vJ/vV0/drv+Il8Zv///+EVAG/U1zIf9/q8/3Jt/tdHKGQdGbLwFWN3/+4e7l/BLvH3x -+js4K+//Wp1AhA89AAQUGC0APv5ibLJ4EIEQvH9x9/L5i+++u4WFvqKr//aHt2+ef3gGZOIFjPge -CR4Mn+bb37y6//5uY4BbugWqgIdqY+fp9u4H+MJ/yCzmdHu4fwmMkbNeMBlO4H/ev/7+HtkCfPgl -4Pa3v/vrqz++efntLf8r9yUvPTCMvwWYfwMbhteJ+fUPhhjOb15+gI/+6e2bDz/88vV3b8zPmEP9 -Z6BvcKT/8/755jd//D/wC7CdxPlsfg8HBQaA3/MzN3cvfvj5xeHgXnt7v+EP4Zv0q/778LcP998B -y1a+zr3H13++f/nmh2pYfu7h8QA5Xt+93VB/Hu7rF3AbfgNY874MiA/ev/+XK0YE1uMHvBL+rNNZ -jH7hgeqjh1/0u2fIILzd7N5+ePenze/fvHmZX9F+lNcg3dSLz38Z7/jm7v2fgMcHuv4uD86/llFx -R7jvqvFgAq9/85oHXs9cHljOHNha/s7j5v53e1f+Tu898OFP5R37O7jsiUN68az3ms7n+X31Z49B -YyKEL969Kthb9XyDhPrZy/vf/RU4tGtohuwpXMpA9M4c8ovP/O4vd++f/enrF3+8iM4IV7hznsMh -+92HF+/vC4TevPoBZfDN7/5098M9rUCf/F0eMOAlV9P5r766cAE4u9m9rj7/J7yE4Fb/xeZn8N+/ -Akl8fU90krt/bvrdKKRtds9ByPh/zLAddsN+OEA7WhCJrLMjNG8DXLMTtNlu7Q7a3h7syQ3OOudG -511w0U0uudlt3c7t3cEdoZ0MfNuNfgxjHKcxjfO4HXfjfjyMx/HkQW7yo/c++OiTn/3W7/zeH/wx -DMEGF8bgQwgTKifCNuzDIRxNHKKNY/QxxBhTnOM27uLe/CNOfhrSMEPDRfAy8M9xOMFSBljKcjn4 -J8mScEEHe6SGC4Nlmbyu9dpO4wAjDbS8sbPAfW+Rxk+wzq2sFNbpT7hSnnyE6ZcF6D4ceQGwBJsX -4GUB9fR1CTR5/GPy1sTV5vAicAm4gHG1hHaXBvzjrYF14Com2qq8XTz5H/nnbzyg1UaTP9nTcDwd -8edw3B93x+1xPqbjdIzHcIQ9Oo6AyhY24nQ4Hg6H/WF32B7mQzpMh3gIB38YDw5wZ9if9vD1/cHs -9/vdfruf92k/7eM+7D1gg9vb/bA77Y67w26/2+22u3mXdtMu7sLO78adg1M1bE/b4/aw3W932+12 -3qbttI3bYLZ+O27d1m6H+TQf58O8n3fztp78qZr85en3FlAtweAKaAFnlnBhEd1lGFkHraQshCfv -YPoK/UMF/XMLaHeg3QNYgsnbcJBFlCUs92G5iOVe0DJMsx1lQ/7R+M0/fLt7C2uAkzfDKURiEuBc -4hkd6NTCWwbeI+o6USd2EwzxQzjoaZj0kfJQ+ZgeGCI8MsBDAIYRwBEAMBMAaAvA2gPQjscT0gca -p/p4pgc6j7QP7OsHTq5eGlDfEaiwDYM/wT7sYYe3dPQnoNceiJoDSgTUAajEAajFDuhGAhoSgJa4 -0boTkMkDUZstUJ7kJkOkyANRckCcgEoBtToA1QLqRTOjMbY0yiTjeKJOSGiH9XhC2XpD8qCyM1Pe -HQ/UE3eIIUGzLu8sb8V31m+s39q8r32nITqM74zUAr2T3ig7CMh03J5gdy3g2Ai4FgDnJsC9GbBw -B9h4gB07AYJYwNMR8DUA3ibA4S3g8h5w+rg/ARJZOK0jIH0wgP0TnIIZzsMOcP4A5+N0hKv76GiF -nXece8tUvafzJn6RyW9q3oVoye+79l3T2VVVbzvMpl5X/bZjcwYfIP5M7B01uvMGuM+GkFukxrcv -3b+GLmC9hIUdIoaIWaJyCXthi/Aarlkj5SIs38LISSgvUS7ilpfAS1ivYOYj8gUsPMRIjBLdv0Z4 -JeEgmFe65iq2K5gUyLTQEQiZDCIgRESOZgISQ2dLxGpfsSrKbfGPI/T3NctiMsC2mWsRzgUbsV7M -ugQ54Ayvbct9FagZ4V0aBux6tsQ2+FGwxGVYZGiYjCjTChI7ggQS7yMzzxkOzLb5jDPKugEQTEab -PTWEhHJwCAP88Qs4MO4QFAR3BsIdYuEMQWEiKCgjehDic6p/jrkdpO2p0c142lIDZuOUqE3QIrUA -DW6DE1B9vL7LBa4M1IFulMKH4EXOV3mgq5wvc+VH9DqnC93AkdcbvfBV5UrfP3Cl84Ve8SWmx10x -53ENLNbQmDM0pgYa3iBACjwqnkzhcR1EMo9mFCgdmCi3eeryame4NSNgabjOa2BxDjPO4kYLC4XG -8RHQIHavYIih+6bm+ZaMa8V9C47UvOsKHqbi/DI8mgtlm9kvYsCIBnoiCkJAVeCc8sf8wCg0dagf -i9UjXh5ZPjYwMw8HH4CHOBUAohPAdwZ4ww2K19/ppDz/VY+5zkPLxwofy1ySci2eBGXH3BJxpg1v -ykxrzeQIYwXPnuQmEBa45XP5Lb5wRivOF7+QGK7K9wbiWSNhSiLOdSb8Ufb2QNiFHGxmci1xCswr -+Pz1lL+4r77EX8kMRmYxVpxyl0/+VzPcAEM4TcArTxZY5hQ3w81oQ+KrL82BjMpunmyAX5MN0boE -PcMAdDoCI4vaj9FCT4QeB58nYBR8oB78zzAn/mDCHj8NISUHr5tB3ti4jd3ETZo2s70J04iT+p35 -h2+/rEnt3gGU4PFp9H4e8EsTvcwluLEDjGXdyB0jTC26mNIUp5ls+HP1rkjr6PXMg53hbsY5j5O8 -P9ibMdhx4+cbPyZXQPPZZ0LwALSH7QC4z94DkPGlAPQAnXGenYueekCCmcYBmYY5jOzUkOoNYGcE -b+2km+CpJ1XbFnQaw2Ycb6yPtsDis86C4DAC2QToE+MC24JoCazuaG0E9noGhMUeoJsRuKlhngFX -Pc0gCoxdwJ2EjqmGvIvUU88glQnY6cYj6mYwfM5JIBQqDxkrT0R/gwCnQ+nZ3SQhYMvmXfrS5zpz -8cZOM1MSJ7P2qBf5nKdP5yQwSfM8wM0F1/I40NsSebgB1fPTaLknwR0U4GgAyMfECL9AZjwCQvAI -63GjUk0Y47x6f4HB55sDwGB3yNYGNQP07QgLW8HG/tx0+mBQly0IKlU5kp5YeKwV8ygqnrJtQVXx -qZGEKttCUcLPIgKqyNxqrRuNdWVXYI272BWAE7ImGxZCiGRa2JFp4USWBUe2hRinYluIB2AekIEa -gHlxQB38FAApAXOnedpOOzPtgSM9An+F7KJNDuX3BCQ0wYZCS7Bp27RLe+Dk8Q+yMCeEBqzYzSOg -rJ/DDG+bYX+gzQZVjcCZAguLDC9yO8S4IWuEQjPCAeU7Ty1Ag4mSihXeQ3rKeYs/uy3/7Az8F9te -2kEa8ULM0e+IryO9J+qmXCs/2ywVszQc855ua4tRJfLWO5tNLEZsLLq5ap/oGI46ppWl9YhsEvU2 -o0ViX8wqeZ9jNiFtZa+PzW6zLYl23MiWLzd9ve1bVGI9vO8mbz1te7Xx663HH9753g== - - - 3su+m7z19cYvt35b7/j1e7nLVqdTo+oK1SkVJZfJO3nZCLjeybUdkBRcj91L3Ml6L7k5sQ3Cjho5 -xHyM9SAfZU/1KOuu8r7SgS47S3trdW8NbS5ub6Tt1YPN+7vcYd1j3WXdZznkuNem2uyy3UeWrkUF -afORp0P/UzS31T+2aq2+rWhla32sUBijaHnm6kCkLJSFcZExEfGw3BeMgfO4Q2PDkRBvFPMzm2RP -hGuebgY0OSN2ob05ADLNgEQHQB8LiAOMC5GAIyCIA5yYDOzqDkRFdCH2sMkz7OsB5u7gpEY4mzug -tyc4OeMu7CbY9N0ua6KOpGPZkV4lkTYlkIbNVbaxtV1y7NslzRnD5NIedrVV0lT2vIVhsm+XRDYV -ABAB4z1gv4OTMMC5ONL1t0OSiGzsBIcowIECaQjO1wBn7Qhnbg+nbwtnJAF4IwA5wPkELhpAPgA1 -PgL497AJW9iKBBsSYVt8HA2cehuHcILdOsCe7WDnZtg/4KaAYrRGrMPCjBUWhiwyZZmVHUqsUGds -UCBpf+pedi3M5sfdyd1g+gbmj9tH3EZz5T5esYu8ieZH2cVDMeuZ6/dQbYj/ffay2U1z9am8cjfN -j3Qm826ax5xI3s1GT0eiMkvew1AL0VUvSEe29OSnmr7HSFDffHj7w8v7zW+h4+5l7Yt15gN4y9iR -pZRjC1miar2FMgfeXJHYgrBGZG7aNsamk9y/am5T/i1lI1Ph4AoPF4qXkBEmrrBxNnNxysftalen -SvYCPq5mZtZsaS1g1Czp+ubf185Php23xH7YY0f7HlutrbXiQ00lPS5ZUWVEj2eER+A4z3FsNv9p -eaLWEln3jNku6UxmmcaKefLS41ctVI2hG7JVozHzhurD9rdiBJ5kcybV05Nyf1CiqWRTCaeSTiWe -buVwVUjowunHZDPQoev3s7SI9S1ASlaBsJqV90+hroW+FnthIbFEZHs3w8fdDdXtYM46k33k7WDO -u5JdczuURR6z+U9Nf7rcaWEMftDyaRpjX9nk1tynJuFiFG5tfmXPRyPbXkyhxeurbH8iXxNFAUEC -hGDj50RSXSAZjc6zipYHEi+PJI+wcIknfGTxks75JPKlKopQPBiMCJgjCZhRxMu+0qBWGbA8uRVt -wUn0BECCDExsIpmC1UKsEmCpkPUAk0j+rNs5ki6HPYw8eeTM5JGDoEFvHGvIHceTbbS44hwIiKcD -Wy1ZVhYdSL0gTzwAysssMe+IQ1Bp2ZGsDJSz0oKQiGyydOyIB0F5OBHu7VDwRYykJemCEikxEIOP -IjihKxM6GCUSn/aG15KXggthjyJeBvsTsS8Rui2hGxFb+Eay79VedGjXs2gxZVspWkrRSnqsTePF -5BvFLjzl39R5iP8u/5vzb3O+rPVvEWxV61KcSPD/h/z/vTgN7sSdea9uNvnPge2zaEe11tAtOYjn -TfnjiRXgm7P+M608mIoXE/0x5JlzZGc3Eq4dsVd4u0aXfloKCXtFc6tW37B8Y3qTb8biElQ4sh1B -RfRxdKZFSxeJCAcixJ40eY7IsSUz+YmI8pE0QXsizTsaYmYCbYhGR6JTnjRLjjn5ipdHbp75eZLP -hKWPROE8URtHCi1k7U+GuHvm75XDZx6fuXzm85XTZ15fuX3l95njF56/SOLK9yvnT7w/QSVP3JGS -rExep7/rTt+LVEJySZZMYO6Gpq7iSRFQxsXE96QELGJKI3bWkooRUaUnrDwgrqzFT5RXzGWBhaDC -LPle3YNPwqMc6ZY/ZMcm5lfYb0W9lvHmj0Qa1QmbeABxYs5szJGuhn1mZrYZOQti9pGSUNJknCwY -mc4gpG32tEZI1vzQnpruppZtXQhuSztnGG6meZw2wyVjaHmIDc3eRzikkwsgIaL7g6dz7fHVsIOB -LZGDBd5+dNH7xIbH2Pg7oJkxTI3DA9p41T+CH9P3TzfjbMfNGG7mECpj82eeCEEjAUMD1C2NaOsf -KCnDjQ1wH0yzBSlnDp5Mzx6EqTiDWD2gXIVeJLWVfwz0LVeb/nE9C+eA7AUB1NQ30vdnnsZjRPmF -qE7G0HUfId+TMfTJGPpkDH0yhj4ZQ5+MoU/G0Cdj6JMx9L+mAe3JGPpfZy//exlDrzFyXmswvV6C -un/eyUrR68XUiipFEe5qhC4vmRfNyy7Rwbr4svwFADha12jUcRO5PUrsdh2JgkrbqKE/62CpH+Hn -MQNWcVmfcS7FKCRRYDSXCuHORGP3gF2Be18ihZDjMVXAlM9mzmIVXTbltUTvuiV2/2Oirdkc0sQl -mzYIuhdt3QTmS7gQBzz53MKixUWbFi2tGhAqjhjVtl203aLttfFceo/tm3Zo2rFqp7rxLpjsPlC3 -9mesmudWm94qSWkdF926HqjzgUpN6oLwj8ZCAzmgxCH3Je8561OOTeqaLKaxIvbh++eBtB0M67Jr -7a4udz0usCLjCw+jIK+3ot6idvvqjZXNbsIa5+wvokHLOxFzNSnFPjdNVnGUxBVsdTqK7YmaEUgP -VcS3lYhn/Z/LOXeW58A3qyfocEhhDTrGc/z/Gs/b//X+vzMVjpf/KeCOXVwvv7Wf0f9NsxNnDsby -96rpKcm/m8XxWR+h9UG62Iz8QxkuSgKilfqv0iSoHmEnVm+W8xxJerHxZRF9wZg1QIkMwKghYOOv -Ja0PqgRmsWQfxObLFt9JFDt7ku9PhowMlpQ4IStulHYfhXar4Xciyq20G45kpt1IvSmvhBFrdkkt -ockl2vQSSsnnKpsFU3Ol5xICaprY07lKq8KRpxQTqrGnEnJbgm4j+UqkHHoLzZBtZ08xuBRzKu1T -r+1ML7o6qJI5YK+6qKyNUl1UyPqoGW1IlDoAMWiVqyuu9VKVZioQV8s4VWmmWMdoRIHAKsZEagTU -RZ1IF2UJr0bBrC1poPbEdTN2IS8eRN2EyibYQiPo5UivNIlTASKYuhSwipBxa0tE+iBK3pFwK4oS -QjwkyK2AHAuQ+rOHxEwsAXpInMixwJJjQSCvFPRO2ZHPCuIC4g9eXSj8IMqAMGQIX/BT3GVHTgae -cIO9o/BtjAofseF/P2XV33nAs/Z5c9FU35rtXXaPG1ducdkhzgxh0WLTpgdaWjaz7pKbt23bs23X -NiP/ENM/ZCcrTbpxzMkVDtntap+drzTZwlZSLmhL3Iw4ZU3ZNSuKg5Y2n9uYm8utvguJNzDZl0tb -mVr9s89tV7Vt1WZuRlzASpuqFqsWmuabNpbGrmN1a/neoW3706IdF+1g9odV6/3szrZt24z8Qwzp -x+SQu6ALMVkZck4dslZubVdaykojYshEUCtFarVIrRgpqpGiHFm7YByMqEiKkkTVJKwoUVWJKktY -XcIKE1aZqNJEnDJM1may9mSXNQqsTyi5xlqNAqtTDnRlslZhS1dpMqJaiOQ0HUiuGUnsdYW7q/j2 -wqk3vHmW45LIC7zhl+SPh1IHdrbdZIeOVgv20MZnvWblg0OqMNNow+qtv+R9s9581Y0RU7B2GtLt -Zy2Z6slIU9YgAOvLWGPGOrNoCAMKDrDyLKu0F0jQqpUUDRpEMKJd6uACNUWHmNHBCz/uMlJUbL89 -iWTXSGeXb7O2XeG2dnnA8Uxbf56vTNNxLF+7l/cv0VglwQn1gP0vPHTndu9dvnnXH/Xu3k7j67Xv -8aw+z7XHc8lsdFj4sVf6b1MpwB/OHtrTgDMNqPI4sfdXOf7s5KUUnw8+U3srPoV84vG081l34nV3 -xDOuFij2xmK6jiebTzWeazzTdJ7zaeaTrM5/eIaZfIv/3Exnt5xbPbN6XvWsRjmmdET5gPImJAL1 -COA9AmC3BNAAh9cKP7EHGCIEA0APYXcEuG0JZkGgdRRaSYAyACdHJPJAxDEBYfRwgEHyJOggNWTY -IBUciP6xF2IiujcmS+QOSR2KJMkApUM6xzRO6RtTN77W+EorhjgkaIlEIgQLk7KBBCcCiska/1br -T5p/0fu3foVqkIvZBKBEiwkW/FOSV25F+mMVbZKMxkisRlHXVupx+19csviJDMh5rFbM5oV2eLiZ -ax5atQs/5tKHV/2c2maWHZ/ajChnPqqxUmWtM77OuedMcJmpXHuatOcX3XtqRy2XM6A3jlqH7NDj -KhVd9s3ruGgtQ0/EO8vk6BN22QnZKUt9dEh7VxyxSH0XswJPzS/ZAIPuyMUGU6wwqstTS0ytzwtk -j4l7dpC+CPSrwE5QX2VQ7YUmXg34Ku4n60Zr77jrQF/7RKrTFMDeZNDXwN83wLcN8KcM/Nr6le1f -JpvA1il6z4FfU/XODad6jgs8xx+eD0ysGMslx3mOQx0f5GIz69tyx9eFe/R6GqXTNUMUs6TtEvcz -Az70c2ESywEfPcBDA16z8IvtojzChPYgcUaa9bY+6622umRIPpwxcsDBNnSyHSkO6ojdoo/GM12X -ksgxfHSQ+RhHCd7boarjmE+wz86Ps+ii2ZdZYvZIGc2Wjj3Ht+Xjqp6qM2bH35E+mhyP5ZzWVHJB -I+mA1kc0isVaQ/h2hqweZLru2D3Ygq2Wj22Ty/vYJMDMmTM1X/y0yr65tIMc9DrP16etLCLZKmJI -iApiHonZSDI1phJt26rtmpbVcUb+c+g1ZmUPjb9kceUdK4fe1j17Vxn/ln693uRY+XlRU6MYrQsv -wAgbKrdtvp6q6hqG8NcT2884XFXYgD96RQ3kjhlII6bB54LOgtKODXdGYlSn7PJ7EO7ACmaPEsM5 -kQFPvDcB/pZ0PJ7knokidvBiwuhNceVljiCSoWWW6M0DKpZyQKr6Yc+C3Hsx5Tkyt7DPJ8hkqMTa -alQqXT6o6hqz0YXxGhWhe47pJHUsG19G0fDislAjvMUwatYl4w8b1hSTHWGyZoBNFPSJjblmZUMZ -ZRVVQ0HUgqaptCcR6WnAv8WArP+YOi1e0UK/mUWHv7qN/WZWXe4Rza6b6XXm9mix7WPFyE8WdB8h -VV8jij9G+t9fVBawNuExlYx6mdQX9gizzqJ+hR1q6ZVb+eUaMkhcY5KorVHFP7d46IpNwlRGiaVF -ahkU3JolWquU+u1KcPDaMFFbplin1zNNFOtUtk2YhXGi1KRZmicuGiiKfcKsTBRzNlEsbVY9I0U2 -Uaj9yiy8oRqnM6061Mesj8Kt/WA6Ns4Fdq0SnNR2zhV+mWzpLCav4vxdMKw48xd759LiubJ5Lq2e -PSxT49c6Zp7xTNzDxQDKqLbANLaBFiNYwTXFtl2NbUbQrZhDK2NYF+PWONdgnRnHBvEK6hXkY/MY -Y99OarbMFQ4qFhIemspiVqPkwkkU8+sPQwLGfMLE9QAOSvQ8u3GYfbB2GJ3FCOF58oPD/NFTGi2l -68aa7tAD4HbDMGNm85mydOcE0Rgz3OTmxlT2dhFXzDHDzt2gZqcNXf6ypkVB3c7FeR4dSB8RRJtp -I/HUEe0xFgTXEU6A64aSD8tE5rZJZF4lb5/HGwenosDh7/lSzpyPwex2CniAphjkhQ== - - - gx9x/ARHY4ojAnaqChcMnJR8laPeto/kF0Z3M8ICqkT5f8eXSu724OyU4FGAGGbdv4GTMcwzfC3B -YeFxAJlmVIR5PFySJ30ZGD/VuOS5p0kbLhMY5xs8/5vR3wCyhjpj+2eeCcPjsx83H2/gXRGO202c -vPuSKMFyagwxeHBIsx2mGbYGp2VR6wE3Q0ItACbWvxnCQGoNpPczPoPTaHJIcG2H+mCOnWoPsnHT -DcwI0GOycwWezzuPx4Qo/eH167tX988339dZHjqdTwFK65+nAKXz7jm1fP8UoPQUoGSfApSeApSe -ApSeApSeApSeApSeApR+HOvJ33PAqxwnLrtEPAUoPQUoPQUoPQUoPQUoPQUoPQUorS7HpwClpwCl -pwClpwClpwClL3LApwClpwClpwClpwClpwClpwCl/LXr44kePcBDA16z8IvtKUDpKUDpKUDpKUDp -KUDp3M/TgP/tB3wKUHoKUHoKUHoKUHoKUHoKUHoKUHoKUHoKUHoKUHoKUHoKUHoKUPpsAUp27IYo -QXddi1Y0z3obts4iyouliheLHf+hUUJnsJiURNAU938pGN84EaG6asp+9KzQcuJ/P7AopPE17ETI -/oVJ/CSieGMEUbir8lqMj3XJsV7RsZbZY1+8cw4NwOSZhQRR4ilawaGwdYWlq92X1GctGmHibPFm -IMaNBQNl2KSmGEvW6lWgfgWRdEOOlnMgD0ReiGevQFoE+xbQEmj+VvwxKm8MXYJjfwxawk78MSby -NpBFVK53uAgt8I0+GRYNPwYWcpCFTMX9AHXOIt3sSBVNTCcrzWOOGyl739n/HOKxlUirWZCAESG7 -55hsx+kZXM7ZUT5W39HVf5DCO5sFs2WqKL6L6rsov0n9nbXfjf5bA7hUBc7O/6oE32Ul+CErwYes -BBc1eBsDYCr1d1Z8L1TeHAIQTpEjMa4xThav+gcNwqZTW7gO1lgag8+bgsUaaRpLcDZGVpWjKyOw -hvyx0rs2fp8vvlsvt15wXrKhNderrtd9rhRva5OtrbJ708DgnF1WINEKHBZuFbiKEywGWJ5AN/MU -4OaxMxZwnTxdTrCYNMAEHdxHeBUNaYp2Ggfog7OF19U0Nj/IODUMEPPJdY15W5jBStL4QuYjbBhc -46OPwA0nkCvhGx7EX+Bq0oQGxpEqw8cJ2GV4BO55ny/zdlxgVFbv9g2zU7H/C7nrM83gExkJ32ck -fK+oPf60puu19+ba+bITuWAaL8hefME+x/lJZB8R9BMH6MqV4koon5FovlFunTp6NcepVuGpdZxp -FTKnSiaNI+UX1JGiQf5mYxtzS8w3TRIvyn8niXDStjX6H3F7K20nf+/k72XbV+0gpA2aEZ5OubtK -mY37UBuDLO0OFzsvpc4pLtWWmNQSkdrWkh6zk8sW6evasWh5hSBFZWqql8eObd+LgCwgn6b4s+RL -Q22EemW0lu8kAVgHsgs6Cr6KdEPQ/VC8hHyO7dtW1m6Xg/pyOPYiGLsOxYZb3uRIbI3D5jA+DeF7 -TBg23dSGI7E5SE8C9MYSmrcsVm8XZyvILk5yfLZaIjxHGtexxhJtbHLAcZIjUIUdn3EiS5UhuTYi -U9xzzTusuYdz/MOBbtMu/9BDBL9waTrmSE8vfAM5QFSxeKMwDDNW2d5XYZ5eTMPoq3SkCDw2Ck85 -spNrk3tCANz+gzB5jnYe9t1wrJ3E2U0UpXmg6LoRtvfJ+Hru57KHzioWzixukHJrnL8ySnD4YXll -2MHkgzBWQd853UHJWlGlssiOHLvsc7/V1BLZ835aGDgr66RprIp1dFxrlKsj4upYuCTCbQ6AMzn6 -rY56q6PdZOFNeFsd1NaGsjUBbHXQWh2mpsFpdTxaHX0mkWYcWmaaeLKtGFJmMqYkMqhMJKxGMqxw -8xJKMJIA7kgIt2xuYYPLiYwu3HgFe/Gh3/33KVL+X6vg/OP37YqdM4+IXckWvUt7Z9YpNK7au7O7 -ZzrxitfvXmf/jG7gJ+xfs4OmCuTo7GAji264WWod2fDc52woScA1DBNc+3A3p0Qy0DxPg0Pnyil5 -lAkBdHDHwwpAWIqBxMYIHMUMwlRC1qMrNtpYm26wY6HZzzOZ7M0Md0Mty34xc/pEeS705bmA8tyY -5bmzYd05xYrq5trf9yUGmQ6ycmDiplfY8S0x5Afy0GNunHNtpMyPH5QR44G8+P5p6o5jdmmNov9R -zU/N2Cs/N6AT64/Ggi3DXHaLtl20edFSDmTHgSqiviQMh/MBra3vCA30MMF4iNiHNrhT8xItsxKp -hLzvuJqukyNtNYWHUdGUJVCJgVCH0zpTEosNki2JGuf22ItWjjVzR870cRKZYhDJwoq6zonSThv/ -hKrFqpGzDTsgTBLlsmicp8tVeV+WObuWGbtUVFzn7NKsXcmQwLinm+hQCY214FhEx1mEx0MWINvM -L8QJFp/nrYiS+6zyPYlIqUrfsVb6rpyZq9wvxXt57apMEPHkJVWy4eyIxZOMOOInzp7iQbKXRLpS -k2Qx2dJFi9ft0Sz052sNeqT7ehYd+p4E7j3d5yd0ueW/CZID8qaGLn1mWVWbzowtJ9NBjlfdcPfi -Fk68snDPzEUzV4089oheacxwO1KyM9M9MQu+JjPnBJy1RqyWZVSS2bEl7IzoLmqs4gO+l+RPKrVr -wrAoeqe5OYyLZGWxktlnOXJ02PLZcuT07fP54XAwkN8N+fHsRSF+UG9MXhdTzPNc2lm3vg6jllk1 -I2JB4bNrbq3wa8ptrzMOMNuWnfwM8W7MvWkcckk6UfIPFE5Oiba6/VmJUj4ReT8YoeF7Cs3lrBSc -mWKWXDiPYssXtLri6zJnZ9qkA5m5q9m7HoN3qrIMlEQT8C6zzFvZ5JjQvJVqIq6zCTSpJUpiCZPd -8VZ5JQQm2Xtx6VRWEmsUB8aSW6HNrqBuZfParax2LPsEtzK38mdcOpWtXcrSwq1RjOmmciQbK6s6 -/JwWVh7gDuM0+gCLnoNLbEeYgIEa52kM3pJlIQDjCagUARtTFDvCyksjzEveM1SGBjvFrlXnM72f -rThAIPFNI5KgiH4lsCVwbODbYUBHFupJAY0nFpWHI/lrDQN0YRyKiwN5cM2NfwqtoXHowXHEv0sn -XHx84Ld5Mwb09amdab64qbFrXQLUBBDbAc4NW9zmcQJ6zyGa0ZIzygxYHeDJ2U40rRFtVFNAyxxQ -M5RtQvtO8g9rbU7oa9YKN8UNbr7xwLNWvndf0qw+TZ4a+/axsWMfs5WdRS0tamtha0uP155FGd/E -cpsrgrkXZvvW3jNUdgPlP2KeU20Bqm0GNpvVZIammabaDQ6VuYwnHIjQ0YyX3JFt+CNNgKYzC/lP -EG+PWM1U/8wlS2gBp/5hpS/H0h2z2tfCPIYfR0PYBCWYx+sHW41XO5NmLg/ovRqeyixiJVq2qp2Z -zK3Mo6RLrvPJTHlGQfTYqsIesuq6ziqz5USCKSdpC1k1zQz1UDlkHbISevvjaZJQ+wLYNXugnHDL -IDUIMVp0ykDD5Uy+sEBUgR8bbBqBBHu6qyqHXyQk5PFZXH6B2iB9aq4zf8bq/9lm8GlUbe5nOJ/b -HOeS9Yr5z+Ly3096Vtz8lQHNLBigEjFeptIvFg3jSkMsjGaQJOk2p+3eCz/J7oUTmjXVuxA9y+oU -6ZqzO2iidHUHo0NQRb60oQiclYvTi+5FqY00NgmfWJKyOWYLae4HIyltdPq6AJ5+nXe8zTxeco+X -/OOWkxjrYjTj+7zwjlQPuDbLeIcBdhX7zwvaS7TvTFfIREvSrXCNBABCZC0AzDk/j6M/OTePOIIy -l79Mql42qFpYncy+LKpOqV4vDAm5pJJIFFazbRUQTUqJZUKPeZXQg3QOpsquXtv16/S8tW3/snU/ -sGIm51nvWvcnUr1sSdOCOXZPmhl+JlH13JJY69SmyegtSrRPplI/tVmHT6IzeWhZC7cFs1zWtQvb -53wrR0luu14Q79I1iVeiaXbq3KJaT4zlbjVJ8U2VOLm/X72FFfWpMjhLpm/uOtgwS9VqcpCXOomf -0bhMJ5MZP2L76lTzhfFTd5viwFil8DGNy6Y6XXBybXa74GTI5L649DtxFY9We5xs6dwqR1sSGCjP -GIQ4k6uJaTjGdbqilsctOTWGhtMti06m0loRmc5aq7FJpjNlhW53SX61X7qc5ZJGIc6ZCzaV99gh -M8GFEZ6a9NYV857Z95IwhJKGGEmdtmu9UsWLqmwsLe7H4WoftJ/2eNsld3tRL2e6ijm2pi5Vc9Nj -TMIPGfPzokyjbVwz7C3LXjPt/dSmyYi+Ua37dcjncmEXrNyPtHPXO2W68av1srpqVHGvaG3etDCT -o6RbVWpZWlGn7mvSl7O39rWorS08G73W3gxpYoO4IQPMZZv4ZeVprTg9YrpeTW5YbOG1Jby2g7de -DEsDuJq/V9wpM3fIqTxQUAboSYcxNV3ONINnAaAKPgVChyrcd+oomE+YAKxE+p6xCK78By55EMwm -A+6CC0iVwLjrA0IsssDQNGkeDxWTr4Ds1eZRgFbVeZSDNF3OOBtXS+B0a2JtI6cLyilICajFIcMs -gFrA+nGA3V4P2FALIGdEpwLYSvBYix0amrWsMrW7HrAwZZwuy00sL4GcK1Mk6Ygmx1PLp6ba7MWZ -MYvJLA+OJuxdF2BaBgHpLK82+1/587cfkK0k/Wx//Vx/V4TVmDMJFh8Iq1llVsyp/UzHQv74qlaV -eGIe7VD9gLxlunLJjwvWNJgfF6zbVIqF/cQA+7FAPRMEZn5csAJXtk4C+ilgPQzmarB+AmAz10WJ -P5YtNm2Spj9kzM5mac6muuPsaWy9pvyAOcPnQCZuRwybZlkNAl+GcIGyQppgzfA2mnqV0KGugpFb -Vc2j+k1T7nF0UF2bzOXEcJ59xAq+JLqrtSAPx4RgYZ4T4Y/lAFVJxVOjUUYlk1PL0nRTp81V264a -6S/iPrdjtcSTQWaBmAaX1yIrofgFDmbhRI5zdnzTiAZUPRB7QsRFoiElvSOH2PZCXtufKj6q5/me -PUtyEb86MGQZGnIpw3AbBoRC7JHzB5JCgvmvTmr8RTYx9XfXMip74co4cdJWuLOZdn4yOb2NplFq -mbTWb/ZsgY+SSMkom8bTdZ3WVj5cLqKefJm6TNvovCvOcpmXpzflacGvZ78QrUfCkmaXMtS+bWNu -7WLKEsr0YeqmnrtMPFZS2OWkVW0lDXY7VFb4kxVokQrwVQFM4p14xmp6qpRnRXWmoUqa4XJVOoy1 -ZaYEqgnLUKrQ4c320TyYEKRLCqpiBZ0bfduxShhaEoVWakXTddvsqBVXSUF7EdIAJdOJ5urFgvfS -g3e5AZPBRoC7DgoLrGg8V2t7usDBFCImULicJr2GQSckHn1RT5fgcCFNOkOCOaMqQtxkgBCD9FOP -H7sc4rX2gZT9NLUq2Q5fQlTPw8WszI8b05Mm03p+fwlQeChCBvPnf0yEzAVImDY+5g== - - - Kig8Fg7rSKFPi/IaTa/c7iMgsYKFaSICQu0tYckToudz1fmEPCSi9ocb9LzbpPEG7qgqC9K5B+Db -OqYPm2m8GcZxWr6t+oT9McosxnAzhypb1/oj+oaX7mm4Sei9Zccb2PsqMOfcA9X8an+Rpu+TfCRc -z0PCNV5fTWT+j9B+3AEP6Jewqip4VTueayb/92wi3W71A9upCTxyHLn++EULVYtVm3IrTO2c286I -b69GkzTxJNROi5CSOqCkE0pi6vgR8jeeydNlJ3d/uf0HKRvtxMxa80RsbEVZemfU4srsgDAEllbn -iSMIkjRmm3mkPcvIJEtyGZVQMsYYEhkPVRkALgTAegCW+A8i3jsR6SdJkp5jpyi2Q6LhjeRE0GCO -JEoRlpO/JKxfo+gVWH8OdY8SL7FqRoIolq2L0V10XqCyEVxOZzFZXdT7SNyisCTsXWJui7apQl12 -oGfUpWpfGXmdIq/JTgITmS62xVFAkNZSYn9F2pLniCtW7EUPctI0R0ZUNymn9j9QHFOpWxFEMYM6 -maNo+FwVNbgrEYOo0zNVEo9jzt6gCTz2pL9j7V0gvR1p7UgPOlKOflbVHUhJ57ioBOvmWC+HOjn0 -AIGRmTM/X/nlo9qnDLguVVINeL7YzXWtKYDz4EOLZ3AuvU+aGTadzYIe+t2J77D8bcTkow8UwaP/ -v2IikoyC+V8xF5lsNeoljytfWX3xzDd+irYngY77qcujTwM+DfjoAS0XO35cjYMH24874KFf2/ua -dvbH5P9dXQ68SfFSt8Rhz6nJ+1JaZS7JeWBKLpiSD6bkhMFmTc7ur5kJTt38MIc8Yf4hr1pyc5rF -O43dnSbDxhty6GLPJxLnJekau/gVH6hj8YMiGT87eqkP2zYasgmFnOw/h5lmF6l1qOncCTV16ixl -NMo0F5l4yCXo2LgElZhTcQoy5/KJMNaf3/qPap8yYBfXzBkUPI+KK7Rsm+mg5xJFz6NpB1WNYmuL -qo9E1m1BVqPYWiFrQdWxg6qnBlVrRCVUNaSXWqJp68nHeqriy7dE0rH25zMZRXsIWteoWFdm7wZE -m/O5K0DyaLPcFEeqpV8fe1ANrLhn9yl2nlKXPpAUtfzMj9r+ZgOeV8pc16w2U/67asP51q1kRx63 -ZlUjaPmzvIh2TdtWjSgk5ybT7GR1jrKSp6zkKtNsZeuMZZqzzBpNWtMkLjs2t2JLeArNWOct85yZ -oE1aVg75MXtE68HWI52yq205yXKKzeq+WR7gfM9UZ5dP7tDULGIN89bkRAZ1XRk4toucwpMbZutQ -2Me/MX5tGm2YUcEEJzBR/JpFwxqmRbJw9Dl+La2KZEyraO9lWnyOX0v2JowpbGy4mUC2q1Iwffap -kEZ68gFk2DTE0U0UhDynYGNyNkXrIsVnY12EeQ5AvKBv4jhvB3NKYXRpnCf8FpWfmJrcvhjQvKgd -ICF99gbl5jay8DPP49N050NXeT60Oaj0UCqFkTyJde7GxpFl7Dqy5EKZpvZmyVkn6kibA/mcHrNj -y5Bz/LqcSWXM+X2jySEqmlhldiVzL2Xm/VQheZ0uhhQvvUwxeMw1Hxf6lXEyZEsOvGOGx7TI30Su -ACY7STiqYqv5YnhJZSGV20rlaUNOSq3rx9Jrpa4lxXlMPN7ZRr3xiceeYYTaFf8gSTz4upbLWjyI -MSgR7mnS56pjc0CXZiuBoBgCGuxI0ZIHgMoMkCJ/eg2QWVYo7CTpPJOj81gFOmvyr63Jeb5SFfAc -c0bOEvRchz0vAp9z+AbFkU/5DvNVJIfN15TEjc9N3tFe5tGypLKgNuGoLgaW0l/I5WW0i8hLYDuq -WS9A7li9W1mBOvPPVqq1a9Fw8SCsSoe7nG4qLqq3N66bpvLeLP6b6Uy4Z0kvtfLi1FhP87AfZ+28 -9CWZQf5GAy4MJx9rTTxrUzTNr2eNMh0F+Kn8L9sdgRqYrpmmb6zpm20WBhxz0Sy5Nk62BsqlcSdh -sF9trSzp71qTJbciA1Q1TRulvmXLz7mEeOs0eFNjxpzJgUlNmdwOptg0s1cT+zWplxdbNfGHMwKo -w+G2shIdxPcLmlQRzKXNHZU395Xv0yQlodnFVl1p0V16EIunE5/Z+MVZIJetg9jXtgvVac0F2zq3 -61A7o4bpovN5xO3ha4Otpo+yWtpxgZstXtYZGTmJxA4rryhSarq5o6QEZ6avTDtI8XEOsCIbe67I -QjhIKcSJG3FismQbe8wu3jvJL89WdvbZHsVXm2uzzOQNy4b2ExvaDYHGi999Elv7QcITbC5CoK7z -euWpxX2kDPRJMtDD1WaaJJMajqDBCMsyBHyBtYkKJio7LvfWcTA5/KCEHmjggYYdcPQ+RxwcTxd+ -vjgz6OpWUJvg+fYJM3zsMGefNN0Hzs+1Dm/r9cmS176X7e/90ljdQlk/XfvNT3NANiTjvga48Dgb -wYHShUlhlidb7NOATwP+fQZcRFT9BAzCP8qACw39x1qYz9qbzf66n6vtg5esgY+yAqqO3zxoB2wt -gWtroG/lN9NYsLHVReqbpPrZPlgshLWVUMwJpjEW1gbDpYU7W7mz5bCYutWC6NF3faxs3pUpsTIn -1tbvQwbxLlsmKuMimxcnMVOwoYJNFV5kBpeNjcUufpKs+QcxX2T7+Bdnle5aqR+ySj/aVm0uomrP -peIBq7V5wHQ9LvC0g6MtfpoFcrZG7As+F40du7JkmzN+F5c9L2qb2MKibc76XrRm7QveF63zhcnG -7bZQgwTsdA3ctYl7Vc7lspn7mnIubTEXZ6p8IZotZJlikbOEcI4Qzt9dEituKQkHpuBw1v60TOP9 -9hEaGHPJbv5g6xjNzRUW9FKu67IRnbTw5qIlvbWlizU9t6453TQW9WJTv2RVz3b1XAtGDeunwoq0 -HEDr2NPexl0Le6kLZiqiVIjR8YydfbugOS21Gbm2k7vg3bWTCK5z1MU1pIUIi3mggIA6zNhcOuCw -8JjRuDcgKots8JT+yIdpttaFkQzePsU4WTfOdpywDlG3Jv28svnmdOsJw69ck/P9b/kWrvn02Yz7 -0d8M3s9fgp+BToUj36Ib4QbxdvYW/tnQa+tk8QPlOx8waGK2g4NrYEjd6sBDrH8wB3FoLf6X3Aw+ -7zQ+yctg7DkZjJjBeKrqXOUU4Z1o8akpqtIvg9oUQDVV8sZ12fQ6PLwpmd6EhmtgOAWEGzKLrAql -s8KnToVQJ2s/SQ3k5XLahPIH8XXgCHhX5xc9l1p+mQqgzjPaWaQhrf02F3eVdAA8+bZG7XaVYNPm -BXhZQD39Km0o8ihYj7lkMlhuTp031FLesXYJi/K0nDDVSOoHjuPP2/VTVLW1yoocG96Pij4bH94N -Dz+iKuCjq1/2g6JNPyq6nvz5tJjL6fcWUC3B7BdJ8B8R5N5dhpF1LMK7efIlW36bqvTcAtodaPdg -RI+EfmbPZcJS5Yj61ZGqFKxt3oKyIZVbwyId3yKzOmcesk0axn2bMVAf6SUUlBx+4qNzbBOOLbJi -sQiyTJvVeWSZV6vJrFUvbSFDtQUxeykXiwjlRrtOtGhyGlC3TGlIM+ukbXw4cWN/SB5UdmbKu5Nz -xvP76vpOdb56ysRYvbF+a/O+9p0mJ2fkZFFVJk7Nyf4xadRWSdSK/dKcd76hFXbecU2yts6b+EUm -v2mVsI3fd+27Oqnh5F2NT5Gp19Vm3evkRTr3U1v12BxY18teVsyesXpKKfapJTzJhbCpNFfyXE/Z -h3Jdb84qJ7GsArnrlKlpK8SX+vCarzvn0THCKzUJha65ikv0pcKkQKaFjkCodq6MRI5mSbHEic33 -GUbHRUU+Tbnksvtp43ZasqcdFiVynGuL5LRVMwViBWqml4XoerbkXAaeNg+PZ1gookwrSOzE2XTP -cCB3U8UXSzAoTqc5k5zJaLMX39N95uDY+dQJ3hQ4MO5whnQtHKrVCoMRf6q5cpA6lBzo5eeYm+pU -+vXbiw9l8aAU70lzttxNzYeoz2RoivIss4/nVDN6o/fTzVy+0pcZyClkbcVdlfr1D8HiXDX74lGa -vUlNW/6n4smyI+lVEMk8msnOo2uYuMZndMmrneHWjICl4TqvgcU5zDiLGy0sSsqh66FRJ3Kn0k37 -Bc+3ZFwr7ltwpOZdV/AwFeeX4dFcKNvMfl0qiyOkoGRYVleTNuPzKglzcTgpjw3MzKuX0aU6Idc+ -5joPnc2VKlySci0l1bVypg1vykxrzeQIY0UO5ke5DZqU4/wVfktTv2fB+eIXpHSP8r2BK/lWhXy1 -lC+ztwfCrhPHQTCTq1VqSyrZwvQWxrnmizOD0RSpOZeBttU6AkM4TcArTxZY5sS1+ULiqy/NqMoZ -btw8WazVl2yIlgoZDgPQ6QiMLGo/qALkWklU6w9toDKKtQLRaihKmjazvQlTFR/0JU2Kq1ViRUyP -ukD40kQvcwlu7BBQvzhyxwhTiy4mDKKYWYu6Kv3V62kUiUVzNgY7bvyy3uJnnwnreIcBtgPgPnsP -QObKZylAZ5xn5yIpEiNIMNM4INMwi6Y5NVplR2pUqYZJm+Cpp637mGuhjeON9bFKGPZZZ0FwGIFs -AvTFixa/54DVHa2NwF7PgLDYA3QzAjc1zDPgKiuY40q/XEPeUZG4RfXQUhJuuvGIuhkMn3MSCIVO -3b7obxDgdCg9R4MkBKy9VOwvf+lznbl4Y6eZKYmTWXvUi3zO06dzEpikeR7g5oJreSTd/JB8TBMM -4fw0Wu5JcAcFOBoAcpxRB5mHm7SqRJuaOoXz6v0FBp9vDp9kQ+hWd/VtnKLKVSVET+XsaaHjVtH6 -tCghNVYJt5Op0myr2WFwpYCUardTFo2KUF3XxMq6bVOXjZKEdmqGKHlqd6t8vRzB0SSeXSffnSqZ -UG0P50rYVip7wyYHkXrP5wzvG1JUQ1AlZm5rmbWJdjXd8LFKNFwXHTjE4zn52Q7LCrWaHqqWn22j -V1Bp2pWUW2OlavDSs07BFarmc6nbsFZOhOrD9reiupiaGrn0W10cTJOmatpUTZyqqVPdykxQDAUL -VbWpqlD1tNXrQlQ9uaUqRWVWOuuieq8yq2Ypt6jfSXHdywv7cflxK/27OWsC+bi8sBTR/wn5cfvF -es+X6/XXyOtmFfZ5rmBv2es6bnVqglbhsJpV0GexVZTtT9nBI2THDvLpaLTzKafInKtkg4c2iGcR -w6PxYxo7xonYD5gp00ghiZGysccmjGdfVRnRGhFtmZHtoswIkCAjoTxa/4KjVjli1ZODyCSlPCVK -ldwoNUAV9cizxPNIckJDSmRPEn1RIOf6o1yUIlfHyJUxeEFcQULLYMwUmbTXuhE5w7yXkiCcV3GH -yYW11IcjxxROrrjV9IpUyMNWC+IMi4dFjkXNsrhDPQzHJulScCGsB+dlsBacNeCobN9LykVLaOcb -2w+FJaGczxI+yverqKSiqIiizZjyb6ry1iLn+r85/zbny7pUE4ebzWSVZ11cfEuR5Q== - - - RSG8zyrRqmp6/nNgrQJVKbOGbslB9MXljydWgG/O+s+00rsX3Tv9MVxA02mtyVEC+TlDwU8seXy3 -dMmFBPJLU0cuG2+qevExo0Iu6VnK64p7ctc3eVw5dfX8RXMiJEM0unXtKi6jxblr7d4lDl7Za1Tq -z5mqll/rOlon73JXFAkRL1KzKkCnzqTkTsrR+Dpx8UvLky++ab3p1+XzitPrgQuGbHNip57f66lb -JqRxfa2dX82FmnlV1bzGB1YsuP2yeeZiOUKGSjfDXO2KX7ycmzRdj/E07KXmaj0N+0hZeRruG4xM -ZxDSNntaI2TJ0RVNd1PLttZqwY50HtAJDsveXxLhy0OsHvE+wiGdXAiOnOY8nWuPr4YdDCw/DxZ4 -+9FF7xOLy7HR0qFwHFbOh1Ob10bfP92gF+MqJf3nnghBIwFDA9QtjaihGiz539kA9wH6YsJowZPC -xIMwFefJRczwg2qZsdZNjeTFWMRm7GQXzkaldcEN8PNO49NE+NCV4QM6AkYV4okOqFcE+0UwOWCC -UDwylCwUr4xp4SNBHhKmX7xyVUiTjQVRzS1rA9WP8POYAStb2GecSxFpxPLGaR2KH8wZD5gesJtS -oU1BWFMZqdbVQtcsh3IpwjV8amHLxhfEfFz1RTYy+dzCosVFmxYtrZpUeittu2i7RcvBQDyX3mNN -XJs9NK2OkDjVjXfBVEm4Smt/6owWkkeiScQzXvBFaRVndTn5Kee1QOsfcOzIQRffj+Lt0Gq6clKt -xl04q7iYjXhYWfCAqyTDuuxau6vLXY8LrMj4wsMoyOutqLeo3b56Y2WzG1PynLWd6iiyE5lJHQFL -2Jg6CB7FWbDketNsbyeTU70VLxsrXibL5G/rc+Cb1RN02Ixbg47xPEletBaB2//1/r8zFY6X/yng -jl1cL7+1n9H/zSp0qHMwlr9XTU9J/t0sjs/6CK0P0sVm5B/yKixO36qO7fm1a8Gzuuwb62Jrx3bU -xEqVvDFXydPSlwdRXVjJqjKRJmZPAkldDGKSRGJS6NUQi2yl0qvmC1PafRTarWqLiSi30m44kpl2 -a26VyYguprjzqUNf69KnlHyuPAiZmis9F7O7aez9c+XKupdgryPeymw1EDeH4ugQSdOXsrsDNEOS -CaUuo6Y+Lp96bWd60Y2EKN5ae9XjZ6811eSHXECQa5iguxZlA1rGRxTTRK65WGn2A8l8deFFipZg -/b6hiAmtK5wofQ+q/U5Sb2SUMquxqg57zNiFsk5o8/UYQS9N18MqMUQwVYhxsh7GrS0R6QNuBODW -SLgVKV9P1u+RUozUYp7qj6BabCaWAPV7J1KLWVKLBdKpom51RxpXxIWBKpI40s4iyszHZAhf8NMT -1SZxhB2IG6zbx7cxKnzEhv+t1DyffcCz2iVzUdHUKp3aHD5nDDpmCIsWmzY90Fa1cU2nXO7caduz -bdc2I/8Q0z9U+SE14aU6tB2q1JdqOlAHt21OHjnnFJIJsTMdc/XeqsBzyM3n1ovPXQXRmlW4bD8s -th8H24mANRfySZ+Lf21jYOs42Gz4cJ2Q2EVg7CI8NofJLtNv9BJuPC4/Rj9bPjOkHxO3c8FwZbLl -6lxtx3V1x6qk4ToxvFllhq9zw1fZ4au6BZ1qzlmBmMsjlxB6VSKyGlGDQFSRyKpEViayOlEViqJS -NHSHHWnz91Keaxbd4kTe2hrf0WoUWNF4oCuTtQpbukqTEdVC5JpbJNeMJPa6wt1VfHvh1BvePMtx -SeQF3vBL8sdD4VqdbTcl2Xhjsnxo4/dNLcuqxqk5WxTgku54vfmqPXamq/LW7WcdsmqRSY/cIADr -klmbzPrkaAgDCg5waJAiwX6BBK1aSdGgQQQj2qUOLlBTdIgZHbzw4y4jRcX225NIdo10dvk2a9sV -RpePy6a3/rwpKtZvywt0fYnGyvE41AP2v/DQndu9d/nmXX/Uu3s7ja/Xvr1eLfa1vb4uYNt6YVTu -CqYKeHw4YrPnrsA0oPKdZ9tFOf5solCKzwefqb2WBeETj6edz7rLOVIoOwofcbYlMF3Hk10q0eCZ -pvOcTzOfZDVd4Rlm8i3Wn5nObjm3emb1vOpZjXJM6YjyAeVNSATqEcB7BMBuCaABDq8VfmIPMEQI -BoAewu4IcNsSzIJA6yi0kgBlAE6OSOSBiGMCwujhAIPkSdBBasiwQSo4EP1jG1oiujcmS+RuT8nV -t1MyQOmQzjGNU/rG1I2vNb7SSkoYJGiJRKJS+2TgAo4IFJOtYa1FjKxiYhFrrWIamRhznKASLSZY -XCZFAga3Iv2xijZJFDkSq1HUtZV63P4Xlyx+IgNy7MBj8sB1M9G0zVzz0Kpd+DGXPrzq59Q2s+z4 -1GZEOfNRjZUqa53xOcfIcykYGtdII2oUTptcpZrouEem7CDJarkhO1H5rEWZTfaeOoqCzlUqOqk0 -LGq64jjlOo5TO3adMtl3ClkkL5q7JO5TO9XekepOk/6HRcL/Kt0/lpt3lQ2mWGGW6f5rfV4ge0zc -s3n/ItCvAnsurdtErfYca68GfOW1lnWjrgL8daBn4O/Ua01hbzLoa+DvG+DbBvjTotoCAz/bv0w2 -ga3Dos+BX8Oj54ZTPccFnuMPz7vVVozlkuN8KD3zeS42s74td3yds1Kvp1E6XTNEMUt2S8ueG/Ch -nwuTWA746AEeGvCahV9sF+URJrQH8ZLTSOP6rLfa6hKVfjhj5ICDbehkOynnXvzNiz7aUj2DYuXI -Hqh0kPkYR3E93aGqo9Rp5/Orlo4dnV3OHU8ep1KnfasHtjquWhxlxowkO9JHH0kjzee0ppILGkkH -tD6iUSzW6oC6M2T1qGuj1HYPtmCr5WPb5E84NkGHOVpRc3RMq4jHpR3koNd5vj5tZRHJVhGTy/nE -3Kbc1FSibVu1XdOyOs7If7rJ+ZiVzZEdYqZ02aFzbMLgUw6I2FXGP7bilavfmxzpMS/yGB076ZgY -YUOVTIGvpyqjkSH89cT2Mw5XWY3gj15RiMxeKiZo6ISgs6C0Y8OdEQ9r9a7e8R1FJhbG7FE8kKdc -0/2ISh0y4Dky4QVCba7pjr7HJCRb4QiiFHZn3+MDKpayO3WUy2gW5N6LKc+RuWUkcwvIZKjE2qpP -NV0+qOoas9GF8RoVoXv2SCZ1LBtfRtHwRioGj3UTthqZjT9sWFNMdoTJGnWbyGV5S9UU9uS4zHjL -KKuoGgqiFjRNpT2JSE8D/i0GZP3H1Gnxihb6zSw6/NVt7Dez6rpUAGfZ7LqZXmdujxbbPlaM/GRB -9xFS9TWi+KOywF9UFmhS4Ouzx/WyVyzsEWadueIKO9QyhKoKojJV8tXLJonaGjVma9QpV9EWm4Sp -jBJLi9TSpb01S7RWKc3qLK7ta8NEbZlinV7PNFGsU9k2YRbGiZIHbGmeuGigKPYJszJRzNlEsbRZ -9YwU2USh9iuz8IZqnM4001sfsz4Kt/aD6dg4F9i1Cs+r7Zwr/DLZ0jmvyuraCsMOGcPmOq1vY/Fc -2TyXVs8elpUSm8uID8YzayoDmKDaAtPYBlqMYAXXFNt2NbYZQbdiDq2MYV2MW+Ncg3VGypAp4hXU -K8h3kDT0u4x/ioG1oUzw0FQWsxolF06ilEl5SMCYT5gsBMBBwfWzG4fZB2uH0VlL6Yz94DBmf0qj -pRQJIO5a6AFwO6y2i89QZoQclI8e700+BEwfYhde8ezx7twNanZax/sva1oUkuBcnOfRgfQRQbSZ -NhINENEeYwfMiDxT8ud1IMQqQ7JtkkdUCTPm8cbBqShw+Hu+lLOVYCiGnQIeIExwzS8c/IjjJzga -UxxHSvJcksUMnAhilRfEto/kF0Z3M8ICquQkf8eXSr6M4OyU4FGAGGY6uYGTMcwzfC3BYeFxAJlm -VIR5PFySm2IZ1jHVuOS5p0nVIBMY5xs8/5vR3wCyhjpLxmeeCcPjsx83H2/gXRGO202cvPuSKMFy -agwxeHBIsx2mGbYGp2VR6wE3Q0ItACYzuRnCQGoNpPczPrPpJYtfJkdfZ9iRjZtuYEaAHpOt0rZ/ -5nl8UohSsL0QJeiFGToNUVoETlxqZ0tQ1PpQIyqnc17hq6AKqXseJKhYS59r+fNkFjXQdxJnUUoF -5zqm2aJS1FchJ7XMkRcm53WUzI6kzyrmFk4S6rPRJUnl2q0otfbZa5htL85IhdpI/E7KlUCRHzo1 -xpcgxpfG/JKVttn+YnKEfWuAsQsDzNQaYEo6uevaMmyn20w3pqcfylMCOJZxCyU+h5jyg/LozK0L -714jS40iCOMpI8YsSWpmxQYVGw6CEAUZanRwJH2oPjMSn8jeCLuMC+SrQE53VDpWkcHn5PpJ0GBP -XOsBkSAr6ovtMwgeZEOcIca4tsat88Vsq0wSR0aKktP6U3+qs2iqyJbSfDfaa40wGhM0Cx5sOa5L -/QLbUJUSqHJiKpH3miU2zSYwEgMdZZfFRRG3GVnwXQ6s0pxEB2Tb895a2dty0GOVfV9CAdgF5STV -qx0JFXy8iyV7L0bVk+isdU9Hkl4CVfpl96CtgU2VaJNqT8dcXbrVX2f79pPm9e874MNWPzHaFm++ -ksK6roCxX+SgGjljNSe8vF5vdv6n8r42K8fyrmt541e+9Chv/MhNdiGvPcZr//Bl5aRdlUZnXqXS -ocJuTT6dnBL2VNVGKtkK2kwFWuAgVwfQ+gBVqiXJTBCz87coRTr+37UjsGpFBlPlH9g1LuDZE7hy -A85OwDmB6ZXtqp026y0+Gzhw1d6aJkTg2p0tbvylFpbsq6mKYJ3fV93ZOguF1nuIkn9CsmdpDqqi -Rm1VXa0y1WVnT1Wn7qpyVrSzmjekp+4q6tTVzj62nNz5Em0Vs2t6ZdceDBpZ7nu146ba7nqr61CQ -5S6XPW53mPbXLDf4zO62e9s7s3JiTZUYrVWP73M2kbo4ib9wXhMns7kUsjGvQjZkT1vNGlzJIKmC -RAV/JUrZ6Ecg2mOAF4AYbwP1jB4463FIcN3Pkg4yxHGMgyN5AJ9ZFZBaZo6Anq6khrlHa6XaFzMj -1jRhaDJ8ZZhGEDw5N2byA6YoBjHVc4raMAxUZwRmFTnPSKpTEFMGzWUmzHP1xqbxZhibrCyfcw6f -Jjl3E3RC7yMk5wcl5YWY7ExHSn5IRk7SugKyaSTkq+Xj8+KxIQGhFoo4prYIRruFhGxZQl4JyByx -TYLRaSUjx0ZGFuZ5LSU3DqIiJpuuo2JcSsriqqiOor5xFFVvxcM18vRVMnQtOtdpMFIVTrWUnFdy -cxabj2rkYrHZVHLzI6TmLFKthGbTkZp9lpsZUbaN3FxrUFodSuCCbaxCaSTnLGXZ7Obmq/Dr1PgI -USrGIjybHOHf+rM28nPjUVz8iYtrq+hWPl7KXmY/qATqOntKnSlCkSZKuoiVNJ2FaQ24EywwWZp+ -lCxNdquuKG1qWRo2Xne8EIaaKKx0JHmvR3Ff9Iak6VKaj3f6KDttaad1n3mXY97lHA== - - - ap932eoue9GSxKw64z2WnZb8lEoWOEdlkD2uSMOT7P23GvAa79o6GK8WtCnwrS9pt7J2yfgsFSbd -MgsO+TJeI5E/KIEvxTPTkdAekr0vimemkc+ulrvPi2fmSvmsSN5DleG4FryFkTeVhHaOl9cg3JX0 -3bDzIqSZZSTuwumlRGDX/i4l/rqpWn6NnH7d3jd6l8sy+TX73VSsNmXDHyONnxXXrOlI48v9njry -eO110uy36Urk7X6fk8m7PijmjATXyuW9HV+Wqocdv0Z6f1BaX4rq5qKcfkFKzxjQ7n+ljXmUjH5e -RDfLI97Z8d5+d/RqvNtmdbzjQk5furPtVme7Vr+czEVZva9bq3e62edWpseaRvASrJozzpYl39nD -LzA+zMJLT7JYNBw9vamHsjrNbpinCQROKtGzKpHtG+cMksRr4/0Qz8j0X8yMPpNMjy4y/jPL9HkO -nybTz12Zfv45ZYytq24oB9OvubHNNTeIUVmYBXxlKttiFrd+vY26QEUpRVgiMTUoMEde9Mpl1MUy -UlXtWmfkKO13yLNpqlu3pbk/rlBGLmTd567t0Kt00atyMWY+sfxNUVdj86cUwdD6FyU0L1R/6v9h -kF5VoOJQVW9IVfWGdWKEfnEKLTQ4HE5G7o59LlaQcqGCddnFkiBhlSKhV1niY+pKlMnARMyPVVOi -XxKiTTBxqSCEOpfXBS1n05SDaGsW2seUg3g4VfRDWaI3xf/Q2xHkUwdXFbk9uRTwUANVcnAPUgUv -G4MfQLhMA1C9QIRtWhL2demqlB0F8ZN05qr5XBP4JKoahx5VhV54g+/UMiqVjGLOdjJnylUi3Upx -YBX95ky/KJVlVRc4K7tSFdW2z2Vd6ySsWt+WdRp7oWhHU6mu6mhrThXI2gwOuFbFpstaq0h6DNZk -bLV4iCHfgFNTOcRX8depqh2yE1HimNWcg8S6cSw8xrsFk2uJlOIbqsRS7Sc7Ch1YsJIUMlachrg0 -xyg1R6CZJKVPSC6LEhA6iVdREs5uluj6rcTT1W1LYQ25Gfmnuah6Wz5XG07XVXVh+Szt1xWeDlKH -IicycKLnquv5yuVV1zSurjC9xLbqErLPMYy20lbGJrnBXspXHWtvL3IICVmXze5eW7PQU2qIbtn4 -QMJr2fg9bfy+2XZHeSQxyNEbHJ42PeVN30rE45Y4axZEjrzVFP+43GovtVhwmpNpNnmWDV5u7nax -rceqUUbU0oz8s7j76zu+XNCaJCk1xVC0/HVBBq5rcjRVwGspZ+arKiYl5HXOfmeaI/nAClIpAE3N -kIZ0lPhsn8Ngo+SV2WYsKnmcSUEq+MSBsexuRCpxs/A5mgTJ2KtM9eN7oTI7ilUgJyTRlR85jkEw -cKiNK1ZCHnx2RPQSChEoKCKK55KmM50EZdVRMZEONhkhXXP2XuQQi5204s+4FdX8XkIxtGkokDQj -/zypUs//PCLbgMkcbdvOpSe7nNuzyt55KVPnbpU7e7/InF01I/+s+NMlh7rkUfddztnVGcXMBc5Z -eNYV76yca1uQugm9Oi6UJI0jQ1dFUjwZdm1dlKIEPVsYZVGrp66NUldHYeXoaHKJlFL6phS/OQjF -LXR4m6l0ktIpU76q6eYxQuF9vtpHNQhXFscmo9wqOvdYNyP/PEogOSuStEKJ+rlMZwSkti59EU+K -gLLIJGmynLKo3beI4DznejQu99M029krc1M0Yb3iRXX5Ito1k7csiO+Zr/Yo7021DwfRj+4lFJRv -+62we8kIhzZJcGiU4D1tPrexam7RKsO0kX/+sScfl00v236ufKNufnXSTVXssD3r9Wmvijg2ZRz3 -lSlEEMJUWvGeevQhdfhKIW4WxZEulUdaUoKMO1XtLsIgxiHGoposMDYxaWCcYqxqSERVIIuwzCiq -VQRDka5myw4NCalby7PvjPxT5USixzQHDLtEuOwSUWfL4HwZnMBpyDkzPOXN0CKEAEBDqTMOnKuc -csNYAvwodaoYsRk+uyqLFpOdXCWQ06FTwUNKhY65ZzgNOmfk8JL8fCtJOLQQIKaT0RKAHhX0bQVA -TA+DeWEwG4xUo5f892NVABCmTbNpyn1x5POyzBcyfyUBr9b42kquQuQ1XS4qczCLajJSTyaX7eEK -gVpatSofo9lgyl2tt3i52+eq5KCWJ1xnL63SUK3zGrUZmPqJnjDDEs5mQbA65CrTqppO1fSpUKOB -SmdKNoijRB9z/DFHuu8kQmKWWOQk1A9+eDZnzYUlUXOp81ZlaK6LvFUF3sy6wluvvtu6vBtjcX3o -1odyL/Ul1u3Yb6YWvEo7kw+2cjGqD/ruuGiHbDPer2rM1ZHrnKvVSq7W7PiJ9kMmj/k65YukVxzX -UkpU5Px2dGFEuCgc3BBHuhkSbLaHAzsQ7Z8BnzwlQz1g0RoDkxjh5ZgCNQEdGLccGgP4igiNCD7T -UTiSrBjgfOF02UfAk3i3k4iREXaM029xiA/rr0HSwdNhSLRHgR6LOqP0zqbms0z9mHn0EjewldIz -J5qLKrBmScx0UllUKmiquoqrrp7/CY9sJBma6JeNExK2RTRaPf95TX+pnLHIPmjWWR+52uO6PGV2 -COhUd7TZctim585ZCkxrKsbz/pD6dxxvkDJf1gGXh0gRHDzBIWKtW0/GuwA3NEazzi75QG68boYP -3ZzgksLAT4qmnkfY6JAABtF3PHShx9dqWFTwhtoCliqLX4g3k7ex8i3+giZFUIJZwPFLQxzdlNAj -eU6A6snZFK2L5P2MkcHzHGDToI9Ci7F+H+x8GB2sZiI/ZrKWLgsZhkX0bK7dNwOh3aSAIdZVDPMX -MBeCCRZsdICfbkCWCV+Ch9z6OWH8sKU0AePspwCfj9aGeWZjMToxwfSApkR+ZBmGPy4KO6IfeV3w -cF7MqjVhf0mz+iRjQ4o9YwP01m7ZlR2zjgOtnZ5rK0Dr7Fx8WUk/x3o5dWlduj3HLG4lsROomm2X -HaEPxWqgSmTDzqB8VX5iBaUzBXYe9aNTKEUajyWTPNd82tXJvYrZr5gANdGhpjbcVbnoi9JoL9/g -b06G2APlZbZZs4T/MuswSTZ1LDzEkudB09bnajJHkUhBGjUkks7q0au5EkPlPtjawFeF9BYZO0dy -fCaHZ8Per2vbN220uriOVa7OXVWPrGTq3JHK/4SiN6Xp5MIZ19dHOVsdpa6RYUjmrLNRrYNsuiE2 -Z5yznLDXzD7UWZaur/HXqfDHru+m8ofv1x48V3OwjlpunK850pkm2ybvmXL8RMneU2IsSm6C8lP8 -u0t6g866e2ter3deL1Xi61s/qNHOHrhDEE6APpNNd05jBEkyIec5cZoOuLYT0tk0DwMlJPFwbQ1w -q2Nal5h69BjT1izdcIau000vWc4XNSv2h4oRGUEfB3iHS5S8BO2l3pHsNwTKxDFj4pLBewucEiUv -gW/BLiaY4GQpVcnKhG7X2Uz6tZWBk3Rwu9mxcpD6giZ16bqFjm9//eb1N29fvH7/4vX3X31V3cL1 -B+bXP+AnI3/yzd379/dvX8P1vP/T/bN/g4tYeuBqXvZgahckpJsAez6FjbXAaQ/AVcAKpwk47gmT -QA0T8eVb+vtf/sK/3MM/H+i/Vjj2f/kr/fo/4b//Bzr/svGbX23+9X8Pm+f8xd/CP4v3vaq65FWb -r6Hv3Dz6H8pgX6/Hx67X9Pbf4Bc338Pf4wZX4AI/aG2ZyWhXXz5Vj4b1k/ptfRRzDnkPrC6movGJ -8u6ghBWATMH5iZYyU3m4f8IE3G0Azp+4/gF4XcBH4AJndB45U088NtjkN/9yR0v77d+fxf6XLYET -ATnNMNN5RugglSfw7OBPnAAWFgEQLMrX9IF2WqBVcbYEt8nf4P29sRMIeY66kr8JyAhXXbOFScDJ -xG8Ctam78A0BbgvqXL0WO//Yxzycprc3dqD8UYKN+LvlV8OlS18PAEyggk3XBIQUVl0vBPscOVxW -r67H16kwAoMgjgiMpHIJO6CwN7BxcMcPFt2NyhLxCZjfjScaXL1HO+sJ2SEBsKYajDTyGB2NbFef -dN9ZQxATwo0z5lazNQjRj3aDYAIWivoJZMFyX0oFZnHjPaDdVHUlTMVlgVMrwJ42brqByQSFISYE -W/dVL9VJRneTPPQ7B7fQnPIklxv26sy+rt/emSMi2YSQqPoUjfGrs/XnULt3AnrIhGuZ441POCSs -BZjcvJbFWXjVPzHUNU3NhPCbwOfSxIMbK8xZ9jHm0HfDuMYmv0K6xaGsugrKR0b5COcBkQjIVIPx -BS91zq+Wc7H1iz1ggB+B5PlmJ1YfEsbNqVrFSHgz5QsFX+5HfrlPnQ9XM2v2yMMRDjdA88dmjxDS -+G44pWWTwtQMT31j2kTyAbRll9y0QVyZXX9NzWe8JBrCr1fp43mwwG40iKHTbY4TTjncpHn27XEq -Z/nskcc+gBpOzU0VtgOxo5Mgx44O1MirSvW9AJClZQ1VX2x3Tw9jvcsdUpMpWPDETdi4IA4wpWm6 -wVhpXk5nmrrEejlKiKgvutIHm4rjudCsWl+hU6LrE/uFwWnwB3AAnw+CVx28UJSq0UeBVAOuB2Dt -oynNvkE9fW17fjsMWXuAqzOkMypHuJ1RF6PTXH/o+ENrQzPH1U1VT/bsPBqAxyX9WVJvZVaWVL6H -bD2k7B313hnrEeQe4e7dLrSaG5BiAC50YQHG47zh4h6IatPEBz79yH94GQslvpmpHHyZwQZE3SIn -UvU5f+OmWdY6lj68vmhoH/J3neO5gbip72jmpfP9e/Opd5cw7VXvw3OnYdm3RtczuPydeQQzfI6v -xL6G3+vyud9Vd3Lzqh53SAtJsdvXZS1Xr1owHTUf8hDuXsf0K+jqU1ifzBXJT72uhzi370zm+5QV -fGXOMaIkHPT6Olxk3fXdmpWowHaByeizP49g7AtSdPil7hGoYVgTrWXfRaZrCWGlakoRX1V9vSv+ -oWt/OV6DL2N7yHs3XXMhL/p6t+TySC/ZnZoFOssfLPpWrNKCfSpI02FOX/U+bG/Y3q37SPb3OyXw -A3zJ8eXwqupDBhH1WDXR7/Xpd7/ujKfv+QP8ud2+fX948ez9izev797+dfML6Pq/4Q9i3eZnP9/8 -y/9rjqzrOr5+Llqsj1KWJf5k9/bDuz/pONlyZdPPDeq7SNtFuq4P5Z9K3dVXdpGq6yu4wRJgLZBL -DyQVuOgRceSrMc2oFZzr7q8X3QCz0Trqrgc5050HeV3m+Bu0dc4T3IVwrU4T3LhIviP8B1g4F+Fy -DKTojWNC+8E0D+MYybY8jYCFyOpP00C6lTouaUqdBONrtSfcuqsF8RHhbocpqtsFYTcw+9KN7j49 -qPC5+I4+QA0cMDT0QUSL6CvtHuAp6obFp410On0lkG0eFzgMK11x3uzlbT4BZ8Zvm9yUJzHlKY+D -n2QEkM1H7kwAgk13Vs/ydG0KQT5AfZlOF4NApHsAXo07fZxkZIxWkM6Awhp3YvKyvQ== - - - DOC9l3VElArkZd7p1PCkdWewp6nNQBEmp4um173S7mFUCOFdzZ1xSkE7YaXSmfcI5r2XrwNToTB3 -IcqTBZCTjrh4u0wLBA6MqWMMB4xhiGE3vHbibjQE8Xmw7sbL69INb8ZsAWR4/cqj0VEnGteDPOj4 -fdKd4ijdyPV+LasYkZOWIRxPOQIP7IK8a4wTddL9KJ1DALaDwQDd3ssq4FoM+mzQpQ1zGWAedVQk -mc9ogBFtOPosSF8b7oTzx9OS3wl0/NCgi8LuYdLu0Tt9dhonnZHV8ezo9CWufJ/cbhgoIcz0LEB6 -ULyfgwzgUMupb8KrjQeweJdpN+oMpXNIOoHBBu2UZcKo3s0yABCLQc9Hmvl4wE7gt7gPgyWxE9Uw -syImyvZ8PKB70JMweefk2TFFfXbWPm8HObhwTIJ838MbUJFAVAmz72MnYOaYRj1zUY9XDGNUfPcx -n88wOz3gPiqVSDY47bQxDzArAYyDHnCAbExKkqLzG+6ER3VZQTpHwKpMexCBdIBC6QIiAdM03Fsr -Q/gU8hBxdNUiuBNEcSUxQPVl3PEGqL6ChjGbRgX+Wl9mRx3A6xHHKoMZtnCPjArbyC/zgBwKcFJ+ -Yme4CVjRQQBulVoH2NJBx0U9j2xupn1RBo0Aj+j1QTke2D3NCoIweUUEuDfTYsenGzT6lUH5+zM6 -fSlkpzkuTkJFNj18K2ini1awOwB2eT0efuSTAFeMvihkCpkJMSapVAI7jU6pbhwyNR0zgfXpHIXF -7rm6D+DSY1I+V/gOSBGEZHob8k3nQyaZKXklBH5WSuyBWsd8IzkiGhYxZ9BzDL3Y6fCu9roCxGKi -eA7OXBjGdgCHd4CeDu8DrXZE8qKXX8IKKTQx7M4nKY1OH830gdbAnSkfzjQAdeDvw4mZ9CinyPfG -CHQ4pPbIzSDjALLoBFB/wgNgd96aREw/dsPM50wNPfEms8ew8ky4ZFzvWClYCDeN6wOeP70LBqbH -PsHLZlc9C53AWVsb9TpEWkMDYPeQdAC8pGhiAdATZEt5OtGxB/k131yICpY75+rQA1UROg8Mv3VK -0NKQ6NkI++j51AHFljs5TplfwXvaykmIM06nZabmCTgWJHj0rJ883R6TQ5zQAYKXPZ9CvtWERGAn -YL5c1DDbxLBNNvNteNPrcQJxEiTXfCfzYU7ElMnLAk8AGdVpkFlZONr8fSTfaZRHPV9qQPjgVhX8 -mpGGYicp/HVSkxAT6vZWkSP4Sfj8gLlapgrDuHOCS1Ygm/gwzGjfzExFxhl4dhaWFrptElyEp12Y -FeCwUhkCXaplDTCwdE5zZpgy7YJuzCmju0uqQOyeUCunDFMZN01zZuWYa8QnR8Vbixi8lwHcyPRX -wHt2VCCUZVQUzXUADAYQ+LpEzBXwDG7Q3RmF/sy0HiVgiGl7Ea0Gn7GGb1zsDFYv1zQEHdXmy4q0 -4TpAoVXCk5PAlnExzqUzC3dAJ2weYEqKCSO/KkMvzwfQQlEA5KX8zZD0gDt2mOBuLxRNnpZnB2WZ -HVIpeVKfAzpdIGKdvMzDRSXgB7SQV5EmhjuBfxA4g+BZNhXjMLSbSTp1JjlIJJBop3LBMY7Vplq9 -KQMqowUr4GcxA7i/0b7PA2QCgygYlXRGNmkKckdl5ZPnU48sRFByOGK9IO70wkYh6FM5XhilonNg -AYHOsrLTZAZgYhDcZKsneYAxS4CJRRjsdECMlJ+PA9NeZOQm3S/gexxfl7PYsmTBiUGDN+Mg04pC -0ZFE5QNDfGumXLMStDizWAad06C0l1BbOr0ew8m6QvrcwCRGX26HQZfk4yhkM8yDfhduLPkuKpWH -oBSWZF24qHnreVcmZk2gc5wyCiThIqnbKt2MfojyrMsvi0JE6EndFZJdeQDcYx1XpG0k/GO+VJOT -2yDyXgiyDCLipYAYpy9jDIDbBBONc98M96Z0eqffB9SX05WAs/BJ54WA5E6bFP7o/UmdwPY7G/RJ -/b6rUBAgJGce77lMoInnxM6hkr0mK4BB1/FJ0dXlG5EMLLKNaWAYTDOzhTyAsCvQGUA4VsCMAhjo -VmVIeRncyYOb8wDUBSRfURXxl78MhzsoyQIei6AywQ54vbvDxLDGzsEr/GKQC3UCaAtvVk7xhEBR -7UFwwpPMPJYs1E+ZJ4mDXnx09X4t3aMd6kOAnciEKRr7iW/OiKdMD9aIlzuPS3g6KzFOOkD0ioUj -S7rYWeR36tQB3KzgVmoOjBXgeWZVcqdKxYklJB4AGdFMuv3mbBeJoQLsYcxftpNSXXJ9wE6goyFm -ZGN6A51FgxMmZUKxO9Mx4jcYrqHiY0NmgLA7K2YinImNdMK+6x7kORSMicCEZ960IjxCovBUWr2n -gF0ghiKEGywRp5voBA+gG86qLmNUjRMyzaIKkyFydz64nkk/9E1WoUMDS6d+O6nWLIwVz6w3B6rJ -86EV1hL6hqzb8l5JMXbnk0hXPnfaGBQLULUqT3p9suxusDdjvgxGRsNQdKVIuqOXzhjzpMYg92wY -qkvdBz622GmVWSEISmfKCIuXMMs4SPF1ArQw7JxQq5tXy8wTSEM26TkqyO3HrEdBYYZvLm+z9IZw -IbUAil6qrEDGKuoAA/LUQfkiJ/s9EuepMpmwZWNE7YzyUHirfUXin2oLUG2mewMSpI1FxciaAZA1 -w6TXlxusCqtFGWnnqci1RSqkAXhiSKezHB5ZrHQIaKWqolwBGghHTFEWHVJ5XAfQzRfIyD4s/HSh -lTawlAGdwOuHikPkTpd5rmFWOdzBKc3XuHgBfEXy/TxMqqOYPcv3CDOFw8hKvRkr0Hqlf1Y1WtgN -Ur12T6p4gG5SGHE3k3bog5OjwnFStUP1dVTJ8ajQXQmWzLVgZ8hKWbwNuXPO3Cw5WvAAAzw7ZfLB -iGdnZBZVWuRtsKm6xmlQ1qcgX5mP3qDbYFPFTZHA+xXpUwbRXCDeMVGzsZJMi6RmY8U7u6yNgG7S -QRTMy91ZlVzp1wMKxXqb8gkmTY+v3/dVT22vZoaVjvlV7g4d/bbTq6fpzANEVbZgd8iC8zRnhfao -F0RWPHe03N+JdBEyC00c2CvtzhcgyQzSOet8Y2IO5oLY45RdUc4OB8i3TGa3VzNAu9EfjNo86/+R -8fL4+nljunzIokm96Pa/cT3T5pU2TdRlwamHJaGdD+h7QPv6V0BEUS8E1K90f912o/fCFOiOrAc5 -010Gef1FGDNpbliAGqcMGzQFT+vG7sB9CT1ksAcdmqzHzpkdztsFw5OJOX/uHhk8OCjMkDsdVqem -zohUs/t6Qt1pSngNT/I0XHM8L0B4Zs5pFhPyhdg5MhXmZ0dkDqDTI9Gw/KS3ZBbkboIHdwdn9dnR -B1nb4KSP/Bmpzw58jUN3uMEEmNzNZwcz5N1grB13jgywCcQy9FZT2PgkA+AUvUwWs0QwRqFkh8ej -hg52BpdGmReJBdRJnoPciW5ke6PdowKMJDPqJBmXO4eoA0wpKsxFYuUBAM10gwNBAY3acxp1gKSd -sEadAdMr6g3joI8iHy+dBQhkYaZOuu95AghvHYAcTXkAOBgMGZTC0ZDNEMfLkjsxybU86wJBHK1H -Y5QtJ7MejwvduHTeSeSfuZO07dyJHn/SOXu7XNiIxnMBDHO50OlZO8FbPsusApJ36RQVLvVOeQHe -CwwDe/7wXBHx5fsZuYRv41403AnKWv4+8Cuzfp8FPur0CHjuxNuBB0D1pw7ACjHqnOdZOkm2xc4J -0DdOAmvYDRkAnSjzFthZqCAS92mU180uD0HEX1Yr0EYhTqFNenQeV+47nm8adFzhb3ncmc8jKvBG -nS9rOqkzBt2aAJQ0jxu9nucYB5fHxSAmIR4YRMGdpKXgIYj9hU4A/zjqKXe6kdDbvu1r6Sa1TQEa -dyYhgTPTfOlEVRlPgKkdd8MplOkGm3QAn7GW9HLcGX3ZSdaFA620QB10I6Klo5sGh/kUZkVGWm1i -q7suIbCSHqMBmWHk2TrUOFKnC4NCHIm7dCZdgovVAH7ULSM2ivpIwcN95KZAnZj+Rt40Dy5/n/IB -cHcirElDYONJOwBIR07J1IgqNh4g8BT56CQif9iJ4bmKB0TssZNoToG2DoApRGQGfIlQp1fEH9HX -LD8pM3DAvucByBuNB0D3L+xE2X2aFLC503s9IiGDQEz6NZnAToCmgovvTOzzo4LFChZhN6E6jzon -fVbppJBE7ESPS0V5P3qFAPLeftJnmXeBzuDzbeOClwGARYkCV3IUoc5onRI/VGXrqEFfReZN7kJP -Y17AlPsK7dZLCbvTrIgZx5GRGMWQfF6Y9mFnGtNczYkHSGwDlqPBbAt2Oj0vFNXzv+hZ3E6vp36Q -cZEA+IywNAE7AGLqqojS0LvswIKBDMvfx2cRGPXtk2x9g7popzwAuaDIGhy/DFgk5zIjQywPPpkm -JS9pFBSAR92oEyDnTu6Ei20BQktqlrEihTpAQpfpQuj5WTfksz3EKKPOQ3N/8QBoMNVdGPwsHDC+ -DpU+zAbMSSeGaUGUw7J53ClzLFYPB45rk/IGfN9jp3LhmT3Czgj3jbJHGbSOA3Z4vqQNRzdz9MLJ -9EFAO7I/C4MmH2/oJsuhbG708uwUfVTQMKeMA7hRNxc9JXgAoJw+32p4vr+W7jEphQBU5yF85pWR -+MdROn2mO1Nwcx4X04UJKoQhyrMhKtqzhZY6gddOeq86lwcgea9MDDsDzJZAM1KdDekbByXok50U -aQIeYoXMFPX75WqP3kUddMwXaNmbgFRQz431+iwmWtABBu2c8u0TRcXB3RnFyWD2tXTPk50KO4Z9 -QDydHSsgcqd1uuXkrMzDRnbjarcmYo0VASIsWyGDaS2UmbIpD0A+CgxE5i2wk7xDqRMIkk6LnBKl -M7o8QET7ggzANB07nY06rUGXEJKSKeLjdYDZ02nAcZnNTeRDT7cadDpdAvrVBJnBKI5i3B0IBtD9 -/7P3JmByHdWhsCUvkm2NvMjGlm3Z7UW2vEzr1n6vhf2eFlu2GduKZWwDcZTWTEtqNDM9zGJb5IUX -4H8JCYFgtiwEDC/kQdizPJLwB/IMvJjARwIm5GeHhC+JwWYzjg22DP85td17+96evj2a6eludcuW -ZqpPVZ2qOnW2OnUKpotZWB38ZdBilk0o45kzXTG/b9CpKOwihPoAQBdaWQGwVqUOCXIMZdHCrIW+ -AR1NYCnRcuDIRO0bbI02qAsJt5DMRq3oYq2omOGiD8cWYm4D0yrGg5hCWDuHAVPKN8CZ07qsPoqF -VqlGWPSrmkKwDLibWaecEBw5cdgyjwEmSrcNiNC3GhFXyK0CjsXoELDtSsOC0S9nmDUz6bV0IXEq -D0KqyDIfLDbKBdPOYQuquLKgMi7U3kJTSJWvbgUmVo/MkZEu1mfSFi1iWgBxwamFtc4Dc9HXllHq -m6XOZETist1Txh3fCg3jo8QcGZjazl7EYhlGtndNDaZJ7c8zTUpD8FhIHRFTzzkRKw== - - - w2XT6GPWHtuAUcaxUJ+wmPHbkzRdLENpG2DxWEE3cFZRaNQb3YAnN68cUQab3S2Lo0J0A2P2hBSD -QEguPblFwjfAjI6NQwiZFSpYzNz2EIFR+ygKNpWcBVMo/J7xuiiWIreJdxIWcvPCsSENa2UAZBQ5 -IqJcEt9A5FXcyPnNsAkt6E2xsnTMzaKml4E7Po0Y2CNCU8z9TpJ2blCEeuI2TgZdqLgfrRNWWIzW -ui7WLNcUKh6TZ+AaiPecpiTTgHBWkSZvwwwoRmw6UnS2FrU3p+1WdEoanjQIt8W5calgIVOOGWjJ -bQq10RJzSdcAqKwOA2axlc5VlNh1UEbcTtRB3r5+5ISKvnplChVznIsFluwlaGiOYljoWDoWy8At -ArF7TOEhY5J7m0LtY7Oiym88GylkyF6fBppCdOdbJmlpFh3QDpKHlPsGYN+5Boxkp6FzOuLK4nG5 -KdSxMrGcMPXteaEdrXSwOrOCZch2XjBuSDhRx4mvD5zX+6SMpq81U+KYhLRYoZ3u2IkL69PFJPLE -hVxmxBbDwJ38iFwLijFHscw4U7Fb4/7R0jrivll9oG9FgiFOvR6OdWh91BQGoeNo+qK+boAFJqom -iQAD9ssdm1TGVYWF1mBPiUosjvxwI8P8GEUz2RGcNRcZHt563kmcoGLIqh0ZCfRu2lalsqMlykgq -jYHTUHUYZowB8URvXBHYKh6kmnmxZjgWek7P0d/oMMD8bI7oQ4ct454hWr6DQ1DUMXXpdC48+gyd -00Dn7DCFOuLSME8dxwmFzPkycLDMKeRYHDC/7cz2wELOHAbWFcGYsZUtGTDhG9ChAaYz5BUjtjjy -mqf2a5hCFXLH+6yvHgsjt+SBjZwxDShHHYEVrngfMnKLEwijyzF0EzkMYhuIoffda9TUHZAwnhBX -budBofR8MrBmBdMXJsMEKbl2G2Bdu5aaNfuJHGogPt3YjJ87ZAL9/q4BtO5cu7Hu6QQD4iCJU0dC -5hCzLkdNdtb1avB1k6Pz81gMvLzi1jjTGPgNyeP6keRO8bO6K0M7zGnaTvllwjmVnC5iGhDAVZlb -iDByfUnGvWizay5MoK8pFE7a6GInA7i1vKEwEm7vCXsYxND7zVWGGEE2yjC5T22rkXBTYBUBLDTa -gWOgvgESRA0Uig2EXgJEHi3qmHXsmWPSXEayW8dNV6ySS+uWAUAaeN2PRcTXJ16ImCAoU+ilsJaN -tifmtE/qeZp32DGdo80SJ0ZjOjVP8xlfHMtci6w0N9nTUyid48CRoetMo5hmoCCxBU0ad6bQ+ga1 -PudHq2AHOYbgLHcojN0BHCnSFOKlMUfcTifFYhmTdxTZgXlPYpIS8eZH5O0SYcsi6mxWd63GFjvx -qknGNBu6YzYsNloDC5M6mrWMWOjcFExflbOtooLg+DK3rBYjfJwvUjNHU6iotza8OgjFjnE5DxSL -nMOOxcYtpuXwJoi0Fxd0MVeOl/h5jZyTngU2RhKwQGXRrVasCWGx10+ExQALqdvfJnRWF8Y6vT5h -NA0QDOp2sx0Z96AOK3LOgMi6bTl152AIGTiNGoqdDHTeSYSUoduHdgKxUHn/gA001sWSBV6EGc1X -3xNx3rrIHHlhofKY+s2FpQFvsIJToCIy6jBHa9PbL8opoxwTFjpOolNPYCFLqNOJwthgjnUmDMxi -biNqe9DCUjdaZdYVyvTZl1lXdwqmQb2s5NZgxLQEinjBYc4zoJBG3hnjWTTnRrv3fY3Y0gRloLR3 -xULEukHES67QMRirj0OZzihhWpVud2Nx6EAd44TCMPDclBhZjYXeVtNSxjSAnkG35ZWVqVwkWIk9 -PMbCeGL10bBrIIyNW25NSyiNuJMofiMg53Z7XnFLHCLhtUg0KxO6t7TuQiiMqdN55Ll0Xl+nn5kG -lIlzN2Nw6xi6UzhMrUiMccuj5Ghxp5gG8GDTWSUh1VlzTLEOq7f0ZZg3t8dkpl1leURkbl2adpU7 -nMMGpLMKQut+4pG5LhbvBtsAk05DdN4Abt2MVrUwCq0IzG0eM7X2ZEmgAS9kYgS6ARF4NZUYF51t -wHt1zMURXai1Ost4nM0sAq9px7MIhcKbMMrYKjpM0wyA+BN8LNXuajvfkauuV7lxALHDVXqzRgSJ -navsLWooJu6AMrFJcbDeV0Sspi/0dQDrBY1998JuIVOMUzTiupP+gM7yNGzXnQKZ8+TQxKq640l0 -/W9vXh1v8DvnfUTcEsSGvHY/bbfD0ic6ZgRG29BD9fzMGpFQCJqX216ExfVjmWo3ksCr+440Hblh -R9Trlnjm6upzv0GJowzi4nFY7NgTGPLoMI2FokZAeePWsH+EDZyTJ7RWlUh6MCOvwujIYidUwsA3 -4Np0Z0X6OqIjAH22Nk91iuqJ68qesQvqTqCQXuMVoCaRiC52SrdA+eUU6chRG0o6tzOovfyhi+2x -p6Z430DsJ3MOPGwgMYUkbkDf8LLrbXcX2KAq8IzE1dcX3A0CMQ0wrwQRk6zLFsa726p7UBgwp3Qr -77EWeBndKUHS+pMEc4dC2JmrriNHYsJ01aUP3AtsBAiWOvnttgBauk7Qu9MzjFZPOAndkLiLstCl -lgJQytpe7KEgFnHHWKQMfW0RN2gKYueatG44DJ73erZeN1eZWy8rMZEpya5jd5eINQGS8MokqptU -iqYMH3i1oNangjhZrytJnB5gMecO1oUGCO71dOJPQASGZxiziHhTHgt9X/HBDBYTFxdJrWcLC62X -mnjmI9zBvObqLjgALzAE3DJ75uUlFOvER2bzuH0ijKS2a288Y1Cob5BbeRkK3y6XzrmGqex9uzrY -wM6iFRjCBBukNB9s17tlpHfWY65J6bYPBnNa2Ej58UqLmM3pa0fmVBQopiacD0eGlpUpJCQWecKW -OQ8BSZxXYLPWBEBu4wcmE7aJ88rrvliDniekuXsUy2zXbqyoubgDKAxDt+jWza0BmV1IkqyPKcct -IVinvMALj6FwGo5R6LBR7+SNnA0jlCe6wB/QYaNR5PriRi3Xl78dW0gQODTgScZ5KHVeCqdA27BS -LNTn8VZ7lTEGCatdusN9nUHCm7fo0XDFNsxOm41GecOWMXjMSL0YXx2lZX2JXsDg/VvuTrGtW0hf -pPZ+RxOSiIWRD8xKkLgq63d5DNeXVhzjhWenubgjd3ejwi+jqR96r1BixUKn5OCwdN4KKIwSnrUE -ySSd5aE9QxAYYOcYAr6KZlt1x2GY7sgZ7gjLHY/WXknbmTlsxg3ixB5G0hHbQOwo0Q14TmXDT6BQ -XyBN73Eb9hJ608I1wJhzC2n90rYa+3lNMKBGi3vXgz/VRVivJjhHAcISp2o6Dzp25f367uKMLrbu -VLSInZCOXIg0FnKHlSKOlHlMBRhD7fU3Zpk1nnZL71AxtrewsZFWgClfPyK+fsTdbNloRhYfkEkd -EuA0B39eISIXAqTtBeb6CrkTYjb0RJdJxyH8aR42a8+MiHHLj9jiQFK3tPZStC624bGao3CPmT1F -JuYMWgb+fM2G67u+bHCuFkxxmypwIsTZVtim9W46NUWiZeRmRfuUXKNO93IyHLunUUJzsX2HzqGj -/ZYeJX/66wL1ESPv/ArtQQE2GnljJ4ziMSnvUHCMW3emvKPGnMFLYo4wzR5wUedYHDt1bJQqFjLq -rEi3B7DQ75Y4QAWKlbcYnVyWxLvorbzHQjxtcZNKvAcNi0kse8zplKTm4n1S9kAZ88aO8pqyxMOp -sIHLS5I4QImsVwvH6jeGTjTrRiAiZwgT6/6RmAhReCdqXOhZYXwogjMjAn/IEAo/XS6oyqraWIYn -4TbQisb1eehDwW2UEWIVumhUZ65AoZXT1N6ecA1YVTARACZJMozBugCxkLswhpgPSWJmzhSzwK2X -jRZjccwKXlr1OpQOTHCLoBMdGzkZGqaFhd64ciaEpPqVCVvoA6WgWKeStYtgdD7JjEcyTcjM3Hwz -QsrJMyiNBbW2grCQJ/32ykgTyRNyJ/aCQgPxaaTJ2aALFfFCLrT7k3m3GNoMzi2GDZgQMv0GhzHO -ENZHajmbFQsj784JAocB9ye6xIgQi20YNTBzHJf3hGu27TEQzn/l1ivpcXRhAVhIXEirPu51CIhY -clnHh+SJ4FHPYfAY0N/i8ZERmFgnEJ4OjeiTse3gAxGlSMToaCPD1EfHngsoDe0ph5Rmr6bUKijU -+dtsA54KVHwmXTK/61vHcbihKaTcxSAKJ0r1PXMfk2xdDlhfuk3orHCENJsFsfS6ufQapD7w5zbE -Ci+re8dRSCx703c+fUyy3dx4Z9OfRjvfHYLi+0hxRO+ILbZWlh6EazUOX3ZH1Fgo3bi0p8E1Gweo -Cseh7a19g5ZVyRCSu7B0na7ANcCVGxexRxRS37F3Ti7mG4h8fKsOIXcNuPtOFlszsMhFn2mF2YQb -YiIEGrm4aiuQkcS8Ch3zwgjPyF1v6FEyV/gCR4XU3rDwxST0gzMqtwpMJsc4uNsUwny7oXFPssjc -3a2t0AfWYYoG4e7LBDYOQwWJmG0i3cjACvJ3NHgYN+ujXF1IroycWy0RZotZH5SLbdQRzK4By6d1 -eLfdislpdPcxEFXuyFnfWHENxBEygeOHkTsX0hHfZroQA2EihUNjFbsGXNBl6Jw1iIARPzhblHqs -JPGAURTXtzdKQnN8YalDaEcwFmK0mim0J+9YGIvlyORmMp2JyO2RiLj7itr74SjUTWwQ60YhHqWI -hs5Cf28s9FdScDPY61EpDPAelDsFc5EVUvk7ZqG5MmF5ir1SKL1aoExywDAZc69fWHC7htgAf2nT -IJnF9lGrOjG0OwbVNq0tlG7f6khOy6TMyZqGJDEGnLpQaS9/0fb1VwF4zCiFuzvoslxa/stpYmnN -7pDm4qRpwvHEZKGnbmm8p6Yw1piEE8E4YY7TCR+fnyjkRkCawljhwbMxdy1Sm9ojTgL6K5DO/NRi -lbrbjtZIg0Lp7zPowzknghPzwKlXXI3yT11aFF2oX+IwkAGLVbkgIizRLhYG/l6LzgnkbW3lCJH7 -Myi0NIW7S6sks1EJ2lR1u9G1Kyy1hIl7t8bWdXd/Qx+4KZI7z52u6bQbbnatFELPgpHBiJdnB/ou -v7sz6g7i0A1iTmtwYFa/gkKncYRGa/MuntBtEgYmkPd96QvKIV7ZjkwYCbq+lGMINgQDXXomONDN -oXPpKd+ZCw1Bn2CguNvjoXMUcsHcJvVXF7Rr1K2ji7SFQv0glSm0e0QnM5RuXD70CV2+1usTxq4r -5u+ioVC3rglmoilsq+7YEk8FrOKhjJWJhWDucSHdJPoTM3fNUJnQVn88aC8/hO5djmF98mljTnQQ -pzEK8IxUuGUMXLQB5rhl9ja9989AqbCai01oPGKLrSGKo7BRlngkHHLmJsEe02KaDuKa9b4zPFUW -Zh5dWhFd6IhGeU0PT6oDs0WUufzuTsBt7BKOQRhBjIX2jq1yh5F4Li+lna+YreswAg== - - - aovDyJjHGHBAHAJhHAYRUaMn21cxXAPubo0yJ5cjtlgP3Y7XnuJjYWipxlkF2K69JxwmTp0wasIq -ddZraArjfUPcsTj1F9VUfMTBiTHATX1rR/LAuXExGNgFMmCMnLK0EfoDAZ24JrQr5k+60Sg2CChz -w9EUEnvZUfksPzpyRgauAXdIyKwKZcnLhwhZs4DGSYVNceBmXFqTLw79aWgg4J66HJ/TUUaO6vUh -wDytMuZWUce9mQaUv5iuPLdn0guWmDp0XFwYxiRn6nN3eEuV1w8YNSqQnUMXVKvz3Jgyt5mZvyhC -lXuZcljHBUfMNeBCANAkJI5PEhcFjXq1tA34OEbtxJBuZe0BFo3TGyhtSZkyvRqm/zhoPvLCWZkE -DsMmilspx0zwBMMUBpx5GnJ8VrMbtzmkPe6ioQvso/bWui1USrld62/Q+Eh0JG57AI9pPmwmg5g2 -MezeXnaMU26bsHvh9ow++TOFSrgpcIfCWKgcow58ABy2K5zmRIm9vyHdPSYdP28vREjY9E7g+ygI -Ks0TArbURuhLwwAsGXsE3JVTDLR3fAcTGCsn2v1tFWYuPJjpsiE2+pFCj5WXVZQktn3kr8u4y8iY -bixyt5DsCRy1aW5cfXcnHpMOGcGKhZS6EVg9N74GpcW6jBsgxreqB2ZD9AN/TdAmMDKF8RrE91t1 -LiTpWJy7nxT4dANhfGEnMKkQLTNVwjdg47po6I438XaXNxRcvDeJfKISk2BJVyeRyYEXqwsjttge -GmgZbmLWSZiwgJyuT5QLpU/uerytqdzu0IHow+beb+RoUytvw/o6tD0BpCpxFwsvn5ubUFhsTwIw -2YCJIsRMXPYELyAJ2tLXPEwD+rlmJz/tncRAX5BxW1Fn3zM5EOwFX+Xzq+liFXgWR10aBxWTIfeZ -GVTgRuA1Z92sdKRhQhN0wofIkZY1CXShvd6r4qsXOpeFcsLens0qk8nVMXPji1c6oTGzA/Ch4ljs -NFzlrhjoQuvy9UqUbiD0zDTwGIASpJwKwpxRoot5YNdWn3+4YhW4dfB5OgSwGIcvNWGPWGjPDlxW -I9MdNUFuUCydGoM5XPBVe8f9TYqN0KY7N125ixZYbE/FqDVVsVB6x5RyjljQPM0ZpZ1bK1Qw749z -ESgXu4EZgkD5tkyK2gxBqXxNmkfoBjDpp9edrYWek3noDp2SCP0vKuE8oNSmSrJBeWEix45295h7 -tzoZjpHCKki43+NQGSyWxJn5NhofOwudiuZ2dBYDky0JDU8ufWw0NY/GmGLh74zYGHXt/fXhyRY1 -LPQB4sIfsmIDcSi2c0p77y2LQ7mwULpwQuFDNKS/s66PTqVrgEfKxY1Hzq3eMAI3NJoIXRdUPwtr -i5U7jPFIMB8fYU+5TKH1Qmh3ueOk2XZHbIfETwUxnskJW0ypC6mgwp2RUCO9dVxL5M5IOKPSFYr4 -oMvqdTrYJXSwLoaf+Ei3LALbPWbWKHNxKQ6z+HqC8kgEPqA3VKHzA0Q+XC++jWeOpdwhgzvCJC7P -iw4VccdHDf1bxHQW+siNzbyeaYsJcdFagQtSUJz4qBDlCm0cozkvdQa7O8dMxGSE5rKHOZu1HuJs -9w6vOFyFWJTQIaTcEXDg7X2ddtoevUgXfhKfysUaBPoGfKhKYH3JGtaHEjiDP77nj+FR/tA/iZMl -Oe1LdGcc9sFso/QGPvBXH/G5S4KBD+fV3oGR/EZs60S6xF74BTKoCVscHwm7W5yYh8DHn8UpE6zL -kiUvwmKz0tUXVp0kySur7iAvi4BdH3yh0dyq0z58ZemG2Dvmptjm1zTFoUtfoX8ayW9kRKcYPMJ0 -guxI0wk6R7tjWVIkU9xYjpMsZio0EUUjcQt5ZYnqiZfRbhvq9BOkW4cIzAEr3Wv9WMDTcHEIM/t6 -Il1M7UWVcWsl27vVWs9gtLGY2OTg40O7oZetUzZbYkDxBQskbgqSC7EHNSckBNQPwIvr3IgRJpGB -4cCQJG5gHCHBPInQPYukTpcYpfMl4njtsGzSRCzhJDkJmC8R1tx6ae0t9gBT11MnbeNi5dKsoVyz -GbtI4O8S4Zmk0CqZKxy1/n577ygBq4J0g+Z32+/okC1hURiHX7hmwGD3EYW+S184OpRELwXrBpJq -NTPo0aG9iTcEYYkwnioAmxiMKdyWCvaGJjlM1Q2rEzCYS1wPnX8yXgAEiZKTnZO+EiafGELDeA8T -Bx4Qo7NNWJe+ndJAp4j0x5z2niKWSqLiYnOTCV81cgOMzO/uPqT7PZ7ouMQdvrnfw3QNH4iewIrp -uN8RNwRzuwnTplFXTNDHri0QzDVkH+lLFgfE2Jkj+fOAbG/Zt4jBTGgPDNMJ8wLesEJYHEfV4jmu -OaoMzJUTXxrqKydB4PJO6mUz19oC4q9AZ5e4ceaT9JAzac2n2Bez0J7Uj+SPz8w8ZaCkSODnAXBg -YYmfoK8y5HgJOEBTFqOkkvOIDx0HyQ1B9Uz7NK1YGs9rA9k0Un6SxpK06IneBIEjN4ncYRw3FnqS -O4l87iRAN9I+yCQsN/dkdaG7bYqRKOa+LQlMLubt6VnGdBmoUcxH9nmbRNM3qKoRWNqgBhHDTkAT -wKt2IRckMuwE7A88DggkAgqu6TtAVzyReALCNH1nMuay9AdL0jLPrQO3N5+QZ/rUtMYsUpbDulR3 -OGn4umWav4p8Xuwu3qZg7SEHymajFeXtme3zbbAccm1O3IniwCT5G8kf80gqj7OR0cubzXh5dCCr -/2TnzaiyLhecLx7WPjSiryexKI6Q9YVpmRMXY0I0a4EnMszZnZS7vUat09aG/iZgqU1cmWo1Lkxh -4IuT2PpWk+PKzsHo0LYGFUHCEijQIyTQJ3pig5JW38EQAZaE8gk3Zwmv0DVySZVcb4acVKXoJIqV -BCnsMQtgwsyFP62BRxzFo9Z2mDlQGVYKgwHQdMd7BWDb2byZFB+kEKZQH/AbLyXm2lN2Ob1HU5hc -drrQ5dMJ7MuLulCAqHKraW6LYKl5ekYbMMbhhIX2CJpQe+QEdg46Rk11wm1aDiyNTGARESYSBsrs -Sd2w9vKaeGEsDDFJqqkf2tQmWOxcVSS06RVwrnwWRZtZVBdq9/eo9V4LfYSAxVKxOOWW5jshj7Mn -oddF2sLEMYwwbyRAcehTz7ljElgW7q/L+UIUazoKb3QoVYx5LV3+JuFyDuMTBNwc6QIGLlyKJK6S -6pxl5jiR+MBYNE4i46kmPueLnwMs1FGtbhL1BU5d7FwIOLMmTR6eEERBehU4tTfbRoeSK4bF5v2J -xNJynSzOngE4KsBCHcgyOpQkGByuCyv0pIWFyrqBPBViofa8GjJ0FIvFTtJ42sbCgNPUNuA4Fmnj -JOMtg8V2FePN5QLp412oV8BdrpRgilhPOSYiNEOVKnDHlpj70gTNSRW6BjBlrbIn+BKTxgdcGIlm -w2olejBDw6aoSwiSwwe2L9XzA2Ix/AV65jSr4spfIcOykVQZbh5/A8E6CrJFrmbD8+mdFZCVvNHp -HHmRu4gmvFvLSjod0eSyGETOm4onZ85pkigOWCKZaqLYOmST85EqkzbYsKEFvI7HdUgRPkWCOZ0c -tAsTSiCXnmfUTiV6djkmWIC9F6CQwjc8wKwSlGFGisgQBEbHJgQcqkW00QiQZlKthSXtVOoRatvc -LvhEujSylwlGUsUc04PigW1DcXJOJQaN2nCV/OJkI3FxqstEcZIgM1ib2eo8KUrJXLSpW1/jm0OX -oxQN1JDYhUnaSUxJs+JkI03mNUKkgwZ6l/hwo02GmN33iTJMKEBdBKKvnR2d8zCnN9xEs611S5pX -hBjvCxMqMasRGJK4IsCcQyUYIzB4DELHSBzg+6CA4b0KxpHoaWrqaY6+jo7gNMWb9VHK3UV1SE2k -pyU9h3GxfR6g6SQ2WYVsf3bGsrPTnHP5siQWyeIU68KsoyaEIJ+jJRFpT1QJLNxzS31y13RtcrY2 -uX942BRrCZb8YuiWKfyGBOar3XfsvL42Ds0MbfY/lq4e2nzXzSO31Meq+OOO2uhsrT5ZmT403xdb -SpvumxifhK+GAa3p2t652erM5aWrhjZvnZ6uNECMHqiNj01XJ/F7Wtp84+Rs/B3+NXtoqorfbSJB -sPHy0ubnT9ZGoXg3tDu5Pw16T2V8zsAeqNb2H5idHxplNwIDLg78qm4e0721sdkDhYdkoTs+ovre -F1dHZ7fV5ybHAL1t9fuKDm+fpjcAnZ0pPMhUnY4PdeuNe7aOTx2o7CFFx1gbA8gWY0KYjg+lOBW2 -WM/EQO7r6nEcKjyOQ24886PbLWxydm5679x4dXK0WnQqTNWCs+H66fTClgNRdDx7KzPV66erL5mD -SSi+zA21Oj7Cyfru2drsaAsOH49yRkPfXhuvFueXqTodHyEtOrTJuYlbR2cr97QxsmSVjg8Mt1zR -sU1XZ+bGi2smDrwIB2qCOpkH9XxplBDK1duT7GR+ZOeZ9w4vSG2y6HLUp6rTldn6dOEFiSt0nMx2 -1+emR6s7pytTB2qjhVWOFlOR1Dwmu3zv1CZbsJDUYOgy7prt9Ymp+kxttsimWQoEtF7csu/NO6r7 -SlsG1l43jmlg7XWrtccH1l7OQAbW3rKwyX3TFVB7x2+p12b6zN4r7FQZmHvdae4V5pMDc29g7g3M -vcyoBubewNw7esw93ofmXhtj6g1zD2ygbdV7quO7D1TG6vf2wbnXMO0XW6idkfStNWREpjbT+0Vg -FtaiZ2bHdlTvqVUQoTYshGSljg9u7/hcC1WsdzXpnZW5mZlaZXKbGWOv6NKF6W2sOBcZWw4Du/hA -ijP2seXg7O1skm7nZvV9+2aqs9v6eNvfqkfYQxt+HLVjjBIcrY/Xp6++94AxYwrKnEPjxV2JFnoZ -jl0Kj2eqOjo3Xpm+7r6p+mR1sjjZZSt2fpTtDnJ7fXJmtrKAQcYVOz7IwjFAM3PT+yqj1d2jlXYI -NFVpwOiPYCxIK7fOtaCtjnD5buGzYKDBp+iEvLTwXLx0OYxN0cZQutxuJu0sy6Jbzkuig+yq1yZn -R6yTbDn8kdXdVlSMWOWih/Sh/jxMaJMfd7t4WZCjp+3ThO5eo16zjNo5JOkWZlBYMBxs4W5ILASC -dq91cJAVHwhbhoEUX5EWQ04OhHT1ihTnWweXg21VpmuzByaqs8UPqXtJcPblKXzb2kC3i87x2uyu -Sq2VL+Mol529Yyu37yZue8ct00LeXJ3eX8WZ7CElqN3N1Y9rsXQIDEKGFqpA9WPIEOm3kKGj64bI -9np9fNt0tfrSwkdo3RsaJQpTYpd7eNvgE30bGUXKhW9fT1fGanPF95wD7/i6jtXGK8WPqnvP5uyr -MLbCA1mwZdatA9IMvuDKjC2nNlyfnjpQH6/vP9RDpsmArfUQW+sbZrb0t7+6dUADZrakimq/xN62 -ccWry3d64VOantnq7V3a6YG93nMRt/16Z78N0urybR8UVysH2QeajXF5sw8UjhTutQ== - - - 7AN7i1s8vSKSCo+oV0RST2ZR2FrYSbr9QGVysjq+uzpeHW3H9sxW7Dit3VbYp73QQWYrdnyQLUK4 -Emy9vesRy3Uvom/0ijY4XdeH3OwtTGU9I4cKj6hX5NCO2szUeGW0OlGdnL25MtVDwmiiAk0VPivu -BesoKLk/pcyPJPVj0VHrn4prrQ68m/dVt/Pvwh66nuF57WWz7AGetx2vMd/s2Eev8Ls21qHL90jx -e8i9mLCksFuhZxhA4REtAQPolt23r62QrX218fF2QtLGl2FZi2+ueFy++1s0+gUH2FBrGUL/J6uV -wnHiYMKO3lwfKz68uMIyOGknC9NkZXR0bmKudeRAcuESVTo+tumqNkwKD29srDZbu6eNwfkK3SsA -903XJ4rzEQ3ceTd6C/sicSbd6rJG8lB6bjncYoUl3Wy9uDFZX4aBVMbvrRwqvDCgWsxWpttSRQx8 -503kwmPai+8VFj9tM9DLZJJUJmsTlWVLDdureeiGw0EwTJdZdqN9FwxTfES94v0YBMN0ibu3DdLq -8m0/eHox67nqtWiY4ikQey0cZrTvwmGKj6hXhNIgHCZ3TQbhMJ0ZZGFLojfCYfpHs2iD03V9OMxo -34XDFB9Rr8ihQThMzop0SzgMOVrCYdrYV93Ov/suHKb4iHqF5/VmOEwb69Dle6Svw2FG+y4cpviI -eoUBLNb5T+9E87Sxhu0yj2Vaw17MGthGYNlgFZYuVOBoXoSlQ2CZOu/9pI1bb9yzQye42dOed6HP -Ak6LO4sGWYsQn2VPxrbUCcCXi5u2kydnwNHm52jyaOZohQc/4GgDjjbgaF3O0a6bhoKBitZXDK2K -azrgZwN+dtTys4GCNuBnA3424Ge9z8+Shzp72juz7jO2Vnjwi3K+2htneINtU2TbqKN52xQe/GDb -HOXbRgQlUTgGz4z3tjbC8BI1Oq5oHV1vU+2q3Vcd3zVeObSnvVuPfcb5pqsT9VaJJHor10ttcqy6 -rzZZK+6tnq5OVSuzO9rI2JCo0fHxFWQqvZ7IZmYKU9kUHeMgkc0gkc2SXxrto+Qvg5wpC8yZ0mmi -K5EtNCgRAX8HJfh/C/wM/26BL0pLfhVkWQyV4gliukWH6sMHCjtrEHc6FreNl9R7JVK/nTEdbbH6 -HTdA+vEYpi0C63LutsAjpa6/dF2fmKrPgOF761wLjrUI/G2ZeMJ2N8YeYgiF/YUHWxzfJBYCQbv3 -9t7BFuFCyYGw5TATCg+kxZCTAyFdvSLFmdfB5eBdlena7IGJ6mxxftxLwnMhnLk3hGibVk8vidCl -z+/YyzK0d444FrSmPRNANLgAODhObkqag+Pkzh8nt5evcHCcPDhOHhwnD95FGRwn57OTwXHy4Dh5 -cJy8qOomHijTYEtbqufgCLkLnSnd7R8aHCEPjpAHR8hL7NYfq+3bNzdT3V6fBBE5WZzIMvW69+TC -7IfdbSUjT9Xp+NAOVcfH6/cWHd94bf+BWfh+eBRzkxYeYmO1zusShfn73PQ+UOLbW8F0pe7mhV0u -iO1e7zdx1eaw+vi93oHTrdecbu3w/IHnbeB56/zY+tnz1k+v+A48b73heTM2wZb909Xq5BbQLqtb -QMbV9te33FOrj1dnt0xXx7bUpyuT+wtvuYFLbmlXTBZ2jlbH4Ze2vFeJGp1nf2HhgVVeWpuYm23x -EGSSqTv4ZfP37Khpf8YI6lfLFRGzwxgmI1bH6yGSJ8Vt+qnqKKgm09fdNwVKUBuOp2zFZTh5a3eU -bbvXshWXQYFrYfD2vgeqDXIduKCW1QXl9kN3XEzpFnY78NsM/DYDv83AbzPw2wz8NgO/TXf6bayX -xvhtrBNHu28Gfpt6dxqxA7/NkfhtlkOh6rego25wQu22FlcPeqH6M3/GAkzgbrfq+/IGcHe5KpaE -NwxyaJSWL4dG8YF0eQ6N4qknujyHRvEVGeTQ6Pt3QLo8iLHrxed4bXZXpdbqqGwgO7uTwXW57Bzk -n+o22TnIP9UTsrNdrtztYnNBxnSviM5B3qkjm/tuEbttr+cg51Q7CCxT572fc+roSsy0+0BlrH7v -0f3ITx9mFyicZWuQXaC7lIAevZFf+GHNsUPFI08OLQNtFR9IC7mQHMh9Xb5Jup2b1fftm6nO4paY -ro61xad7bfvfqkd6dBgAC1/VfrQEumVV+vs98YFp1sumGWHBxqIkeaDaOnYqQZYOvPMuYl58TPfW -xtoIW7PQnZfWR6MBvQRpjTs8lmEiChNicd13OVTfdkZS3Bw5NHBqLLMZIAdOjd60anrUqRH2i1Oj -+EAGTo0eMH97bfsPnBpHqw3dLasycGoMnBrd6tQ4yszl2UobQWT9eNq8b7oyOlsZv6VeKx7YbCoX -XGPXU4fHNbp0gTydDj8tF86cs7cyU71+uvqSuerkaHEjoKFWxwc4Wd89W5sdbeFKTNrTCH17bbyN -i9mpOp33qhYOIZ6cm7gV9uM9bQwtWaXz26ywp7FXMlUXH9EgSfUg2VHXJDtqg/UPch3NO7xBrqMl -Yil9m+uoDQ1t33R9ojir1MAdH04/ZW4KyoVftpqtF7dp6sswlI4loVoWx1Hx1EVL4jS6fW5679w4 -yM5e8iP2Z+6VNhTwLrfcO5NyZZn8vO3cDxu4WvO9An0YP9bGmAbxY93nEI/l4J4Wt/J7IIasOCl2 -dwRZ8XH0bfzYbFI/65tDiqAcDHz79d727ReOZuo11z5uuX6NARqYe/VuMffaIbOBwTcw+AYGXx5p -DAy+gcF3pAZfYVV0YPB1zTj61uDr17i0oFw4p8PA4utOi6/wAg4svoHFN7D4jojMBhbfwOLrZYtP -9KHF18aYBhZf91l8d9brY/unK8VlS9eae8OkXwy+dkbStyZfX74ZUdhYGGSJ6I77H21d6u+RN+56 -NOPFII3nfAMZZLw4Qq2v8xkvlmWE/cbMjjx/R6dd2eOgcZtH6K/eO14ZPbilZIrqU5XR2uyhq9vw -Cc/MHhov7uO20J0P4cax9ttuamtQvbKZrkdC7KG91J8e0fZIq2/lave/+tP/OsOMTiC6vR95XS++ -Blg4i4l9m3J7fVI/Z17cjGis13l/cntbaPdopQ0NKFWn40O790Ab+QbG7ePvwwWkQWKEjdU6f124 -sO46N72vMlptbwHTlQYG7xGMpc3na3tFYrX7Km//Zm2RhdMMVcfhl7Y8zYkanZcQrDCPqby0NjHX -xpGjh+/4oDTfXs5cQ0uiY+2oaTVixB5lL0fUAOCgGcKIFYy9pO0V3sDuTdXr7puqT1bb0PeyFbtX -4XO4tq3UZisOVL+B6ncUq34LeIJ5CQM8u4XdDvSlXtOXBurS4uOw2/KGHtSX+vM0YAHMutvlT2fC -pLt/nXrt1kQvuswLC/WDLU7dEwuBoJ2/KlZ4IC1S9SQHwrrZ4DvYAjI5ENLVK1Kcdx1cDtZVma7N -HpiotvH2QS8J0L4MJG7Xzd314nO8NrurUmvl1RnIzu5kcF0uO4uLnC6XncVXpMtlZ/EVGcjOZZSd -7XLlbhebCzKmB6KzD0Rn7/ihB680dqMutOScsAfWYukQ6CFC6NdURH34Jvsgn27DKHsvu1L/vpV3 -e9s5rHtNb+vJJEsTFWiqcMqPXmDspBTYP3k/+ZKiQ9Y/Fd9jDrwH9le3i7OdUHWmdcxU7zIMfc/o -ZrcBe4Vj9KHi1NdpSjp6X2+ZdlKPpvgYLqyvd3uOj+G+SfLREUdUh8d0a+cv7i4TI+i59Bj9GcTX -turWvzuo+89T8LwBR3Z7HydA7sVwhIWsS7fvI1L8sehe1LWTS1b4dmOv7aUeVbb7TiYhsd21rzp9 -fW26G1wk3bLOs5W9xde4FxyatFT4UECP/Y72PJapOsuXimtucvS2HuImfUdlZVUKSkcHne0c0Nky -0hk5WtjZtuUKMdHGDqY3uH26Mjmzr8ArEt1D7/3pD1mIqtbt6ucC75n0gjfEDK1L9OqBP8SujI6c -2zo+3gVr0i1TsjBiHcRqtoPAMnXe1vNPG7feSII9102O+WegsEhgyZ5b6pO7oAmdKmfYFG+r7q9N -Jr8YumVKt8HNV7sPTeytjw9t2laZvnwoKG2F/++6F3+oDs3BP7cOxRE1dx2CX26CH14MRfeWeOnm -0ovuDkpjWOW2IRmWpZJhYD+0RGiZyZBE9lOayAFh5ZAq4gp4SaqyiJiKC4goB0GkXCNhScoyFaEv -kFmI7UPDrYFGAAj74tKVqSzQcGuEc0Aaho3oNMIMGyDqSgw+Wahsb404D+cg3Tj4LMz2ISnKoaQ0 -US1niqA3EsVDyQPKRZqzQMVDywEh5UgRD0IQn1bTODK0bS/ssk3Pn8QdMVbaP10Zq4HeWwrl5aXh -oBwQriIKxDkcAcWWA0pZZCnX/b1t/xDAuU6ZUpGAKWVBWUZEsTAUgC2FEsJJmQkmNRjFkriaZFzS -SJSGFeAKq8PsGkalkHNZjgQLeRTRiPPSXRPJ7kRAOa4gg+mRTGogO6dtd0c4he6ULHNBFAUyUry0 -bTTZG8EFiErDlJelkKGgEQNIbKit3uz0ExwcLUdhGCggSOxtKcamewtD7I2EZcaggmBcSIWD2wdc -Zts2JEko8VuClYCWCElzmQwILXMaJpgK7BAWGaQsBCAeEZqAADoPYVwxOTZC4LZGIM4j33cGaESz -ohZ9DWuElYhLMgjngDQMe/tQFmZYA8kGfLJQ2d4acdabOqK+JeApmcFnYTSXSU9jFgi4TOveMkua -RToHpHH021tTT1Muw4XmMoxTxYjnMiyMYDPMx2VkyCSBjcCgZ9xJAaOcAKnjIMNyROzWIESltgZl -UnGltwYtB5xFZggStobgZdhtFLa/YhkuoyQBtjfMojKwCoIwnAGDWEhvlCBPi2gZNqnCOhRESYrL -AB8iIGeguzKRsL0JiRggGYYLGxzDwTGgBSVg27NQsjSbCXggFTYVlQMRRlLA1AJPYwvrjobYXQDz -hFNEgSwy3SGDQukJyw6SUglGcN5lm92FRlJid8AMiQqhUR6EUUNvguoZR6oF4R0IELIE+hML6o0j -DwXBFgoBvCaIeKgauiOECdwktCxoGEQMRCEHqdHuXIZmbEgpBGhOQq+EBUw1zOUi0aXpTeFUEllW -PGDQE48YTQgIp7nC1zClPAQxQ0FolQIQXwK2IyWhJBQIqYQdwcAjIRSHMiV1CaUhaAKAHNAh1uLw -P3zHYUlCkFEgSbEEZKqk0EMQhQEDteOuytCwUKBIqJRKBcoa8ToNESCchiUpcyBzV8hyoEbyoATw -nkaobI/FoHJ63AdwrBzBfi/RMgEe6cCBxUzktJEBKtqR72beL3Oa35fTgShHQSOqmanLAOXNb6Hx -FALK6W7f0POHotKmy0t33Qk/bdwDpvRsymOwcY8z/cEwY7vA8K5OT2Li2unZ260RuXFPUNq8rV4f -T8NMogt851xtzBjpG/eIbEO3gZ03MzutAyXi5sCS3OOxio1KYw7mG4ilm+tzM9XSjg== - - - +r2TTWzFMgeWQ4jgsKWlUAq2CvyA3DaETaZA9GEJsGAK2xbkBSjpIW47IkA2gmiD+UJKgA3m9xbB -vYYlisL3AYkkKKEgLKDE/giqPH6Fm3BgrA6M1eZAHTRW93XWUiHzQDhLhXllXR2RpRIm28m3VFIg -TSyVJExzSyUNtXBLhaXaaWapkPka6hFLhV2ODJWBOmusFFB8uBKUzWumgEqGWtwwFaDaKOS6oBez -WEHjTkGTGQUNRblXrVHJ5cDOqQpgW4OG3mCfMPTLQDegwgeCIIwEG7/tbkxbqOQqBr1BOTpCYPui -fYLjPlKsUXtdrHYSSjcsHIHhc1hbiuorQQ00tpcWrR+YD6mwH7ApQJkNBGrBot1ptpYLmhJRWYCE -Bh6sRKP3B3pTKLOhNyIFlyC3wZABqb2g3iR6thhQIQvBbqFUkEarDKw+SbRVphRVMhJMCtDKF9Qb -aGeoP5RBgZBg/zAaNXS3SARrDJdIQG8U9RYwYjhoL0wmDReYPrBCAgVthiHap7BzI8WUAPYB4kYG -qBdFEnQmaBawpdAYbnWoFQDtw9Qo3BMwL2m1CBpOaU4IQtIGzMB+GdgvTXEy9kuvWi1zs7P1XGtF -/0NKW6es5UIpaKqMAlOWDMQhiEi9UaSIBGi1IWEwG7jfZNLwJ9ppkNhtAYKQeK9haTuGCQnLoQLR -EG8c5BfCK9EhcPGJLBRwQ1BemIOSugC4h6fOElRRIbA3bA+kQZD9ZnQIFRGQ/Ml2XS0SlUMYbrYj -/00Ootii+xaahk79djGernRnCAzqunMXE5aDbBZmdCgz1ixQdloz+BSZecOsXZ4B/ANLS1Q5Ejxw -cFGTJWuEisogO4T7VUksCKPYMQ+tKzB7kmqhmY6Y5YA1nYHBOQcREDDflcppCAYbyaTZlcEmC9Jk -gTNg2H1EYiRLWYRwgUBF8f1FeUPLAo0OZeYoC5RdjgxCRVYMl5okN+1gmftzmcGMclt624Fci4oQ -cXli0zdYUTAzXBJONbpERiVjODSWgi6oQBcMFEMtkMGPEXQPymaj3xplB0XLAFRtGC+6oKGhCM+V -QRVkjGufGmi+KpKgKhKwfErGymv0mMmUlmfc1kk/NkkKJoI0ju55GS+yPsBNTRl6LRBIeAkgjF0e -qFhnECUOhCg8Q6ZmcRo8PzAu0G3xNAeR830qpDaBzn1PyHgsAlCCxD1QXSJjQRSZg0yYam+ehwaG -eJZOeM54oDdsO/QlIQoHVSaKRK4eLWmMYlcInmXgeQdPORrciPAbMF6gaZwH7sUXMbXAik/QsZ5y -r37p2YTOifAN01KBVdkOZJSroW2+uTJzUP/kFbEbJ++pTs9Wxxr0s+3jtampGr6KkireUZtBZc1C -33WN/g5IdeOeOfPjlP4nwSg37tGBR9fXxqtXu1+0TnZbZUZHK+0B7Q3IbSeihzf4dGTpodJdt0DB -izw5woYJuT4SLN1dorwEqwfNH2gOg0UGzvwdJvYqL2HtANHZqHHZUZmtXF1iLBq668aTjlnQ5+Jw -2w3PGxl53g3bwovj0tJzf3H65b91/xvf+PpXv2LmRVsutMUXPW/8VQ986G8+8dBDn/zohx74jYM3 -lnTx+u213/pfH/3Hr/3bd77zb1/7x4/+8auqW9dj+aW/cO/v/cVnvv7YE08//cRjX//0n715dtdG -LL9k1z2/+2d//7XvPvHTnz7x6Fcf+uAbZ265BMvP3nbgN97x15/+8rcfeeTbX/70h9/6yr3/Zb3p -d2f1V9/0nr9+8O/+7sG//JM3HNq7wyF0Pt9Z/ZVXve4Nb3jtr9/zy9ez8xMD27Tl+ptGRm7cEV66 -sIk5BmcZtHKcY6SZGxwVQJmngVvy6ZXE5kJUun7upS89VEIKTij/G/egMeJNgD13XQl/Afz0rAHy -LYzUJg86ut2iG9zT0JRR/JeT4c5jCWiIsSHpz42wT+wmtiKCJEDasNHAcT/JHdm4H91utHvxtp3b -cCumNlmkAw8kbDIelURgNmITCCwyUObvsISuR6LS+zC5C0EkMtyGP1/oZ35qXHCzi45Jh9Fb0N5d -KsSOEJnFRWwRkVkUxJYInwVjtaT4LACrDuDTFlYdw6cgVh3GpyVWy4LPPFgtIz7NsFpujBpRWm50 -7KebUVpuRFKfAUpFPt2GzzFdidLgM/gMPoPP4DP4LNan28RcdyonA5RafrpN/e5mC6VLsOp+a3fZ -scrFZxmxmgefZcGqJT4dxqogPh3Dqi18OoDVAvBZUqwWjM9SIHbkyCwiYouLzBEitnTItIXeIje7 -wn+KzMGKFSuPPfY4/Tn22JUtKwH08SesPunkNfA5+aQTVx1/3Mr5qiD46jWnnbn+3PM2bDjv3PXP -OX3tSauOh36ag5+49ozzNg7z8OotW64Oefmy0vrTh1Y3qbJi5fGrh848/wp1/W2/uLe6f/++vXff -ftO19LINZ0CVnBorjj3h5HUbroied3f9Zb91/5ve/OY3vf7Vr7hn/503hFdsWHfyCcc21lhx7Kq1 -Z1+qbtoz+5t/+N6//NiDH//4gx/7qw/+0Rtf+ZK7b1KXnr12VUONFceuPvW84W0vnP7NB/7sE5/7 -8je+9a//+i/f+MoXPv2xD771VS95wbbh805dnaqB8BvIjdWXv+VPP/lP33rkez96/Mc/fvxHP3j0 -377+8Cf+9C0vr95INqRqAD6nbqAjB1/9rv/z8Le++6P//MnTz8Dn6Z8+9cQPvvPNh//2Xa8+OEI3 -nBpjtWLlCWvPIyMTv/OBh776yA+f/OnhZ3+mP88efuanT/7wka8+9IHfmRgh5609wc3VyuNPPnv4 -xoO/86HPfPOxJxDc0RnW+ekTj33zMx/6nYM3Dp998nEr3ADWXbqt+uoPfOZb33/ymRjc1Hn2mSe/ -/63PfODV1W2XrrPDWHn80Ab1wpe/66Fvfv+pRnhd46nvf/Ohd/3aXeK8NcevMB2cccVNL3nL3371 -sSefaQTXVZ558rGvfOz3J6+/7PRVOIoVx685T939Gx/6/H888cyzuVvm2Wee+I9/fP8r7qTrT8JR -rFx12sbr62/5+Dd/+NMMPg6rn/zgax994/5rS2sBJ8DozOHbXvbezz3yn7kIGaSe+LdP/9E9N20C -nKDCSev5L/7Wh7/0vZ/kI4QVDj/13S988BXP3/ycE49dseK4k88NR+//6Dd+9HSzDmAUP/3BV/7q -1Xfz9SdhhTXnXb3vTQ9+6/GmGEEXT//oGx97/Wh4LqwdVNjw3P1v/vi//ni+Cs88/i8PvmnflvPW -2AoHfvcTLSr8+F8//ub9z93QToVP/O6BI6jQegwplM7bArP0L/POUmrQuA6v/9i865CaVlzpu1/9 -V1/5/k+brjQs3PfjhTv2xOeUb3/5B77w3ScPN6Wlw09+9wsfePntZSQNoNbTL7tp7h2f+vaPm+L0 -s6d//O1PvWPuJtwQuB/WXnBN9f6PfPl7TzXpAmjve1/+yP3Vay5A8kZyPTvY/avv+vS3H386d0P8 -7NmnH//2p9/1q7uDs0/CTb0CdtAlW/ff/5df/M5/5m65Z5/5z+988S/v37/1ktP0Fj0GJnZ9sOve -Bx782mMZpmHYxmNfe/CBe3cF6y2fAT52aunqu1/57k9983u5bOZ73/zUu19599WlUx0nW3HciWds -2rHv1R/49DcMI3N1LCP7xqc/8Op9OzadcaJlZChK1qwv33Twte83rPIZyys9q3z/aw/eVF6/JhYr -mrkGyIz/9uFvfucHTzz106cbmXGQYK2GfZ+yIdDs/hMPf/3fHv0B8PsUuw82nLKqUUCcAgLlBS95 -1Vs/+LFPf+Er3/iXf0kLlFNWZ0SQEVl3v+SVb/yjD/4VyKz5RZYXiuENd+6/5xWvfv2bWglFK3bP -2HAZvfam2+/eW91XbSF2rR4wdPr60mVllOwtBbutsuqktac/B3SH81qrDrrKipXHHb/qRK2dFFBO -TBWv/xRRf3yl5gpWHHyIoYfpwMNbEld+BtH9g+h+jO7nNoFcoNtgIjTxnTISudH+hOGVyzAII8Z9 -sH+q0MT6cwwCjaROniYw6QUPQrzx6UP+m1yq60zI9mLFaOv7wSIs3V0SrCTyY7RjGCwycObvAjHa -NJRi4UHay/o58Nq3PPAO+Dzwlte8uGCN17/ni489+fQzhw8/8/STj/3T+163v2WVF//hFx47nJTG -hx/90vveMG9/+9/yTz/KKgmHv//5P2ze3fRD389Xdn7+/U/MNakz89mnm9T5+c+f+Vx+rZnPNVfc -QJH5zH15df5hvjqgcXw+29f8/Zi+7m2zH13rczPpefvH1nVgNv4uOfP7/+6ZAnV+/vPH3pKo9LZm -69P4+ee6r3Pg8wXr/PyJt/pKr/9e0Uo//3zVVXrv4dbQ9vPd1zrsvli4zs+fer+t9NrHilf6+f9n -Z/0tT7ZR6dHXmEpvb07c2c+Tf2AqvaPYyprP0w+YSv+z+OQBKb1jAZUOL6jS/+xYpXcsYPbcRDzQ -zjq5KW+LItzivqYd2nvMkvmL/6mNSg87NvHe4jPxkz9xm/B13y1c6ZH7XaWx4vj9Y80ziQceL1jn -sd+PWdhE0Q3/2YkE4/v9RwvVeSTJLI8Z+1QRtvyTT9SSlY65dx6B5j6HP50WAChqWtV59rP3HNP4 -OfQP8/f17GfzBOjsvBz92c82ijTb12eealrnmc80E+8veeiHTep87//ONqlzzDEH3/L572Z7e+o7 -//DWeXWd6us+8KXvJ3nGM9/93J/cX5uviv7U3vjeLzzy+JM/+clPnvzRI59/72sLKmLHVH/7D972 -9re//W1/8Nut++jCT+9cwUPVnxa4DRekb8OxUiqhRt5VuIylTwaW/tFt6ZvcaGjoB2UaMYE0Uaac -52SKh06pECqghDPBSWgt/cZSNPUJLAYPo0An5qIEExoyESYv9/ff1eyIuWvXnOJ/uWY/S17NNnDm -vwJmP1FSdczsL3hcu2KFP6htceZ63PEnrF69+sQTV69edQL6QJvDrT7x5KG1p5xyytq1a04+cXUT -2BXHHr/6pDWnnHb6ujOfc+aZ604/de2aE1cdn+MXXnncCSeuOeX0M89af8455557zvqzzzrztFPW -nHjCcSszgKtOGjrtzLPPOW/DBReUShecv+G8cwB26KRVDaArjtMu4HPOO7900cWXwOfii0rnn2d8 -wcelHeUnAOBZ555fuviSSy/bBJ/LLr3kotKGc84C0JQPe+XxJw4h4IWXXLrpyquGh4evuuqKTZde -cuH5556F/uiVib5XrzntOeecf9HGy668qrwZ2cHm8lVXXAag5zzntDWJ/lcef9IpZ67fcOHGTVeW -NxPK4EPJ5uErAXTD+jNPOdE3ik2eftZ5pUsuu7IcUCaElIIzGpQBtHTeWdCow3TF8Seecib0fekV -w5j1W6kwVJiLLRi+4tKLzl+/bq0/uFh5wsmnYZObrtqMgDZLteRk81XQ6LnPOfWkEw== - - - VtopWrXm9LM3QJNlwoSKrsYT9qsxszg0uvHC88723QOaa9etP//iy67EJvEk/rnP3bIlCqHR8pW6 -+6HVx3nIM8+54OLLoHNsEgABFBrldPOVl12MiHpIHFAS8tprNaSggOjF55+TgCzeJuB5TkE8h05f -33TsG84+3Y8dZil3PgHNTXo+T3bLicv+HEC0yRqdufbE491qQvfrzk6vu4jX/fQ1q/0x1LGrTj5V -Ex3QUuBpqXzlpo2alhK0jIcwQMgXIOiwo08guo0XASmfBk16UsbNcQr0f8FFl1x2hab54auu3HTZ -JRddADQPWCa2x8rjVp8MoLA9Lt542aYr4LPpso0Xw+Y4e90pJ6e2HB4CrTkVQDdccOHFl2yEzyUX -X3gBbDgAXJ3exhr0lHXPWQ+wpQvhU7pgAx7oaMDG46vjV5+89jRkIXjsc96555x91rrTcLdnWBO0 -ugrYzWnAlc46++yzzjoT4IAx5fEwzepOWrP2lFNPO/300049ZWhNU2YHGBx3/Cof4bJ61fHH5XA6 -C7piJQCfsMrw2fm5sgu0ObYFmAMuGr9z5J/eUdZvbTd9RVoro0eqlZk3YFIpMRQvbgeUgyAMSaTw -4YpQ6Iz/UURB1eUCs9pRgin/Isw9FGEC3JARnbBcK7gRkQqV8ghTj0fZjJrJXCAUE59DJ8mHAzK5 -Pwgp47MDCb0/KPMgkS4IzZAMDC9zaM2rwrLMKI9T32kLI5Hnr9H4cIn+VJmxMM7ix+NqhJaB13qd -nWV6zIFoxBvtjEYgRFSmEjhlcMBUvrG1wHINqAzM6FBmCjIwmVnMINN6LUb7M8OS0glwQUVnYIUH -+RmWPAwWGTjzdwE1XgZs8bT40y/YCAJx08bS6ZmvTi0NX3vT7jtf8II7f+Gma6+68LTkd2tLcucd -Y1P3vezXfu1l902N3bFTXDAUV7xq6x0H7v0f9//e297+9rf+3uv+n3sPPP+/Xumqr9m0/YX1l9// -tvf86V9+5CMf/tM/eev9vzb5gu2b1phvz736jolXvPGdf/rRT/79Zz/795/8mw+98w0vH39+dK7+ -8qQrdlbue80DH/rYpz7/z1/60hc/99BHP/jAb99X2XmFnovTycj+l73hf/3vT/zDP3/1G1//6hc/ -+/G/+OM3vGz/CNEjOz0Yqf7q6//4Lz7+2S9+5etf+8o/febBP3/n63+1ar89adN1vzT3W3/4vo98 -8rMPf/GLD3/2k3/93rf85twvXbfJzPI5atf+//bat733w3/7yYce+uTf/u/3/OFv/8r+XfIcO6JL -rv6F/fe96s3veM+H/vzPP/Set7/pN+4Z23X1xWvcgC8QN9098Su//to3//7vv/l1v37o4Itu4OfH -k3XMaZdEN905Wp+779BcffSOG9QlqYkGzC+86tqbdt1++64btlx1YXaVjjlm3QWXXHrpJeeva7HS -RT89JTm7Svq0k3kqSgncqLnjDedEs6tiTrYcuCVzs23c01FHG3bXUVcbEGoHnW0b90w2kYbulViQ -QVtvLG2dm62XzE6svTTxvKrbKWP1vdU9uF9u3TtTnb6nOrbnedVDewyQTQ29ubGHht9NIyXz/nl9 -eiLxjiqRpol5QFpDkKAlCCMtQSi9PD3oGydnZiuTo9U9yLv23LgDOMZUkwEPRwK2tsDXuUyWbN/B -1fDDWH2iNFNNsB836iNtZ5GacfN3pO24ST7SdjIrgeR33X3V0TlsNb0uCQ5OAHyyPokpI+d7x2lh -+clbPKzkjzHwFaQk822eRjwqc55+DKesaIIVSDQuGoGAXUgqSpop0cRLPsgngzD57glIpTDOARsx -mYUxJxuhSj07k2kIcABFPCUANA7ZL7IjMOnFG6FoWRDm2ZUoZbEY1j76hmS0jePJAulE4+mJyQLl -THwjQgXWpshpBg1M2GKgzHoE0mSlVLgYmdOMqEwVISGgAbMvhT3NaCw1pxmhCiQHlQPVfnzRFeRC -wBOnGQPi6n/iutw8hqhfSaSYyhTfVMbn2/JIKwy5UFwqIahUnrTSpYa0BJjjsEbKpMDGh00CLnlO -GuzFTV/Ky8K8nCrwwErifzkpTFNQ+shKxv+1TmMqmSALSWNa3Nppt+VFR2DpUDoSHBYRmUVB48jx -WVw0FozMUqCxAGSWDo22kFlqNAoi0xk0WiLTSTTmQabzaOQis1xodBUmx3RTsp7uweSYbkqr1CVo -HNNNmAw+g8/gM/gMPkfDp6tk8QCThk+XqG1dqFF3lb2zXJjk2oDLgkwzTDqMzDxodBKZlmh0BpmC -aCw1Mm2hsXTILACNRcfnSHBYRGQWBY0jwWdxEVgAVovT5ooVK/2nRXT0ipXHrl677gz7Wbd29TyJ -gzAt01mXXfO8W3fpz63Pu+ays05Z1XhnxX5Wrlq38drdE/e/+4P28+77J2577oVrcoPEj11z0fba -/e9/8Ev//qj9/PuXHnzfa140fEZO88eu2fTC+z/ypUd++NThZ+3n8FM//I/Pv3Ny+0Vrjs0AX/5L -Dzz86FOHk8mwfvbsMz/++t/c/8JNDeAI/I5/fjyb/+vZnzz68AO/dHkK3AD/OO+C8s8OP/7P70iB -zwOMzf8YwDetcUNduWbTPMAa/IEXXrTKJvBaddELH5gHGMAff/j+7esMLseu237/w4/Pe6n68KMf -qV26WqcfW7Wx9pFH588A8LOnvvzm63TjK0+59v4vPdU8AZxp/LGP1DYi5seetft9j7RKLvCzp750 -/7WnrDxmxerLJh78Ycur4Icfed/us449ZsXaa1ojAtPywwcnLlu9YuW6573731tnOUBUrlm7YuUZ -uz7waIE76Yf//d3PW7cSoD9YBPrZRz+w64w2oD/YNdAW73bmpK35LriWP/vRxydhLQvSybOP/fmd -648tSIOI9si6lQXp26Jt985jLRrHraZ3A+zL69785fkbf/bHfhuvWH1pi435s598/Z0vciyi5aY/ -/Oj/Ozns2E8rhoLsZMcZnrUZZpXDMzUawAhjVpXgx3kZPg2Tjdmg5/V/8/UfH86kMmzCwC/aPvlO -w+5/5kCbC4eVq84YfhGIkv947EdGlgDoI80Fzwojpt795x83cgpk1Ptf31yoaRF4zcidk0YGgvzb -fe08AlNnJFx3tpGvRrbOJ4zNRSkru+eX28kaTXWC+dPxNburryPcigTqTPRxoE7vB1G1DjWy2fco -zElQpibSKIwE9mxDiUpEwsSVBZcR/EiZLHPBiIk+GmYwglAQIRQNObHhR5lCjD7C59kpPuGMUT6c -lmVAA5LOxxcHuucGd24aZhhXLyKWiOzdtm3r6OjcxG312QrCpoL+ocvmt9MwRLwIeefDLSGBb9zT -QRKHzpaYyE3k/9KS+XLFw5c231Kfva06Wp8egz11lR7r/Ltm823VyvjNFWjxPn2bZfvWG3farXg7 -xkybr3JCpGFsu2cPjVf3xP3bqPf2dkUcSK1y3y23/9zq+QbRfxL3V/RmYuVIqPi2A97d4GWmaGrr -5ADRcsRYYuFpmYTCU4bA5YX1ldKDmG0TkPhCYSBzgICZYlPSNxXmtQQI+V/NxsoglAfTODLoLAdK -lEMS8BgqByFZjlToRkJI/tAagUaHciapEShnqhvxKbBkeMuyL9KiKmWCSQMdTIpxs/mXK9NwuljD -mr+L5EmhLS5YfhiTdP3sRx/Gn39gNNcf4M9WyT+MP9uMjo9qeJ0a9Ht/bWp/5LHvf2Q+xa93LuAt -MM/U8tDiklz27R6a3MC37rxhm9iAP9MXTP3Kf3vJixj+fPWBV97/+v/x4i34M/ull73mNf/9lzn+ -fMF//eWXvGTPfymZ2lc897lXHNU0maKPZlcwCwnIXLClE5GgnnRSSEJ3HRWTG/d0UFB2UOVs0NvC -xbwAd0N9opp75y199a2s0GaDSQqo5KG+BR1EoPxTSkQYSkLwNjWHWcPkbFQoIiTXV1gCqrgE9Tfi -gbJ53SUUCXdhGutJe23alPKMrjnfRTtSloCEWxi8wFuWKWqaGBJlCSj5tQOikGVBA7/AgpdGcoDA -aBGhjBwUBSAG9k4Y+s54QaCwLILERWQCQJqiKY8pWhkLkjJ/HVohWOvxAVBUBis7vqEsigHp7uKm -NRBFGz3esFExIFFmAXeGZ6gQiEC1ML5XTQvB5HQWlRVhycksApMz/CLzuM95wRrsHmBilIcxf4hK -vByoVP6SCUzpQgX3WEQkCzSSA4QZd4QvIFIgVKa/YlA5He5DapShpzOSg9bEkMKi+Bo+y2spA5OH -U6azQkC5eLd0BrXL6G6cRPPaWMPz8Lvq0BW9wPdgEwJmfj1AIJIyE6lMCRMaSCR2BspRqoSfe84F -FnGSyDcgqX6EI4gdLMDL8F4rOmEcl+OYAwFWLUYgQk8PAVGbSPxjNplIuJYE6DJSqlhAa+mfzJEA -fTEYCE+1AhTDEh4glL5AMzzeSCEAcbwomeTpvEzTMzQsyjDhPqcQdJ4F0cmM0qPKAoVlElDfFXSO -W5F4EAbCI8KrlomZh4mgxPvSGAJEqWmHjmCSRZyyiTKmRUIQxn0z7fwKIj+BkWkpillKqPUpoClf -hyCIpAmRZJwlkvHYn6iBiAz9GgvdUIPWF4IWFCXZF4IEwk8pwyvMZcVin6CwnWWhGlYdYELOYiEp -cC0k+ojdfEgkBCZI0vMHMIQpl3yKEGZcM2GQkHQRLrxUkU9RhWohL+OWTsPwSPgVCnQJIQnizYOB -3gCDKDE2mteSArU0NZEZtLMgmJ5L+OUwqYozQEAfwJTj/CF6QSKWQhpza3HfmXHbchIlNg/JAcLd -zLj0JdaiSAMB3Uc0tZsBRBDiQVAoKZHSfRBnzpKSV6cQIyymfKRFENV+CUG24chTOgfMRYMOlwUR -oJuJuEBAT1kgoJYoVvYBSJY5LKMnMoFzCns3wf1AmSFKpigshxuCFZGaZS06Yv88B7sCD0HicROl -ZYLXUkC+hHjtW6WVJOBQCf2HaMaB6qWnFODqwCXwOAdI3e8WAduVAk15UsU5y4LAFlPCtNnwDZhA -IvIbm+nxsATXw0eFgFUGqX1OypSGyRFmQAx7kDEvUnntZMQdLxOekBI8BwQKJPXzDXxwexGxOQ7K -BwqTBBUDRaIjP6HIKJSuGSBVhvVwMxQqLdxARfOsmIYAQgmNl0rPUIIVgA6RBcHFIDxWmUCwZIFA -wKjEHIalEAgnRScZCBhTWu/CPd8AA/uZEO6bYTmLrrlC6KdQq9+gCfntwWgWRC+6SEvwbDuZCQbW -AZB+f0Q5IJmFQpf2Fc83ubMKuBbbVSt3VyvTowfm1yjTxyrdqlKiiRR58tVZGjkLE1wZz3MY8CdP -MZpfKeHpBQgOdHfaUA0pJvIf5DpAU3ge7OhD2zcysfJ4Cg3LGDt8KJ6hAedOpdca1UZ0Q2os0H1A -nHqoEDOxsQQI2L0s5coR2HKDLsIxq4sfFUfGEZVZyJJiDIxO5X1GoR44Qb2Z+XFxkw== - - - xDLWICIkcSEVSxQAeiqx+0sEZE0qIVmEeymJC2xSVJUCFbcCahlTKWYAgoXEsy5LqtHEarnY25vl -2wxslifcGqXR+sRUfW5yrDRzoDJVLU3Ux6oJl1VLG44UbyvjZk3464nL0Xmr/rvBfIfvW1M2ALWe -syLz3mL1tpueWkCNGKRb0UpLemtNtRqflvSP+BTYSMX2Y8uNvV331hJMT1JrTtKaHRXgatuLUBEi -1GTTFCP0TWhmg/hShQ7yG09CfKbarfpvEEXzHWrlCwJd8baiW6aQOECnfKcEwsY9HRQJmPGxtVDQ -wTwdEQuasXRCMDQ9+WhDNOQQLxLqpl2V2QP7apNj1enS7rnabPVyS7V37VoECdLFypfN+UrSmdMb -3JKktGNIK9cpF/JwqHPEuQ8YrNo2YVF8ECatq4B5t4iupkiYcrjknCMEYB0nzCP0XKhAOocDoeYF -JXTpxsYYR6NamOAtoFsVxlsL88UDqbtfqfGEpbYjbtiIprgBdCHKuMF8GVrgQRxQhr4hNF3izQjM -CKaAJDYVOqOF5jRJDqWDa6RKWPc6TK7BHiWYTC3lLJMZp2CBdRnVkY47UG+VgYx3IUZNljlJ7G8R -GvctEwmzT+HMcJZ0ncO8pHY8sjIYnm8IfSnotEvF3pVDyv2WJ8TGoUZJpweSvBIeiKGHCrkUsDGP -Na5yko+FmoKQj3tstM8VuFOCnUBnYJky6qsh4cFMKe/XAnsO7Toh0j48IBMgMldi3JMBScQQGp+Z -8P4Uoo+8AwyKjJkv1SjJIOVFBKLgCYcU0y7URMxhqFWb1ktmTc3FU5tz9n9Quq3TXAwMW6B/RRWw -LVm6ecCCepoFzQxYUF+zoJnFZUHPH7LayrwWuP3xCmON74iNcTzUAcVTwkISUOkjrXwHsCfwWXkg -AaYfmSkjXwoEDSgDRgOsQnMm7A/N9wLbU0fpL+EGRSOmc1sUxtJJ5olB60vOPo1pHGjaaM0PzK2L -DnIEjVQHeYL2cHSQK+jIvw6xcrPUzbhQV7hCstyqHedIMQWoP3dxP3HZyZgjFVOHOruLBgxwURng -5DxMaWk9V8vkeVoOQzHP3ZWyHlMnjmmn16KH/O0+UDeXP1qczpLuD/fj5ZDxZNhXWKZceTZsDe6Q -JZgKwyCBMBU3pzdYintJ2ISpGAmMjZYy5f8VQYOnWcfeJMIIRRYIORzMSYJRqJwwukRIcCRDPSbP -gDBGWFtqqVhEPNMCiCSrRGxYKlokwpD/lEgC/BLhOTpMoCFUQxv4kiSeHIyyQHqKZTISKCpjEJLv -ipZar1TTlww3mWsOikaFlB6VvhFMYIYzd5czMLLM00MC4SniMCoC4pwDgboaICsEPm2SeP4qC4Gh -Tgp4sO+GZmEwEjURr5KDSAYiMxz0kzTA4BNfUUxCKGobMMmsYWY8OaTQOCkZkMy8ZhBpvTrGG5y8 -Z7EMDFuWGYuS6hVFW5wmCibw6gATUTKKKQM0YlIZsGSQKcbSSr+f8HlZjCKHWsn4ItjfkqaO3kaG -dgNDvgm44IuxZ65S4WMcBiGTkbYTOASZUJLCLAw22RpK7xaZVlzCRtaCTSmMmI61Sc3JQEdNxhBO -YDAIzLqnVa1f8zC+8aFvQOx2PB9ZKifpwGiJOmEypHACg01VOuwrZyV264A6EjNAhfkXyrASnh07 -115aK89tC42AKMmkMfqZxXGhGi8Gunw6bAzESkzs+mx8tyaRVNCejo9rdOSoxvjGLBA21vAqYuMF -vaUI9bq9srepJkGSj4TxYjKdCbACkkHhYL+FPBEhiquUAYKlBO0+3lb6XkkWCg+ZQ2+XwCwyVqa4 -CdEWlOlVYIFOU5Cs3QizfagA0MhQ805aY1hgpIBFyznLm40coG17c7OhkIhcrtcuMhFEje9fl12j -hIQRZSWKcsxE6FPgXrSkeBk0DWowjqi9mmkRwXfvcTMCRy+HFkOcLjD4VVn6uwlR6a6JZFcM2DqY -45HviqFDtf2u8N4G8mgM9Nc6ixSstG000VVAJBjzxmJFXYhHIMWBpy/SsLYlhwUSTlGODoRIAF8k -IZHa1mu/L2RCoFtirLFSGmnZ2BfnwJZRkIeU8DCAv3ikYP3a70s/nkUxjlwvDCFENPSFCjVHdhqi -VxuUQVD/RKgW0Bfok3gpArVCSSjo3DLTFz4Wh+EpRILlyxjoLVLwhcwhwa5wfiI0wRVevNm22FQY -OFEDSg4ro5iDTRQJrqnQZwGa/3p1IbaZB5bHOHPhFp11btxTiHkC2FKzT+iiAG8sNMkj2qUS30oW -6RNrNKZ5KARsDw76ghSolYIOJlGBDBWH//TryqB+Al8Cy5MAO40wOEt7gAgHKoZNS4SO/BLJ95X1 -M5ypJ5ixxL3GzPRX5t4mqEuhTA8iCuJwJyNgG4FAwWnw343kQWGgVPIOD9ACB20RnY2mG682ok8O -L9mn8x01woBsaw0EErZpJwVQLDBWQKPlrOXNRw7QvoGK040qDjNvS8KGQjtxONKvlqI7OGyh7+D9 -eNDG0WSkEZWg8sPWBn5fSALANJQJdfcLIyMB0JPP0I6VtFHlIWjdQm8RXiDiCAR2IuEL6A0qYTdl -Ao1KsJnAMtJKDw5+cVBHObm4rSWUpABvs2jHe4h+bk5hR2s7bCl6I6HQF+jxdhVFjwJouTLQ9xPb -6M04AcLQaBQ0CkE3wSuZvLE3pCKBvaHSgVCChlQsqDepn8s1N3xBToRQ3qgCgjGpLy4TDBFmGD+r -8FhmIb1hfh5Mcoiv14OMU7JRV1oU8jV9oRqtA4tDFYG9DhZxWlka6Ec9oR/J+VwRND5/Yrsqs7PV -6cnr7puqT8/efmiq2pC7KgkziVmsds7Vxqo2VYzINnRbdX9tZnZau4/j5tp2ftTG8/PEOMdlCKoe -sCdcRUapThkggGDxLIEqUM1QSQNVIwBGgEefYPmh+icIGCwhZQz3jEAYklHtApXU//TlAK/nIRxp -evJEMYdkmHecAv3INLkkdlyE7suJZlBBfLdep0PJQAFQEJIgSQq5QOn+RoY43rmNT+CjJjBF2mk1 -uDyM8qBmrCZPAzDVYQUomNrmCgXD26V4gBvhQbuZemBSkisQWLCggkbomJbxSgIsrmbo1Hj0Q+sL -WqR07xDTZ1XmIjpYBF4JxkOMRRxPwSVFbJRnDQHNQWtkHpRR9QXSBkIHqgYiDfGYC6cHiJ8xFLEU -Noayk5akdqKvVbMwRd/6Wk2iiBrjRjVcmtdoxCmMdFKaDFAessWGu5i7ATsk8Q1hnsV9pMgAzTyH -BEQrGJUAGgIb0fGERCgiVQTGJ7oXdIQhCF1gzwov/1OqLU9OSIJedS0g2rgQGVaYPETRE996Bxak -2PnoB7+LkidQhYAAhify8cqC/EJPIgwd1A+YHTAuKdeTCMpZqARjBJ1zVE8QqjtgLkIngnEkVdow -QQCTYt/EcP1G6i1KvK2pZDG5b0uYYiRpzgLKkjLQPwTmgQGxh5MFIpJxKQSo8CRSjmnyrHhLz5du -KkGasp0ZbIlvMR6xMKDc6VngaYzOH7nnlvrkruna5Gxtcv/w8FCcjDP5xdAtU/hNaL7ZNT4Hf9+6 -98XV0dkhk26vtG16buZA6ebKZGV/dbp06/RYdfry+b8rmS+3V8bHa2BJTx2ojVrI20Ep21yipanZ -cunWeyrwcxb08tIwNJGEF/PCp0CZBtVNXD9emW0Jb5rOAdVNNGv/Nox4atm2bkJlK8By3jqJEVAp -6O0HKtOj9XiIGko3kQHdVZ0crY2Xhku3H6hNzt/qtopuYnISloe0AtVQdPPlpbIhCaChFEEsMmE1 -mTggoJhA4BcC9AJ/ZAnjGQX+Z9XX+fBcULfME4PuFgylUgR/XKfBEnaqCcT3CoxV/5/4s+j9ivRg -RUm4o7xoqTv1C4udEt3hMIajCJuJYPH7VQ2TrOBPm5O8mJSftwEBL7sDid4Bm0vOGWlgALwkNpfc -H8AWuZeRiMTLQSP/9J4HIQhwequ4/12qhyNd4Pnxp03xZzn4U5TnqO9b8a0I5toH/GHHdxZ9x4Gb -ok8b0EdsNIqYL4jGSBoJhkWmeEmwTQmBBpRJOA+muZOpUV7sHRCZb9xjDDNDm583Wb93Uv8Caox2 -9lxe2nwL4Fy6amjz7trE1HjVfWtsaVHa3+618M27KoBFactQafOO6j74N6dXcwTne94KytU9vufN -221M8/W18Vmg56s1adQmSwbAlJrAh80W5CrQYzffUZup7R3XDWZb2D1bGT3YRgvbKjO10WT16frB -avH6VH8xfuu0rQgtzvcUx2YDZmeg1HTGgVnnZfs2E10aKm1KtIOusy0l3a1ejF2V6dmckW2vT47N -1WaLDCrZypGvUQMeOF1t1J53NrGteC5vbU7B2fnUJLxtLyxg+/E26OSOl8IjgQvhHaLPn6led091 -8taxsYLrs228Ojm2WBOjG4tnpmn0V+O8xKOKW2iCf/6PnRxVwbVua0xDm6+7rzo6hzi05GxywNkG -nK23OFtbx+w9x+aWgiH0Kr0sd5xTuwS76IRmlPrbpyuTM5hj3dx8azK3mzxYuVKbArZuVHJ8Xscy -+E2JhjbfXpttvSQe81lX0x59zqTGBV+O1Sf0IxxXoX/WvMVW2jRRv6d6x55dsxqaBNyVz4xWxqs3 -7NlVnR6FDY1fcnu6OgVmTb1myuLmq/vGway4S7dSDkSqmTv2XF8Zna1Pp2rob0Zqk1WHp6kwjXd9 -qntuA0ZSMUOA5hqxSjUXj+MGNw53o3FybmJ7fapWtYNrxCoxuMaBvCAPqR3V/dNV09hAUclRVNRA -UellRaW71Qzndtl2IFfjaPqS6xLpGy0lwo7p+lRp94HKWP3e+WWCAb9xfHxOB6rUp8uVqXzZkGqy -mHTwL4JNVWqaYeZIcCUCiqI3ZBzka6RP3CMZUiFoSDgPdSgD3rgjEcjeUGLydrycTyTX9z5CyqRf -ziORyDOj44apl0PHeetTldEkRx+dmR5NseYD9emXXm4Gagr2js9NJ2vsHZ8cM2LEs398LM9IBN/M -WGX6YBdolo1v9i4DEw8HTHzAxAsy8djrnH0jtxO6eEsmnHxFcXF48PXVyuwBnMaC/BeDhKjjMqjV -zjXTH7t0BBRvqIkFjaCfdd1owCZ7mU32mJMlCMKQRIpwEoZCSe1NoyyIuCAE8xbhOXGkUB0jlKmQ -Ee12wYsrUCL123U6nUKUiU8jSacLRfcNaQgNHDhZFuZkGSYk18ki1SL4WPCkZfFcLKjfL4aLhQdL -6mHpUgkpCwnH3uU+i26rE2LOB0hgXvc0gUJgtfOoU8cDvchQgiY+22AxfLaL6bBdHG/tUclLaNB1 -mjaGci2Bsj3ghp4bWt+lvtwXYIpNm8MqEp1lhwOX5ZK6LGMHpHNa0pZOy8VxWQ6k3UDadaW06zJh -x5bErdSrkq6MjgLKgDaVUEJnYOaS8IiFPFKCM8Z1sAdVyHs5Ji8mRnBFmVCOxuSLwA== - - - C1OXZZfHfdxEClZb80gD05RB3lmZniq6B7Tkd/vAtHtDfbr20iRDM8V+hDlV7qiMz6XZpi23ckOj -dHVpKz7XGudX3VGbmRqvHDK/Xp6UvTrlalEfXC+KF8Jz5YugiyBe8BLEonpnMlgtSMhkkDoqZAzv -MhmDDBJ54kDMLJ1BJS4vxUeTPR5uSpZYJzmqDox7bGuUKaanZzRgRDLCVckmeJAiEooEJi03zU13 -HTReoyfJPBt0cKyz2HapWAy7dNEjZxuxGkTONhHJ0fIGFETJSz4duji5rXpPFXhXfd/sIJah12IZ -5h1C7wu+xbmFJIg+ZgQhisvIhH4pIpIC0zri80pUCdVZD/uyW0Ok2PnSklKOGdyt+/bNVGfxHv6B -xZqLVJPF5sOHPdT3zcxal7wWgC+enJ26PGk+TozXJgqudS9sDW5wGuZmVyydpbT8wn3ZJPu2ub17 -sY2BcO0t4Xo0yc0WvhQRdUekzrILzoKBGQPSid1wrFviGvrDwTA4+F60Q4kBQRy1BDFg0J5By6Cv -jknwacgl0PR7lVzKjAZSsCAMIh5Qna+YRTIiSqogkoLoi9IBPjkRqUBJwpVJyluWYTLhrs5AGKTT -lmOu83Rqju45TBjEMB5BDKN3djSLYRzOCWLM3LwmDUGMwWLdvO4n4c0W57iILab8bmxuwSK8Eat+ -Oy5aNo/SzunKoZIOD6tPzsKE7bSyfP7Do4LHRvPk8iqZJF7N9ISCB063QbMdRp4sGvJeAAyceQNn -3lESLdPjGpbOEaef6dBv75gLzwH+dnBR1CUlGvUl0qgv0TKRjQoTvprcSmdK1nNKkyiiMx3FwvFF -UFqZG5+9u4VAyWyr2xZbG2/yIleO2CJNhI/Otn3d5Fica7tlwu5doGqBNqoHuGvvIg9p04uSL6nd -fbmewLteOtRYPrRrNDvDm+48UJutmu8W2+wB6gEZ6fotRxGLQgVWLj6nF8pSnB0dYW/bua0ESojF -BF9sxRexGXTHqIYqo2XMQxZGjEUcjWarNrjaL6iOjwOTMg3g1Qce4WNgIoiUSugWcYWdoMhOWngB -aDEJ7UaSCHxIzLwYBBhLJmCkVIR+4lz97YcqrnoYYopNGvCAh0SgQa/AngfLHfAAlIm7pRkkqm/D -awGmOoYSBlCPSaH0ZQ58cxyf5AoB90DEqMe1b67sByWqYhsgEvCOqFIE7H79VlekoC4LGMEnxgOd -loIqqsenn0jFXgKpYAlDJQB7pvSLAMm7ICzKfXuKNDympjG6hkSstPMaqLLtGi7cKkLfQkjG8ak9 -nVsUE4tSIB2imL5agngyaAcfCRcEutapMYKIy0BEDCZECY15EgVaNDUGYEVhLnZeQ0PAiklPiQor -Y1UBU6IfhwIqV/g8OxMCk3kYLAjF5+UIIMZF7tUZlp2bfCxgpDuvAT03xgLbB5KhBKhGcP3Kl4Bl -gmWAQVMOOwx7DIUU+PQ8jFEqtwtSL1vpXKyNj9uR9BJ5LHAuMFQV0AhiNChh0DwLpNC3fxjs81Bg -S5TqdCahIiwQPACOwERkrxFlX4LLPKhHkxBB6LAQOBf6ZdJrROSw4AKQIPhUWkCNqytiBDcVEA4n -LOK215T/S0OlPnrTpmnF9UqRDpgmBOY2DWwvCVsG/uI6TQuuCfzCuIB+DV3oJyADWBD4E5gVCFNk -oNWXTEBvPhJEEyPlSSQEnsER6JgDB9KvbOEzrYphQl7gffp5SmAOwG0VvogtpYmGzHmdL/vIIU3d -43JoEB7gCkQ4F9KhgU/qCkQkBGq0s439w/YUjCjKzPQAhMB8wgQoATtoeP8LnxJMbsxQn0ynCcMg -ITQt4pux1yjumKhkIT4qrIDzgxDSrEYA+4wYbETkj9qTDFNBGSAqBeBAqJmMTDpimhw5ccSnB86R -9KQjPVgwfEuYAG2EUlMBY1wJ2LK4Iah++hPEFrBj5Fz4JjkOk0r4loPE04+kMY1E43NyANVwtS6B -RIBEIByjVMC8BSYAAkKU0mwA4EcwEYACiD1qHkUqkwy5Z+ebN5Cn6RTW1M033sGw3Yacg8wCZCUP -dRIimGZgilBVT4bUzSkhUOYLBQ1yQwb4ArOEVYAh23PjTJB747XCxNglCgmQdk5URwqfZwcGA3JS -GC4K86r93wIEqL2QAzIulWBaqyKpNUYxnHkWETrlhuPg2Cl1/BdfEJQcBCQ0EeKbl2UBswCsXoYc -mYJ/TKbMGx51hXljKXpLjo0wHFsYOuqKgHcCIyQ4z0beAd3ARg5B5APuWt6BtgVdiAhWHnaAnmGB -z0IDeYdBpJ36JEz5+bEkSlFXziawg5eAFtczzs3YzUUFKoETY/IpAWRtErMC0VOQNZoJahkrkvw2 -7+ICa0DC8jnN5lDaAV/z/AW1ozCQDBQiw1mhe9zoqI8ow31BQYyA2DiUmf6A7GB1BKPABLR+wnP0 -D7ywmpaJls8FyPNhbDh0R/IwqyKkHF/ghEmPjEoCbAQIGHi9UUmQ/8KWCIADg6pis3VB2yCJQday -QOYL3YwyIDIZ0TX3VU5PAvXWYgUyF3BQsNNAHzDrA5VAKnLUCRnRzxbjpRKBWHN8+1JfLUldGzEs -gmUv72KvsK92XoNLEnnpR2D3B/jmI2jZNDKndMCDzGPrEgZrRh4qUP5BHYOlUHqPNYj1PLJomAon -/qijiyiIrQKFYkWhOQG96qc7Denje80BscpAVgFsUHGyz1UmFUCmiZESp25TkHIRDBrU4VDbMEA9 -FFUtGTFsRZM2KEDI80FVtW/iAr9s3IUypYbqEq8PR5rrhJrX+YXG/kCvRS1Dt1rmgAsoyCLEJ9S1 -tAGFkOLOx4fhI6MRSxCHAoUShkWHuhcN1/igaWrDCr/2qJkTxjXvV17vgBECa8JJAOrD9mANYdWJ -JkOtU8PyRvo1ZQ7ELYxO9/9z957rySvJwui5Ad+DsclREjknkbHBJIMTJhsTLWBmz5/v2k93K2cR -1pn9nVnP+AXU6lBduau6gFoegPIwBOvWKogbWCVYqqVJK9oy8wJCDWjFkBIi3KzC0IoEWnkI0Cg9 -BTA2+H8ACJwIEg5ARfZHAnAaUCVCIgqHXwI4UFSBaYMUcxloZKVLxS1YHh6BoEKSIhTkkAWwJ4Av -0CTG6AK9gBsBbAMoCgCO+9GcwOzAnKNBID1DiHUB8gJCHrAasNeoorhCDWoRVBAwhVIUqEgsKkHi -BfBFHJVVXKDEgJwxAI12mgIA1gAihVYs0NFQYWegOwFhCr6BVuhQGaAU3NQg5C6IkYVk+yetLQzB -qcDlgaICZ4W02QjBTgpoBUApAPACmgEtVdHVh1gkAmbpR8V6gfSDhh0BcDpAaxQAxDigf7gZABdD -itqtvPa0VPkUardIueU0DD/kJlEMGLfRCE1jIaDeBeDliwCtaAQBKAR0L2A/A30/gCNDCEgKyPUB -uhEIeFLygrqtlPyVDUAcaf7I5uEMQIDXwA7GwBYFgX6NzvKhFhQC4gko3GAYmjkCnTMCeEYUo5lj -gFbAcQB3gsYiv1ztl4oFWaV6elZRuIE0VrFIBSMNgFIEvRZQ9CIUCoCNBNa5HyrmiP8DMgO2OgHv -lKDxGLo8oMIGKICWEYQMUlKLCNp8YrWKnhNCKj9SomhuTR8ewTPSEcUdS7FnR+onRwpvML2JI2/Q -Gev6nI7lb/DThKdokoH1+1N4h+8RnSqe26XiS4rLb56o/Xp2L1mT7gAqr8Eh7Pmf2WQF1sScvztE -PdH/vQu6/bzfy9+h1VT762x8n9+td3AVu9MeHmk0F//9K1eRWhGS+pX+l1hT/2sU7f9u7SE4LX+U -M/eB/sIQKk7TFIp+YBHqfnFnrwmMFZz+gdVSvQT9PcJ+99Pfw+z3AP09xH4P0t+D7PcQ/T3AGUP0 -d84JF6G/E+z3KDsh9jvbIfrezHEHDuy5wjmlQevLw1F4IMPlwqgHAWgEN3CH76KcVdkZCRr0krqm -OEY/ouutw27+Hzjh43G3dbAf7p92p8Psntz9G/7WGY1RfVyK/it5uEQLLe828J/KFgYKoeMRtJDd -fg8v2wEfAeec/Dik5d7p4dWXwUCa3E1OGwAccnQcwZry7Pf7GPomOK+D3/tP9efddKb4MH5v/5/N -egseewBnpJbj05EOvUGV6uGe/H/RxQ36F7Sa/CzXU2q2pduwOX3sU/jn+J/9jH5qt24Pw3+NqENc -cDOSsOm/2LuVQFv4+0GlHQw9oZsxMzmIvv1fCp3xcjsFS8UNAAcAsT07PiMw6ENI2Nr9313jdrdV -m7JwfesdVCCMrI1teaPtv3L1uObqDe3rcgS4txHE193J/5sIPfYvw6QOm/6XsRgub3I6HHeb/y4n -++fwMHYYwXAOKPMA6zCKjv84XYC5/C+ayv8fqPQw//f/Ymn8XyaDw3o5+b+dF/vDOLA3A0QUAxYj -4ecCxtXW/DNbLn6MUBnX8r/LjIOBELCootD4jQBTHddb37+X0+OPkeUxDf+7q/MTXizAXwqlSp6G -SPO/vZhgFAZy6a3lP0bW8p//9lq4qFi1ZYx3wJjd1GfzY4NaAjPSyKrk7/wv0AUQE2zvTtRkloMh -3f91ZQCIrP/2FDaz42gKdKNr5xG9ch6PU8YZYQS7BI0RNRIBIsKMn61E70fUcbwbUdP7CfLREvdj -bhxC0AxlZO1HYAmT/9wvqOX0/sAkYFmGXMA7bLgf7WcUeLg5rWmfjLQJHrqfr6GLeAvajbbH5f1o -vRwdxDskn5nB2S9QOKhsTPyehcL9agtsx93pCJoid7RG0+VhB2Y6AyCZIRudoT4Jw2HTycAUKEl3 -G3SfBvwpzAJzul96Ja0O+x2zOX4uJn0/mk4lzQCYeBUrW7nPno67+9bocJxR3FbggoVgAjiD9a6X -29n9AWWCHOSrVmp8nP0PM6+AAORFuh1EupcTmNPxP/d16DSkW4aCQX9QfYNw4QbptqVYE19327mW -un3y6C1T1kRctT1bl0dHcjep7yajNfSiHNBzJQ7MtQXDzqgKKWwpfNyBFgQclaFjPOLFvJiAiFfZ -SvG0XrO+xt6MOoAJgqesWgCPY+nFNcGz/QylSJUAOQ5bUCsribBfvV2OA4IQXopNW9wecNkRiu0a -+9EE4AKDL0HNtsXRZJbdLtYzvdZQJkobR1Tn0VvO/g3ASC4Px9F2wrSP4FFYmTgSCHAFilHSJ2S0 -sh7aR8SzuKxQSFC47kv0KYQW0LvbJct+I3QIJgrZDWqDqfA/R55tG3sPAkz4WiAYCQdUJlVc73aU -AGO0sAu15bFGt6kBrEHtRFhDhAhcbbJwYYK5BiPRCK7RVIzgGg0NTBQpZsJ56iwJXZLHYI/qRuVn -63Ue6FUs41ftEzZsc/ydUJ8mc7BTFphnhMrCO5yuwSJsntrts9RsROdcyq11CasMR8KQmsLRoAJR -tU7rGSXUZNlBmGoIT0xyFWCAgPUB0pgAlYXlgLy7mjPpmtkWs5UBlELFjdaarTu7Fg== - - - PRJNmbvDkqNfgh2c4xgGXsIlYrQCWDktQJijtme5jse2EDB9PARjvlkpxLLz/Gj7r9GhrSis8fsm -NTvMqH/N7jtA7N4XpsvjaLxcc0gX5qWaSFhTSAHw/GsGE8nvx6M1z/ow/g38nju/as+Op/19fbRd -nEaL2X1zt2e1IA5ZS+sd6Kg125/WB4EK5wlimB4zBOAdwS+IFHqj7fLwA/ZVwFA15VITzH6G0uLQ -yttsjQyOjYejRtg431dntxeMfZYs4DvJIftM2E8Ior+AGzMdG+lRCSaIjgJR9L9IlPDfR/x4SL8/ -yJjQBCGPEHJ9VRjzlFnZTmf/055NdluG/8GTd3ZNOBaOGJwDD6VLJ1FcUgedVxAyqeOG2mscfK7H -KK6rKxCK60OGTzDji93/cCRgFJ9gh0ropGYE7FkOs/vXjNrDQ++D9guT9XIPFGd4JPA/QMVeAF7A -vGFntZF79oNAi233SkgXy+3+pz9g2r8/zabL0+a+NQM21YnJceTeUOJQRW4aiDMe7wWigZeCUMd/ -mh1+OEMIKXCCYVj5KnqjcTrugQWo/U4cvsFl4UqEoDRJlzddweqLu+2xfRqDSR85q5EztsBzlLiN -TAqgVsyMQoi4B0afFlSEZvh2x+/y/XKLdhEKOiXbR74Wflwf73vy/e7G3j2QGRSQHfyYaNHSZofV -cj8GuL4SU6i0GTDK1jIyljaigHVJHWZwdpT2qGi1o/VaVbuQvsBahwZWxPbNviI0xZH0hoCu7sYw -HOWet/GEYhu/LzTbDNL5erTAzkkEtkAhgI0bjCne4UxxXNpfQ4OYxZ201Yz/EMSsLHTFZKErhsNZ -YVcI+/KQIeQZhtASMgRZU91BRa349QkBhppowAuXNJWCwgjXgQDSICoxmGBjHTjRPaoDSofyuJiu -+9fZ2NdbTmc739MOCK/ZpzY6Q1KaoZ5FHEGGy4fj2julh0CgYmlKh1rga0x73rto5J39dAMer7eG -J7WfGu6cPozn3lBiIPs9xTRTHx22YUZnDA2cqwcmbSc4HgpHVVsJz8jwiFqr5QYwU+96NjfY8rhj -FfVoQLslxQ8fDqrOkm5Lnz4wMAfIB8hxej/+zz1JAT2D0t4E2MtWSCvygSYSqKk3EgJNo6udwL7W -6EzSTLbpqBXyamtLn+nssFxsBa5sQktAjJmjEq0eUcPdfCl1GilLnMN4edyM9oZFmmg75KteU15I -j9otgFUA70SBfmmNtcCWnI4xRrdE0AAKK7ampt4dBcNNxccCig3ngH2yt7kgu1Sx1Z6x3LVwAY26 -8GoiH9OGCTASXJ0nbYXijdm+dNv9S3uNh8l+PfmPOlei20y2UuNI2uYIDBuBkqmyPrBP69FeHw5M -O4257xeblXe2ha5sLb4LWx3YO2d0MRc1p/k0TxhG3gEof4TXGTEzERSGlDUFLB7qGmJepDxxsDbd -xU2o3V6nCVSWl0Af1GlGCW540RsUnmKMR9RBYx/5FQAeKBAvBhofBUvSayuQMSHV1psRtTqIp2Gg -MTcNA20F01Ciovn26J2utVke3WZPzXdbLX4Hmx2AVce6bJX26AAWyp2FKeoaB+94CZU/jY0+eLez -xYh3xKo0giYdUFcP2lgD2wFxs9Xua43D3kacN1p5/w/ew88IWGEzDSjBRrMj9CFswdwkrlxJQ3Gr -sBKf/5+9V+TTRFNTakVREvMdOQmUWi6kLVXaMVLwKDO9lNvRR6vaLddLDZYBGsDj8JHItFBpuNtP -NLgKanDQ2HHUYHpSV2hAg8Npj9Dr3/BuKZYgVSwqDS4NetJWSYD1fdCXJ6jV/LSdaGAU3Yax5Vis -0hEi6J3RdsuewCt7PlArPTNishGoVvaut+29p3PfRkegUX/Y26+N5ofj/l+EjiG3AZqfQD1U2h7Q -BppiQo+fUhvW4TfZ/EfDESNouKMrdhiUAELLwQCnFjZXZI2izk+HGbmb5OBXHX2aVpClRC12zGTZ -VwSuGc5qlx3obkfSuBBZk5/dv8vLqYTc271Sk5pNljxLljgFYSzBUelhYTOeTWlPh3jX4bMtQBWh -rwE9qIPG7MlThZQ7K4K8P7W5/J/ZGqxgPptIdEmjJ0O+3JJ1WGTb+UolEiRnEH/hw0C6YX13JV6T -tvio7676rQ1PLkOVNj+xxdZULZrcdlt+OfIezKFuuRB6jGW6pdRTIB2rf9ieMtRpEi4WiKeIBQ8E -HjHsQP6SCzdmzsS/vM5Mwr0/ZA41wndnycTrJoptVD3mFuWXeiYRmLXzy2RqQnq9toVsqPp0AMYL -k0VLLPxWOpK/n7nAm8ed3ezqh2ylffxxpUKPpyIZML/mfte21zsLOceqY8XOzOHoPNx7ef/IdvLe -nvqgwnaxz0xiVfzMxA7ejYt0W05Fe2k6v7MgYBW/h40TOf98DefWmXU/Ns/9HPM/4TdcBI5vKznB -63+ZRNr2SvcDpnzIfy2+duCT9Y+sTCumnCfya862PY9beg790fR0Z4n+2l2TwiT4Ys//BIbxRNbi -t7pyz+5vVyZv6xbzs5Mz1as+/sQnk9EKflq6CvP6Dz0yjvlGYWpp/o4tv6rT3NqStnko18cpW29b -/+D8HZl49cd/ZwnFe5+Z7HZi27iST3FfePORXIbDvsPcn6UmFdy1iuFcjxOyeugBsIVts/CrH5vG -lnnfCOwv/pS0e9yz3Drc3NArGNQtmXwl8fhacEeDB7AvlffQYyqc3325Er3pe4wYP36iblNbC1hQ -KuR8hFvyHnoNvWwhnFK5lSPkYVCzN61j+OfjE+kbJaxFk+uNgqOE4IMv1AtqcmfBxg+VAPrsShUT -zKfEa6FGN8+7C990Z8SAqADU7WOuVKrgJsj0Isn085pMxKe/z19oJ7kJg/4auSAzCmiUq3IT+OQn -gNuTLdhoFkC/BU05cohATc4O6UDoLfQ7yXbIXxc599X+CqORzZwLjbsv0aal38028rkmOW8v/zJ/ -n7HFnSUXGHSGNDDfQtO3whB39XKBfrZRJH9fh/nlb8gXn28si2J+7sQBAFPf4XBruuPHi7T/NrVs -o+6sFUnHtEbDhgU0jftg949774sr3Rv90QtKhSKjTLxzfMh2qseTfGkSyArgwG5EnzKxXbUB5TTy -xztL4W1qWRDfiTSJFT8yfoQCie9EkQTY4XS7crvol3SvxJAVbiy7ETTmpH8OJwQlsBYhnKr1UnZY -xRHGJFz7+HfRPq95s1ii80Y4zF8JeiJicIROreisaLfuHfmfUGtVcNW9RR5TAQEMdpDDtAtTiKEZ -QFQbK1jaoyO/+CkcwvFJt5UNvxGv0j1oltc9Ud8PpYLHPY4qbUl0Navl7yzZztPUBThMKkrm6oOV -0mxRS0G70iA8B0RTIDCiFHiSY86xWXQ01/EiGXwjXKnSt+fOwq8LrGoyLxbIYDgX8jR6iOF48XLP -jQYlfd97Z+73ON3k1tveLtv56ZtBFzUn18G+4N49E0WrJ/yebc1/bOC1Z2t2urMvAb3QXYye3UXH -0TdFLFzAI8HbfyVL6TNKA6tTX/xEOlbbU+nDTnpF7cYryEZfQn9Y/x3M8NvMyxRA+9xzcrp+f89Q -j/0jz7PRlgBeuh0J9qVTPUULk9WflQFWy0mzTNWngCevi7u54nPqpfyc7RAtLwDwqzPatOYG+e8V -maGfHmvHZHG49h6z7ZN5WRh3CnawyNdPslYxtbmnPhaTj/ViHTSqIdHiF3LB7GvUlX51fYVbc9uE -cFRMGaLgzxUIcoPliG+TJ4s+4W57PkqQ5U2KGG5sGcFv305/Dr1xZxG2nDrpF4mCKZSnX/z2R/NE -MedroneYt9kB6H7ozhLlIlHsxFtEwZkgUROmcaEAR+GnBxsJ+0GjAKYg6UIwee4NfPIeIunZ0FOC -k0O9wDmAUehloh7hpIqf2Tb6je4MrYoeBb4tARE/Zcmg48V7goYN7A9C7OWQFrwNGQk+8WzS+CRj -zgpAiYYn380ZBoq14AsPAhqe3sT6memlZcvykL2zSDZKcWvP3gjJNnCjvL6U6NnCidK/Dd/2KQZO -InDQ7fivqDO0XDSywhyU12JkS9AK6E9sj8xroq8ILcC+qCGGOlp4nd91wap4VFEAFnoARlECFlor -DQkWHII1w8aKQEW4IQAGC0AWYpJVw3eY8bguxLMREClN9nA8flDUHz0oeArXwu+WeFdp2MEeUXMI -CSVSYQgSvgYJQICkqFN69+nnZ4NaD18QyBFqgqVxOMZtPP8OGg++eAEa0lvCLhdCDFEyHLsYdTSY -Twj8cBn0SpPZKGThncCfd5kFcs+9A2r6wR5KdQPP2ahvHREIjGO90shQR/tHYXJ6jEBF1AqkWLWE -hxl5Fx32cy8fmJmsVEJ/wExpFYtDh+kHijInufA40rSixiiOtFKyEYs8UbvFpI5sKKhbSq0oj5lX -l8QyziUw3PDccJZtbR35/JRKfRQLkVaZX1A4/lYvZgNglNgzTi6RLdZLikbBHjM9m71UcD3vpuXH -VjIueZpbr0fZ0Ov7Z4ysJk1miWnGKFgf7rJQgxUDxgUMjc4fv1aZspEbL8iZs9ASGYriDiatZi7w -SsRZ9SzkBNZrYuV1xcexnzDULYsZivrpBmJPr2mky0aCSyp0tS4LLQvQWdyVPNmL5BrPYdVgDPwp -YUtWox7vrlbO7ywiDA05ORM3Di3aFa3Vfoftj1CZ2pb2D+NAbLpZfdN7wOtHMstC0BXgMOfbb+db -b1C3PNd+O9t6A3oysNWCYwUT4a0wxhJOckZRbmzWTMa5vRLDqfxB1nIhG0AQxxihPUakSzYW7Rmw -ARzTNSo8/ESg9h8UUjezG00Gz7uWFUMA/VmDLK0sM6D4viTAvkCNEpvHXnfSiUIzJV457Ob55WEZ -AkZqbpn/ec87wByfvuXdyuwJpsni4QdymP6sRvr65TR49OL2W59fX5jnOysWXp3GTaxeG+8B4/IQ -qnQVx9Lxb2hy5LF5NF9hdv80sGQb+1wZjnLKYbi7e+BMzk8v2Jf3r2w0XvNwDzhkhzZyxzkD27QK -CMw+mQ3cCWfitcEDwP0fE2MlQfDHoBulkW2Xpr/FRCFJEZmuKUobs26z7z1pPxGzXLljndMPONM0 -svZSZSRGELSDh20rJxmZpkrp2Lce+c7ComQoB/r58HIDhItfn87HYmF7+iYs0U2E7zsSntSruZdm -pkk4BptnwR68PLd7COWYB6+/ftYWIzyxXb5CrvsAO1482U6+2y2MvhcuV6HXL7OIXzqW3nzfu6K9 -VlrCja9i1cJfHs7Gz3NnICaTb7lye80Y4UQoayXHgVkb4ZgMY6Ke1Dwjpl9hZwapl5eAwBLXo9+y -h6xSzm996hVMRGK7A1mZqw9/WCtf0GMptw4t3nlC4z1usSrhsUu6FVKv573FwTMAeETrAPiYyxma -8yLKsx/mvjI98/FII1+y1vkjfUW/j7b8QZMOAIzXJ3LUPc2ik5PvAcEJCXrS95DwSA== - - - vaPBIukOuWJ4xPRcdAyaR6HEep36BEwfOwxes62O66PwHdof4adfoQ5Dc2zadl/Q8tr6bqtAnvw9 -p4Sym2npKkxeHEnobBuBd8YxzB9vW8mi1feMfsutIzaHYHi8Np4WC6TDD5A00yGrhxd3fF4eLzKx -V98r9MOQC2c2/LlwCFQVWqCEEvYM5YmegLKxfoVNmsBitzkVJu8DSkkd9PLx1CZLg8ycrNU6eM4T -m+2RcsPSPtIkOlZzuzh8tH6BbcwG5YNWT6S3NfVkYs+/K4F4g3sVeihu84x/l/mt7vlrxwsA0V5O -AMfy5UeL4NEu0cS5na7z8hXtH9hVxyK/WCzGWf/R1ASQB4JAvjRhu0A0sQW7r90oWHr7VmgSza19 -Jh/UOHrQFxSEHpIgWG7hIRcIxv5YzOE4jByL4LmDa7KERJMojH1vewXcAMokQNyECws1s41YoZaJ -5/YC7ZDBiLzbkYl/dptIInt28j2I2gGeNL8yiZDpPV6K+DucEsxsYmSZGxW+PYs1EDI1b+Fr1G5m -W3NFHALyBSFdJEjFX9GBSygd6pfyz/kezmvezMwWlhVAi+gD4MmBNEDY8ICcz18IBXj6MwmPaU+W -Gqse5K+Aw4iR5YPvFjRPV7jJg0klQ34eSziHrQRBAL300qtMIrUnAQuLRwpvk/EbJyuRjAg9PgAq -mi0y4SP2Wsr+PAWKJsfqXbFJ5Cfez+PdzcGVrL7x6tl7dJUtdLLhaGsBhFHpN1t7zT3JRgHI8vgO -N/4pt2mkgsZWyqh54l6+gd1BRLBgMBEC8qXYjK3YjSp7Mr1afwl4yOIDoKl/A12keWEXqb8NILSF -KfOXnsxEg9pO2ch4vxDQGiTXMPVkj9xZSpaC0y8Af7Lmt2CV91KCacn509G5yTO2Hqas7SSVcA8S -7ujPx+OerFXnq3LyI0BI8YV4sS+zzffUB+Bj7VPnxKhqoResMJmk8Nz6d7riNjSSba8zvmwjuojk -n7zvQDDZhwE5wr65IWm6ES+FnQZ48qHtF6gcHG2ZRHLVAdifjoTMDz5L9Pdv1IJS9RsaNjPkgy0c -rRUT2+13NNvolovZ1i45zAYr8TE6kRIbgDQI7iyJMjnMJRxmywSohpg1ZH4c+4v57OeimE/HQwJa -ZNWgkEC5g10ARlkH+xfGFtFfytZXHgU22tIHN8nitqtAY7ZsuG2tkvNsAWgS82FSDqzHVTZY/qxk -m+ZJg/xcDh6VRnmyZ9uBYUmlC+sx237MV7PbsvOvmChODkYoVYz2iFuqID7nfKePCiav6V6M+K4n -yNpnx1+0715wYeNodgO922ZGFWEOFrtAu4DyxbN1dzirLekExHDwkJVK3wxNiTU5S3w9ZF+cvh48 -IHiEShIe3Hu6JP+GwJx5Kjuw3Hq9/6adGpzayOAYAIwf2qddK1nZLMdQkbMJFVqmxxD9ILsezbhB -MYBj9SPpbvxNkUUE7KHViQPqLzIVBKNYC5OH0CegDRMl9nfQOxj+K7fq6CgvPt9YrcAq/Q1la4P2 -VrLTnFx/IufRghdwZ69DUVZyukL8teBq2Fy5dfjLo9Uu9VTMz2tmMHLRqzQy0PnZsV8ziXXRoYTu -XJN35rwZGM9yXCwdIZKuGVwsVJ6Fo9CkZD3tZ8gqw6rAlhb4LhAz39gju9zaW1jnfn+bGbIyfTmS -Vbu9CCm6kul1KiO4VwjHnCL2wGg9UCIb1Hv21OMUIEjADVBuOCnmJxtcyGSrp6Mqk72zxKbTSSf2 -/DU+Fb+/iA0AcNrPoftbtj3ez2kHDZGcdWUMt9xp5Z/JwxuUELl4zUx+kMWstZpJlPNeIVWC5h+P -QDrnIoD3eUi0aoGBxHLGAOBt8322tfVZkx9kbMeDjT44fkn0oNYTGGW9kdVC8hrg/K3thy8UGzes -2UjpcKRDDVqd0TZRWm/BXq2mU8EK/E67I3R6afUBvLtu6LcsZLFUdSPAF5arHhiDrGl13VmSGc9P -BAzlLpXeIp0PICOyr+QiaF1mdz8NJ29ycEyK5U8cY6KZGbMRBbQDSNjmf94Tf8VsMwPWEns6nHZi -D2co9IdHW+QkP1qRzqVvEk74C7PC27xS4Fx6qEkbaCntYjGDHUfZiMf7AA2kEnvC2XwLd77LviJ5 -ytLnyL8vQLTYwJ5ss09QW3fkVvGEh2Fwkh4XmTUUhFM+UkPU7ctDLugo+grTGAnsl8ZPAj1Fp6Lo -eeexmLHNOhzsupA/fYdSf46VwG8JoZzM2RL1gvszZwLvEvyW0MBKuE8fS/Cas0qO+7MWoLBUGWgX -g+H+G2mAHNGoQJ7bHFrNA4sETKr4CM810+TclrYCOPzlhFN6sR+L9sooASDWbU59CGOKFty+gAjk -JqumOSZvvsdDvb95lhbvlno4ptb3qWh9W2zJ+e7ThbwYrO9C4pIW0FA+1ymdvPuvbO3NEeF3H8mA -wuT08BVplP2dqN9djReH7l5MNB7TC7T3O4Ud4IeegQTRuH6+gW1ftAHxtosodZFt7EOl7O7v4FOQ -+wXARtwLZFcenLHqqPfEr1/kDH8BCvZT0VayFMtArSRHQFuLAHWi82r2klXXY1A48vpoLkzG7in0 -WqeZ3zYP1jsL3PghOcfeEiLHy2c4E//ynKABMQRiZGoFAtozyu6ysyKaHpoc3Y/fno1DYygX3lY6 -OPm5+CRoPZHp6htYFtnmFNDfMgEWLJI/haK1VN/z8UdekzXaC4Wqy0Wo4xm8EQWTJ+f72U5H5uji -lQJzLcNCtzk8vzS92wou5+SPxMyeLfIh31mCprwTB0bHBliEg+64BB2RFtz/f1JcqCABszfvG3sY -n3e4J9E1XyiSky6z3CSLTHYgzDnY0c2kCbrCHvg0vHA4zF9eJGnF3wahkxioFP243K7Wh6MX/OOn -s4WYGTep3WR2ONC1TZUjWvlXMb0MLr4p4R2tj5M1hRtq7Re3VopjFXZ9FF5KotUvxvTrP2sWfvUg -UmHXAjDqQXx5EMTVCspJqy1wOtseuOs8lAJg+ca4ABpKeQbCaRxll7motWQC1Y0BQnDnoTesB2LR -0gKKKTiiHeGvc9LZPZzZPcLIpHHZCo0gRuCsibCtvWGd/cbFQDFIWYawlDhrnZhsnZogFGG1zjTO -aWuYsHBRU29IMdRfuDwpnDXRWjJlIwhCGENr7AK09ksYNlsPWo9n4wKerTcv/Ix5YectmbhgycZk -ByGjeyOtjZEyJp5JQB1jJvwFXdwW0eXQ9TbIr5P0IpyNiJi5cZhC6HoDEYKB9CcFM3pFSTTaIoAa -7QW3boR04TqnZn8neEOosRdw6Qv6aC9egJ7AgwtQuldVbf7i3vWmT0inr4FJ3HQE8NTf2nNWi0tW -q602ENLJ6LFvced6oPFLQaOt/OHnzQaTzIZN9alsV/ewuo84x6fCXgUqyXPZj7ZsoqbunRyV9fqE -MnR31D1Xc+ns6ziUVgUNAmBaDLuHGcpU6oizuZXa47B9k76LA96lx9/mF9J4ARZ/yvMZo7XlViPb -TvdCWCKoNxYs0iS46k4xbZNtT9+VBBOkWjA9Sp07cQPAaY2Os87PaTPejpZrY8l+LLDp65/yu+1U -cH+AwXfJ2eG4pO+D4HdWifLZuT7ttrvJD7XbzBTBr7VM/lVY+YquzcG/qaiAsq/St1AWwbtZ6vjv -HcASNoWTIJTybIVbxw9WgTeEZMc7NhNZcPGW+GVDl3ApZ+SyI6MagfzQspc1iYFOX8xOqN14dKyP -/jOjDpqvEdyIeSR9D+gCyPVS60IG0UQFe8ncgmwAa8UkKHrvMsytAN33uJwvtS7GMnynmxaomnRG -amU7AYxQAqvzc4JZgPBXSdOeFZ6gtJFUgioyLDXO0UT3YZ9HUDlhOqsmZotpSorY543a4q87UMnS -N3y/3XkD14UXOBimDZ5bBTRBBDmd+oaeRRxgDEAUDMJq34Wlgk+6zFkqCIxyDjEi8MNoS1M0O7E4 -VVLu+ObwIoel8O5Yg/Br0feQ/Eegsajcp8KO1aGWG6iCvIqvblKdG0PwHUExAf2X2EG02RS3doh5 -WU3fCNsaJZfndLLSRY3ry62W70DUtqN1PQwnuQCiV7gbYuydH8AG7wFg7o8/s3vmTrJ75h7Jw/2/ -f2bb+8PoX3AHR9t7oVYKkf1+dIA/8/5qtpCB9x6ol7BL8Ffc2X92p/v9GrwE+MMMyhTQMxya7m4x -Wm7h5ZGCgdz3YDDu1S1Y5/1xB7uYzO6X6KbJ0f169B9YX2G03wOyoHnP4TT5gdOrwJiI5WLLd0OP -tgWghBU+d3N++OXh/rRdbQG9eA2rZhNqude5Ekq0SS3t22M4bshec2UAxQHPfZ2N4f2n+o0BxQkw -W1c7yo2MqDXt42g7HVHa6j1BUxbYI8GtGzrA4kWA8i0sWmqrQXVOi48LuaziXTHGb8Y2okwKkL5A -U0Z+tKev5F7O+Ns/wSu08pLnLD4OnuxlDO3Rv2ZPgJKXABBZ8f2huPBa2NNxV0PVtqVP4PWYjW1z -JLi4SvAMwJe7RFVy4URHXrkIXlKxmMv76bOXXgT4LlDZX/lt8eAJ2SFlJgF7DSdXVR3gIWMXaF3H -S78EK53fA+Cgl9AV6IrmA/cSfc/muUPRb+mPFZd7AeJcPWRxaWDYK10yGPbEPrtD+CT8RfHyDFcq -+B12pXtjH+ZzPXlc6Z+jH34iAomXmJ978MJ9Qg/i/nTnmCPn0dIKBpSPyDk2SHFPCVeyFfoxOSjK -b3JNvL47C/zn2eQmikWTZYZnTY7nwQv48waep1ZZk3sU9GK+5MCOhg+a8o6XwIE4PIHJkatAuvGd -8uci/kjoLbR5S3i+izt0ewP/FCsPZ/k7C0WlRtvSuvc7zn0/vWSz7l3RVXjNP/R95exbLVsOpfPF -TjrQz/iOiQN4u7rByt/NPDdog548WinmMEdgdBmVn5c+TNnGV6dbTBQCvwBiDCTqB4oiDiOT681e -NblKfymTfYp5TZ52umfyRDyYyf3z2zF5coMAvbRUsLlLRUtfXb/VZKvgbtuPFy97nU+EI/TrTe0d -iT03kT0cBW1EchCgJ5XbHZ4F06OHD5BLzNdfhaVNIPipj9F7wOuvR06uVMlk5eHp9R0iJeI0+B6j -3S+tsal1QAq7jR/61KeDfMJ8gTa9JTyUwbuut8ADEXOC1/CtAGxo0M9uiJQMikZhhg2++FeU2qDf -1OffsasyaH4cao08hOKgh8grfmdRW2s5ELVkV8qDJh6sB5t5t1calDp9e832sbn1wQ96Z+GHdSWI -unSt7KChx8fe23NQedDA4A0r5kINxZU+FH8jdxbz1h9vKq0VK84nZdVBrURgUFAbdIqVStSAHxRd -nMMBuPjXJfKdsQW8GNjJdtW2iTGDNm02CSr5qZ7vBw2KO7PjgnhP3wFVfpK9JhzWId/VwGfg6O16 -lAfdl6uqg4aesfgjP6iYKuNAC/uK4H3lQZ8Lzse/0OlJadDD4z5XVBu0fGdJE1v8TQ== - - - ea0Bx8AVX3eflQYFqJR0ODOvzpHSoFgxWkjxg4J9Ee+qud2j4iqDDj6x4me5pbjSh+Ihbln5em2l -Qe8sWMl9elZZa+jRNltkGsqDJkw+6rBvmuGgThl4X4rOdDhjguAN71HYi2it9XBuwAw68Nglg4ba -9VWPHrTwsSqKVvqWwervhaDSoHeWw0P57xBePb6E0LDSQZ+c1FJ10MxqmM+qDPruwNqx2QENyvBk -IYBrno/adOY+Kg7aHqbjqoM+f5SrOaVBoRQLvOexnq0fUQTwQ/3x1F6MpxHFQXt1fKc6aLfkK63R -oHcWhbXWsN7en1EZNO3ofb1+ZxUHfU2PnUqDAp4Mhx0Os8dXFQB/BLDPRsehPOhzY/HbJxNOxUE/ -j94XNCiUL/K1bpoua19t0CI2fPlLKA/ayDio9+whLxkUjIKGLfx6QioAjpRNr89YnR509HAsiYkm -TZ1e3wNwUJeMaBqPccfXaTO8g/w3SUnX+u1smZlBV1GnaNDgjxV7YiQNYUvZy+JBvdRhUX2Eg3r4 -QcEoDIOoe00fj6EiGDRzkEnVj12UHjRtL7gl4DVliw0bPejnMVYVM8KuK15OVsEoYFifnBV2cU+4 -bv0FgxZP0kGpZdrBDBp78YpXWu7mLNYEGtSf7tbraFA4Cr3Wx/dDcPyOJA0mZ/pR60P/+FIBgxIy -7kxlx9uuy+JPKD/NRQBPHnTrH1XF56eRKYFVPlxHlae2FD46NB+VnoIdKLpNlpyZhE+VOEx5vA2F -i2YcPpehzUP5Zx/a2kJ+ladbKtz4LAclT7ndLx+PETz1FlZ+u2I1ZRqvhReVp8d4rVJ9PCg/rWGf -d5a6yxU8qTwPDZ8zqZNN5Wlt3oyFex7Fp5HnN9xhT79/wqduBYjVMTO3lx7505C1O3ovpFSeJuy9 -fOI1I3nKQayec76aqWVO5e2ye5gPdT6Unz5li79Jh9+h/PS5BSTy72FYcKk87/9u/AcfofJ087fz -rGYR5aeDzyarOxMeBYh9Ot857Ja/PfzrsfxQ4emoTyQf3OGiGsRm/efi8aExU357jn3+2H4rD4pP -La8v057d9JxWekpRyeHLncWfebHb4XOv/DmRqzRechv4VMaEqOxwczB92kj+qcQCQ2wmFS2bfxn7 -hTYV8x5nC3CleljNMmZsX2ctjpvcZOvV5O59tU3u4bRjsr87TvBTExq9eZOnNgzy1hscJblbgfm0 -M2g8NDb65HuKbG3AFOyfIEe3A/Y4T3CDPvqWybED6GgPhUOk6RNzPuqBsCWbHlq1hXaOSB9LPfpt -yApGYgRaOiue4QoHDTg+1Ad9KH55JIPeWfhhkaWjMihQbYGdM1QZdPClMWjJFJRgsnCtyNLhBvWL -Bo2Uofb/wQ5aWovB+ykcNNA231mEAH7JtASDTq3WR35QpP2rDBr8gdr/XnnQwGCArFfhsCIALzDV -QZH2rzJo6BFq/2N+ULAW0bAjjUFLWEx1UKRTqA56Z4E6RVcNwG6tlVaskj3F3UBbQMOjT8w2PJ+m -st1Xbtl4nBlp99BImpTaIX1M2JI6DVcWAb+Aq2be+a6mJYQL3nXbBW4Z8CkPNbgKAgsL2XaG4TCp -aKnRAlB+cjN/0liFN9cZr1jA3RJSU9MKGJztPc/MYdTKgWnGdqm9fdqRMCYwCphAzvczIy3wzyM3 -gFPJ7QZm807iztxvETbxi3xPgOmlUgWL4A/gi3mBxQf68ZtfhM2b1j+2EcPg+Clj1aDFgv5AZBCZ -CmLPHJg/6UqN/WXGcyWDfKnbBF+tUPqcnPyk1KZ00J4SpP3HmBv9oSFK+1xQPzyy0ECvn5SALgY5 -+tMSWtXIDyNdYRqv1fXWh/6M+qT2/vnTvQ5y4/lZz5XiDrqfGIyhbRrF9cWdBvbvztgOltrb84Al -7opdC9NZTxHdz0d2bG776/NwhzrMxZi1w0dmW1mPcgDc7yz6kPddTTk07UNgjQ8XA0vCegburYT1 -IK9Cfi8cgFv/mbvxVcALn4cS14HgJOJOyHdSpZqVUcoUYFf4aBw1Z4M4uxv+eRe6TRWosgCt4JqE -cWtSpUN1aX5zvFYXUKVfGTt0lvbxqA9oK6IhRlYqTQWbjYZd3VU5rGhVysg+cO+RmKDtfelunbEg -0ivCc479STgMvNLHKtbWhduUKn38GQWMKljAKPOY/U0FMI0XDm14Ke1Sh/E8731X6grQvpHOJHQ3 -JnZSkT96qKuv+c5yBt2NilwTlZ10F9z0H2av6COKF+i1liDG2P9gYEPRH4YHIje0Am6MHp5w1BXS -x2Sd+X52rqR8ZrE/ZYQdE39E7i1aVV6kO2dH9otUC9PaklVkL9kS8G6X0uS0j/DiTxXmI8bpEgRM -UUUh0NMYhacJoPm0JOarcsGksr8yKK4iJ353GQ1Wsr9GtScw+bFJG1hwfb47i+6kog+qspKfjfaU -oNynJ/XzqDapDE+zRvZPQaHjdX7IZocnm4bOL9o/XqUzsH+IXtR3kOKE1VXIANcCO5vaRoWbYBal -ZHcgT+9FnZ2D8XoQ09PrzoKYmNdeBTExRzsbYoxfi0E0ItcfeMSGaxmSSkGJCSEpdo52fEydDCu0 -anxsUTaqYKtpCmWpJX4FVS7KxOcpVzNqKN/xp+wK0ElbzoeOZDaIRwj0sYugU2puDJgKUFYC6Kjt -9EGPKRiZSI+zkvStFtWJ6HEB8OdOfypi3fKiiTAQMwQTJKLGfoei1Mz1hwFVVLmzKNqG9LEk5+QW -9PgdQ8fcLaFj204e9Twk0gE4t4YYdhVo4JbOcNoIyYOP7kCTKqjLeMU1q09JxAAU7H3DDOC3YpQB -8DqMCgMA67NevT7a3q/AQ9SnC4EuwQMlTUEsXyRYq6LLE5+HH/ys9QE9WX0HS4P9Of4MNZv8twIt -PvxhcBtgqRK42HdhCFjB85FBYO+LSTx5lJE4Xj0ZMNKUvEtSD0lVSuLn+xKAnmyWzIaLUjvXqPCb -Y9BNoOcIsLAeEi1WUZVq8BctzX5nMWIPa7k3qjKxLF/Vnb6DY1PFZofV6zULgjgGcEfVS2fU7+M3 -R/8CqmARSjFdwAypczyPLlXdEkBHzWOjwgpEngaxKg0DpTGkSgu81jWpMq03gIoqDdj7ox696MOu -pnQmpS0GVT2K+5pYEKpghODISI2Nxl5uQC81qQRUAPSdLunGXkxi8XcBnt9Z/OmuxX/9gqQiT83X -p8kA9jWptDuHAbByHwJGz11oTJeFsAkbwmRjuqzD7uLiN9hV9dtKVCe2+IyasIAJn8X5OO+oaNXQ -+e7Rxgij0g525TNGL/r+VtgZdj1PzgN4Zk4X+uL5fUH7pif0dDEe9SI+KRScip7ZjwYFKvXCnYlL -+7n6pAL1wsg9zko6Q/LJOxOfD6ppFyqdSdzipfZWqm/C3wycMNxZDPm9YGdXiBuRXYlmq3Hoo3jG -pwrKDg9KnX0RHnNrcTSnAkfr8hyN5ZYXahKQNgxwtDsdKQfVSt/VHI3xwMPO8FtxtMOKuF5TygMD -of1wPe13b8LRujxH08Ex/X4McbQ7i24/13O0LsKxoerhWQabHbs+BouUdQHxhsUxJQuawTHR0aGy -lsIgAzMRGzCAU05JUJdq2MP5MVf93vlmtMLZK9jQCw9yFbuCTFb/fF9fq4ed8dEPSl3dGVGmYaSO -utFogJjpfYH7RrquVclRL4pqHMvHzujHSAiEpBepHwb1o8OEDc5GQDnKJ7yaKrmkMyNevzuj+r1b -QRq+GrWq7yy60vDj72rPBu1R1BFghvV70JWi8SjHMQPSEHR2HvkI7H3hro4eZuZr+f0rLwuvkmKv -Svr9BVLs9Xz9XqkXJMWul4av2rIQRkOdIw1HD0+EKhmqykKh9SqRhjAo3C2RhrLYF2NBgIqaUl9L -GgpDp/gwDNXVg3l9ncQnicKZiRQLniBVPBbQVJBqlDIb2Th1x+yGCFJM2ypeBdBZ0EBnBvAFQGxr -UYfYWcZlX1vnlUWpqTDmIaXlutYLppN4etGk1InUgKopEUtexrIQC6bBjdy90KTkxZJC7Kg7Z9eL -XBOufoBi6bVBKYtSU0eWXH+lbRsZj7aFnf0ZEC2KAfXyro6WG3lIBgb9yWpnA+K9NBR8y3QlVTFY -uT/Pe33iaClVjPAZmZLYLczHWxoMfGU8QLxGmUO2kcJ4gmy5O4vJ3jKH4YUpbZgbV4f3pwzPz6HT -zqCD9sstcuiEHi55Bp2Qw1yTQ6edQYe08Rvk0KkPCjPoBFR5VQ6ddgadMFvwmhw67Qw6Ub7YFTl0 -2hl0omzBK3LotDPotLMFjefQabdDcRc3yKHTzqBjMFkWcnFuDh3HohTjocXnlZfn0EkCkiXyWsEP -07TuDZi9Qr1OPQ8o8yeWYsYmpTAlSntKEJvsgig19Yypq+NXuQiiptVITKiRXAFntimNJZee8hiE -k00nzgzBiYeS6pn4OykV9PI4M6fBJDzXnZHoUGP4FHerdiWI67MbwANJ5pzR9YlzeJlJec8CusaU -2KMczs9/MdAVHcgG6UU3aU4/ZU6ArkgfU0PYgZu61utXQKxVlF2rHwyisgdfBe2zubsz3MYDj6FU -IoWlCWi/YEB5N5DsphQKohAJqZfspnPwb8TTW7iFqwrmp2np/MYBo3HgIDdD0ChqhgjsTDNDS8em -4UKwGK81sFlLLrESUdSzyQ2yh9FDX8OnpGP2irezqJ1iemdROIBWC2gdFY0mMEose0VPb1EzMMCI -40zsNnQxHEbkJpmWbpdAdJBkC16SB8Zmgb0ftTXBc/L4xO6Wc8LNZXl8urrX0453WmlM6Ziuik8T -zkgulE5JPQae2zomukM3j8+sJ3PPyOPbamePGKXPklJOjEy3PKMznVsQBF2Jb2pV7EznFgQj86JP -RUv6UfXnLFKWMXMNxNSPQi6AmM5VCNrzYiUyS8lhShbqdEzp3C9iTJddlOG9CjopjCyxq3Whm7YI -b6LQ7kKX4XRw+o9u5uMxrUPdRo093rUr2URB3AWvPSuqYkRu8GA1aOqr+GBhIpZhq0WZ32klynF6 -su4mS09G1C0etYiIsgHa14Nnf6h+xCizK1XBcZZ4k5xJCDhM2QCdG9Aj0TKIz8PYy2uRbI6VWl6s -sh6pnumzVUyBV8Rk7fSxs9wWDtWz19/KjdKTwZQsGvrYeRT/ebTrkCt9e4MBONnOh5NSfPJv5Uz3 -zhmZcQrZT1qTEkzpHI8MXIvGpPzXwImfkvxOlcvhpJ4Up+i5Ek1K7JFJ49WDxCPjN0f32mHrUhxT -S8/Ba5e6LQS0Xz0/PUdlDzZVJY+Mgu/CQHoOXrOdtTRFu7J6vUcGJqHxHpmL71OCaWjq4RySBUF7 -Xz0N7WqPDMw/wx8Gml44Y4AxkJzD5bxrpucA6ISuCCnZiz2935mTLA819mLSi5TTVZbRTRT72vU5 -iekuru7SYTIgDFottQvvDVOSyPuaduyssaUlHfzSRHdEGMfQfe2se8NU7oSEe64Rug== - - - YHhBloBEu7gwr85QtJ529CDMqzOQQqIbHgLpBSbXqTtBdZPrJIF6YORHm+QcFXl77Np5CMbOyrTy -4Yzf13dNPpzsLAllxN06H+4qHDOcD6cToXqjfDgUoWooYvaafDijGanX5cNJsgUvzgTXzodT55a3 -zIcTZ6Wdl6phPB9O9x6Sm+TDCfalo3mGcFU+nGCUrtQcv+xYB3pSpJzownyxovaapXoE4jCKmkRe -dsnw5TGRKLZHHCdxWeaYpv7On1hpHh0CJnTNNaSc/YL6ufJaC7oXifGskiduoJ9zc+yVMrlgPze6 -ixSRx/igfpvW+RHPLvlBHkxhA0SoE0VgiAzBRuhkRN0ZIsMrLgKWehRhZz0DlGOEDEFXg4ertXEA -73PMaLUb2oEUv8FtwKgXQIRXWq+oHwUylPSie3cH3c/lV11wGizq5xaqPdOV+IIZ+d2DZ1wxA9fn -kviw4G+6OYnGzp9gDtItMlI//m6WkQq6ul1G6sffTTJS8QcjSTe6Gamjhyf3Nf1wvSjyzXMzUkE/ -F2SSyjNSQT/qF4qcMxuBg1xcA8JYLreEQJQuTZUEGUk8vZpkGLO7ZWQYs+sIMKPRtjdIhRNKMZQM -94+kwsn25R9Jhbszluh6ZSqcBGLbfyYVTs+uVGFcZ6bC0aNoTuoGqXB8RASTDHdmKpwxxRCeJeW9 -6rnVZ94ID/PqRAESkpOR8/PqzjixofdF7cwGppzdovAE8o3DzgxcZGgse018EbnqWZIBTpz3+pSC -apW7Us1Gh5EH6kLmTOGQh1XLlXDizBhUxgP0QteMU0BnYcQdKnIZnr/Pw+RbsdfO+I65eoH6Sg6T -HXKF53O+6iv5OKu2ybSr3Unuvl0h8KnUBO1s+WL/ozglbKkHkhZGyN0r8if3FJLdntPCbCxJsttj -b9AUuq9ECWCpWP59IMk64zLsAo6+at4ZdfqO4aqDYkXM+aQyaOjRHG45PlUz7AaaGXZ7v/qgpce3 -rmRQYYadrTL2LtSysRwayW7NICEYVJwAdrCFrZRqhl3wBxa5XKvknTk0MuweiiOvZFBxPb5aoqky -aOjREngmv9WS3YZa5eLMIa0Mu9LL45vKoJGypbF8GqkN2tKsx/dc66kPWih0i+JdNdPXFbCfmEy8 -kzPpk7SjISZv6c9jBnrEvp2xrIF2AGKx3bHAC0+w6kFAqopyRzgK4jSvFXPPR9savPYfADXoEJ8R -kUbDmwzUsUoauKpZveiXwEoi9S4TN5zak1eMJ1WNubq4kpyS9qt8e8M1leTEApGuI6dZKc8wnMSX -nunGXGnURcMU7hFXj+vTrPt2XRE5UVfCYzBah7kwtXJnNFKXvXFaY1I6tQaMTAlFdll35wVTakxJ -OZTyAnrZ6d2XLw92hfRy22w6pRlyGuzNsumUtG2uZsrNsumUHF5qnt7Ls+kES+Nczpo3T16UTacU -AEKfV94ym062V6XB3shdN+dl013mtT43m07JUhNg8o2y6VwKuXQ07d8ym07nHsUbZdMp2c2qGdwX -Z9MpzQudJtw0m06uGE5L8Bz5ttl0ytG2t86mU9pdRXv/qmw6pVw6zXpJF2XTKeXScbUFb5ZNp7R/ -4hiSW2TTKeXSKWtK12TTKXVF51feMptO54T3Rtl0Srl0V0NMTyc8C2LGs+kMQOwG2XQs0Qhz6Tgp -drNsOiUNXVIp7wbZdEod8Ce8t8qmU8qlU4lTuiKbTin3S9l6vSabTimXTq2u6OXZdEo7pBRrfV02 -nVIunY5deUE2nRIwFE7er8ymEy1Ieqf9Odl0kinpG4AKGamS5B07SUkL734eFjoqhiQ9TC063V4w -ncNw1BOfELcwrl0YrVenpPAY1S6M16tTCp+Q1uPTqVdnFE6SyrZKcbAG4aSrWEjuIdEo5aZUifb8 -KTERRGfhpfqU1KSPPFNYD056GoDSlOQcBpW8Uw+lOG9Ks6NhDtNSs4gUTp43VbFIUDqvNOQGu6DM -nQLE5IXuLlTJ+TJ3Z9QZuaLMnX61LLxmv9YZU0X0cnWOg16ZO2PxydeWuWNirrQL3RkFjGpyg3ql -CbUwhUvK3IlkZV6l0B03W90yd0bvhfOnu67HK5FhX7tZnkU69mIo+ZWOU9JWusHSYvarlwary8mj -Mc5OpNMpVmAk1rp2dVIRk8VpIPrXQN0+1RAO41lpEDCXJr9KIyFrBpNgDOYTNTfIUJbUsWpulETd -2YIOpqt5JediFyaI3S4aqn3LaKj29WVdIbRVSe+8zEeH0aMQSS8iex/2c3VOLd2LWOQpcEuD/agH -UZ1TJ9Fxm0KTqCtgJd0wsVbhgmLwW5K60a2AsLO8evKKIL/SSMYJ6IwwVGNI4C6SVAARAvN35jQE -SoEhqXG0BKuZHFYOaQw1+E2nSJPBRIYuUt2vzkzp7QwkMhitYNjb3bCCYW939QUBENrSQkMXZj7G -nWepuyo1hmT3FF+UOgB68dwgg1t+QbFqdLpuP+LECkOFeJQtC0QgBlIZjCcy2P6cPBFylSZsfzob -YZAMFSvcnZ9feUmFO43ctxvVraajCK4nQ/0Kd0YzH6+rcCeolHd1jIV6hbsLKuXdJC9JXONOyXmp -nR8i7gqXcJjzOjuvwp1a1I3RxFr8wQgAdfmYWsDGWWoOn/s2NFBc1VBi7ehhLHUYXFDr+fX8+6mU -Mx9vkVgLe2G9WVfEXMF+DJrWdxa9fq5MrEW9aN8Ld15++6tOjOL5+e0eBTLsq/q1BHF9xsgwZjeY -siJMYlKVYkPKYMqKAVD2oUS+0cVzAGJqZjsHMcNXm8POzk1i0oCYIceZgYyhmN17x0/eSBqTEuMC -8OypM2aEEXcWA6ohP6kLk5hYPiZVDfNejyzHNe/VrfmtohhK6/ENblnuMdf/MamfjJyb45r3KtZf -FepjxnNc815DyeIKMRvye65AZ9fczSeCGBu9cYtKefoHOHf6Oa6wSN7l5R6ldxANbpPjylMv5isO -PcoxJGyi2SxPUWncQifpddLhAflWHHTItwKVyZZDnWo+553k8zlfDYZxtves4LGsxZPjom0lddi6 -+/W7cj5cwvSuUebuJdYUIpIoHw6MEp801NLwgj9OS8K0U0vCU8/8OzwUpz6x9SrJ/evkXlQGDT2K -ssSkg36rDnpnOTyUPFHBWqV12GKuAzeoNDUt0P+px1Uy/x4EVQRpr7UgI446fePSNDxBmbtEfKNe -cU61tt6dBa71XSv3b6OecIgVd52O6qDW+uxnytOLNA1vppHl+PzSVx+08PxeUhr0zoIALCpeKB30 -RbargDSZ4dEnBs9jqu0Ynsy1jBvqMfBRN9bO0UTtuNwEoh5SiFpgHMOp4mktFZ3QT6zKjiTSTrGi -gVhbdcnvl2tad2eFTWpUMdMLhZF6SNSzf/70qpgZrfKlHYh5d0Zqk25oldHKLO/kNaFVIjjZBAFo -epGQ2nCShFapHggayEozHlqll5WmF6NpHJ92Sqh5QWwPeW6UVnivZlnASRmNEtab0pBSv7HtzKw7 -zSitc+iFjdNSmFKGno3czpHeEOLdydjVwL2/hY/5qyCtmXKBD9bArXGGaz8Vrjm3lnCYr8LV7mWw -tI/r/WNfhfP9Wgr+MbDnVx9ZSzzLyncQGcsCNH4JraqshFmAN7qyEWKyVpyW4ZLcrFI9JnbSnNnR -Q/1P77TaEIcZE6db2cjXOIOlfv6i5pXA5zkC4CVkhMZJopGbh8Q+FfpmCFEAQUnu578iu01DbzNy -R4Sg+SpyvCaRTHiOLLt/7Jq0KJHyJqlhp+CNVc9um6nec2BIGxdOSsLvLyurh7yj05KY31+RyhlV -1LvFd0IaTgXsec5CBhTTq96ZbgUtY/NCGRA99bP1sxepeD54KcSk9X2ugphuYtA5ENMt8mN8kQEN -iMnSheX6IUsvl1TUu7sqC9BoDiCiyouzAPk5aGdl3V2VBXixP/msLECjOYDqFdiNZAFqW75q0VDn -ZgEq7ZBSDqA4UuXcLECj8BTJyrOzAI3mAGrZyPpZgMbMUfXTN+0sQGY2slVJtCeuKJ8Ax/7Bonzq -mKyZtXVmUT5Vy+KmRfn0vHCGE4c1i/Jxpzz/aFE+iY38DxXlM+KFu74on17OyG2K8iEpBif1jxbl -U79vXAtO9cCHmu7cNXY31GV1/YzdDXVtXT8mk+tmd0Mp1/XTdjmrZT2fW9dPcWk3uBtKXNdP2yuk -cTfUWXX9tKv6XX03FFPXT9tdZiC/0lBdP0ORw1fX9RMp7LKqfkwVs1s4dDWq+p2VyaVR10/b5yDP -5LpJIlJKXNXv8vqV4rp+F/otz6zrp4yfbFU//eoMxur6XRWhariun15+5Y2Kf2hW9RNj8uV1/bSr -+inpY5fU9TsvK+3Sun7SaCdxVT8tP7+B8gBcXb/roqCN1vXTTpO8Tc47KlqnkYB7Vj2+i0vZSurx -XU2BylX9FE+sLqjrpx3mplA34aK6ftqWGjpNuEFdP20LC+HYDer6caBUrOqnuC8X1PXjRlGs6qfm -h9EMuJ7J6/ppq4OqWWln1vVTOyigq/oZ0S0N5T1oVvUzTPs6df3Oqcd3fd6DclW/y+rxnXulgFo9 -vuvzHoRV/ZTO+C6p66d6doVOOLmz1yvr+mksHBChuJ745XX9jGalXVfXT5S/Javqp8vHDNb1u1Ab -P7OunwqiMVX9blGPT/MynXPq8V15swdXj+96MpRX9eOIUJyZcnldP20rQeNGnbPq+mkb1Eo3HF5S -108pf4tXc9Ss13Pr+mmrOXdGFB2Xfl0/Q7c2XV3Xj01HVK7qd0E9vgv4pmI9vgvyZxV6wYzZYufU -9ZO4syXJ8HcWVacWTyBXJ8MLTxOuqeun7deib6G5vq6fKH1MVtVPIMWuquunbbZz+3JlXT9ts52j -yivr+okgJqvqd6ldKa3rp2dXqjCuM+v66Wdx3iLniVMMFav60ZEqF1z1JsMSrap+0H65RV0/7YRY -dX3svLp+mgmxEGK3ciBrVPU7X4dRruunfbigcjvQ2XX9FOmTq+pnIN7SUF0/bYzgbtA1eldKPeCV -CYd6QCOrm633qneJqc1vjq58Eteu5hmmNPBegMlKiYtSl5bYh2UVkb19I3R4IcbMSzE6TYBNgYoI -3d1iWxRmhJns746TyeOzPXn99aiZbVI/UBRxyJqcC+rF57HErP7Xp2A2GHIdfiq+3Wl0Z7GVZ5Go -M/1ufnswVY4OU7bY8j0MvkIxc/v1kbSstu26bfaz94Ta9b9heDWtLzKr7+ef2qwdjT5/lP96bXxf -m7d/Xpbrbsn3dOoNSw77cJh3OX4Hwd/GpumKz+8se9db5khZ2nYbRfnNpofdbOezYOafuOOtPum5 -oq4ne+rPvKljU8uWpKh0rGlyfpaeTESusXbFJ4EMVsTSKazYeS1ipcfdM1ZqPP9Q1DLtoU4/KdvB -5n4e31ng0k10KmA89VdwJSPP73BLTCjtDSv0wkPqsKg+Yr7GTJG3M/uCsktThyP5Vg== - - - zNaLyWxywpeARBl2wR+HLffXUgbWGg+0f7rmPyqzDT2bXp9rLvWVnr69ZqfV0m+aI/F1ztJsl6q2 -73YlCWg/an0KubjkULBNHwVPuG79BWjhKh4eihWPiVp++mACZwuIlgYlpqa8kHy+LWuRZxUqEwA1 -aVmZ4xfHyx8hJNJhW8y6IwKF19xfL+M7OklXNDD25QpEOQN+e6pm5t3Oc7Yc+n52RYPJdDFqbk3z -n9XHMlopvBdu4CrQhI2udUuVXu3whMXuIt2WU9FerlTwwlcskV+OfDjcnG1hsvqLYr7+ykMMy1M3 -5hv9eaCMN8OICA98FwjM5G7lT3cfvOiwhr919tGGjCHMFww40FcAscwOfI250FdAzq0/8DXjob9+ -HmZu9MlvTiS+i0PHew2bf2UWmXjdRIFZ1wTThJkp2Pabe+QUrMCdt4y5B27hgy4+5R54hQ8WyTn3 -ABON4jFXfthHzw60VrxUfxhxv7kE/ZS+vBPugUf4YB/D4G8+RiQEnzGYsLTBy6E6ynoOPhN03+Mv -C9f3i4tuNN7j8J6OFw/HcMwAVeywOsyLl24yCeUJ+BVDl8bjk3IDfWU6nby948wpD+YbFF2+p/bK -D5533Og54QjFOMB0vPQomMMcwYh121JwRx1fmTjWMwsRErBMmqEiC1PJemU4P+jRd02PCv1hbCQk -6hH3PR4Srm6cCqW6geds+HNqp6nJ8dY2Mfg7eCeym139kK29vn7z6EU4TtMVu/BXAaoQZDnpRfvy -SuM3Qb5VcBrxyUkjyHxadwnm0+n9CxE7UXCMhswnYhGEHQTpDoZvGahbvnlRjgoxXAPTHb4LqHJ4 -ajF9fzv6HLa9EYL5fMenv9yDgKvQ65fhWsaCtXy/mvKQr8ThVcWt3Nq7cGabk3mdrFVMbWHWAMZe -6ZjnvHRWgeuPZcc5v+VUmbGDfvpoOrcS3QCaq98afw8yn8jRErVDEPv0My17m6x0Po1857NIrh8m -2Vbnw1YYezKvUKYmIDfx0YaN77gPFQvEU0RVfNMeeKtA5KeCvT9eBZH4plDZ4VTIkj8BMTLrk4/T -UyH/WWr1Y5+NnR3xzZxjTcE6w6FyroB5O/G3+hbYYqV1r/8BuKlp7JJfXWBDS8ed2Qg6o3awhN3c -Mcvor1z0nub6XwfMt3rw+pYPTSvQcDZHDLN7Dwg14VqCXhtoNPAgbw/ilqhSKc8tcSAMUqDvspvb -+A/wRg+ylDKKDs3AUBcv8mZBJgQdfmWf9CYKzrVbxhR2v0Vz2NQx9SdlrYiHSLgq/VsXhzhdA7gR -7pXvLPnvVXZK5N66aUaCpOoYFhzX4EbUcCE/zP2FAG4sGpDzgQEGOyQ84MI/sowGV8q76d9gqhT4 -WqGbQCnWH/zm1g/bIl72FHHYhbDvcroFeduLU2Jh02qlIGE9uefD6uBF88kSL3tlkZCAvF4bvmWq -noXkGsXLXn8B6NvTLBOEzVS2DXCQlRxGPWLVEh4Bexq3g0+BBOeHkajxAo/q5h137zdpfPxjenal -CXfIn3X6K9jcPiLgWrqMNEgO2jKWyX91p9FNes2kU9EGEeiyjngGoK4riZctWNhvNSUqvp+5Nw5Z -zwjpP2iGuDM3JWlJIvZ/IRw7BrFaDPegtaqFa/MHN1XcDStiV1f1ArwnPOq3FkIlwuG11RAHpZEB -jgytwBfeA8/5bYcnCwRmDC0TfAo79BcZxsf1UQGM7IGL9Nd8y1I+zxhN9CYuGvJTUVEXMb9lagZd -5DcB0IUz61sGw1miEN9MODg9aW3s74goJHJQuxgv3lNga60BAMJAxG+lqIyhrWWXS4McHTioadGM -Twng71sLbKgr7s9ZbSl/zjcHUi7jqTBeZEP4GwYsCsAdgDwui4cRGl8yzyTBWlbWjVAdRlpt0veL -bEjEp7HZQ9DHrwD9Bqt2vyA1Hd4QkqRcQrCiLhLptqCLyofbK+7iJ9UdOmGmROsIzbCu6PoL2jR7 -BL9FTsz9MCbrG1EV7D591UeiwXfxIu/iJOjCZC1by7xhigQGwg1GVrifCWRXpoBe5y674Ccv+hV+ -8nG/AQbvbgMV+WinaEUGyI03gQnLrhldWfPN3syShKrf0xY9uLPYx+bWB+ChgZL00hZG44ILCji+ -BDZbgjy0WXPNMYAPHhljbt19FhnKcDvRvtCX3/CV7Fsb4ktQVBOsxcnc0pILNbgbUCQ3+DgFC3qn -/GN2QTFcHHP1HfhTnjexEF2wA0QZa91l/C61+33oFAuuAyiRBWXoow/M0ieNJ2gRPbAwEczbqzJv -NCizEbDe/Se/DeK8JDq29IqNgOftbAcffAdgFHgVD9dFX6uLwZ7r4lM4B2EHinNg/cnozkSFWZwx -hyGl2gHcFyNdjA/XgBJ5en9UdkN4qxHE/o+9ITRsDqXoCkZR7nHGTX7wxveIFWuJpqjdzqQ6Q36R -tB9GjXSpB26ojWCo8tNgImw3+OAwa/AhnNJnuSXZ/abIiVZqb0VfgaASfl2bRLPpiRo3BzvR1zEl -OuNLNX9EnTVXJ9GUh3vR1/Gf6OuMEn39OYh3f7AS9T3YivumRPMenB6EX98eH4Vfx2PRRMYzNJE9 -0i3LtKoNj3qiIu+hM2ByD6d9k/tvXze5n/oNmteANwQOBeiD9XGipaXkiARSzJ7eBEyu1KoAO2ub -XBPPymQmwyPwyVuGfdfhgzf41WFy//xWYZMXk3OxayLHUiwXiGxi1s3nMJ7Gen+uaLD/BzqI2EwP -2V3YZKJeq2AU5R75flyUK+r/24g+BU7sp4hJ2G0++wAtpzCnInL3wimsUOhgPcMgkxkf47Ubhbqg -fen9gbebeQ62TiI3wCvS4QVyP0AuuSn72UGBoKcHBaY5PejooYqcYC4uChq6k2A/yPyAPiUfXsKL -Ttp3keu/s35Eoh7ksJZVJ0Z/EQmIJDNkOAwNIuR/4F1/KKQ61XyzQ0OKYDTK4PDITHnQ8CKx5M9F -/JFQNxnLZ7vW+Jb117T3SMsKrsdToPMDk/rNLvLi0OYx68WRnX28sF6c0hoG7oRkPl+h2f6HxkM6 -/6NbovfgbjyfojcMWSNANfJBUPt5pRSdKgHDLl/T3z8Xs/viZThA3xmB15Nzc0L1bJYDb3xHXKmQ -oxp5iUZKxexL/h25WwhbMlmmqFRyTKZd7Q6Ztk/f/AmcmortyjOAxdxVpLsMtAheU9JeBoPnCOWA -ah8kRD6Vsk2kmVU3YrdMTngTOO+wprsVhztI3dlsjAwcNILLrSQ2kI2OHoQejThvqSMLlMfQ2PQt -PWBcyaO/V6FjsGKLQxwT4aeKKY9uoWGMecYXn+wfpD0S37sSkXvzl/nh47lW7wlpwpIH0fLgBGM/ -sg6/ZbIpAIOLSiNvT9JNkF4TMB/xd4zZfcQPHhNgc+bhot86PITgNrl8y3E/y8Zc9f5YKCKUG0RR -VyzYfBhnXkBMZgVFH7KPGMclkCuuyJxw00e6lIWfHl76MeX82dfyE+CHVY8/W4iSTKxJfwXLGixx -gKnfIXhTCgW9Co0PB/QV+QGwhmACq7UXXndEIcnnz/7sU+DBTxQeM7jgH1ok4uWMx4/Nxl0cL5sz -AXRRFuGohMIAxasY/BMCKvkf7PQjgnAs4gO/PvngKATbPAp9KU0MY4s4vaPEaH/2uVYkHC1PFcYo -BgnHxp8jhhtPBfpPIoC/1kmCfPf4/dbE8xOAdiCDu6NHFEUAGCA0zce4+2uUIxxhZxm84wtD6JC4 -OzYl/FZ/ue5bPuJx6O6N4+Uwlsdq+IK9ODDotUl8kOg0CDEmRE1wFORz4k5XAXLaJI14txTLGZob -MKXwB8PRgridJkPQ2CFGGuQIwGEcLIM2Htxt+3EIaFp4uIuwiCTQvHF3971AOx3FCCtDV/F948i7 -aCPsi02BOx8Ncg8esHl3moJOjVcGxY/LADY7VrK0g1xCSJ+bYZU/AYNEDyt9O7PhLUQ/5lCEFX8i -Om95EsirQAfFPHUCcawWtzUBFq3A/k2dJHReEiJqau/R5VMASyoUssQrFDx6CcB4mZgr7SDMcKIu -8OeLgA8AYq9OYYjdJ4i1QNCvlkHlr+lWSPCVfTeCdEv3Ee65i1k/K5FZwm7u8Il5lOL44ZMQD5rW -P547+c3xQlXGxwBC3lkAMJd16E6LYdVjBeDqBgNygyD8ABL+Bj5eLDBILx9K9ALIAoO/JeqQXghi -WN4U8FJ3H/BbC4kaACCsW4c/DGgN1ib0iqFPjZmb1iTQ4Z/0tBOeUykiu/CqKB9qB+ZvOjG+caFA -AZsMMCLzh7v3+S+jFKFND4Lc6r2MVJgHavcex5pQ+z3BPxuowZrgn7IXs81Ftx2j2B6JesP3czB9 -2kgW8YHko7Ww5MBOK46Fjyw6o3WyamN7zzQpxRwMlhB16JmLoxj4hyY6AvBwpOIWyXjCIZLxGucm -shkyIjbCWXxArYRaA5BTxR8njGRBDnvmjFPoj4QaLGMeshoszy2/8T1c7hp5uPg3xFWY2aARzpPf -FQu1RuhlZk4xmq6Ir4SfR+kk4+sSOZ8hbWegFGPczzHCaYpWCIdnU+KYWVRJskOR/ywe/gXtC+Sg -XvEDGAFVRrqlBC9jdj+PlyrcCx2HR1xCOSzRR5anMm9BMhl2CHfQfJgjzz72KNcfgh413SNODCu2 -OkFWbH6e80OQ99HNX4BbTsoNsKGnxyjN0Wr5MGCAJyuOvuKTly6ddI2YlN/qxKrQ7xyDsMvi7vpX -gnC8Y2WYywNk6nOihrv/zAXIcMIE6fktAi3EFqLjLT/4jeK3CbCwbhpOD77jiAJhtc+ArXtNAgGd -ewL8sJGHc/imjWzuwAyM57OJJFvYeWcRyrZUwM7xmpY+U1A7ZkDO4KPNsxxnltj3awLIF5/HPN2g -z6nuZ/9LFBkkDyO6zLikrSSXtnHJnqqBRcpNXdHqodqoMEOW9tUsj4vsDglPQpqSpuWhZFnQ2Sr0 -uZExAwFAjDURnHITYd0Eul4yAw/0E1gttkgDcdqiyfAsA+HOcpaJcKGBwFivWiaCw86bCBcaCIBe -HJ4vgE/5blGqzdnSzhKrxrf9QBpMT4TDYg4KvyKtHeVbH+0D+YljqAwWtAC2mD9L9qOQ4iHT2D3D -ckdAZV8+PwPlPdGgmUu691yTbZP9K+XPUp0mQJASRjjK+zTQZnJP8IgNaoL+OlCSElHm9jlsam8N -6DCj2WFlE2qrwbJTsD76YFx4XKzDFIS5CUrRCNly6Lmc/6z66uRp9PeWLQeLDvKtGK9my/6fl1S3 -09qb7J7vL5Pje7Y22dPricmxXKVR9KArGqjaLBhGpUAHkUbu+9nRvLMUqM9xA3rS9lAFmZqsgTJl -snw4NybP9sXEKSjgQfL5wD14YPQVe+XXT82/khKlRZYx9I8oLVBlCdJoCGHMnonTPp6vcNKAh4j1 -KvisdDQbM+jTlhm0MXPSsRi2ZNvJRBHQ/TChBkknr3nLdaaI50KdCcXBMlrTJTrT2g== - - - bTagM/HZT+AdOc92cDpTR03m+JlQRDSo2LnOulftzIkV8olyvJYpCnCmKgYvxlaJA4CVvmWRALdU -xRAbhbEK/6gqhqB4Z7lWFYvgk5YzRzg2uZoSu0UWK8IxZZvVn423cKSewWJBrHqGlLfBHIPHFYDk -xnMcfgow7h30dbz0CHS51GrtQdYrSuP5OMDQlA/i+7lAsqEpjhCtubntRSdQ6ZCbxBWmNbxswQN9 -LmkB2waKWqHJ64QA7nuwyHc/ibw9pSBe2k+LQCg4S0jDA0pEMouXM2macV/Nthk+xotgsLVuL0AB -KG6DMZdo48deeG8uxmx8f+AW0BC9Yc252599+hoKjmPYSMjrXHpuA/Ia0oumS88de08C8PuLwmXw -Lj1NR13ho+lHlwSi+2EOYJPfQyH4qw8QqesRLOPLK/uNbhcNy9vRv/n95tjDA9Ajph6hLkC4gaYE -5w2gMwzFgNlQqPmWQaDLg4kECYd5miAKzucXeH9nGJvXv7KARxSeNZBqaMoC8glVIBqGsDleB1od -8RWHkcP4Vxo8SlSZ2JcrPQhKwp+7s0vbg5Acvlgwz08c++71h4BdeL7RVzwX/h2Br/4x+ko8bm0T -8DU6RaEwwhh4WaD4LYSjRDRCi09dOAZ2chPoklM6tt6r/jmdkumiFGmlpK2w91rfTl8RaCt0vjwX -oXr9WaG2McdmDUjPCmlRfiudCckXZcS4IVrQEapXHd8aQAvx6ds/pcZyfn45YtwQLe7OPUK+CC34 -02rj/OJ8tGC9Cv/EqT6PFgIN1jC/OB8taO3iPH5xPlrcXcAvzkcLOsfqRmJEFS2Q1kcjhuH4BoPR -DaJcHjCzgc+Q3cWEIxn2VYvu7uA9V2faXcKsQ/k5OS6IkBLUr7TzkQ7a5+jM1TBnDC+4s0s6gRsO -j+4iOHP95w+P1qK//otjDNxiDwntQnwBGuzgPU98k79JrHqcZgky46xcbdHS3FJq097aogUQk9m0 -1s2V57E/BLAM8wA2T/sEmiFf/QedyC7eAZTfj8ID/UQ0BzT9XB3ewh0CVqCtiM175ir0HkZo3z85 -TSDvYcW3TOUTwLIIvPHH+Vh1lc/CSPs/Uw26AYFB6sRIYKS+ROH5aRPs0KgAc6fSWM0+gqbsb55J -6TjXLGDki95ROx22pLtrsrt13E7Iu/oCKXaTyBG74oGRkj9Z3U+hMChzwK66kwRZXiTh7vdsNXla -RuIJJr5HYBreu2QvuZ0MYrMmHvFbX19jYP86dbD7rSrM6Etitdghj82OxQzaSXSOfK2Jp7CTSJ4Z -8inJ9pJAyWCd83eSt/iU9hIWyLzO45QE43Xz0M+fzgTlGwroE3ryVXcVGOFOSJ/OOqJP3LWqg6fP -z2CbnM6Sb9lspOgrkGAiA8Rk2cYDIm7WC9BSj/mzz+kctNMb0OgPYTW8m8fd9j52lhsIYbKyI0ju -BooAPOgf3TDIwSHu0S1yLClUZgFsyFy6dRQMTNWkk44JW7oOJDLKq2MUObFv9ddWThkeFHkPRScx -gm24s8DdIn1LdyALo1vC4k0O4x7zAW5EPSk6iRFJu9m4GAOa528RbN1fEnpf0qDJdxc69CALRvdd -VMdF121cevKdTAHsDXzYIYc5dy8BS8mdt5NMpQmdiCYgwJ38Xp6/k+h8/8WKjxdfSX+6GwjIvHmn -x7DITSthmQ4ChmoB4Vd4hsKv8wQvxknTh23zWD8OCC4K77VG4o9ONZLQpxMrQaZQwifpSgQ0L5Bg -ypMm8vQSDnMfokUjRQfrzH5nGyb9OhhwSJyqKOaq7eXcql4uWkh0gsa71521LNSzHIC3vyeNyk/J -LZoOO3QwethzHGWPKUIBceDDQKyPtWgc4mJS7ixXH6wqDNqnCzZygRSAw0hobI4vsvCMpAqdtwnx -TocB6y2m4JG1RxjtJabjScVc4JUpsM99dPa6nAN8c6bF6pReKIV+IEWD11rZ+LFU6dUP8y/jMJTU -pkWpfUx8ZIRowwo5URElmyqRK6T9KwIQDZLrnUWD9QJyxaoDAMXP4wOhQK4RTXKFCb/mDNJw0O5D -HWcwKiE3NjYf2qCOU4nTFxopk2uiAfQoexreVBBF5EqQ6d8U2n1/9jsNyBWv5HlyvbOoEuyF5Arj -BZL0Dl2mKTk8KDUW5pzazyJcOoJIh3SvJlzGa61NujLC/dqnieE0+iwnXDdk0QsYV+wSKL4oSk2A -GFEwaCzpt35/xiWqL5hDP0kMN7aSASYs2VN0Jm5sV4cbE6K76PmWDH2Hqg/wp0ZakLJ9M3ZMR7mw -0VAXsuPZKpaCgfDPilEu5Hs6irQnaFnI9SegBPtF2lOhUIDHZGUYYxvAy559Tlt7AittCLQneGL1 -NcoAoIcQigRgXG721toTihzm9ScHDhbUTaIduuRUtLQOwrR4gKn9cY+3czh/8j9gs/KvIflyc5s1 -gpe++iQQmNgz2nHoVRDsefoZHiFnNNixP0prT/DENQFgl84TjunzCx186tj4awAtvgjJnsJ7e26k -E7uBlPa8A2Fbijklewrki6Gz7jeMvnLg/23uWNvSZpa/IP+BtmK5huxmc0NUFESpWKnWeqsgN6k3 -9FU873m/nN9+ZjabZEmCBYvnOe1TmrDL7OxlZmdmZ2e+dH4d//9prxZwixTSy/bwOc55dcd1x5/G -mEnu6FGWqK6KB7DPVjplpDrkuawUSFTuDYjwEqHpgw9VX6ZyYPZbgENjSPD2yBskKn5aPZNMJSSq -5qUnUd2MMrPqPnKcXpKr3GyAmDBc5UExhPl1Uf7JtZe7PzQhxjTqXk4ScpSb921SksrZwDKHKNWW -zPCcb1cOimgrWnGv8cQT7pYrR+FKNjjhooVEkC4M9allo+9Laf499/UdF22wYs/NoHf6Fu65K2+z -HkKjmc9lAADa0+SOi7O/iD33zzxVYA7KILmc61P23H6eTrVYwAztHnDDEcrJ3HS0tVMDRblfRap0 -YE3vb/imozhlyAYcjvd8y5WDoXZAN0odqfpyqSRbrtCUqCQX7S8S5y0SOa3m/iKf7u7Oz+Gj9RM+ -Ohfw0W/Bx7ANHzeXIQeRGdxDghx2f3iyt2Z8zXkXeiJnna4dphicsERvP72C46z3f10vgtAN4JQb -79dXEIMGoGDbC6mFO00oeI0UKurWyYi7WKunhxPR52jz42ng/j6xT9GcG9vr82ozO3MAIReHk9t8 -nAX+hx3rcB7riY5843fsH+dlMTYQdyinacuyx90r2nLzDiin2argDqnHGp/xcMjzODt0fdPQJdzm -r9x3NPsJWEWG4BeMZ/5ykZ88gPW3ThMDYaDAs1UPTuPl0tO7PMmD9gU8ovhF+PZMlPcy9PJr7zg4 -XZwovcpqV3tLX4PL2xOlIGR3W8PtuJa5vyX8+svpftWN9eiV+4z7xM01MOWDPXhcXpgWyI71oUq6 -jzd4r3UZ9a8y8uTl614JFRZMXa4WYSIysEecHqyR7aOT6oSGcgYc1qisY8jKIqoFFmoouzAltybJ -FeuroDRVVhE2cfWT3SL5ycUc6Msfmo5muYMTczOFjitTQ0q80VVNmcf5xMjyGH7xfhcT580hbhiK -EvBmfhgXD2HCR/H3l/zjrtq4xDDjVRvg/BMn5YWQyf31wGSzXrUR2us7X7UJTqtf10//TJNBqkRd -ZtCsrOvLl1drMZpMBa099oQmMzGKG0+XddBkMruY+KdIeudanbb7pX3v0g0r8R35hskC0fFxHcTm -/RrMbxIavc+ABNTO1PE3QN3NOgzb8mVRXLpZq6zOcM2On70uisRjCLzKCVxJLpDEpxI45zCLIvGp -BK4kF0jiUwlcinAYT+I86s08t+l8AlcjeiXskBdHsGLq62gNIqhDr4A0fv5lLhKfSuCy5Woxt+ni -CFzE7ligsQK24KJDLz9s2mGrtSDx6rqlySQeGsVuA8b79hz73EaH+aUqTd+vmxjVsoHuEw5e/bjw -rchu0EkechJnny5Tsk0qqCqtGwD7Crb309YORpK2YYaGm9LhwtvcJ7yYkDPrPELAZkLorr2gAxcV -FAgrcUVEla21214kWvQb9zA7fCS54VAmEB51l1889aLucnpZ4lFhxNPNICN6hVezoC9ZoV/z12IK -I2/vcGmcf9FgAsTVUXHsafl1zY8ufQErfux44W+tdFAg92BtNSsVdJYqq7wA19haJR8UTcTSrReC -AlgRww2vYJ/4BS1x9xa0suA7ueXtSk5JSkV+226E3f5yDr0jf/II7WkQsG9eoOCA8FcelUErNMsB -7LYIWtyscX/KjBcWCX3hMBWEzVMmuGEfCs39ArLMHFq1l+D1iIPNuJNTaJ7rflxybt74xA0K0IB6 -rxVOG8GwXAbBl3BezLN8tdApLReHo89HtdIWu5k44HGFZTd8rDaZdsRn1g5gOKp4NBuBJ3l1zgzR -U8InAkSVPw++V+v91Q+CWZ+eEG/1fqdS3B7Yu+/an7zg5R3md70jL6/uPo+cnxMWte5RQSz77olG -uo16Gp7OidjKui265tQp3rModDs6f4anPuMgxNTeHnCIeZ4VBF5PvKDct8A8xVMrWG3dQNmDgr4e -FChJ2vqgt0Vk8r2/vIPF23tTYuaDVvqq8sus7W/e2Z9sOVAsp320//EOBR9u+qTgdq1WGJ+ofrM9 -sVjGLQ14WzkFTx3iPfWDEPA9sYGNb1gEG2P8o5ZJr61YP/If92qXe0lxv3JTGJi3sxjV/cKU7AZo -K/nj6OAidkcoPviio4O70bTC8cEXHR1ccMtQfPBFRwd3z/jC8cHnjw7+nzXFsi2iGgmb6fhf4eDl -bvC0/3Q9vB4lcsqKUtioE3I06j/UngaD74N/j6sPvZf7wWicKCYKG4eVet02qoPeQ3+QyLlnT5bP -MLxALL7P8RRfcG5W2axeOdu3O58OVjvVK+10LZxcJq3vrGJymQMliYEdSx+SA7KLoRsP8bXmxucM -LG8Rl2jOjDKfqoOnzZet7F7jmEerC91ON+66W39Vz2rGDuwUO0YxWV3P/jrfvPxKD63d8noOXnt5 -3+Kb4YfdoO13yug/RGm6jDGErr95JrfJ9D8xN8zl3ARTg/WbXyv9j+XCuPSlXHjur9ScT7fNreOy -3uLB+idC9YejUKRA0LI+u7dxW94i3RsFe5hPN5dog1Jd0VuERTx9Ejx1nFKzUpREDEwknkiKZ1Tg -XFjoO/wWAizM+iMXGvkrVw/gtaJ6P6wVfKFKk7ORfP7lyze7abnAGXeCPAu7cuaRXCPrZx7ZlTOP -5FqWn8MB6FAqeKwEmVVC1JfhhCfvR2T7KOUT+Fc5qcr2kPm5Q76q7gnPzlLZTW6BJKi7JMgZQkB9 -co6V7jCLY/tNZBXoLVlFsQ3k9lzVivTyq0jK3woi3cl6HYftmwALeigHq0tiA1o0XRabzjPXmvo9 -L2+w6+WVwJwZSpcRLMjJZBnJMLv0lSia3qmVJM/8RUD81lgNOIMxbi4Nti/O7CFQ5Q== - - - 4cvS9dZZv4k8/jsJ1i+9eGmVBXc9bem+bMHk1Cbrlr9UjvMiu8m3Ctpljgvesj/GHCtr3Ys0PhNv -+zrm2vUDPun+E3NBbK3cY5qkMwGx3eMTf+ZnvDnT/CcycSvnkrau/dQmupzzpHq75IkNN4bXlzNz -/mwyihc334+lL+eTuZBSAenL6X0c1Av4OD1G9e6C+E9Urrc3ZPgdmzytE/h8q13+OK1Us3a6Vtva -+2GLPWB8b2iDbtHEFar6qVvOZs1RwU0Ivk/jrBmiDFby+ObjOk93Un3pNPfjMkTJN4vFRaqZ76iC -zgULW8UxTnGrs3u/yhdJ4NV64tzSlV8yG6uPIW55yIRqVUz95Uk/5TyqEWlUvEBqyf148oRBS5y2 -gh52HpMtqIKpo35GZ5+bNIDDFmKYazaGq+ZdhuqKM8PVQvVL6QGNWDVVVsac2zsl6QodoYRRE/fw -VPS/yIKsUs4GlwSFJLddy+MBsSZE0+1GwZONMFcUZ55m45eS9GEHCaPy8gW2KZnuZkrP4EndcqSX -uRI0zJWeQazk+RM0zJWegd/FfkuChrnSM3iek3MnaJgrPYMfN37eBA1zpWcIMiDMmaBhrvQMOPtv -StAwV3oG9yb+GxI0zJWeAfOSvClBw1zpGbAvf5QkYqb0DK9mDXgtQcNc6RncEXtbN2ZPzzBtxH6b -oGGu9AzQytsSNMyVnkHQ/twJGh6zU5MNZJyChckGbNQgGx/ym6dM2DrQkutL9Tuq79ZhhngbOu3Y -nHADk6K0f3aW7n+6JqDPq6eGZ/BoC8097wmbnqwgJIkdX+xAvHFPGjzfciNtRhhhyceca/BwXyuq -KtAUP3PFDpCTUfDQ1388bnoWB5aSLLX9VKroFRQzkkFWyoG5Vs5J5ljJ3OVJAG4rF7LkvdaQ7MFy -89vFtOs/I7UMsoBkjpVaBoEgKOC314+eXLlAxBrY1/gBlDCfbh9Rro7LBsJmJcsNrsJA2KznvW35 -JSP2vWZDdW2yeACD9NI80JDhEvjow3JvnrhgQQcZqUKfWlLTXi7JOtdts7KFeSJ/QJyJz48fO2nk -C+dID+SV04PC/EZDJfkaxCMtgOjnOLis/LJ2Hze+b4yOXRPu5nmmJRJF9k58JeW7Hihc6HMSzG+3 -kZMsta4tsnvgGhRgk62m3afOxx+u4db3qMrx0yzuqgILqVTnT2Jiu0ND0IuwaNweqehuQ3zzYt6P -SJGX7fm3HSpZaiW72+2Q+dqUEeSS5P4ztZ2pVvApNnBMxOZ+hG3gJXktjs8LXO3hMb03eK/RGfJL -1n2S8B4Pdf6dd2IqY2Oe3e/cVa+Sz9/LpfUT5tlfLzCQxbeUSEd5nVwW8pgreftnEovWafi8RLSa -Res0SqxWs2idhp89RbSaRes00EqMVvOKTrPxnzVlBXhsnZD21qgvG1+VZBK+ORyMXx6xgtHeHAyv -R43OP4MnhSTcvxr8xU/LSRBqJ6hhwIuB3za6SorXTZB0ojFStMQG6NbtwsbTuHrdG18/jDpP/ySK -+NXJXuOoXk0UE+4P2vCDlUQKUNLaUBuK0mj2bQOabQQD/07+xoeB8oL/PcLHgaKpZmJb0QROUOUf -ePkCDzcJouqJvxMssZc4v9ASffz9gWI6qs6IxWyNmbZlkoRu6ypziO3olqFpGkncK7puqk5QyYjW -aUTrEGKotqgD5ZF2flce08ZzDBRTUxmzHdPWHcMgLA7bSJ2GchiFRDVDJTq8W9Q0TZjAGEiROvGQ -mKOaXs/ioMjl8RAcplLE2NCIwRiNhRKuEwtJ123V0Q2m6bZtGqYdO5vhOgiJOlTVqUaJYzKN2Cxu -XUTqhOYUoDBLtUydmpplGpZtxUIJ14lC0XSVvLr+7qN1IlCIYasGYEt1DT4NMw5KpE4UCtFVB7Fl -hBm24cRCCdeJQDlSnEQqnTg5ds98kN0AD9ASBTz5wRMgoHT+1rkf1Ef9wb/h3UwUDscPT/947zRR -wN9tjMbXnbvrzvP1aMhPkYApIVsA6u7Db+ZtxZq1lTe3YLyxBeKyuH1gcUZiqBCqwTJmJtUd02EO -LmPLJXPdoYwQXOoxdXTVcHTmTxYhlmoTh1KmMZthBeAVpmnbjGgaLiKcSSB2PpMWC5f3YK41lWgW -rH7KdGrRCAQNqM0mlg2l8MeMQSFaI9QRaCVShwE31xhjuk1Ni2JHwngwpjJdc6huMcvSnZi+hGtg -b0LDEQESGdEIIr+dl55ypQBtqQbW0gwGXBl+ZjiqzZk0jBsAQpKO1jFURwwd7LFAd4iqZlLq4Egb -VLVx4G3oHfyE81kDOwzsWtP1aIUe8B5DtXDUNBhcC3buGCBUNXDkNcDNtGkIiWhpqBvYRriOqUOj -MGS2TmCqsI0wFqap2jjsNtUZdfRoV8IVoJnIeESARMYzgshvZwXnbnZSZ28kdS0gdSASqjkwMjDi -puYkQL6xAB2QsKhNAHPGvwGOTRwgDtuE3sA3jkZgS6KO4UDnTV8W6ggRaaFANxQuWCkW0D1MoC32 -3tj9xSQqUJ6huXWYHq1zp2zGQIId2oSpFRJFFIpcHguBSwuixjRcInXiIcFStByC65858CcWUrhO -PCSQpmB5mq/iFK4TC4kvU48mY6BMlMdDICb2/VVcInUQEkpTIDo5E7KJSVEiswzL1DzZbbIOCE6A -E6FQD+QMnUOKVQpSeaIawBscM4209IQUk9rc3OiBbnLwMO5gXUktoA5RLcZF1KnYROu8GzYg2em/ -wyZS592w0YC1M+Bsr2ETqfNe2KCkGZFpQ9hE67wbNoTCpk29frNYbCJ13gsb0GKsoCEjdmyidd4L -G00welfThz3EgUkJWibAnjWgqEnmqsMyosSro9nAXM0wowc0QBCjBnEMnVAjCmZ6D7iuA1LkTB34 -PS4x+OrAMomnsiwIEWIQhOnRuplgBp9FOqGBcdwsqQ6IoMxHJAqD4XyE9prFUKiFanpAfROY3Cuw -WzpSsRXGdDFYzC5s6f8T/ZC+u35I3r0F7c800HeQIClMScQOErIjRcs1lGLgrwUNAOAE5dqbZpqg -xYBOoUctX6BigHoDMKAYWE9MDdABGeiJsPjFwrZioITtGxFMojXkvvSiFhLq2KDgajpatICJgwoU -xiJipYr0JVIDlKLwiETqREc1jMnr89JTnpXGpmsY3hr1ueU2n1eSyWZnOPj+1Lm+Gzwpw+fOvwaJ -zmiE9D14hJLE8GnwDGtwkHj+9fA3fgM/8aonk1v7NeW/JmIQRQ== - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/drawing/index.html b/content/static/tutorials/drawing/index.html index a9cd9625d..547195f58 100644 --- a/content/static/tutorials/drawing/index.html +++ b/content/static/tutorials/drawing/index.html @@ -1,25 +1,27 @@ -

    Coordinate System and Shapes

    - -

    - +
    - -

    This tutorial is for Processing version 1.1+. If you see any errors or have comments, please let us know. This tutorial is from the book, Learning Processing, by Daniel Shiffman, published by Morgan Kaufmann Publishers, Copyright © 2008 Elsevier Inc. All rights reserved.

    - -

     

    + + -
    + +

    + This tutorial is from the book Learning Processing by Daniel Shiffman, published by Morgan Kaufmann, © 2008 Elsevier Inc. All rights reserved. If you see any errors or have comments, please let us know. +

    + +

    Coordinate System and Shapes

    +

    Daniel Shiffman

    + +

    + Before we begin programming with Processing, we must first channel our eighth grade selves, pull out a piece of graph paper, and draw a line. The shortest distance between two points is a good old fashioned line, and this is where we begin, with two points on that graph paper.
    +

    + + + +

    + The above figure shows a line between point A (1,0) and point B (4,5). If you wanted to direct a friend of yours to draw that same line, you would give them a shout and say "draw a line from the point one-zero to the point four-five, please." Well, for the moment, imagine your friend was a computer and you wanted to instruct this digital pal to display that same line on its screen. The same command applies (only this time you can skip the pleasantries and you will be required to employ a precise formatting). Here, the instruction will look like this: +

    -

    Coordinate Space

    -

    -Before we begin programming with Processing, we must first channel our eighth grade selves, pull out a piece of graph paper, and draw a line. The shortest distance between two points is a good old fashioned line, and this is where we begin, with two points on that graph paper. -

    - -

    -The above figure shows a line between point A (1,0) and point B (4,5). If you wanted to direct a friend of yours to draw that same line, you would give them a shout and say "draw a line from the point one-zero to the point four-five, please." Well, for the moment, imagine your friend was a computer and you wanted to instruct this digital pal to display that same line on its screen. The same command applies (only this time you can skip the pleasantries and you will be required to employ a precise formatting). Here, the instruction will look like this: -

    -line(1,0,4,5);
    +line(1,0,4,5);
     
    -
    Even without having studied the syntax of writing code, the above statement should make a fair amount of sense. We are providing a command (which we will refer to as a "function") for the machine to follow entitled "line." In addition, we are specifying some arguments for how that line should be drawn, from point A (1,0) to point B (4,5). If you think of that line of code as a sentence, the function is a verb and the arguments are the objects of the sentence. The code sentence also ends with a semicolon instead of a period.

    @@ -38,41 +40,40 @@

    Simple Shapes



    -

    For each shape, we will ask ourselves what information is required to specify the location and size (and later color) of that shape and learn how Processing expects to receive that information. In each of the diagrams below, we'll assume a window with a width of 10 pixels and height of 10 pixels. This isn't particularly realistic since when you really start coding you will most likely work with much larger windows (10x10 pixels is barely a few millimeters of screen space.) Nevertheless for demonstration purposes, it is nice to work with smaller numbers in order to present the pixels as they might appear on graph paper (for now) to better illustrate the inner workings of each line of code.

    A point() is the easiest of the shapes and a good place to start. To draw a point, we only need an x and y coordinate.

    - +

    A line() isn't terribly difficult either and simply requires two points: (x1,y1) and (x2,y2):

    - +

    Once we arrive at drawing a rect(), things become a bit more complicated. In Processing, a rectangle is specified by the coordinate for the top left corner of the rectangle, as well as its width and height.

    - +

    A second way to draw a rectangle involves specifying the centerpoint, along with width and height. If we prefer this method, we first indicate that we want to use the "CENTER" mode before the instruction for the rectangle itself. Note that Processing is case-sensitive. -

    +
    - +

    Finally, we can also draw a rectangle with two points (the top left corner and the bottom right corner). The mode here is "CORNERS".

    - +

    Once we have become comfortable with the concept of drawing a rectangle, an ellipse() is a snap. In fact, it is identical to rect() with the difference being that an ellipse is drawn where the bounding box of the rectangle would be. The default mode for ellipse() is "CENTER", rather than "CORNER."

    - +

    - +

    - +

    @@ -84,22 +85,18 @@

    Simple Shapes



    -size(200,200);
    -rectMode(CENTER);
    -rect(100,100,20,100);
    -ellipse(100,70,60,60);
    -ellipse(81,70,16,32); 
    -ellipse(119,70,16,32); 
    -line(90,150,80,160);
    -line(110,150,120,160);
    +size(200,200);
    +rectMode(CENTER);
    +rect(100,100,20,100);
    +ellipse(100,70,60,60);
    +ellipse(81,70,16,32); 
    +ellipse(119,70,16,32); 
    +line(90,150,80,160);
    +line(110,150,120,160);
     
    -

    -

     

    -

    This tutorial is for Processing version 1.1+. If you see any errors or have comments, please let us know. This tutorial is from the book, Learning Processing, by Daniel Shiffman, published by Morgan Kaufmann Publishers, Copyright © 2008 Elsevier Inc. All rights reserved.

    -
    -

    \ No newline at end of file + diff --git a/content/static/tutorials/eclipse/imgs/addtobuildpath.png b/content/static/tutorials/eclipse/imgs/addtobuildpath.png new file mode 100644 index 000000000..ccbfb16f9 Binary files /dev/null and b/content/static/tutorials/eclipse/imgs/addtobuildpath.png differ diff --git a/content/static/tutorials/eclipse/imgs/clientclass.png b/content/static/tutorials/eclipse/imgs/clientclass.png new file mode 100644 index 000000000..dad17b226 Binary files /dev/null and b/content/static/tutorials/eclipse/imgs/clientclass.png differ diff --git a/content/static/tutorials/eclipse/imgs/extendPApplet.png b/content/static/tutorials/eclipse/imgs/extendPApplet.png new file mode 100644 index 000000000..30f21a124 Binary files /dev/null and b/content/static/tutorials/eclipse/imgs/extendPApplet.png differ diff --git a/content/static/tutorials/eclipse/imgs/importcore.png b/content/static/tutorials/eclipse/imgs/importcore.png new file mode 100644 index 000000000..b791db39c Binary files /dev/null and b/content/static/tutorials/eclipse/imgs/importcore.png differ diff --git a/content/static/tutorials/eclipse/imgs/incore.png b/content/static/tutorials/eclipse/imgs/incore.png new file mode 100644 index 000000000..d98f82994 Binary files /dev/null and b/content/static/tutorials/eclipse/imgs/incore.png differ diff --git a/content/static/tutorials/eclipse/imgs/newfile.png b/content/static/tutorials/eclipse/imgs/newfile.png new file mode 100644 index 000000000..39a90793f Binary files /dev/null and b/content/static/tutorials/eclipse/imgs/newfile.png differ diff --git a/content/static/tutorials/eclipse/imgs/running.png b/content/static/tutorials/eclipse/imgs/running.png new file mode 100644 index 000000000..c17695b0b Binary files /dev/null and b/content/static/tutorials/eclipse/imgs/running.png differ diff --git a/content/static/tutorials/eclipse/index.html b/content/static/tutorials/eclipse/index.html index 9df2c9ff9..1dde1915c 100644 --- a/content/static/tutorials/eclipse/index.html +++ b/content/static/tutorials/eclipse/index.html @@ -1,120 +1,153 @@ -

    Processing in Eclipse

    -

    - - - - - -
    - -

    This tutorial is for Processing version 1.1+. If you see any errors or have comments, please let us know. This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

    - +

    Processing in Eclipse

    +

    Shane White

     

    + + + + - +
    and if you are in another class and have to refer to the "parent" PApplet:

    +
    int pink = parent.color(255,200,200);
    +

    Globally Available Functions

    +

    Pretty much anything you can find in the reference can be used in Eclipse the same way, with some concesssions to be made for proper Java syntax. For example, any of the mouse Event functions, including mouseClicked(), mousePressed(), mouseDragged(), and mouseWheel().

    +

    These can be added in the exact same way as setup(), and draw(), just by adding the keyword 'public' to the declaration. So, looking at the reference example of mousePressed():

    +
    void mousePressed() {
    +  if (value == 0) {
    +    ...
    +}
    +

    Would be declared instead as:

    +
    public void mousePressed() { 
    +  if (value == 0) {
    +    ...
    +}
    +

    That's all there is to it! The same process works for all the mouse, keyboard, and other event based functions.

    +

    Note, however, that these functions are inherited from PApplet, thus you will only be able to use them in your client class, and not in any other object classes.

    +

    Exporting in Eclipse

    +

    You can export a project from eclipse the same way you export any project in Eclipse. For more information, visit Eclipse's documentation. How to export a runnable .jar in Eclipse.

    +

    This tutorial is for Processing version 3.0+. If you see any errors or have comments, please let us know. This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

    + + +
    +

    This tutorial is for Processing version 3.0+. If you see any errors or have comments, please let us know. This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

    +

    The Long Version

    +

    In order to use the Processing library to create our graphics while coding in Eclipse, we need to do a couple things. The first thing we need to do is import the Processing core as a library for our project, and the second is to set up our client class to take into consideration some of the processes (pun intended) that the Processing IDE does for us in the background.

    +

    This guide is written for Processing 3+, with the intended audience of someone who has already downloaded Eclipse, but may have never used it before. If you are experienced with Java and Eclipse, you can jump to the bottom for a quick summary of the steps involved.

    +

    Create a new Project

    +

    First create a new project. It just needs to be a regular Java Project.

    +

    File > New > Java Project

    +

    Let's name it 'Hello Processing'. Leave all the default settings and click Finish.

    +

    Next, create a new class.

    +

    File > New > Class

    +

    Let's name it 'UsingProcessing'. You can choose to include public static void main.

    +

    Creating a new Class

    +

    We should now have a new class that probably looks like this:

    +
    +
    public class UsingProcessing {
    +
    +    public static void main(String[] args) {
    +        // TODO Auto-generated method stub
     
    -

    This tutorial assumes you already have Java and Processing installed on your computer. This is also not an Eclipse tutorial, but just covers the basics to get you up and running with Processing in Eclipse.

    - -

    This tutorial outlines how to manually set-up a Processing project in Eclipse. However, I recommend you check out the Eclipse Plug-in proclipsing that is designed to make working with Processing in Eclipse much easier, taking care of several of the steps below for you.

    - -

    Step 1. Download and install Eclipse

    - -

    Grab "Eclipse IDE for Java Developers" from http://www.eclipse.org/downloads/. When you first run eclipse, it will ask you for a workspace directory. This is the directory where you will store your project files so pick something reasonable that you will remember.

    - -

    Step 2. Create a new project.

    - -

    If you see a Welcome screen, go ahead and close it. Then go to FILE --> NEW PROJECT and select "Java Project." Click next. Enter your project name (for example, "TestProcessing") and select "Finish."

    - -

    Step 3. Import the Processing libraries

    - -

    Eclipse doesn't know anything about Processing so we'll have to manually add the Processing libraries to the Eclipse project ourselves. One way to do this is by pointing Eclipse to Processing's "core library" directory. However, it's sometimes a good idea to copy the necessary Processing files into the project folder itself so that everything stays together. Go to: -

    -FILE --> IMPORT --> GENERAL --> FILE SYSTEM. -

    -Click next. On Windows, click "Browse..." and select the Processing jar files inside PATH_TO_PROCESSING/core/library/. On OS X, do not use the "Browse..." button. Instead, use the "From directory:" field to manually enter the path to Processing's jar files, which is typically /Applications/Processing.app/Contents/Java/core/library/. At minimum, select the "core.jar" file inside the "library" folder. -

    - -

    -Click "finish." -

    -You should now see "core.jar" listed under your project in the package explorer. -

    - -

    -Right-click on the file and select -

    -BUILD PATH --> ADD TO BUILD PATH. -

    -The "core.jar" file should now appear with a jar icon. (Note this right-click option will only show up in the "Package Explorer." If you are in the "Project Explorer" or some other view, switch by going to WINDOW --> SHOW VIEW --> PACKAGE EXPLORER.) -

    - -

    -

    Step 4. Create a class and write your code!

    -

    Go to: FILE --> NEW --> CLASS -

    -Enter in a class name "MyProcessingSketch" and click finish. Eclipse may yell at you and say "The use of the default package is discouraged." We can't really blame them for getting upset. Packages in Java provide a nice means for organizing your classes and this is a good thing. Nevertheless, for just getting this example working, we can skip thinking about packages. -

    -After selecting finish, you'll see the following code: -
    -

    -public class MyProcessingSketch {
    +    }
     
    -}
    -
    -
    -Eclipse is being nice and filling in the class definition for us. Thank you Eclipse! Now, if we want this class to be a Processing sketch, we've got to add some code: -
      -
    • Import the core Processing library: "import processing.core.*;"
    • -
    • Extend PApplet. PApplet is the parent Processing class that allows us to have access to all the Processing goodies.
    • -
    • Write setup() and draw() (and specify "public" for these Processing functions).
    • -
    -
    -
    -import processing.core.*;
    +}
    +
    +

    Now that we have our project and client class ready to go, we need to get the Processing core as a library.

    +

    The idea of Libraries

    +

    One of the most important aspects of Java (or nearly any programming environment) is the idea of a Library. A Library is a collection of code that performs related tasks. They can be one class, or many. Some Libraries are so powerful and robust that they can almost be considered a "Language" themselves. When you combine the Processing library with the Processing IDE, you end up with something that most people refer to as the Processing 'Language', but technically, at it's heart, it's a collection of Java code.

    +

    To make it work, the Processing IDE does a lot of stuff for us in the background 'Java' environment in order to make it really easy for us as programmers to create sketches. However, to make full use of all the Java awesomeness at our disposal, it's helpful to use a more robust IDE, which is why we are jumping into Eclipse. So let's get Eclipse to use Processing as a Library.

    +

    Import the Processing Core

    +

    In order for Eclipse to see the code that makes up Processing, we need to import it into our project.

    +

    File > Import > General > File System

    +

    Click next. On Windows, click "Browse..." and select the Processing jar files inside PATH_TO_PROCESSING/core/library/. On OS X, do not use the "Browse..." button. Instead, use the "From directory:" field to manually enter the path to Processing's jar files, which is typically /Applications/Processing 3.app/Contents/Java/core/library/. At minimum, select the "core.jar" file inside the "library" folder.

    +

    Importing the Processing Core

    +

    A .jar file is a compiled collection of Java code. The core.jar is the core of the Processing libraries, it has all the code that does the stuff that we are used to doing in Processing, like drawing shapes. Once we have it, we can make use of all the normal Processing commands that are found on the reference page.

    +

    Click Finish. If you look at the Package Explorer, you'll notice that there is a new file in our project, called 'core.jar'.

    +

    A new file in our project!

    +

    Now that we have the file in our project, we need to tell Eclipse that this file is part of the code base that is used to build, or compile and run, this project. Do this by right clicking on the core.jar, going to Build Path, and then Add to Build Path

    +

    Adding the core.jar to the build path

    +

    You'll notice the project will expand to have a new section called 'Referenced Libraries', where there is a new core.jar file. You can expand this to see a hierarchy of it's contents, if you are really interested.

    +

    A successful add to build path

    +

    We are finally ready to set up our client class (the class with our main function, where the program starts), to run the project like a Processing sketch.

    +

    Setting up the Client Class

    +

    A Processing window is a special type of Java program called a PApplet. This is technically a Java Class, which has its own main function (or method) and does all kinds of fancy stuff that we don't need to worry about to create a new window and draw graphics onto it. In order for us to make use of the PApplet class, we want our program to BE a PApplet. To make this happen, we use the keyword extends in our class declaration. This will allow our class to 'inherit' all the PApplet class' functions and variables. Change the first line of code to be:

    +
    +
    public class UsingProcessing extends PApplet{
    +
    +

    You'll notice this will give you an error. This occurs because, although we have included the core.jar to our project, we still have to link to the library in the code. We do this by using an import statement, at the top of the Java file. Anytime we are going to reference a function, variable, or class outside of the Java file we are writing in, we need to tell Java where it is by importing it. Eclipse will help you by suggesting to do this. Hover over the error (where it's underlined in red) and choose from the options "Import 'PApplet' (processing.core)".

    +

    Import PApplet

    +

    This will auto add a new line of code to the top of the file: import processing.core.PApplet; You can also type this in yourself if you choose. This will allow Java to see all the public parts of the PApplet class.

    +

    The next step is to simply start a PApplet application, and tell it to use this class,UsingProcessing, as the program to run. This is done by calling PApplet's main method and giving it the name of this class as a parameter.

    +

    Add the following line to the main function (method), and if the TODO comment is still there, you can delete/replace it.

    +
    +
    PApplet.main("UsingProcessing");
    +
    +

    Your entire Java file should now look like:

    +
    +
    import processing.core.PApplet;
    +
    +public class UsingProcessing extends PApplet{
    +
    +    public static void main(String[] args) {
    +        PApplet.main("UsingProcessing");
     
    -public class MyProcessingSketch extends PApplet {
    +    }
     
    -  public void setup() {
    -    size(200,200);
    -    background(0);
    -  }
    +}
    +
    +

    NOTE: If your class is part of a package other than the default package, you must call PApplet's main using the package name as well, like this:

    +
    +
    PApplet.main("packageName.ClassName");
    +
    +

    At this point, you can run the program. If Eclipse asks, choose to run the program as a Java Application. Processing no longer extends the Applet class, so you can't run it as an Applet!

    +

    This will run a PApplet as if you had run an empty sketch. You will get a new 100x100 window open with a blank canvas!

    +

    Now we are ready to add the final touches to be ready to program like we were before. After main(), add three new functions: settings()setup(), and draw(). It's just like we did in Processing, but you will also need to include the public declaration before the void declaration. Now we have this:

    +
    +
    import processing.core.PApplet;
    +
    +public class UsingProcessing extends PApplet{
    +
    +    public static void main(String[] args) {
    +        PApplet.main("UsingProcessing");
    +    }
    +
    +    public void settings(){
     
    -  public void draw() {
    -    stroke(255);
    -    if (mousePressed) {
    -      line(mouseX,mouseY,pmouseX,pmouseY);
         }
    -  }
    +
    +    public void setup(){
    +
    +    }
    +
    +    public void draw(){
    +
    +    }
    +
     }
    +
    +

    setup() and draw() should look familiar, and they work exactly the same way as they did in the Processing IDE. The only new concession we have to make is that when we use the size()function to set the size of the screen, we put that in settings(), and we put it first. settings()runs before anything else happens, so we can't use any other Processing functions in it, except to set the size of the screen. More information here.

    +

    Let's try it. Set a size in settings(), set a color in setup(), and draw some stuff in draw(). For example:

    +
    +
    import processing.core.PApplet;
     
    -

    Step 5. Run!

    -

    Go to: RUN --> RUN AS --> JAVA APPLET -

    -For most things, you are often going to want to run your code as a Java Application (rather than applet) and turn on Processing's present mode. You can do this by adding a main() function to your code. -
    -

    -  public static void main(String args[]) {
    -    PApplet.main(new String[] { "--present", "MyProcessingSketch" });
    -  }
    -
    -Note that the String "MyProcessingSketch" must match the name of your class (and if it is in a package, should include the package, i.e. packagename.MyProcessingSketch). -

    -Once you've added the main() function, you can select: -

    -RUN --> RUN AS --> JAVA APPLICATION +public class UsingProcessing extends PApplet{ -

    Processing in Eclipse with Multiple Classes

    + public static void main(String[] args) { + PApplet.main("UsingProcessing"); + } + + public void settings(){ + size(300,300); + } + + public void setup(){ + fill(120,50,240); + } + + public void draw(){ + ellipse(width/2,height/2,second(),second()); + } -

    Take a look at this example Processing sketch. The example is object-oriented and contains a class called "Stripe." In Processing, all classes are treated as "inner classes," meaning they are not individual entities unto themselves, but rather are classes inside of the larger PApplet. This is why you can do anything you can do in a PApplet inside of the Stripe class. You can draw onto the window calling rect() and access the PApplet variables such as width and height. To get this example working in Eclipse, it's perfectly reasonable to just copy it in as is and include the Stripe class code below setup() and draw() inside the parent PApplet class. However, the inner class methodology can quickly become unwieldy in the case of larger applications with lots and lots of classes. -

    -And so we find ourselves in need of a means for creating separate Java classes in Eclipse that we can use in conjunction with a Processing-based application. -

    -First thing first, we can put all the code that is not the Stripe class in a Java class like with the first example. -
    -

    -import processing.core.*;
    +}
    +
    +

    We did it! We have a Processing application running from Eclipse, and now we can take advantage of all the powerful tools that Eclipse has to offer. From here, you can develop your processing sketch to your heart's content.

    +

    The Short Version

    +

    The quick break down of what we did here:

    +
      +
    1. Create a new Java Project
    2. +
    3. Import the Processing core.jar from where your Processing is installed. Add it to the build path.
    4. +
    5. Create a new class, and extend PApplet. Import the PApplet from processing.core.PApplet
    6. +
    7. In main(), call PApplet.main("YouClassName");
    8. +
    9. Add a public void settings()public void setup(), and public void draw().
    10. +
    11. Use the size() call inside of settings(), and other than that, use setup() and draw() like normal!
    12. +
    +

    It runs!

    +

     

    +

    Processing in Eclipse with Multiple Classes

    +

    Take a look at this example Processing sketch. The example is object-oriented and contains a class called "Stripe." In Processing, all classes are treated as "inner classes," meaning they are not individual entities unto themselves, but rather are classes inside of the larger PApplet. This is why you can do anything you can do in a PApplet inside of the Stripe class. You can draw onto the window calling rect() and access the PApplet variables such as width and height. To get this example working in Eclipse, it's perfectly reasonable to just copy it in as is and include the Stripe class code below setup() and draw() inside the parent PApplet class. However, the inner class methodology can quickly become unwieldy in the case of larger applications with lots and lots of classes.

    And so we find ourselves in need of a means for creating separate Java classes in Eclipse that we can use in conjunction with a Processing-based application.

    First thing first, we can put all the code that is not the Stripe class in a Java class like with the first example.

    +
    import processing.core.*;
     
     public class MyProcessingSketch extends PApplet {
       //	An array of stripes
    -  Stripe[] stripes = new Stripe[50];
    +  Stripe[] stripes = new Stripe[50];

    public static void main(String[] args){
    PApplet.main("MyProcessingSketch");
    }

    public void settings(){
    size(200,200);
    }
    public void setup() { - size(200,200); // Initialize all "stripes" for (int i = 0; i < stripes.length; i++) { stripes[i] = new Stripe(); @@ -131,42 +164,21 @@

    Processing in Eclipse with Multiple Classes

    } }
    -
    -Second, we create a new class called Stripe. -

    -FILE --> NEW --> CLASS. Name it "Stripe." Click "finish." -

    -If we add the Processing code, Eclipse will give us a bunch of errors. -

    - -

    -The errors are all on lines where we call a Processing function (such as rect()) or reference a Processing variable (such as width). This is because a Stripe is not a PApplet and knows nothing about PApplets! We might be tempted to have Stripe extend PApplet, but this would be a fatal error. A Stripe is not a PApplet. A Stripe is a rectangular object that we want to draw onto a PApplet. What PApplet do we want to draw onto? The PApplet that is MyProcessingSketch. Instead of extending PApplet, we simply want to tell a Stripe object about a MyProcessingSketch. -

    -
    -public class Stripe {
    +
    Second, we create a new class called Stripe.

    FILE --> NEW --> CLASS. Name it "Stripe." Click "finish."

    If we add the Processing code, Eclipse will give us a bunch of errors.



    The errors are all on lines where we call a Processing function (such as rect()) or reference a Processing variable (such as width). This is because a Stripe is not a PApplet and knows nothing about PApplets! We might be tempted to have Stripe extend PApplet, but this would be a fatal error. A Stripe is not a PApplet. A Stripe is a rectangular object that we want to draw onto a PApplet. What PApplet do we want to draw onto? The PApplet that is MyProcessingSketch. Instead of extending PApplet, we simply want to tell a Stripe object about a MyProcessingSketch.

    +
    public class Stripe {
       PApplet parent; // The parent PApplet that we will render ourselves onto
    -
    -In the constructor, we initialize the parent: -

    -
    -  Stripe(PApplet p) {
    +
    In the constructor, we initialize the parent:

    +
      Stripe(PApplet p) {
         parent = p;
    -
    -And then anytime we want to call a Processing function, we access it via the parent variable. -

    -
    -  // Draw stripe
    +
    And then anytime we want to call a Processing function, we access it via the parent variable.

    +
      // Draw stripe
       void display() {
         parent.fill(255,100);
         parent.noStroke();
         parent.rect(x,0,w,parent.height);
       }
    -
    -Here's the whole thing together: -
    -
    -
    -import processing.core.PApplet;
    +
    Here's the whole thing together:
    +
    import processing.core.PApplet;
     
     public class Stripe {
       float x;       // horizontal location of stripe
    @@ -197,48 +209,36 @@ 

    Processing in Eclipse with Multiple Classes

    } }
    -
    -Finally, the last change we have to make is how we call the constructor. Previously, we had: -

    -
    -  stripes[i] = new Stripe();
    -
    -But now when we construct a Stripe object, we must pass in a reference to a PApplet. And here, the PApplet is this, a reference to ourselves, the PApplet we are right now, MyProcessingSketch. -

    -
    -  stripes[i] = new Stripe(this);
    -
    -Here is the full project folder for download. -

    -Another important note. The Processing "color" primitive does not exist in Java. In fact, in Processing a "color" is really just an integer (32 bits with red, green, blue, and alpha components). Processing translates "color" to "int", but -Eclipse won't do that for you. So instead of saying: -

    -
    -color pink = color(255,200,200);
    -
    -
    -you should say: -

    -
    -int pink = color(255,200,200);
    +
    Finally, the last change we have to make is how we call the constructor. Previously, we had:

    +
      stripes[i] = new Stripe();
    +
    But now when we construct a Stripe object, we must pass in a reference to a PApplet. And here, the PApplet is this, a reference to ourselves, the PApplet we are right now, MyProcessingSketch.

    +
      stripes[i] = new Stripe(this);
    +
    Here is the project source on GitHub.

    Another important note. The Processing "color" primitive does not exist in Java. In fact, in Processing a "color" is really just an integer (32 bits with red, green, blue, and alpha components). Processing translates "color" to "int", but Eclipse won't do that for you. So instead of saying:

    +
    color pink = color(255,200,200);
     
    -
    -and if you are in another class and have to refer to the "parent" PApplet: -

    -
    -int pink = parent.color(255,200,200); 
    +
    you should say:

    +
    int pink = color(255,200,200);
     
    -
    -For more help, check out the How to Craft Your Processing Sketches in Eclipse tutorial from the Creative Applications Network, or Proclipsing: Using the Eclipse IDE for Processing Projects by Scott Kildall at Instructables. - -

    - -

     

    - -

    This tutorial is for Processing version 1.1+. If you see any errors or have comments, please let us know. This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

    - - -
    -

    diff --git a/content/static/tutorials/electronics/imgs/39-1(ACDC).svg b/content/static/tutorials/electronics/imgs/39-1(ACDC).svg index 1c710ab9f..c6c106916 100644 --- a/content/static/tutorials/electronics/imgs/39-1(ACDC).svg +++ b/content/static/tutorials/electronics/imgs/39-1(ACDC).svg @@ -1,55 +1,265 @@ - + - - - - - + width="650px" height="100px" viewBox="-19 0 650 100" enable-background="new -19 0 650 100" xml:space="preserve"> + + + - Time + + + + + + - Direct Current (DC) + + + + + + + + + + + + + + + + + + + - - - - - - + + + + - + - Time + + + + + + - Volts + + + + + + + - Alternating Current (AC) + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - - + + + + - 0 + + + - Volts + + + + + + + - 0 + + + diff --git a/content/static/tutorials/electronics/imgs/fg39-10.jpg b/content/static/tutorials/electronics/imgs/fg39-10.jpg index a72c55701..2b3eeb834 100644 Binary files a/content/static/tutorials/electronics/imgs/fg39-10.jpg and b/content/static/tutorials/electronics/imgs/fg39-10.jpg differ diff --git a/content/static/tutorials/electronics/imgs/fg39-11.svg b/content/static/tutorials/electronics/imgs/fg39-11.svg index 5bdcb4c2e..5de2d1e6f 100644 --- a/content/static/tutorials/electronics/imgs/fg39-11.svg +++ b/content/static/tutorials/electronics/imgs/fg39-11.svg @@ -1,54 +1,228 @@ - + - - - + width="650px" height="110px" viewBox="-19 0 650 110" enable-background="new -19 0 650 110" xml:space="preserve"> + + - Time + + + + + + - Volts + + + + + + + - Digital signal + + + + + + + + + + + + + + + - + - - - - + + + + - - - + + - Time + + + + + + - Volts + + + + + + + - Analog signal + + + + + + + + + + + + + + - + - + - - + + diff --git a/content/static/tutorials/electronics/imgs/fg39-12.svg b/content/static/tutorials/electronics/imgs/fg39-12.svg index d62c1c3a7..82d2ab546 100644 --- a/content/static/tutorials/electronics/imgs/fg39-12.svg +++ b/content/static/tutorials/electronics/imgs/fg39-12.svg @@ -1,48 +1,342 @@ - + - - - + width="650px" height="120px" viewBox="-19 0 650 120" enable-background="new -19 0 650 120" xml:space="preserve"> + + + - Time + + + + + + - 5 + + + - 0 + + + - Volts + + + + + + + - 80% duty cycle emulates 4 volts + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - 10% duty cycle emulates 0.5 volts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - Time + + + + + + - 5 + + + - 0 + + + - Volts + + + + + + + - - - + + + diff --git a/content/static/tutorials/electronics/imgs/fg39-13.svg b/content/static/tutorials/electronics/imgs/fg39-13.svg index c8d72f557..bc111499b 100644 --- a/content/static/tutorials/electronics/imgs/fg39-13.svg +++ b/content/static/tutorials/electronics/imgs/fg39-13.svg @@ -1,633 +1,880 @@ - + + width="650px" height="240px" viewBox="-19 0 650 240" enable-background="new -19 0 650 240" xml:space="preserve"> - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - -+5V -Ground + + + + + + + + + + + + + + - Digital I/O Pin 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - -Digital I/O Pin 4 - - - - - - - - - -+5V -Ground - - - + + + - - - + + + -Pulse -switch - - - -10K + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/electronics/imgs/fg39-14.svg b/content/static/tutorials/electronics/imgs/fg39-14.svg index 779236429..eaae65cde 100644 --- a/content/static/tutorials/electronics/imgs/fg39-14.svg +++ b/content/static/tutorials/electronics/imgs/fg39-14.svg @@ -1,635 +1,815 @@ - + -Analog In Pin 0 -+5V -Ground - - - -+5V -Analog In Pin 0 - + width="650px" height="240px" viewBox="-19 0 650 240" enable-background="new -19 0 650 240" xml:space="preserve"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + + + + + + + -Ground -1K - - + + - - + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - + + + diff --git a/content/static/tutorials/electronics/imgs/fg39-15.svg b/content/static/tutorials/electronics/imgs/fg39-15.svg index 76318fbf9..8be92823d 100644 --- a/content/static/tutorials/electronics/imgs/fg39-15.svg +++ b/content/static/tutorials/electronics/imgs/fg39-15.svg @@ -1,631 +1,843 @@ - + + width="650px" height="240px" viewBox="-19 0 650 240" enable-background="new -19 0 650 240" xml:space="preserve"> - Digital I/O Pin 4 + + + + + + + + + + + + + + + + - Ground + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - + - - - + + + + + + + + + + + -Ground - - - - - -LED -Digital I/O Pin 4 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + + + + + + + + + + + -330 ohm - - + + - - + + - - - + + + + + diff --git a/content/static/tutorials/electronics/imgs/fg39-16.svg b/content/static/tutorials/electronics/imgs/fg39-16.svg index 7a4cfccb2..92324f100 100644 --- a/content/static/tutorials/electronics/imgs/fg39-16.svg +++ b/content/static/tutorials/electronics/imgs/fg39-16.svg @@ -1,668 +1,3907 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Servo - - - +5V - - - - - - - - - - - - - - - - Red wire - - - Red wire - - - Black wire - - - Black wire - - - Yellow wire - - - Yellow wire - - - Ground - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +5V - - - Ground - - - Digital I/O Pin 0 - - - Digital I/O Pin 0 - - + + + +image/svg+xml \ No newline at end of file diff --git a/content/static/tutorials/electronics/imgs/fg39-17.svg b/content/static/tutorials/electronics/imgs/fg39-17.svg index 7250a4f05..85a98d31a 100644 --- a/content/static/tutorials/electronics/imgs/fg39-17.svg +++ b/content/static/tutorials/electronics/imgs/fg39-17.svg @@ -1,783 +1,1591 @@ - + + width="650px" height="385px" viewBox="-19 0 650 385" enable-background="new -19 0 650 385" xml:space="preserve"> - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - Motor - Motor + + + + + + + + + + + + + + - + - - - + + + - - - - + + + + - - - + + + - - - + + + - - - - + + + + - In2 - In2 + + + + + + + + + + - In3 - In3 + + + + + + + + + + - Out2 - Out2 + + + + + + + + + + + + - Out3 - Out3 + + + + + + + + + + + + - En1 - En1 + + + + + + + + + + - In4 - In4 + + + + + + + + + + - Out4 - Out4 + + + + + + + + + + + + - Out1 - Out1 + + + + + + + + + + + + - In1 - In1 + + + + + + + + + + - En2 - En2 + + + + + + + + + + - GND - GND + + + + + + + + + + - GND - GND + + + + + + + + + + - GND - GND + + + + + + + + + + - GND - GND + + + + + + + + + + - Vss - Vss + + + + + + + + + + - Vs - Vs + + + + + + + + - - + + - +5V + + + + + - +V (Motor) + + + + + + + + + + + - L293D + + + + + + + - +5V + + + + + - + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - + - - + + - L293D + + + + + + + - - - - - - - - + + + + + + + + - + - - + + - - - - - - - - + + + + + + + + - - - + + + - PWM Pin 9 (Arduino) + + + + + + + + + + + + + + + + + + - PWM Pin 0 (Wiring) or + + + + + + + + + + + + + + + + + + + - PWM Pin 9 (Arduino) + + + + + + + + + + + + + + + + + + - PWM Pin 0 (Wiring) or + + + + + + + + + + + + + + + + + + + - +5V + + + + + - +V (Motor) + + + + + + + + + + + - Ground + + + + + + + + - - - - + + + + diff --git a/content/static/tutorials/electronics/imgs/fg39-2.jpg b/content/static/tutorials/electronics/imgs/fg39-2.jpg index 76f4e1359..307f6020c 100644 Binary files a/content/static/tutorials/electronics/imgs/fg39-2.jpg and b/content/static/tutorials/electronics/imgs/fg39-2.jpg differ diff --git a/content/static/tutorials/electronics/imgs/fg39-4.jpg b/content/static/tutorials/electronics/imgs/fg39-4.jpg index 84a345a76..86faed109 100644 Binary files a/content/static/tutorials/electronics/imgs/fg39-4.jpg and b/content/static/tutorials/electronics/imgs/fg39-4.jpg differ diff --git a/content/static/tutorials/electronics/imgs/fg39-5.jpg b/content/static/tutorials/electronics/imgs/fg39-5.jpg index 4415f20c4..a14a06780 100644 Binary files a/content/static/tutorials/electronics/imgs/fg39-5.jpg and b/content/static/tutorials/electronics/imgs/fg39-5.jpg differ diff --git a/content/static/tutorials/electronics/imgs/fg39-6.jpg b/content/static/tutorials/electronics/imgs/fg39-6.jpg index 77e2d60fa..9361b2be2 100644 Binary files a/content/static/tutorials/electronics/imgs/fg39-6.jpg and b/content/static/tutorials/electronics/imgs/fg39-6.jpg differ diff --git a/content/static/tutorials/electronics/imgs/fg39-7.jpg b/content/static/tutorials/electronics/imgs/fg39-7.jpg index 7913bc384..f157795c0 100644 Binary files a/content/static/tutorials/electronics/imgs/fg39-7.jpg and b/content/static/tutorials/electronics/imgs/fg39-7.jpg differ diff --git a/content/static/tutorials/electronics/imgs/fg39-8.svg b/content/static/tutorials/electronics/imgs/fg39-8.svg index 53cd75416..1e454c1eb 100644 --- a/content/static/tutorials/electronics/imgs/fg39-8.svg +++ b/content/static/tutorials/electronics/imgs/fg39-8.svg @@ -1,28 +1,111 @@ - + - - + width="650px" height="160px" viewBox="-19 0 650 160" enable-background="new -19 0 650 160" xml:space="preserve"> + + - Light + + + + + + + - Switch + + + + + + + + - Battery + + + + + + + + + - - - - - - - - -+ + + + + + + + + ++ diff --git a/content/static/tutorials/electronics/imgs/fg39-9.svg b/content/static/tutorials/electronics/imgs/fg39-9.svg index 936cceda4..651939792 100644 --- a/content/static/tutorials/electronics/imgs/fg39-9.svg +++ b/content/static/tutorials/electronics/imgs/fg39-9.svg @@ -1,692 +1,692 @@ - + + width="650px" height="170px" viewBox="-19 0 650 170" enable-background="new -19 0 650 170" xml:space="preserve"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - + - + - + @@ -694,23 +694,187 @@ - + - + - + - Holes in the top surface + + + + + + + + + + + + + + + + + + + + + + - Internal connections + + + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/electronics/index.html b/content/static/tutorials/electronics/index.html index fbbfc7586..02b31bdcc 100644 --- a/content/static/tutorials/electronics/index.html +++ b/content/static/tutorials/electronics/index.html @@ -1,365 +1,462 @@ -

    Electronics

    -

    By Hernando Barragán and Casey Reas

    + + +
    - +

    + This tutorial is “Extension 5” from Processing: A Programming Handbook for Visual Designers and Artists, Second Edition, published by MIT Press. © 2014 MIT Press. If you see any errors or have comments, please let us know. +

    - - -
    -
    -

    This tutorial is Extension 5 from the second edition of Processing: A Programming Handbook for Visual Designers and Artists, published by MIT Press. Copyright 2013 MIT Press. This tutorial is for Processing version 2.0+. If you see any errors or have comments, please let us know.

    -
    -
    -

    -Software is not limited to running on desktop computers, laptops, tablets, and phones. Contemporary cameras, copiers, elevators, toys, washing machines, and artworks found in galleries and museums are controlled with software. Programs written to control these objects use the same concepts discussed earlier in this book (variables, control structures, arrays, etc.), but building the physical parts requires learning about electronics. This text introduces the potential of electronics with examples from art and design and discusses basic terminology and components. Examples written with Wiring and Arduino (two electronics toolkits related to Processing) are presented and explained. -

    -
    -

    -

    Electronics in the arts

    -

    -Electronics emerged as a popular material for artists during the 1960s. Artists such as Naum Gabo and Marcel Duchamp used electrical motors in prior decades, but the wide interest in kinetic sculpture and the foundation of organizations such as Experiments in Art and Technology (E.A.T.) are evidence of a significant new emphasis. For instance, in The Machine exhibition at The Museum of Modern Art in 1968, Wen-Ying Tsai exhibited Cybernetic Sculpture, a structure made of vibrating steel rods illuminated by strobe lights flashing at high frequencies. Variations in the vibration frequency and the light flashes produced changes in the perception of the sculpture. The sculpture responded to sound in the surrounding environment by changing the frequency of the strobe lights. Peter Vogel, another kinetic sculpture pioneer, created sculptures that generate sound. The sculptures have light sensors (photocells) that detect and respond to a person’s shadow when she approaches the sculpture. The sculptures are built almost entirely with electrical components. The organization of these components forms both the shape of the sculpture and its behavior. Other pioneers during the 1960s include Nam June Paik, Nicolas Schöffer, James Seawright, and Takis. -
    -
    - The range of electronic sculpture created by contemporary artists is impressive. Tim Hawkinson produces sprawling kinetic installations made of cardboard, plastic, tape, and electrical components. His Überorgan (2000) uses mechanical principles inspired by a player piano to control the flow of air through balloons the size of whales. The air is pushed through vibrating reeds to create tonal rumbles and squawks. This physical energy contrasts with the psychological tension conveyed through Ken Feingold’s sculptures. His If/Then (2001) is two identical, bald heads protruding from a cardboard box filled with packing material. These electromechanical talking heads debate their existence and whether they are the same person. Each head listens to the other and forms a response from what it understands. Speech synthesis and recognition software are used in tandem with mechanisms to animate the faces—the result is uncanny. -
    -
    - The works of Maywa Denki and Crispin Jones are prototypical of a fascinating area of work between art and product design. Maywa Denki is a Japanese art unit that develops series of products (artworks) that are shown in product demonstrations (live performances). Over the years, they have developed a progeny of creatures, instruments, fashion devices, robots, toys, and tools—all animated by motors and electricity. Devices from the Edelweiss Series include Marmica, a self-playing marimba that opens like a flower, and Mustang, a gasoline-burning aroma machine for people who love exhaust fumes. Crispin Jones creates fully functioning prototypes for objects that are critical reflections of consumer technologies. Social Mobiles (SoMo), developed in collaboration with IDEO, is a set of mobile phones that address the frustration and anger caused by mobile phones in public places. The project humorously explores ways mobile phone calls in public places could be made less disruptive. The SoMo 1 phone delivers a variable electrical shock to the caller depending on how loud the person at the other end of the conversation is speaking. The ringtone for SoMo 4 is created by the caller knocking on their phone. As with a knock on a door, the attitude or identity of the caller is revealed through the sound. Related artists include the Bureau of Inverse Technology, Ryota Kuwakubo, and the team of Tony Dunne and Fiona Raby. -
    -
    - As electronic devices proliferate, it becomes increasingly important for designers to consider new ways to interact with these machines. Working with electronics is an essential component of the emerging interaction design community. The Tangible Media Group (TMG) at the MIT Media Laboratory, led by Hiroshi Ishii, pioneered research into tangible user interfaces to take advantage of human senses and dexterity beyond screen GUIs and clicking a mouse. Curlybot is a toy that can record and play back physical movement. It remembers how it was moved and can replay the motion including pauses, changes in speed, and direction. MusicBottles are physical glass bottles that trigger sounds when they are opened. To the person who opens the bottles, the sounds appear to be stored within the bottles, but technically, custom-designed electromagnetic tags allow a special table to know when a bottle has been opened, and the sound is played through nearby speakers. These and other projects from the TMG were instrumental in moving research in interface design away from the screen and into physical space. Research labs at companies like Sony and Philips are other centers for research and innovation into physical interaction design. Academic programs such as New York University’s Interactive Telecommunication Program, the Design Interactions course at the Royal College of Art, and the former Interaction Design Institute Ivrea have pioneered educational strategies within in this area. -

    -
    -
    -

    -

    Electricity

    -Electricity is something we use daily, but it is difficult to understand. Its effect is experienced in many ways, from observing a light turn on to noticing the battery charge deplete on a laptop computer. -
    -
    - Electrical current is a stream of moving electrons. They flow from one point to another through a conductor. Some materials are better conductors than others. Sticking a fork in a light socket is dangerous because metal is a good conductor and so is your body. The best conductors are copper, silver, and gold. A resistor is the opposite of a conductor. Resistance is the capability of a material to resist the flow of electrons. A substance with a very high resistance is an insulator. Plastic and rubber are excellent insulators, and for this reason they are used as the protective covering around wires. Electrical energy, the difference of electrical potential between two points, is called voltage. The amount of electrical energy that flows through a point is the current. Resistance is measured in units called ohms, voltage is measured in volts, and current is measured in amperes (amps). The relation between the three is easiest to understand through an analogy of water flowing through a hose. As explained by the educators Dan O’Sullivan and Tom Igoe: -
    -
    -The flow of water through a hose is like the flow of electricity through a circuit. Turning the faucet increases the amount of water coming through the hose, or increases the current (amps). The diameter of the hose offers resistance to the current, determining how much water can flow. The speed of the water is equivalent to voltage. When you put your thumb over the end of the hose, you reduce the diameter of the pathway of the water. In other words, the resistance goes up. The current (that is, how much water is flowing) doesn’t change, however, so the speed of the water, or voltage, has to go up so that all the water can escape . . . 1 -
    -
    -Electrical current flows in two ways: direct current (DC) and alternating current (AC). A DC signal always flows in the same direction and an AC signal reverses the direction of flow at regular intervals. Batteries and solar cells produce DC signals, and the power that comes from wall sockets is an AC signal: -
    -
    - -
    -Depending on your country, the AC power coming into your home is between 100 and 240 volts. Most home appliances use AC current to operate, but some use a transformer to convert the higher-potential AC energy into DC current at smaller voltages. The black plastic boxes (a k a power bricks, power adapters, wall warts) that are used to power laptops or mobile phones are transformers. Most desktop computers have an internal power supply with a transformer to convert the AC signal to the 12-volt and 5-volt DC signals necessary to run the internal electronics. Low voltages are generally safer than high voltages, but it’s the amount of current (amps) that makes electricity dangerous. -

    -
    -
    -

    -

    Components

    -Electronic components are used to affect the flow of electricity and to convert electrical energy into other forms such as light, heat, and mechanical energy. There are many different components, each with a specific use, but here we introduce four of the most basic types: resistor, capacitor, diode, and transistor. -
    -
    -Resistor -
    -A resistor limits (provides resistance to) the flow of electricity. Resistors are measured in units called ohms. The value 10 ohms is less resistance than 10,000 (10K) ohms. The value of each resistor is marked on the component with a series of colored bands. A variable resistor that changes its resistance when a slider, knob, or dial attached to it is turned is called a potentiometer or trimmer. Variable resistors are designed to change in response to different environmental phenomena. For example, one that changes in response to light is called a photoresistor or photocell, and one that changes in response to heat is called a thermistor. Resistors can be used to limit current, reduce voltage, and perform many other essential tasks. -
    -
    - -
    -Capacitor -
    -A capacitor stores electrons; it stores electrical charge when current is applied, and it releases charge (discharges) when the current is removed. This can smooth out the dips and spikes in a current signal. Capacitors are combined with resistors to create filters, integrators, differentiators, and oscillators. A simple capacitor is two parallel sheets of conductive materials, separated by an insulator. Capacitors are measured in units called farads. A farad is a large measurement, so most capacitors you will use will be measured in microfarads (µF), picofarads (pF), or nanofarads (nF). -
    -
    - -
    -
    -Diode -
    -Current flows only in one direction through a diode. One side is called the cathode (marked on the device with a line) and the other is the anode. Current flows when the anode is more positive than the cathode. Diodes are commonly used to block or invert the negative part of an AC signal. A light-emitting diode (LED) is used to produce light. The longer wire coming out of the LED is the anode and the other is the cathode. LEDs come in many sizes, forms, colors, and brightness levels. -
    -
    - -
    -
    -Transistor -
    -A transistor can be used as an electrical switch or an amplifier. A bipolar transistor has three leads (wires) called the base, collector, and emitter. Depending on the type of transistor, applying current to the base either allows current to flow or stops it from flowing through the device from the collector to the emitter. Transistors make it possible for the low current from a microcontroller to control the much higher currents necessary for motors and other power-hungry devices, and thus to turn them on and off. -
    -
    - -

    -

    -

    Circuits

    -An electrical circuit is a configuration of components, typically designed to produce a desired behavior such as decreasing the current, filtering a signal, or turning on an LED. The following simple circuit can be used to turn a light on and off: -
    -
    - -This simple electric circuit is a closed loop with an energy source (battery), a load (lightbulb) that offers a resistance to the flow of electrons and transforms the electric energy into another form of energy (light), wires that carry the electricity, and a switch to connect and disconnect the wires. The electrons move from one end of the battery, through the load, and to the other end. -
    -
    - Circuits are usually represented with diagrams. A circuit diagram uses standardized symbols to represent specific electrical components. It is easier to read the connections on a diagram than on photographs of the components. A diagram of the simple circuit above could look like this: -
    -
    - -
    -Circuits are often prototyped on a "breadboard,” a rectangular piece of plastic with holes for inserting wires. A breadboard makes it easy to quickly make variations on a circuit without soldering (fusing components together with a soft metal). Conductive strips underneath the surface connect the long horizontal rows at the top and bottom of the board and the short vertical rows within the middle: -
    -
    - -
    -Circuits are tested with a multimeter, an instrument to measure volts, current, resistance, and other electrical properties. A multimeter allows the electrical properties of the circuit to be read as numbers and is necessary for debugging. Analog multimeters have a small needle that moves from left to right, and digital multimeters have a screen that displays numbers. Most multimeters have two metal prongs to probe the circuit and a central dial to select between different modes. -
    -
    - Commonly used circuits are often condensed into small packages. These integrated circuits (ICs, or chips) contain dense arrangements of miniaturized components. They are typically small, black plastic rectangles with little metal pins sticking out of the sides. Like objects in software, these devices are used as building blocks for creating more complicated projects. ICs are produced to generate signals, amplify signals, control motors, and perform hundreds of other functions. They fit neatly into a breadboard by straddling the gap in the middle. -

    -
    -
    -

    -

    Microcontrollers and I/O boards

    -Microcontrollers are small and simple computers. They are the tiny computer brains that automate many aspects of contemporary life, through their activities inside devices ranging from alarm clocks to airplanes. A microcontroller has a processor, memory, and input/output interfaces enclosed within a single programmable unit. They range in size from about 1 × 1 cm to 5 × 2 cm. Like desktop computers, they come in many different configurations. Some have the same speed and memory as a personal computer from twenty years ago, but they are much less powerful than current machines, as this comparison tables shows: - - - - - - - - - - - - - - - - - - - - -
    ModelSpeedMemoryCost
    Apple Macintosh (1984)
    8MHz
    128 Kb
    $2500
    Atmel ATmega128-8AC Microcontroller
    8MHz
    128 Kb
    $15
    Apple Mac Mini (2006)
    1500 MHz
    512,000 Kb
    $600
    +

    Electronics

    +

    Hernando Barragán and Casey Reas

    -
    -Small metal pins poking out from a microcontroller’s edges allow access to the circuits inside. Each pin has its own role. Some are used to supply power, some are for communication, some are inputs, and others can be set to either input or output. The relative voltage at each input pin can be read through software, and the voltage can be set at each output pin. Some pins are reserved for communication. They allow a microcontroller to communicate with computers and other microcontrollers through established communication protocols such as RS-232 serial. -
    -
    - Microcontrollers can be used to build projects directly, but they are often packaged with other components onto a printed circuit board (PCB) to make them easier to use for beginners and for rapid prototyping. We call these boards I/O boards (input/output boards) because they are used to get data in and out of a microcontroller. They are also called microcontroller modules. We’ve created three informal groups—bare microcontrollers, programmable I/O boards, and tethered I/O boards—to discuss different ways to utilize microcontrollers in a project. -
    -
    -Bare microcontrollers -
    -Working directly with a bare microcontroller is the most flexible but most difficult way to work. It also has the potential to be the least expensive way of building with electronics, but this economy can be offset by initial development costs and the extra time spent learning how to use it. Microchip PIC and Atmel AVR are two popular families of microcontrollers. Each has variations ranging from simple to elaborate that are appropriate for different types of projects. The memory, speed, and other features effect the cost, the number of pins, and the size of the package. Both families feature chips with between eight and 100 pins with prices ranging from under $1 to $20. PIC microcontrollers have been on the market for a longer time, and more example code, projects, and books are available for beginners. The AVR chips have a more modern architecture and a wider range of open-source programming tools. Microcontrollers are usually programmed in the C language or their assembly language, but it’s also possible to program them in other languages such as BASIC. If you are new to electronics and programming, we don’t recommend starting by working directly with PIC or AVR chips. In our experience, beginners have had more success with the options introduced below. +

     

    -
    -
    -Programmable I/O boards -
    -A programmable I/O board is a microcontroller situated on a PCB with other components to make it easier to program, attach/detach components, and turn on and off. These boards typically have components to regulate power to protect the microcontroller and a USB or RS-232 serial port to make it easy to attach cables. The small pins on the microcontroller are wired to larger pins called headers, which make it easy to insert and remove sensors and motors. Small wires embedded within the PCB connect pins to a corresponding header. Small reset switches make it easy to restart the power without having to physically detach the power supply or battery. -
    -
    - Within the context of this book, the most relevant I/O boards are Wiring and Arduino. Both were created as tools for designers and artists to build prototypes and to learn about electronics. Both boards use the Wiring language to program their microcontrollers and use a development environment built from the Processing environment. In comparison to the Processing language, the Wiring language provides a similar level of control and ease of use within its domain. They share common language elements when possible, but Wiring has some functions specific to programming microcontrollers and omits the graphics programming functions within Processing. Like Processing programs, Wiring programs are translated into another language before they are run. When a program written with the Wiring language is compiled, it’s first translated into the C/C++ language and then compiled using a C/C++ compiler. -
    -
    - -
    -
    +

    + Software is not limited to running on desktop computers, laptops, tablets, and phones. Contemporary cameras, copiers, elevators, toys, washing machines, and artworks found in galleries and museums are controlled with software. Programs written to control these objects use the same concepts discussed earlier in this book (variables, control structures, arrays, etc.), but building the physical parts requires learning about electronics. This text introduces the potential of electronics with examples from art and design and discusses basic terminology and components. Examples written with Wiring and Arduino (two electronics toolkits related to Processing) are presented and explained. +

    + + +

    Electronics in the arts

    -Tethered I/O boards -
    -A tethered I/O board is used to get sensor data into a computer and to control physical devices (motors, lights, etc.) without the need to program the board. A computer already has many input and output devices such as a monitor, mouse, and keyboard; and tethered I/O boards provide a way to communicate between more exotic input devices such as light sensors and video cameras, and output devices such as servomotors and lights. These boards are designed to be easy to use. They often do not require knowledge of electronics because sensors and motors can be plugged directly into the board and do not need to interface with other components. Messages are sent and received from the boards through software such as Processing, Max, Flash, and many programming languages. This ease of use often comes at a high price. -

    -
    -
    -

    -

    Sensors and communication

    -Physical phenomena are measured by electronic devices called sensors. Different sensors have been invented to acquire data related to touch, force, proximity, light, orientation, sound, temperature, and much more. Sensors can be classified into groups according to the type of signals they produce (analog or digital) and the type of phenomena they measure. Analog signals are continuous, but digital signals are discrete and are constrained to a range of values (e.g., 0 to 255): -
    -
    - -
    -Most basic analog sensors utilize resistance. Changes in a physical phenomenon modify the resistance of the sensor, therefore varying the voltage output through the sensor. An analog-to-digital converter can continuously measure this changing voltage and convert it to a number that can be used by software. Sensors that produce digital signals send data as binary values to an attached device or computer. These sensors use a voltage (typically between 3.5 and 5 volts) as ON (binary digit 1 or TRUE) and no voltage as a OFF (binary digit 0 or FALSE). More complex sensors include their own microcontrollers to convert the data to digital signals and to use established communication protocols for transmitting these signals to another computer. -
    -
    -Touch and force -
    -Sensing of touch and force is achieved with switches, capacitive sensors, bend sensors, and force-sensitive resistors. A switch is the simplest way to detect touch. A switch is a mechanism that stops or allows the flow of electricity depending on its state, either open (OFF) or closed (ON). Some switches have many possible positions, but most can only be ON or OFF. Touch can also be detected with capacitive sensors. These sensors can be adjusted to detect the touch and proximity (within a few millimeters) of a finger to an object. The sensor can be positioned underneath a nonconductive surface like glass, cardboard, or fabric. This type of sensor is often used for the buttons in an elevator. A bend (flex) sensor is a thin strip of plastic that changes its resistance as it is bent. A force-sensitive resistor (FSR or force sensor) changes its resistance depending on the magnitude of force applied to its surface. FSRs are designed for small amounts of force like the pressure from a finger, and they are available in different shapes including long strips and circular pads. -
    -
    -Presence and distance -
    -There are a wide variety of sensors to measure distance and determine whether a person is present. The simplest way to determine presence is a switch. A switch attached to a door, for example, can be used to determine whether it is open or closed. A change in the state (open or closed) means someone or something is there. Switches come in many different shapes and sizes, but the category of small ones called microswitches are most useful for this purpose. The infrared (IR) motion detectors used in security systems are another simple way to see if something is moving in the environment. They can’t measure distance or the degree of motion, but they have a wide range, and some types can be purchased at hardware stores. IR distance sensors are used to calculate the distance between the sensor and an object. The distance is converted into a voltage between 0 and 5 volts that can be read by a microcontroller. Ultrasonic sensors are used for measuring up to 10 meters. This type of device sends a sound pulse and calculates how much time it takes to receive the echo. -
    -
    -Light -
    -Sensors for detecting light include photoresistors, phototransistors, and photodiodes. A photoresistor (also called a photocell) is a component that changes its resistance with varying levels of light. It is among the easiest sensors to use. A phototransitor is more sensitive to changes in light and is also easy to use. Photodiodes are also very sensitive and can respond faster to changing light levels, but they are more complex to interface with a microcontroller. Photodiodes are used in the remote control receivers of televisions and stereos. +

    + Electronics emerged as a popular material for artists during the 1960s. Artists such as Naum Gabo and Marcel Duchamp used electrical motors in prior decades, but the wide interest in kinetic sculpture and the foundation of organizations such as Experiments in Art and Technology (E.A.T.) are evidence of a significant new emphasis. For instance, in The Machine exhibition at The Museum of Modern Art in 1968, Wen-Ying Tsai exhibited Cybernetic Sculpture, a structure made of vibrating steel rods illuminated by strobe lights flashing at high frequencies. Variations in the vibration frequency and the light flashes produced changes in the perception of the sculpture. The sculpture responded to sound in the surrounding environment by changing the frequency of the strobe lights. Peter Vogel, another kinetic sculpture pioneer, created sculptures that generate sound. The sculptures have light sensors (photocells) that detect and respond to a person’s shadow when she approaches the sculpture. The sculptures are built almost entirely with electrical components. The organization of these components forms both the shape of the sculpture and its behavior. Other pioneers during the 1960s include Nam June Paik, Nicolas Schöffer, James Seawright, and Takis. +

    + +

    + The range of electronic sculpture created by contemporary artists is impressive. Tim Hawkinson produces sprawling kinetic installations made of cardboard, plastic, tape, and electrical components. His Überorgan (2000) uses mechanical principles inspired by a player piano to control the flow of air through balloons the size of whales. The air is pushed through vibrating reeds to create tonal rumbles and squawks. This physical energy contrasts with the psychological tension conveyed through Ken Feingold’s sculptures. His If/Then (2001) is two identical, bald heads protruding from a cardboard box filled with packing material. These electromechanical talking heads debate their existence and whether they are the same person. Each head listens to the other and forms a response from what it understands. Speech synthesis and recognition software are used in tandem with mechanisms to animate the faces—the result is uncanny. +

    + +

    + The works of Maywa Denki and Crispin Jones are prototypical of a fascinating area of work between art and product design. Maywa Denki is a Japanese art unit that develops series of products (artworks) that are shown in product demonstrations (live performances). Over the years, they have developed a progeny of creatures, instruments, fashion devices, robots, toys, and tools—all animated by motors and electricity. Devices from the Edelweiss Series include Marmica, a self-playing marimba that opens like a flower, and Mustang, a gasoline-burning aroma machine for people who love exhaust fumes. Crispin Jones creates fully functioning prototypes for objects that are critical reflections of consumer technologies. Social Mobiles (SoMo), developed in collaboration with IDEO, is a set of mobile phones that address the frustration and anger caused by mobile phones in public places. The project humorously explores ways mobile phone calls in public places could be made less disruptive. The SoMo 1 phone delivers a variable electrical shock to the caller depending on how loud the person at the other end of the conversation is speaking. The ringtone for SoMo 4 is created by the caller knocking on their phone. As with a knock on a door, the attitude or identity of the caller is revealed through the sound. Related artists include the Bureau of Inverse Technology, Ryota Kuwakubo, and the team of Tony Dunne and Fiona Raby. +

    + +

    + As electronic devices proliferate, it becomes increasingly important for designers to consider new ways to interact with these machines. Working with electronics is an essential component of the emerging interaction design community. The Tangible Media Group (TMG) at the MIT Media Laboratory, led by Hiroshi Ishii, pioneered research into tangible user interfaces to take advantage of human senses and dexterity beyond screen GUIs and clicking a mouse. Curlybot is a toy that can record and play back physical movement. It remembers how it was moved and can replay the motion including pauses, changes in speed, and direction. MusicBottles are physical glass bottles that trigger sounds when they are opened. To the person who opens the bottles, the sounds appear to be stored within the bottles, but technically, custom-designed electromagnetic tags allow a special table to know when a bottle has been opened, and the sound is played through nearby speakers. These and other projects from the TMG were instrumental in moving research in interface design away from the screen and into physical space. Research labs at companies like Sony and Philips are other centers for research and innovation into physical interaction design. Academic programs such as New York University’s Interactive Telecommunication Program, the Design Interactions course at the Royal College of Art, and the former Interaction Design Institute Ivrea have pioneered educational strategies within in this area. +

    + + + +

    Electricity

    + +

    + Electricity is something we use daily, but it is difficult to understand. Its effect is experienced in many ways, from observing a light turn on to noticing the battery charge deplete on a laptop computer. +

    + +

    + Electrical current is a stream of moving electrons. They flow from one point to another through a conductor. Some materials are better conductors than others. Sticking a fork in a light socket is dangerous because metal is a good conductor and so is your body. The best conductors are copper, silver, and gold. A resistor is the opposite of a conductor. Resistance is the capability of a material to resist the flow of electrons. A substance with a very high resistance is an insulator. Plastic and rubber are excellent insulators, and for this reason they are used as the protective covering around wires. Electrical energy, the difference of electrical potential between two points, is called voltage. The amount of electrical charge per second that flows through a point is the current. Resistance is measured in units called ohms, voltage is measured in volts, and current is measured in amperes (amps). The relation between the three is easiest to understand through an analogy of water flowing through a hose. As explained by the educators Dan O’Sullivan and Tom Igoe: +

    + +

    + The flow of water through a hose is like the flow of electricity through a circuit. Turning the faucet increases the amount of water coming through the hose, or increases the current (amps). The diameter of the hose offers resistance to the current, determining how much water can flow. The speed of the water is equivalent to voltage. When you put your thumb over the end of the hose, you reduce the diameter of the pathway of the water. In other words, the resistance goes up. The current (that is, how much water is flowing) doesn’t change, however, so the speed of the water, or voltage, has to go up so that all the water can escape . . . 1 +

    + +

    + Electrical current flows in two ways: direct current (DC) and alternating current (AC). A DC signal always flows in the same direction and an AC signal reverses the direction of flow at regular intervals. Batteries and solar cells produce DC signals, and the power that comes from wall sockets is an AC signal: +

    + + + +

    + Depending on your country, the AC power source coming into your home is between 100 and 240 volts. Most home appliances can directly use AC current to operate, but some use a power supply to convert the higher-potential AC current into DC current at smaller voltages. A common example of this type of power supply are the black plastic boxes (a k a power bricks, power adapters, wall warts) that are used to power laptops or mobile phones from the home AC power source. Most desktop computers have an internal power supply to convert the AC source to the 12-volt and 5-volt DC supply necessary to run the internal electronics. Low voltages are generally safer than high voltages, but it’s the amount of current (amps) that makes electricity dangerous. +

    + + + +

    Components

    + +

    + Electronic components are used to affect the flow of electricity and to convert electrical energy into other forms such as light, heat, and mechanical energy. There are many different components, each with a specific use, but here we introduce four of the most basic types: resistor, capacitor, diode, and transistor. +

    + +

    + Resistor +
    + A resistor limits (provides resistance to) the flow of electricity. Resistors are measured in units called ohms. The value 10 ohms is less resistance than 10,000 (10K) ohms. The value of each resistor is marked on the component with a series of colored bands. A variable resistor that changes its resistance when a slider, knob, or dial attached to it is turned is called a potentiometer or trimmer. Variable resistors are designed to change in response to different environmental phenomena. For example, one that changes in response to light is called a photoresistor or photocell, and one that changes in response to heat is called a thermistor. Resistors can be used to limit current, reduce voltage, and perform many other essential tasks. +

    + + + +

    + Capacitor +
    + A capacitor stores electrons i.e. electrical charge; it gains charge when current flows in, and it releases charge (discharges) when the current flows out. This can smooth out the dips and spikes in a current signal. Capacitors are combined with resistors to create filters, integrators, differentiators, and oscillators. A simple capacitor is two parallel sheets of conductive materials, separated by an insulator. Capacitors are measured in units called farads. A farad is a large measurement, so most capacitors you will use will be measured in microfarads (µF), picofarads (pF), or nanofarads (nF). +

    + + + + +

    + Diode +
    + Current flows only in one direction through a diode. One side is called the cathode (marked on the device with a line) and the other is the anode. Current flows when the anode is more positive than the cathode. Diodes are commonly used to block or invert the negative part of an AC signal. A light-emitting diode (LED) is used to produce light. The longer wire coming out of the LED is the anode and the other is the cathode. LEDs come in many sizes, forms, colors, and brightness levels. +

    + + + +

    + Transistor +
    + A transistor can be used as an electrical switch or an amplifier. A bipolar transistor has three leads (wires) called the base, collector, and emitter. Depending on the type of transistor, applying current to the base either allows current to flow or stops it from flowing through the device from the collector to the emitter. Transistors make it possible for the low current from a microcontroller to control the much higher currents necessary for motors and other power-hungry devices, and thus to turn them on and off. +

    + + + + + + +

    Circuits

    + +

    + An electrical circuit is a configuration of components, typically designed to produce a desired behavior such as decreasing the current, filtering a signal, or turning on an LED. The following simple circuit can be used to turn a light on and off: +

    + + + +

    + This simple electric circuit is a closed loop with an energy source (battery), a load (lightbulb) that offers a resistance to the flow of electrons and transforms the electric energy into another form of energy (light), wires that carry the electricity, and a switch to connect and disconnect the wires. The electrons move from one end of the battery, through the load, and to the other end. +

    + +

    + Circuits are usually represented with diagrams. A circuit diagram uses standardized symbols to represent specific electrical components. It is easier to read the connections on a diagram than on photographs of the components. A diagram of the simple circuit above could look like this: +

    + + + +

    + Circuits are often prototyped on a "breadboard,” a rectangular piece of plastic with holes for inserting wires. A breadboard makes it easy to quickly make variations on a circuit without soldering (fusing components together with a soft metal). Conductive strips underneath the surface connect the long horizontal rows at the top and bottom of the board and the short vertical rows within the middle: +

    + + + +

    + Circuits are tested with a multimeter, an instrument to measure volts, current, resistance, and other electrical properties. A multimeter allows the electrical properties of the circuit to be read as numbers and is necessary for debugging. Analog multimeters have a small needle that moves from left to right, and digital multimeters have a screen that displays numbers. Most multimeters have two metal prongs to probe the circuit and a central dial to select between different modes. +

    + +

    + Commonly used circuits are often condensed into small packages. These integrated circuits (ICs, or chips) contain dense arrangements of miniaturized components. They are typically small, black plastic rectangles with little metal pins sticking out of the sides. Like objects in software, these devices are used as building blocks for creating more complicated projects. ICs are produced to generate signals, amplify signals, control motors, and perform hundreds of other functions. They fit neatly into a breadboard by straddling the gap in the middle. +

    + +

    Microcontrollers and I/O boards

    + +

    + Microcontrollers are small and simple computers. They are the tiny computer brains that automate many aspects of contemporary life, through their activities inside devices ranging from alarm clocks to airplanes. A microcontroller has a processor, memory, and input/output interfaces enclosed within a single programmable unit. They range in size from about 1 × 1 cm to 5 × 2 cm. Like desktop computers, they come in many different configurations. Some have the same speed and memory as a personal computer from twenty years ago, but they are much less powerful than current machines, as this comparison tables shows: +

    + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ModelSpeedMemoryCost
    Apple Macintosh (1984) 
    8MHz
    128 Kb
    $2500
    Atmel ATmega128-8AC Microcontroller 
    8MHz
    128 Kb
    $15
    Apple Mac Mini (2006) 
    1500 MHz
    512,000 Kb
    $600
    + +

     

    + +

    + Small metal pins poking out from a microcontroller’s edges allow access to the circuits inside. Each pin has its own role. Some are used to supply power, some are for communication, some are inputs, and others can be set to either input or output. The relative voltage at each input pin can be read through software, and the voltage can be set at each output pin. Some pins are reserved for communication. They allow a microcontroller to communicate with computers and other microcontrollers through established communication protocols such as RS-232 serial. +

    + +

    + Microcontrollers can be used to build projects directly, but they are often packaged with other components onto a printed circuit board (PCB) to make them easier to use for beginners and for rapid prototyping. We call these boards I/O boards (input/output boards) because they are used to get data in and out of a microcontroller. They are also called microcontroller modules. We’ve created three informal groups—bare microcontrollers, programmable I/O boards, and tethered I/O boards—to discuss different ways to utilize microcontrollers in a project. +

    + +

    + Bare microcontrollers +
    + Working directly with a bare microcontroller is the most flexible but most difficult way to work. It also has the potential to be the least expensive way of building with electronics, but this economy can be offset by initial development costs and the extra time spent learning how to use it. Microchip PIC and Atmel AVR are two popular families of microcontrollers. Each has variations ranging from simple to elaborate that are appropriate for different types of projects. The memory, speed, and other features effect the cost, the number of pins, and the size of the package. Both families feature chips with between eight and 100 pins with prices ranging from under $1 to $20. PIC microcontrollers have been on the market for a longer time, and more example code, projects, and books are available for beginners. The AVR chips have a more modern architecture and a wider range of open-source programming tools. Microcontrollers are usually programmed in the C language or their assembly language, but it’s also possible to program them in other languages such as BASIC. If you are new to electronics and programming, we don’t recommend starting by working directly with PIC or AVR chips. In our experience, beginners have had more success with the options introduced below. +

    + +

    + Programmable I/O boards +
    + A programmable I/O board is a microcontroller situated on a PCB with other components to make it easier to program, attach/detach components, and turn on and off. These boards typically have components to regulate power to protect the microcontroller and a USB or RS-232 serial port connector to make it easy to attach cables for communication. The small pins on the microcontroller are wired to larger pins called headers, which make it easy to insert and remove sensors and motors. Small wires embedded within the PCB connect pins to a corresponding header. Small reset switches make it easy to restart the power without having to physically detach the power supply or battery. +

    + +

    + Within the context of this book, the most relevant I/O boards are Wiring and Arduino. Both were created as tools for designers and artists to build prototypes and to learn about electronics. Both boards use the Wiring language to program their microcontrollers and use a development environment built from the Processing environment. In comparison to the Processing language, the Wiring language provides a similar level of control and ease of use within its domain. They share common language elements when possible, but Wiring has some functions specific to programming microcontrollers and omits the graphics programming functions within Processing. Like Processing programs, Wiring programs are translated into another language before they are run. When a program written with the Wiring language is compiled, it’s first translated into the C/C++ language and then compiled using a C/C++ compiler. +

    + + + + +

    + Tethered I/O boards +
    + A tethered I/O board is used to get sensor data into a computer and to control physical devices (motors, lights, etc.) without the need to program the board. A computer already has many input and output devices such as a monitor, mouse, and keyboard; and tethered I/O boards provide a way to communicate between more exotic input devices such as light sensors and video cameras, and output devices such as servomotors and lights. These boards are designed to be easy to use. They often do not require knowledge of electronics because sensors and motors can be plugged directly into the board and do not need to interface with other components. Messages are sent and received from the boards through software such as Processing, Max, Flash, and many programming languages. This ease of use often comes at a high price. +

    + + + + +

    Sensors

    + +

    + Physical phenomena are measured by electronic devices called sensors. Different sensors have been invented to acquire data related to touch, force, proximity, light, orientation, sound, temperature, and much more. Sensors can be classified into groups according to the type of signals they produce (analog or digital) and the type of phenomena they measure. Analog signals are continuous, but digital signals are constrained to a range of values (e.g., 0 to 255): +

    + + + + +

    + Most basic analog sensors utilize resistance. Changes in a physical phenomenon modify the resistance of the sensor, therefore varying the voltage output through the sensor. An analog-to-digital converter can continuously measure this changing voltage and convert it to a number that can be used by software. Sensors that produce digital signals send data as binary values to an attached device or computer. These sensors use a voltage (typically between 3.5 and 5 volts) as ON (binary digit 1 or TRUE) and no voltage as a OFF (binary digit 0 or FALSE). More complex sensors include their own microcontrollers to convert the data to digital signals and to use established communication protocols for transmitting these signals to another computer. +

    + +

    + Touch and force +
    + Sensing of touch and force is achieved with switches, capacitive sensors, bend sensors, and force-sensitive resistors. A switch is the simplest way to detect touch. A switch is a mechanism that stops or allows the flow of electricity depending on its state, either open (OFF) or closed (ON). Some switches have many possible positions, but most can only be ON or OFF. Touch can also be detected with capacitive sensors. These sensors can be adjusted to detect the touch and proximity (within a few millimeters) of a finger to an object. The sensor can be positioned underneath a nonconductive surface like glass, cardboard, or fabric. This type of sensor is often used for the buttons in an elevator. A bend (flex) sensor is a thin strip of plastic that changes its resistance as it is bent. A force-sensitive resistor (FSR or force sensor) changes its resistance depending on the magnitude of force applied to its surface. FSRs are designed for small amounts of force like the pressure from a finger, and they are available in different shapes including long strips and circular pads. +

    + +

    + Presence and distance +
    + There are a wide variety of sensors to measure distance and determine whether a person is present. The simplest way to determine presence is a switch. A switch attached to a door, for example, can be used to determine whether it is open or closed. A change in the state (open or closed) means someone or something is there. Switches come in many different shapes and sizes, but the category of small ones called microswitches are most useful for this purpose. The infrared (IR) motion detectors used in security systems are another simple way to see if something is moving in the environment. They can’t measure distance or the degree of motion, but they have a wide range, and some types can be purchased at hardware stores. IR distance sensors are used to calculate the distance between the sensor and an object. The distance is converted into a voltage between 0 and 5 volts that can be read by a microcontroller. Ultrasonic sensors are used for measuring up to 10 meters. This type of device sends a sound pulse and calculates how much time it takes to receive the echo. +

    + +

    + Light +
    + Sensors for detecting light include photoresistors, phototransistors, and photodiodes. A photoresistor (also called a photocell) is a component that changes its resistance with varying levels of light. It is among the easiest sensors to use. A phototransitor is more sensitive to changes in light and is also easy to use. Photodiodes are also very sensitive and can respond faster to changing light levels, but they are more complex to interface with a microcontroller. Photodiodes are used in the remote control receivers of televisions and stereos. +

    + +

    + Position and orientation +
    + A potentiometer is a variable resistor that works by twisting a rotary knob or by moving a slider up and down. The potentiometer’s resistance changes with the rotation or up/down movement, and this can affect the voltage level within a circuit. Most rotary potentiometers have a limited range of rotation, but some are able to turn continuously. A tilt sensor is used to crudely measure orientation (up or down). It is a switch with two or more wires and a small metal ball or mercury in a box that touches wires in order to complete a circuit when it is in a certain orientation. An accelerometer measures the change in movement (acceleration) of an object that it is mounted to. Tiny structures inside the device bend as a result of momentum, and the amount of bending is measured. Accelerometers are used in cameras to control image stabilization and in automobiles to detect rapid deceleration and release airbags. A digital compass calculates orientation in relation to the earth’s magnetic field. The less expensive sensors of this type have a lower accuracy, and they may not work well when situated near objects that emit electromagnetic fields (e.g., motors). +

    + +

    + Sound +
    + A microphone is the simplest and most common device used to detect and measure sound. Sudden changes in volume are the easiest sound elements to read, but processing the sound wave with software (or special hardware) makes it possible to detect specific frequencies or rhythms. A microphone usually requires extra components to amplify the signal before it can be read by a microcontroller. Piezo electric film sensors, commonly used in speakers and microphones, can also be used to detect sound. Sampling a sound wave with a microcontroller can dramatically reduce the quality of the audio signal. For some applications, it’s better to sample and analyze sound through a desktop computer and to communicate the desired analysis information to an attached microcontroller. +

    + +

    + Temperature +
    + A thermistor is a device that changes its resistance with temperature. These sensors are easy to interface, but they respond slowly to changes. To quantitatively measure temperature, a more sophisticated device is needed. Flame sensors are tuned to detect open flames such as lighters and candles. +

    + + + + +

    Sensors and communication

    + +

    + Analog voltage signals from sensors can’t be directly interpreted by a computer, so they must be converted to a digital value. Some microcontrollers provide analog-to-digital converters (ADC or A/D) that measure variations in voltage at an input pin and convert it to a digital value. The range of values depends on the resolution of the ADC; common resolutions are 8 and 10 bits. At 8-bit resolution, an ADC can represent 28 (256) different values, where 0 volts corresponds to the value 0 and 5 volts corresponds to 255. A 10-bit ADC provides 1024 different values, where 5 volts corresponds to the value 1023. +

    + +

    + Data is sent and received between microcontrollers and computers according to established data protocols such as RS-232 serial, USB, MIDI, TPC/IP, Bluetooth, and other proprietary formats like I2C or SPI. Most electronics prototyping kits and microcontrollers include an RS-232 serial port, and this is therefore a convenient way to communicate. This standard has been around for a long time (it was developed in the late 1960s) and it defines signal levels, timing, physical plugs, and information exchange protocols. The physical RS-232 serial port has largely been replaced in computers by the faster and more flexible (but more complex) universal serial bus (USB), but the protocol is still widely used when combining the USB port with software emulation. +

    + +

    + Because a device can have several serial ports, a user must specify which serial port to use for data transmission. On most Windows computers, serial port names are COMx, where x can be 1, 2, 3, etc. On UNIX-based systems (Mac OS X and Linux), serial devices are accessed through files in the /dev/ directory. After the serial port is selected, the user must specify the settings for the port. Communication speed will vary with devices, but typical values are 9600, 19,200, and 115,200 bits per second. Once the ports are open for communication on both devices, it is possible to send and receive data. +

    + +

    + The following examples connect sensors and actuators to a Wiring or Arduino board and communicate the data between the I/O board and a Processing application. When the Wiring and Arduino boards are plugged into a computer’s USB port, it appears on the computer as a serial port, making it possible to send/receive data on it. The Wiring board has two serial ports called Serial and Serial1; the Arduino board has one called Serial. Serial is directly available on the USB connector located on the board surface. Serial1 is available through the Wiring board digital pin numbers 2(Rx) and 3(Tx) for the user’s applications. +

    + + + + +

    Example 1: Switch (Code below)

    + +

    + This example sends the status of a switch (ON or OFF) connected to the Wiring or Arduino board to a Processing application running on a computer. Software runs on the board to read the status of a switch connected on digital pin 4. This value 1 is sent to the serial port continuously while the switch is pressed and 0 is sent continuously when the switch is not pressed. The Processing application continuously receives data from the board and assigns the color of a rectangle on the screen depending on the value of the data. When the switch is pressed the rectangle’s color changes from black to light gray. +

    + + + +

    Example 2: Light sensor (Code below)

    + +

    + This example brings data from a light sensor (photoresistor) connected to the Wiring or Arduino board’s analog input pin 0 into a Processing application running on a computer. Software runs on the board to send the value received from the light sensor to the serial port. Because the light sensor is plugged into an analog input pin, the analog voltage coming into the board is converted into a digital number before it is sent over the serial port. The Processing application changes the color of a rectangle on-screen according to the value sent from the board. The rectangle exhibits grays from black to white according to the amount of light received by the sensor. Cover and uncover the sensor with your hand to see a large change. +

    + + + + +

    Controlling physical media

    + +

    + Actuators are devices that act on the physical world. Different types of actuators can create light, motion, heat, and magnetic fields. The digital output pin on a microcontroller can be set to a voltage of 0 or 5 volts. This value can be used to turn a light or motor on or off, but finer control over brightness and speed requires an analog output. By using a digital to analog converter (DAC), a discretized signal can be directly generated as illustrated in the previous figure. If desired, some smoothing can be added to obtain the desired analog signal. When a DAC is not available or not justified in terms of cost or conversion speed, another approach is to use a technique called pulse-width modulation (PWM). This is turning a digital output ON and OFF very quickly to simulate values between 0 and 5 volts. If the output is 0 volts for 90% of the time and 5 volts for 10%, this is called a 10% duty cycle. Following smoothing, it emulates an analog voltage of 0.5 volts. An 80% duty cycle with smoothing emulates a 4-volt signal: +

    + + + + +

    + The PWM technique can be used to dim a light, run a motor at a slow speed, and control the frequency of a tone through a speaker. In some applications, any necessary smoothing is obtained for free e.g. the inertia in a motor can average out the PWM duty cycle and result in smooth motion. +

    + +

    + Light +
    + Sending current through a light-emitting diode (LED) is the simplest way to get a microcontroller to control light. An LED is a semiconductor device that emits monochromatic light when a current is applied to it. The color (ranging from ultraviolet to infrared) depends on the semiconductor material used in its construction. LEDs have a wide range of applications from simple blinking indicators and displays to street lamps. They have a long life and are very efficient. Some types of LEDs and high-power LEDs require special power arrangements and interfacing circuits before they can be used with microcontrollers. Incandescent, fluorescent, and electroluminescent light sources always require special interfacing circuits before they can be controlled. +

    + +

    + Motion +
    + Motors are used to create rotational and linear movement. The rated voltage, the current drawn by the motor, internal resistance, speed, and torque (force) are factors that determine the power and efficiency of the motor. Direct current (DC) motors turn continuously at very high speeds and can switch between a clockwise and counterclockwise direction. They are usually interfaced with a gearbox to reduce the speed and increase the power. Servomotors are modified DC motors that can be set to any position within a 180-degree range. These motors have an internal feedback system to ensure they remain at their position. Stepper motors move in discrete steps in both directions. The size of the steps depends on the resolution of the motor. Solenoids move linearly (forward or back instead of in circles). A solenoid is a coil of wire with a shaft in the center. When current is applied to the coil, it creates a magnetic field that pulls or pushes the shaft, depending on the type. Muscle wire (shape memory alloy or nitinol) is a nickel-titanium alloy that contracts when power is applied. It is difficult to work with and is slower than motors, but requires less current and is smaller. DC and stepper motors need special interfacing circuits because they require more current than a microcontroller can supply through its output pins. H-bridge chips simplify this interface. +

    + +

    + Switches +
    + Relays and transistors are used to turn on and off electric current. A relay is an electromechanical switch. It has a coil of wire that generates a magnetic field when an electrical current is passed through. The magnetic field pulls together the two metal contacts of the relay’s switch. Solid-state relays without moving parts are faster than electromechanical relays. Using relays makes it possible to turn ON and OFF devices that can’t be connected directly to a microcontroller. These devices include home appliances, 120-volt light bulbs, and all other devices that require more power than the microcontroller can provide. Transistors can also behave like switches. Because they operate electronically and not mechanically, they are much faster than relays. +

    + +

    + Sound +
    + Running a signal from a digital out or PWM pin to a small speaker is the easiest way to produce a crude, buzzing noise. For more sophisticated sounds, attach these pins to tone-generator circuits created with a 555 timer IC, capacitors, and resistors. Some chips are designed specifically to record and play back sound. Others are sound synthesizers that can synthesize speech by configuring stored phonemes. +

    + +

    + Temperature +
    + Temperature can be controlled by a Peltier junction, a device that works as a heat pump. It transforms electricity into heat and cold at the same time by extracting thermal energy from one side (cooling) into the other side (heating). It can also work in reverse, applying heat or cold to the proper surface to produce an electrical current. Because this device consumes more current than a microcontroller can handle in an output pin, it must be interfaced using transistors, relays, or digital switches like the ones described above. +

    + +

    + The following examples demonstrate how to control lights and motors attached to an I/O board through a Processing program: +

    + + +

    Example 3: Turn a light on and off (Code below)

    + +

    + This example sends data from a Processing program running on a computer to a Wiring or Arduino board to turn a light ON or OFF. The program continually writes an H to the serial port if the cursor is inside the rectangle and writes a L if it’s not. Software running on the board receives the data and checks for the value. If the value is H, it turns on a light connected to the digital I/O pin number 4, and if the value is L, it turns off the light. The light always reflects the status of the rectangle on the computer’s screen. +

    + + +

    Example 4: Control a servomotor (Code below)

    + +

    + This example controls the position of a servomotor through an interface within a Processing program. When the mouse is dragged through the interface, it writes the position data to the serial port. Software running on a Wiring or Arduino board receives data from the serial port and sets the position of a servomotor connected to the digital I/O pin number 4. +

    + + + +

    Example 5: Turn a DC motor on and off (Code below)

    + +

    + This example controls a DC motor from a Processing program. The program displays an interface that responds to a mouse click. When the mouse is clicked within the interface, the program writes data to the serial port. Software running on the board receives data from the serial port and turns the DC motor connected to the PWM pin ON and OFF. The DC motor is connected to the board through an L293D chip to protect the microcontroller from current spikes caused when the motor turns on. +

    + + + +

    Conclusion

    + + +

    + Electronic components and microcontrollers are becoming more common in designed objects and interactive artworks. Although the programming and electronics skills required for many projects call for an advanced understanding of circuits, a number of widely used and highly effective techniques can be implemented and quickly prototyped by novices. The goal of this text is to introduce electronics and to provide enough information to encourage future exploration. As you pursue electronics further, we recommend that you read CODE by Charles Petzold to gain a basic understanding of how electronics and computers work, and we recommend that you read Physical Computing by Dan O’Sullivan and Tom Igoe for a pragmatic introduction to working with electronics. Practical Electronics for Inventors by Paul Scherz is an indispensable resource, and the Engineer’s Mini Notebook series by Forrest M. Mims III is an excellent source for circuit designs. The Web is a deep resource for learning about electronics, and there are many excellent pages listed below in Resources. The best way to learn is by making projects. Build many simple projects and work through the examples in Physical Computing to gain familiarity with the different components. +

    + +

    Notes

    + +

    +

      +
    1. Dan O’Sullivan and Tom Igoe, Physical Computing: Sensing and Controlling the Physical World with Computers (Thomson Course Technology PTR, 2004), p. 5
    2. +
    +

    + + +

     

    + +

    Code

    + +

    + To run these examples, unlike the other examples in this book, you will need additional equipment. They require either a Wiring (wiring.org.co) or Arduino (www.arduino.cc) board and the following: +

    -
    -
    -Position and orientation -
    -A potentiometer is a variable resistor that works by twisting a rotary knob or by moving a slider up and down. The potentiometer’s resistance changes with the rotation or up/down movement, and this can affect the voltage level within a circuit. Most rotary potentiometers have a limited range of rotation, but some are able to turn continuously. A tilt sensor is used to crudely measure orientation (up or down). It is a switch with two or more wires and a small metal ball or mercury in a box that touches wires in order to complete a circuit when it is in a certain orientation. An accelerometer measures the change in movement (acceleration) of an object that it is mounted to. Tiny structures inside the device bend as a result of momentum, and the amount of bending is measured. Accelerometers are used in cameras to control image stabilization and in automobiles to detect rapid deceleration and release airbags. A digital compass calculates orientation in relation to the earth’s magnetic field. The less expensive sensors of this type have a lower accuracy, and they may not work well when situated near objects that emit electromagnetic fields (e.g., motors). -
    -
    -Sound -
    -A microphone is the simplest and most common device used to detect and measure sound. Sudden changes in volume are the easiest sound elements to read, but processing the sound wave with software (or special hardware) makes it possible to detect specific frequencies or rhythms. A microphone usually requires extra components to amplify the signal before it can be read by a microcontroller. Piezo electric film sensors, commonly used in speakers and microphones, can also be used to detect sound. Sampling a sound wave with a microcontroller can dramatically reduce the quality of the audio signal. For some applications, it’s better to sample and analyze sound through a desktop computer and to communicate the desired analysis information to an attached microcontroller. -
    -
    -Temperature -
    -A thermistor is a device that changes its resistance with temperature. These sensors are easy to interface, but they respond slowly to changes. To quantitatively measure temperature, a more sophisticated device is needed. Flame sensors are tuned to detect open flames such as lighters and candles. -
    -
    -Analog voltage signals from sensors can’t be directly interpreted by a computer, so they must be converted to a digital value. Some microcontrollers provide analog-to-digital converters (ADC or A/D) that measure variations in voltage at an input pin and convert it to a digital value. The range of values depends on the resolution of the ADC; common resolutions are 8 and 10 bits. At 8-bit resolution, an ADC can represent 28 (256) different values, where 0 volts corresponds to the value 0 and 5 volts corresponds to 255. A 10-bit ADC provides 1024 different values, where 5 volts corresponds to the value 1023. -
    -
    - Data is sent and received between microcontrollers and computers according to established data protocols such as RS-232 serial, USB, MIDI, TPC/IP, Bluetooth, and other proprietary formats like I2C or SPI. Most electronics prototyping kits and microcontrollers include an RS-232 serial port, and this is therefore a convenient way to communicate. This standard has been around for a long time (it was developed in the late 1960s) and it defines signal levels, timing, physical plugs, and information exchange protocols. The physical RS-232 serial port has largely been replaced in computers by the faster and more flexible (but more complex) universal serial bus (USB), but the protocol is still widely used when combining the USB port with software emulation. -
    -
    - Because a device can have several serial ports, a user must specify which serial port to use for data transmission. On most Windows computers, serial port names are COMx, where x can be 1, 2, 3, etc. On UNIX-based systems (Mac OS X and Linux), serial devices are accessed through files in the /dev/ directory. After the serial port is selected, the user must specify the settings for the port. Communication speed will vary with devices, but typical values are 9600, 19,200, and 115,200 bits per second. Once the ports are open for communication on both devices, it is possible to send and receive data. -
    -
    - The following examples connect sensors and actuators to a Wiring or Arduino board and communicate the data between the I/O board and a Processing application. When the Wiring and Arduino boards are plugged into a computer’s USB port, it appears on the computer as a serial port, making it possible to send/receive data on it. The Wiring board has two serial ports called Serial and Serial1; the Arduino board has one called Serial. Serial is directly available on the USB connector located on the board surface. Serial1 is available through the Wiring board digital pin numbers 2(Rx) and 3(Tx) for the user’s applications. -
    -
    -Example 1: Switch -
    -This example sends the status of a switch (ON or OFF) connected to the Wiring or Arduino board to a Processing application running on a computer. Software runs on the board to read the status of a switch connected on digital pin 4. This value 1 is sent to the serial port continuously while the switch is pressed and 0 is sent continuously when the switch is not pressed. The Processing application continuously receives data from the board and assigns the color of a rectangle on the screen depending on the value of the data. When the switch is pressed the rectangle’s color changes from black to light gray. -
    -
    -Example 2: Light sensor -
    -This example brings data from a light sensor (photoresistor) connected to the Wiring or Arduino board’s analog input pin 0 into a Processing application running on a computer. Software runs on the board to send the value received from the light sensor to the serial port. Because the light sensor is plugged into an analog input pin, the analog voltage coming into the board is converted into a digital number before it is sent over the serial port. The Processing application changes the color of a rectangle on-screen according to the value sent from the board. The rectangle exhibits grays from black to white according to the amount of light received by the sensor. Cover and uncover the sensor with your hand to see a large change. -

    -
    -
    -

    -

    Controlling physical media

    -Actuators are devices that act on the physical world. Different types of actuators can create light, motion, heat, and magnetic fields. The digital output pin on a microcontroller can set a voltage of 0 or 5 volts. This value can be used to turn a light or motor on or off, but finer control over brightness and speed requires using a technique called pulse-width modulation (PWM). This is turning a digital output ON and OFF very quickly to simulate values between 0 and 5 volts. If the output is 0 volts for 90% of the time and 5 volts for 10%, this is called a 10% duty cycle. It emulates an analog voltage of 0.5 volts. An 80% duty cycle emulates a 4-volt signal: -
    -
    - -
    -The PWM technique can be used to dim a light, run a motor at a slow speed, and control the frequency of a tone through a speaker. -
    -
    -Light -
    -Sending current through a light-emitting diode (LED) is the simplest way to get a microcontroller to control light. An LED is a semiconductor device that emits monochromatic light when a current is applied to it. The color (ranging from ultraviolet to infrared) depends on the semiconductor material used in its construction. LEDs have a wide range of applications from simple blinking indicators and displays to street lamps. They have a long life and are very efficient. Some types of LEDs and high-power LEDs require special power arrangements and interfacing circuits before they can be used with microcontrollers. Incandescent, fluorescent, and electroluminescent light sources always require special interfacing circuits before they can be controlled. -
    -
    -Motion -
    -Motors are used to create rotational and linear movement. The rated voltage, the current drawn by the motor, internal resistance, speed, and torque (force) are factors that determine the power and efficiency of the motor. Direct current (DC) motors turn continuously at very high speeds and can switch between a clockwise and counterclockwise direction. They are usually interfaced with a gearbox to reduce the speed and increase the power. Servomotors are modified DC motors that can be set to any position within a 180-degree range. These motors have an internal feedback system to ensure they remain at their position. Stepper motors move in discrete steps in both directions. The size of the steps depends on the resolution of the motor. Solenoids move linearly (forward or back instead of in circles). A solenoid is a coil of wire with a shaft in the center. When current is applied to the coil, it creates a magnetic field that pulls or pushes the shaft, depending on the type. Muscle wire (shape memory alloy or nitinol) is a nickel-titanium alloy that contracts when power is applied. It is difficult to work with and is slower than motors, but requires less current and is smaller. DC and stepper motors need special interfacing circuits because they require more current than a microcontroller can supply through its output pins. H-bridge chips simplify this interface. -
    -
    -Switches -
    -Relays and transistors are used to turn on and off electric current. A relay is an electromechanical switch. It has a coil of wire that generates a magnetic field when an electrical current is passed through. The magnetic field pulls together the two metal contacts of the relay’s switch. Solid-state relays without moving parts are faster than electromechanical relays. Using relays makes it possible to turn ON and OFF devices that can’t be connected directly to a microcontroller. These devices include home appliances, 120-volt light bulbs, and all other devices that require more power than the microcontroller can provide. Transistors can also behave like switches. Because they operate electronically and not mechanically, they are much faster than relays. -
    -
    -Sound -
    -Running a signal from a digital out or PWM pin to a small speaker is the easiest way to produce a crude, buzzing noise. For more sophisticated sounds, attach these pins to tone-generator circuits created with a 555 timer IC, capacitors, and resistors. Some chips are designed specifically to record and play back sound. Others are sound synthesizers that can synthesize speech by configuring stored phonemes. -
    -
    -Temperature -
    -Temperature can be controlled by a Peltier junction, a device that works as a heat pump. It transforms electricity into heat and cold at the same time by extracting thermal energy from one side (cooling) into the other side (heating). It can also work in reverse, applying heat or cold to the proper surface to produce an electrical current. Because this device consumes more current than a microcontroller can handle in an output pin, it must be interfaced using transistors, relays, or digital switches like the ones described above. -
    -
    -The following examples demonstrate how to control lights and motors attached to an I/O board through a Processing program: -
    -
    -Example 3: Turning a light on and off -
    -This example sends data from a Processing program running on a computer to a Wiring or Arduino board to turn a light ON or OFF. The program continually writes an H to the serial port if the cursor is inside the rectangle and writes a L if it’s not. Software running on the board receives the data and checks for the value. If the value is H, it turns on a light connected to the digital I/O pin number 4, and if the value is L, it turns off the light. The light always reflects the status of the rectangle on the computer’s screen. -
    -
    -Example 4: Controlling a servomotor -
    -This example controls the position of a servomotor through an interface within a Processing program. When the mouse is dragged through the interface, it writes the position data to the serial port. Software running on a Wiring or Arduino board receives data from the serial port and sets the position of a servomotor connected to the digital I/O pin number 4. -
    -
    -Example 5: Turning a DC motor on and off -
    -This example controls a DC motor from a Processing program. The program displays an interface that responds to a mouse click. When the mouse is clicked within the interface, the program writes data to the serial port. Software running on the board receives data from the serial port and turns the DC motor connected to the PWM pin ON and OFF. The DC motor is connected to the board through an L293D chip to protect the microcontroller from current spikes caused when the motor turns on. -

    -
    -
    -

    -

    Conclusion

    -Electronic components and microcontrollers are becoming more common in designed objects and interactive artworks. Although the programming and electronics skills required for many projects call for an advanced understanding of circuits, a number of widely used and highly effective techniques can be implemented and quickly prototyped by novices. The goal of this text is to introduce electronics and to provide enough information to encourage future exploration. As you pursue electronics further, we recommend that you read CODE by Charles Petzold to gain a basic understanding of how electronics and computers work, and we recommend that you read Physical Computing by Dan O’Sullivan and Tom Igoe for a pragmatic introduction to working with electronics. Practical Electronics for Inventors by Paul Scherz is an indispensable resource, and the Engineer’s Mini Notebook series by Forrest M. Mims III is an excellent source for circuit designs. The Web is a deep resource for learning about electronics, and there are many excellent pages listed below in Resources. The best way to learn is by making projects. Build many simple projects and work through the examples in Physical Computing to gain familiarity with the different components. -
    -
    -Notes -
    -1. Dan O’Sullivan and Tom Igoe, Physical Computing: Sensing and Controlling the Physical World with Computers (Thomson Course Technology PTR, 2004), p. TC -

    -
    -
    -

    -

    Code

    -

    -To run these examples, unlike the other examples in this book, you will need additional equipment. They require either a Wiring (wiring.org.co) or Arduino (www.arduino.cc) board and the following: -
    -

      -
    • USB cable (used to send data between board and computer)
    • -
    • 9–15V 1000mA power supply or 9V battery
    • -
    • 22-gauge solid core wire (get different colors)
    • -
    • Breadboard
    • -
    • Switch
    • -
    • Resistors (10K ohm for the switch circuits, 330 ohm for the LEDs, 1K ohm for the photoresistor)
    • -
    • LEDs
    • -
    • Servo motor (Futaba or Hi-Tech)
    • -
    • DC motor (a generic DC motor like the ones in toy cars)
    • -
    • L293D or SN754410 H-Bridge Integrated Circuit
    • -
    • Wire cutters
    • -
    • Wire strippers
    • -
    • Needlenose pliers
    • -
    -
    -This equipment can be purchased from an electronics store such as Radio Shack or from an online vendor. -
    -
    - Each example presents two programs: code for the I/O board and code for Processing. Diagrams and breadboard illustrations for the examples are presented side by side in this tutorial to reinforce the connections between the two representations. Learning to translate a circuit diagram into a physical circuit is one of the most difficult challenges when starting to work with electronics. -
    -
    - The Wiring or Arduino software environment is necessary to program each board. These environments are built on top of the Processing environment, but they have special features for uploading code to the board and monitoring serial communication. Both can be downloaded at no cost from their respective websites and both are available for Linux, Macintosh, and Windows. -
    -
    - The examples that follow assume the I/O board is connected to your computer and serial communication is working. Before working with these examples, get one of the simple Serial library examples included with Processing to work. For the most up-to-date information and troubleshooting tips, read the Serial reference on the Processing website: www.processing.org/reference/libraries. The Wiring and Arduino websites have additional information. -
    -
    -
    -
    -
    -Example 1A: Switch (Wiring/Arduino) -
    -
    - -
    +
  • USB cable (used to send data between board and computer)
  • +
  • 9–15V 1000mA power supply or 9V battery
  • +
  • 22-gauge solid core wire (get different colors)
  • +
  • Breadboard
  • +
  • Switch
  • +
  • Resistors (10K ohm for the switch circuits, 330 ohm for the LEDs, 1K ohm for the photoresistor)
  • +
  • LEDs
  • +
  • Servo motor (Futaba or Hi-Tech)
  • +
  • DC motor (a generic DC motor like the ones in toy cars)
  • +
  • L293D or SN754410 H-Bridge Integrated Circuit
  • +
  • Wire cutters
  • +
  • Wire strippers
  • +
  • Needlenose pliers
  • + + +

    + This equipment can be purchased from an electronics store such as Radio Shack or from an online vendor. +

    + +

    + Each example presents two programs: code for the I/O board and code for Processing. Diagrams and breadboard illustrations for the examples are presented side by side in this tutorial to reinforce the connections between the two representations. Learning to translate a circuit diagram into a physical circuit is one of the most difficult challenges when starting to work with electronics. +

    + +

    + The Wiring or Arduino software environment is necessary to program each board. These environments are built on top of the Processing environment, but they have special features for uploading code to the board and monitoring serial communication. Both can be downloaded at no cost from their respective websites and both are available for Linux, Macintosh, and Windows. +

    + +

    + The examples that follow assume the I/O board is connected to your computer and serial communication is working. Before working with these examples, get one of the simple Serial library examples included with Processing to work. For the most up-to-date information and troubleshooting tips, read the Serial reference on the Processing website: www.processing.org/reference/libraries. The Wiring and Arduino websites have additional information. +

    + +

    + Example 1A: Switch (Wiring/Arduino) +

    + + +
     // Code for sensing a switch status and writing the value to the serial port
     
    -int switchPin = 4;  		       // Switch connected to pin 4 
    +int switchPin = 4;  // Switch connected to pin 4 
      
     void setup() { 
    -  pinMode(switchPin, INPUT);  	       // Set pin 0 as an input 
    -  Serial.begin(9600);         	       // Start serial communication at 9600 bps 
    +  pinMode(switchPin, INPUT);  // Set pin 0 as an input 
    +  Serial.begin(9600);         // Start serial communication at 9600 bps 
     } 
      
     void loop() { 
       if (digitalRead(switchPin) == HIGH) {  // If switch is ON, 
    -    Serial.print(1, BYTE);               // send 1 to Processing
    +    Serial.write(1);                     // send 1 to Processing
       } else {                               // If the switch is not ON,
    -    Serial.print(0, BYTE);               // send 0 to Processing 
    +    Serial.write(0);                     // send 0 to Processing 
       } 
       delay(100);                            // Wait 100 milliseconds 
     } 
     
    -
    -
    -Example 1B: Switch (Processing) + +

    + Example 1B: Switch (Processing) +

    +
     // Read data from the serial port and change the color of a rectangle 
     // when a switch connected to the board is pressed and released
    @@ -377,7 +474,7 @@ 

    Code

    } void draw() { - if (0 < port.available()) { // If data is available, + if (0 < port.available()) { // If data is available, val = port.read(); // read it and store it in val } background(255); // Set background to white @@ -389,14 +486,17 @@

    Code

    rect(50, 50, 100, 100); }
    -
    + +
    -
    -Example 2A: Light sensor (Wiring/Arduino) -
    -
    - -
    + + +

    + Example 2A: Light sensor (Wiring/Arduino) +

    + + +
     // Code to read an analog value and write it to the serial port
     
    @@ -409,13 +509,15 @@ 

    Code

    void loop() { val = analogRead(inputPin)/4; // Read analog input pin, put in range 0 to 255 - Serial.print(val, BYTE); // Send the value + Serial.write(val); // Send the value delay(100); // Wait 100ms for next reading }
    -
    -
    -Example 2B: Light sensor (Processing) + +

    + Example 2B: Light sensor (Processing) +

    +
     // Read data from the serial port and assign it to a variable. Set the fill a 
     // rectangle on the screen using the value read from a light sensor connected 
    @@ -423,34 +525,40 @@ 

    Code

    import processing.serial.*; -Serial port; // Create object from Serial class -int val; // Data received from the serial port +Serial port; // Create object from Serial class +int val; // Data received from the serial port void setup() { size(200, 200); noStroke(); - frameRate(10); // Run 10 frames per second + frameRate(10); // Run 10 frames per second // Open the port that the board is connected to and use the same speed (9600 bps) port = new Serial(this, 9600); } void draw() { - if (0 < port.available()) { // If data is available to read, - val = port.read(); // read it and store it in val + if (0 < port.available()) { // If data is available to read, + val = port.read(); // read it and store it in val } - background(204); // Clear background - fill(val); // Set fill color with the value read - rect(50, 50, 100, 100); // Draw square + background(204); // Clear background + fill(val); // Set fill color with the value read + rect(50, 50, 100, 100); // Draw square } +
    -
    + +
    -
    -Example 3A: Turning a light on and off -
    -
    - -
    + + +

    + Example 3A: Turning a light on and off +

    + + + + +
     // Read data from the serial and turn ON or OFF a light depending on the value
      
    @@ -474,9 +582,11 @@ 

    Code

    delay(100); // Wait 100 milliseconds for next reading }
    -
    -
    -Example 3B: Turning a light on and off (Processing) + +

    + Example 3B: Turning a light on and off (Processing) +

    +
     // Check if the mouse is over a rectangle and write the status to the serial port
     
    @@ -506,28 +616,34 @@ 

    Code

    boolean mouseOverRect() { // Test if mouse is over square - return ((mouseX >= 50) && (mouseX <= 150) && (mouseY >= 50) && (mouseY <= 150)); + return ((mouseX >= 50) && (mouseX <= 150) && (mouseY >= 50) && (mouseY <= 150)); }
    -
    + +
    -
    -Example 4A: Controlling a servomotor(Wiring/Arduino) -
    -
    - -
    + + +

    + Example 4A: Controlling a servomotor(Wiring/Arduino) +

    + + + + +
     // Read data from the serial port and set the position of a servomotor 
     // according to the value
    +#include <Servo.h>
     
     Servo myservo;                   // Create servo object to control a servo
    -int servoPin = 4;                // Connect yellow servo wire to digital I/O pin 4 
    +int servoPin = 3;                // Connect yellow servo wire to digital I/O pin 3 (must be PWM) 
     int val = 0;                     // Data received from the serial port
     
     void setup() {
       myservo.attach(servoPin);      // Attach the servo to the PWM pin
    -  Serial.begin(9600);    	       // Start serial communication at 9600 bps
    +  Serial.begin(9600);    	     // Start serial communication at 9600 bps
     }
     
     void loop() {
    @@ -538,15 +654,18 @@ 

    Code

    delay(15); // Wait for the servo to get there }
    -
    -
    -Example 4B: Controlling a servomotor (Processing) + + +

    + Example 4B: Controlling a servomotor (Processing) +

    +
     // Write data to the serial port according to the mouseX value
     
     import processing.serial.*;
      
    -Serial port;                          // Create object from Serial class
    +Serial port;                      // Create object from Serial class
     float mx = 0.0;
     
     void setup() { 
    @@ -554,12 +673,17 @@ 

    Code

    noStroke(); frameRate(10); // Open the port that the board is connected to and use the same speed (9600 bps) - port = new Serial(this, 9600); + port = new Serial(this, 9600); // Comment this line if it's not the correct port + // If the above does not work uncomment the lines below to choose the correct port + // List all the available serial ports, preceded by their index number: + //printArray(Serial.list()); + // Instead of 0 input the index number of the port you are using: + //port = new Serial(this, Serial.list()[0], 9600); } void draw() { - background(0); // Clear background - fill(204); // Set fill color + background(0); // Clear background + fill(204); // Set fill color rect(40, height/2-15, 120, 25); // Draw square float dif = mouseX - mx; @@ -574,23 +698,28 @@

    Code

    rect(mx-2, height/2-5, 4, 5); // Draw the position marker int angle = int(map(mx, 50, 149, 0, 180)); // Scale the value to the range 0-180 - //print(angle + " "); // Print the current angle (debug) - port.write(angle); // Write the angle to the serial port + //print(angle + " "); // Print the current angle (debug) + port.write(angle); // Write the angle to the serial port }
    -
    + + +
    -
    -Example 5A: Turning a DC Motor on and off (Wiring/Arduino) -
    -
    - -
    -
    + + +

    + Example 5A: Turning a DC Motor on and off (Wiring/Arduino) +

    + + + + +
     // Read data from the serial and turn a DC motor on or off according to the value
     
    -char val;                              // Data received from the serial port
    +char val;             // Data received from the serial port
     int motorpin = 0;     // Wiring: Connect L293D Pin En1 connected to Pin PWM 0          
     // int motorpin = 9;  // Arduino: Connect L293D Pin En1 to Pin PWM 9
      
    @@ -610,9 +739,12 @@ 

    Code

    delay(100); // Wait 100 milliseconds for next reading }
    -
    -
    -Example 5B: Turning a DC motor on and off (Processing) + + +

    + Example 5B: Turning a DC motor on and off (Processing) +

    +
     // Write data to the serial port according to the status of a button controlled 
     // by the mouse 
    @@ -666,18 +798,17 @@ 

    Code

    } boolean overRect(int x, int y, int width, int height) { - if ((mouseX >= x) && (mouseX <= x+width) && - (mouseY >= y) && (mouseY <= y+height)) { + if ((mouseX >= x) && (mouseX <= x+width) && + (mouseY >= y) && (mouseY <= y+height)) { return true; } else { return false; } }
    -

    -
    -
    -
    + + + +
    \ No newline at end of file +
    diff --git a/content/static/tutorials/gettingstarted/imgs/Fig_02_01.gif b/content/static/tutorials/gettingstarted/imgs/Fig_02_01.gif index 5a71f367a..d1db3a524 100644 Binary files a/content/static/tutorials/gettingstarted/imgs/Fig_02_01.gif and b/content/static/tutorials/gettingstarted/imgs/Fig_02_01.gif differ diff --git a/content/static/tutorials/gettingstarted/imgs/Fig_02_01_2x.gif b/content/static/tutorials/gettingstarted/imgs/Fig_02_01_2x.gif new file mode 100644 index 000000000..a583d2cd7 Binary files /dev/null and b/content/static/tutorials/gettingstarted/imgs/Fig_02_01_2x.gif differ diff --git a/content/static/tutorials/gettingstarted/imgs/Menu-SketchPresent.gif b/content/static/tutorials/gettingstarted/imgs/Menu-SketchPresent.gif index 23f05b007..606b7ee13 100644 Binary files a/content/static/tutorials/gettingstarted/imgs/Menu-SketchPresent.gif and b/content/static/tutorials/gettingstarted/imgs/Menu-SketchPresent.gif differ diff --git a/content/static/tutorials/gettingstarted/index.html b/content/static/tutorials/gettingstarted/index.html index f0a88ecd5..2ebe7335b 100644 --- a/content/static/tutorials/gettingstarted/index.html +++ b/content/static/tutorials/gettingstarted/index.html @@ -1,20 +1,15 @@ -

    Getting Started

    - -

    - - +
    -

    This tutorial is for Processing 2+. If you see any errors or have comments, please let us know. This tutorial was adapted from the book, Getting Started with Processing, by Casey Reas and Ben Fry, O’Reilly / Make 2010. Copyright © 2010 Casey Reas and Ben Fry. All rights reserved.

    - -

     

    +

    + This tutorial was adapted from the book, Getting Started with Processing, by Casey Reas and Ben Fry, Maker Media 2015. If you see any errors or have comments, please let us know. +

    -

    Welcome to Processing!

    - -

    Start by visiting http://processing.org/download and - selecting the Mac, Windows, or Linux version, depending on what machine you have. Installation - on each machine is straightforward:

    +

    Getting Started

    +

    Casey Reas and Ben Fry

    + +

    Welcome to Processing! Start by visiting http://processing.org/download and selecting the Mac, Windows, or Linux version, depending on what machine you have. Installation on each machine is straightforward:

    • On Windows, you'll have a .zip file. Double-click it, and drag the folder inside @@ -39,194 +34,96 @@

      Getting Started

      ./processing
    -

    With any luck, the main Processing window will now be visible. -Everyone's setup is different, so if the program didn't start, or you're -otherwise stuck, visit the troubleshooting page for possible solutions.

    - -

     

    +

    With any luck, the main Processing window will now be visible. Everyone's setup is different, so if the program didn't start, or you're otherwise stuck, visit the troubleshooting page for possible solutions.

    + -

    - PDE
    +

    + PDE
    The Processing Development Environment.

    - -

     

    - +

    Your First Program

    -

    You're now running the Processing Development Environment (or PDE). -There's not much to it; the large area is the Text Editor, and there's a row -of buttons across the top; this is the toolbar. Below the editor is the Message -Area, and below that is the Console. The Message Area is used for -one line messages, and the Console is used for more technical details.

    +

    You're now running the Processing Development Environment (or PDE). There's not much to it; the large area is the Text Editor, and there's a row of buttons across the top; this is the toolbar. Below the editor is the Message Area, and below that is the Console. The Message Area is used for one line messages, and the Console is used for more technical details.

    -

    In the editor, type the following:

    +

    In the editor, type the following:

    -

    -

    ellipse(50, 50, 80, 80);
    +

    +

    ellipse(50, 50, 80, 80);

    -

    This line of code means "draw an ellipse, with the center 50 pixels over - from the left and 50 pixels down from the top, with a width and height of - 80 pixels." Click the Run button, which looks like this:

    - -

    Run

    - -

    If you've typed everything correctly, you'll see this appear in the Display Window:

    - -

    +

    This line of code means "draw an ellipse, with the center 50 pixels over from the left and 50 pixels down from the top, with a width and height of 80 pixels." Click the Run button the (triangle button in the Toolbar).

    -

    If -you didn't type it correctly, the Message Area will turn red and complain -about an error. If this happens, make sure that you've copied the example -code exactly: the numbers should be contained within parentheses -and have commas between each of them, and the line should end with a -semicolon.

    +

    If you've typed everything correctly, you'll see a circle on your screen. If you didn't type it correctly, the Message Area will turn red and complain about an error. If this happens, make sure that you've copied the example code exactly: the numbers should be contained within parentheses and have commas between each of them, and the line should end with a semicolon.

    -

    One of the most difficult things about getting started with programming -is that you have to be very specific about the syntax. The Processing -software isn't always smart enough to know what you mean, and can be -quite fussy about the placement of punctuation. You'll get used to it with a -little practice.

    +

    One of the most difficult things about getting started with programming is that you have to be very specific about the syntax. The Processing software isn't always smart enough to know what you mean, and can be quite fussy about the placement of punctuation. You'll get used to it with a little practice.

    -

    Next, we'll skip ahead to a sketch that's a little more exciting. - Delete the text from the last example, and try this:

    +

    Next, we'll skip ahead to a sketch that's a little more exciting. Delete the text from the last example, and try this:

    -

    +

    -

    -void setup() {
    -  size(480, 120);
    +	

    +void setup() {
    +  size(480, 120);
     }
     
    -void draw() {
    -  if (mousePressed) {
    -    fill(0);
    -  } else {
    -    fill(255);
    +void draw() {
    +  if (mousePressed) {
    +    fill(0);
    +  } else {
    +    fill(255);
       }
    -  ellipse(mouseX, mouseY, 80, 80);
    +  ellipse(mouseX, mouseY, 80, 80);
     }
     

    -

    This program creates a window that is 480 pixels wide and 120 pixels -high, and then starts drawing white circles at the position of the mouse. -When a mouse button is pressed, the circle color changes to black. We'll -explain more about the elements of this program in detail later. For now, -run the code, move the mouse, and click to experience it.

    +

    This program creates a window that is 480 pixels wide and 120 pixels high, and then starts drawing white circles at the position of the mouse. When a mouse button is pressed, the circle color changes to black. We'll explain more about the elements of this program in detail later. For now, run the code, move the mouse, and click to see what it does. While the sketch is running, the Run button will change to a square “stop” icon, which you can click to halt the sketch.

    -

    Show

    - -

    So far we've covered only the Run button, though you've probably -guessed what the Stop button next to it does:

    -

    Stop

    -

    If you don't want to use the buttons, you can always use the Sketch menu, -which reveals the shortcut Ctrl-R (or Cmd-R on the Mac) for Run. Below -Run in the Sketch menu is Present, which clears the rest of the screen to -present your sketch all by itself:

    +

    Show

    + +

    If you don’t want to use the buttons, you can always use the Sketch menu, which reveals the shortcut Ctrl-R (or Cmd-R on the Mac) for Run. The Present option clears the rest of the screen when the program is run to present the sketch all by itself. You can also use Present from the Toolbar by holding down the Shift key as you click the Run button.

    -

    - Sketch menu +

    + Sketch Menu

    - -

    You can also use Present from the toolbar by holding down the Shift key -as you click the Run button.

    - -

    Save

    - -

    The next command that's important is Save. It's the downward arrow on -the toolbar:

    -

    Save

    -

    You can also find it under the File menu. By default, your programs are -saved to the "sketchbook," which is a folder that collects your programs -for easy access. Clicking the Open button on the toolbar (the arrow -pointing up) will bring up a list of all the sketches in your sketchbook, as -well as a list of examples that are installed with the Processing software:

    - -

    Open

    - -

    It's always a good idea to save your sketches often. As you try different -things, keep saving with different names, so that you can always go back -to an earlier version. This is especially helpful if — no, when — something -breaks. You can also see where the sketch is located on the disk with -Show Sketch Folder under the Sketch menu.

    +

    Save and New

    + +

    The next command that’s important is Save. You can find it under the File menu. By default, your programs are saved to the "sketchbook," which is a folder that collects your programs for easy access. Select the Sketchbook option in the File menu to bring up a list of all the sketches in your sketchbook.

    -

    You can also create a new sketch by pressing the New button on the -toolbar:

    +

    It’s always a good idea to save your sketches often. As you try different things, keep saving with different names, so that you can always go back to an earlier version. This is especially helpful if—no, when—something breaks. You can also see where the sketch is located on your computer with the Show Sketch Folder command under the Sketch menu.

    -

    New

    +

    You can create a new sketch by selecting the New option from the File menu. This will create a new sketch in its own window

    -

    Share

    - -

    Another theme of Processing is sharing your work. The Export Application button on -the toolbar:

    - -

    Export

    +

    Share

    -

    will bundle your code into an application for your choice of Mac, Windows, or Linux depending on which platform you are using. -This is an easy way to make self-contained, double-clickable versions of your projects. -

    - -

    You can also find Export Application under the File menu.

    +

    Processing sketches are made to be shared. The Export Application option in the File menu will bundle your code into a single folder. Export Application creates an application for your choice of Mac, Windows, and/or Linux. This is an easy way to make self-contained, double-clickable versions of your projects that can run full screen or in a window.

    -

    In addition to exporting your code as applications, you can switch to - a different mode within Processing to export to other platforms. For example, download and - change to JavaScript Mode to export HTML5 Canvas and WebGL. Change to Android - mode to export application for Android phones and tablets. These modes both need to be - added before they can be used. Select "Add Mode..." from the menu that says "Java" in - the upper-right corner of the Processing Development Environment. +

    The application folders are erased and re-created each time you use the Export Application command, so be sure to move the folder elsewhere if you do not want it to be erased with the next export.

    Examples and Reference

    -

    Learning how to program with Processing involves exploring lots of code: -running, altering, breaking, and enhancing it until you have reshaped it -into something new. With this in mind, the Processing software download -includes dozens of examples that demonstrate different features of the -software. To open an example, select Examples from the File menu or -click the Open icon in the PDE. The examples are grouped into categories -based on their function, such as Form, Motion, and Image. Find an interesting -topic in the list and try an example.

    - -

    If you see a part of the program you're unfamiliar with that is colored -orange (this means it's a part of Processing), select its name, and then -click on "Find in Reference" from the Help menu. You can also right-click -the text (or Ctrl-click on a Mac) and choose Find in Reference from the -menu that appears. This will open the reference for the selected code -element in your web browser. -The reference is also available online.

    - -

    The Processing Reference explains every code element with a description -and examples. The reference programs are much shorter (usually four or -five lines) and easier to follow than the longer code found in the Examples -folder. We recommend keeping the reference open while you're reading -this book and while you're programming. It can be navigated by topic -or alphabetically; sometimes it's fastest to do a text search within your -browser window.

    - -

    The reference was written with the beginner in mind; we hope that we've -made it clear and understandable. We're grateful to the many people -who've spotted errors over the years and reported them. If you think you -can improve a reference entry or you find a mistake, please let us know by -clicking on the link at the top of each reference page.

    - - -

     

    - -

    This tutorial is for Processing 2+. If you see any errors or have comments, please let us know. This tutorial was adapted from the book, Getting Started with Processing, by Casey Reas and Ben Fry, O’Reilly / Make 2010. Copyright © 2010 Casey Reas and Ben Fry. All rights reserved.

    +

    Learning how to program involves exploring lots of code: running, altering, breaking, and enhancing it until you have reshaped it into something new. With this in mind, the Processing software download includes dozens of examples that demonstrate different features of the software.

    + +

    To open an example, select Examples from the File menu and double-click an example's name to open it. The examples are grouped into categories based on their function, such as Form, Motion, and Image. Find an interesting topic in the list and try an example.

    + +

    When looking at code in the editor, you'll see that functions like ellipse() and fill() have a different color from the rest of the text. If you see a function that you’re unfamiliar with, select the text, and then click "Find in Reference" from the Help menu. You can also right-click the text (or Ctrl-click on a Mac) and choose "Find in Reference" from the menu that appears. This will open a web browser and show the reference for that function. In addition, you can view the full documentation for the software by selecting Reference from the Help menu.

    + +

    The Processing Reference explains every code element with a description and examples. The Reference programs are much shorter (usually four or five lines) and easier to follow than the longer code found in the Examples folder. We recommend keeping the Reference open while you’re reading this book and while you’re programming. It can be navigated by topic or alphabetically; sometimes it’s fastest to do a text search within your browser window.

    + +

    The Reference was written with the beginner in mind; we hope that we’ve made it clear and understandable. We’re grateful to the many people who’ve spotted errors over the years and reported them. If you think you can improve a reference entry or you find a mistake, please let us know by clicking the link at the top of each reference page

    -

    diff --git a/content/static/tutorials/imgs/debug.png b/content/static/tutorials/imgs/debug.png new file mode 100644 index 000000000..1a9ed7074 Binary files /dev/null and b/content/static/tutorials/imgs/debug.png differ diff --git a/content/static/tutorials/imgs/gettingstarted.gif b/content/static/tutorials/imgs/gettingstarted.gif index 687ef217f..a048770ad 100644 Binary files a/content/static/tutorials/imgs/gettingstarted.gif and b/content/static/tutorials/imgs/gettingstarted.gif differ diff --git a/content/static/tutorials/imgs/p3_overview.png b/content/static/tutorials/imgs/p3_overview.png new file mode 100644 index 000000000..0102b5bb7 Binary files /dev/null and b/content/static/tutorials/imgs/p3_overview.png differ diff --git a/content/static/tutorials/imgs/sound.png b/content/static/tutorials/imgs/sound.png new file mode 100644 index 000000000..cb8786bfb Binary files /dev/null and b/content/static/tutorials/imgs/sound.png differ diff --git a/content/static/tutorials/imgs/video.png b/content/static/tutorials/imgs/video.png new file mode 100644 index 000000000..4a408066c Binary files /dev/null and b/content/static/tutorials/imgs/video.png differ diff --git a/content/static/tutorials/index.html b/content/static/tutorials/index.html index 786b446f1..7434e5bbb 100644 --- a/content/static/tutorials/index.html +++ b/content/static/tutorials/index.html @@ -1,17 +1,51 @@ -

    Tutorials. A collection of step-by-step lessons covering beginner, intermediate, and advanced topics.

    +

    Video Tutorials. Links to videos that cover the Processing basics.

    + +

    Large collections of instructional Processing videos are online from Daniel Shiffman, Andrew Glassner, Jose Sanchez, and Abe Pazos.

    + + + + + + + + + + + + + + +
    - preview image -


    Hello Processing
    + preview image +


    Hello Processing
    by Daniel Shiffman et al.

    -

    Short video lessons introduce coding exercises that lead to designing an interactive drawing program.

    -

    Level: Beginner

    +

    Short video lessons introduce coding exercises that lead to designing an interactive drawing program.

    +
    + preview image +


    Welcome to Processing 3
    + by Daniel Shiffman

    +

    What's new in Processing 3? Dan walks through the new features and changes.

    + preview image +


    Debug
    + by Daniel Shiffman

    +

    Learn how to pause and step through your running code with the Processing 3 Debugger.

    +
       
    + + +

    Text Tutorials. A collection of step-by-step lessons covering beginner, intermediate, and advanced topics.

    + + + + + - - - - + + + + + - - - - + + + + - - - - - + + + + - - - - + + + + - - - - + + + + + + - - + + - + - - + + + + + + + + @@ -195,15 +259,21 @@

    Tutorials. A collection of s preview image


    PVector
    by Daniel Shiffman

    -

    How to use the PVector class in Processing.

    +

    An introduction to useing the PVector class in Processing.

    Level: Advanced

    - -

    - - + + + + + + + - - - - - - - + + + + +

    + Use the mouseX and mouseY variables with an if structure to allow the cursor to select regions of the screen. The following examples demonstrate the cursor making a selection between different areas of the display window. The first divides the screen into halves, and the second divides the screen into thirds. +

    + + +
    preview image


    Getting Started
    @@ -27,10 +61,6 @@

    Tutorials. A collection of s

    A little more detailed introduction to the different features of Processing than the Getting Started tutorial.

    Level: Beginner

    preview image @@ -40,6 +70,11 @@

    Tutorials. A collection of s

    Level: Beginner

    preview image


    Color
    @@ -56,10 +91,6 @@

    Tutorials. A collection of s

    Level: Beginner

    preview image


    Interactivity
    @@ -67,6 +98,10 @@

    Tutorials. A collection of s

    Introduction to interactivity with the mouse and keyboard.

    Level: Beginner

    preview image @@ -84,11 +119,6 @@

    Tutorials. A collection of s

    Level: Intermediate

    preview image


    Arrays
    @@ -96,6 +126,10 @@

    Tutorials. A collection of s

    How to store and access data in array structures.

    Level: Intermediate

    preview image @@ -113,10 +147,6 @@

    Tutorials. A collection of s

    Level: Intermediate

    preview image


    2D Transformations
    @@ -124,6 +154,10 @@

    Tutorials. A collection of s

    Learn how to translate, rotate, and scale shapes using 2D transformations.

    Level: Intermediate

    preview image @@ -140,19 +174,20 @@

    Tutorials. A collection of s by Daniel Shiffman

    Learn the basics of working with data feeds in Processing.

    Level: Intermediate

    -

    preview image -


    Trigonometry Primer I
    +


    Trigonometry Primer
    by Ira Greenberg

    An introduction to trigonometry.

    Level: Intermediate

    preview image


    Render Techniques
    @@ -161,32 +196,61 @@

    Tutorials. A collection of s

    Level: Intermediate

    +
    preview image


    Two-Dimensional Arrays
    by Daniel Shiffman

    -

    How to store data in a matrix using a two-dimensional array.

    +

    Store and acess data in a matrix using a two-dimensional array.

    Level: Intermediate

    + + +
    + preview image +


    Sound
    + by R. Luke DuBois and Wilm Thoben

    +

    Learn how to play, analyze, and synthesize sound with the Sound Library.

    +

    Level: Intermediate

    +
    - preview image -


    P3D
    - by Daniel Shiffman

    -

    Developing advanced graphics applications in Processing using P3D (OpenGL) mode.

    -

    Level: Advanced

    -
    + +
    + preview image +


    Electronics
    + by Hernando Berragán and Casey Reas

    +

    Control physical media with Processing, Arduino, and Wiring.

    +

    Level: Intermediate

    + preview image +


    Network
    + by Alexander R. Galloway

    +

    An introduction to sending and receiving data with clients and servers.

    +

    Level: Intermediate

    +
    + preview image +


    Print
    + by Casey Reas

    +

    Use Processing to output print quality images and documents.

    +

    Level: Intermediate

    +
    preview image


    Shaders
    by Andres Colubri

    -

    How to implement GLSL shaders in Processing using PShader.

    +

    A guide to implementing GLSL shaders in Processing.

    Level: Advanced

    + preview image +


    P3D
    + by Daniel Shiffman

    +

    Developing advanced graphics applications in Processing using P3D (OpenGL) mode.

    +

    Level: Advanced

    +
    +
    - preview image -


    Electronics
    - by Hernando Berragán and Casey Reas

    -

    Control physical media with Processing, Arduino, and Wiring.

    -

    Level: Advanced

    + preview image +


    Video
    + by Daniel Shiffman

    +

    How to display live and recorded video

    +

    Level: Advanced

    - preview image -


    Network
    - by Alexander R. Galloway

    -

    How to communicate with an online network through Processing.

    -

    Level: Advanced

    + +
    +
    + preview image +


    Anatomy of a Program
    + by J David Eisenberg

    +

    How do you analyze a problem and break it down into steps that the computer can do?

    +

    Level: Advanced

    +
    - preview image -


    Print
    - by Casey Reas

    -

    Using Processing to output print quality images and documents.

    +
    +
    +
    + + + + +
    + +
    + +
    +
    +void setup() {
    +  size(100, 100);
    +  noStroke();
    +  fill(0);
    +}
    +
    +void draw() {
    +  background(204);
    +  if (mouseX < 50) {
    +    rect(0, 0, 50, 100); // Left
    +  } else {
    +    rect(50, 0, 50, 100); // Right
    +  }
    +}
    +
    +
    + +
    + + + + + + +
    + +
    + +
    + +
    +
    +void setup() {
    +  size(100, 100);
    +  noStroke();
    +  fill(0);
    +}
    +
    +void draw() {
    +  background(204);
    +  if (mouseX < 33) {
    +    rect(0, 0, 33, 100); // Left
    +  } else if (mouseX < 66) {
    +    rect(33, 0, 33, 100); // Middle
    +  } else {
    +    rect(66, 0, 33, 100); // Right
    +  }
    +}
    +
    +
    + + + + +

    + Use the logical operator && with an if structure to select a rectangular region of the screen. As demonstrated in the following example, when a relational expression is made to test each edge of a rectangle (left, right, top, bottom) and these are concatenated with a logical AND, the entire relational expression is true only when the cursor is inside the rectangle. +

    + + + + + + + +
    + +
    + +
    +
    +void setup() {
    +  size(100, 100);
    +  noStroke();
    +  fill(0);
    +}
    +
    +void draw() {
    +  background(204);
    +  if ((mouseX > 40) && (mouseX < 80) &&
    +    (mouseY > 20) && (mouseY < 80)) {
    +    fill(255);
    +  } else {
    +    fill(0);
    +  }
    +  rect(40, 20, 40, 60);
    +}
    +
    +
    + + + +

    + This code asks, “Is the cursor to the right of the left edge and is the cursor to the left of the right edge and is the cursor beyond the top edge and is the cursor above the bottom?” The code for the next example asks a set of similar questions and combines them with the keyword else to determine which one of the defined areas contains the cursor. +

    + + + + + + + +
    + +
    + +
    + +
    +
    +void setup() {
    +  size(100, 100);
    +  noStroke();
    +  fill(0);
    +}
    +
    +void draw() {
    +  background(204);
    +  if ((mouseX <= 50) && (mouseY <= 50)) {
    +    rect(0, 0, 50, 50); // Upper-left
    +  } else if ((mouseX <= 50) && (mouseY > 50)) {
    +    rect(0, 50, 50, 50); // Lower-left
    +  } else if ((mouseX > 50) && (mouseY <= 50)) {
    +    rect(50, 0, 50, 50); // Upper-right
    +  } else {
    +    rect(50, 50, 50, 50); // Lower-right
    +  }
    +}
    +
    +
    + + + + + +

    Mouse buttons

    + + +

    + Computer mice and other related input devices typically have between one and three buttons; Processing can detect when these buttons are pressed with the mousePressed and mouseButton variables. Used with the button status, the cursor position enables the mouse to perform different actions. For example, a button press when the mouse is over an icon can select it, so the icon can be moved to a different location on screen. The mousePressed variable is true if any mouse button is pressed and false if no mouse button is pressed. The variable mouseButton is LEFT, CENTER, or RIGHT depending on the mouse button most recently pressed. The mousePressed variable reverts to false as soon as the button is released, but the mouseButton variable retains its value until a different button is pressed. These variables can be used independently or in combination to control the software. Run these programs to see how the software responds to your fingers. +

    + + + + + + + +
    + +
    + +
    +
    +void setup() {
    +  size(100, 100);
    +} 
    +
    +void draw() {
    +  background(204);
    +  if (mousePressed == true) {
    +    fill(255); // White
    +  } else {
    +    fill(0); // Black
    +  }
    +  rect(25, 25, 50, 50);
    +}
    +
    +
    + +
    + + + + + + +
    + +
    + +
    + +
    +
    +void setup() {
    +  size(100, 100);
    +}
    +
    +void draw() { 
    +  if (mouseButton == LEFT) {
    +    fill(0); // Black
    +  } else if (mouseButton == RIGHT) {
    +    fill(255); // White
    +  } else { 
    +    fill(126); // Gray
    +  }
    +  rect(25, 25, 50, 50);
    +}
    +
    +
    + +
    + + + + + + +
    + +
    + +
    + +
    +
    +void setup() {
    +  size(100, 100);
    +} 
    +
    +void draw() {
    +  if (mousePressed == true) {
    +    if (mouseButton == LEFT) {
    +      fill(0); // Black
    +    } else if (mouseButton == RIGHT) { 
    +      fill(255); // White
    +    }
    +  } else {
    +    fill(126); // Gray
    +  }
    +  rect(25, 25, 50, 50);
    +}
    +
    +
    + + + + +

    + Not all mice have multiple buttons, and if software is distributed widely, the interaction should not rely on detecting which button is pressed. +

    + + + +

    Keyboard data

    + +

    + Processing registers the most recently pressed key and whether a key is currently pressed. The boolean variable keyPressed is true if a key is pressed and is false if not. Include this variable in the test of an if structure to allow lines of code to run only if a key is pressed. The keyPressed variable remains true while the key is held down and becomes false only when the key is released. +

    + + + + + + + +
    + +
    + +
    +
    +void setup() {
    +  size(100, 100);
    +  strokeWeight(4);
    +}
    +
    +void draw() {
    +  background(204);
    +  if (keyPressed == true) { // If the key is pressed,
    +    line(20, 20, 80, 80); // draw a line
    +  } else { // Otherwise,
    +    rect(40, 40, 20, 20); // draw a rectangle
    +  }
    +}
    +
    +
    + +
    + + + + + + +
    + +
    + +
    +
    +int x = 20;
    +void setup() {
    +  size(100, 100);
    +  strokeWeight(4);
    +} 
    +
    +void draw() {
    +  background(204);
    +  if (keyPressed == true) { // If the key is pressed
    +    x++; // add 1 to x
    +  } 
    +  line(x, 20, x-60, 80);
    +}
    +
    +
    + + + + + +

    + The key variable stores a single alphanumeric character. Specifically, it holds the most recently pressed key. The key can be displayed on screen with the text() function (p. 150). +

    + + + + + + +
    + +
    + +
    +
    +void setup() {
    +  size(100, 100);
    +  textSize(60);
    +}
    +
    +void draw() {
    +  background(0);
    +  text(key, 20, 75); // Draw at coordinate (20,75)
    +}
    +
    +
    + + + + + +

    + The key variable may be used to determine whether a specific key is pressed. The following example uses the expression key=='A' to test if the A key is pressed. The single quotes signify A as the data type char (p. 144). The expression key=="A" will cause an error because the double quotes signify the A as a String, and it’s not possible to compare a String with a char. The logical AND symbol, the && operator, is used to connect the expression with the keyPressed variable to ascertain that the key pressed is the uppercase A. +

    + + + + + + + +
    + +
    + +
    +
    +void setup() {
    +  size(100, 100);
    +  strokeWeight(4);
    +}
    +
    +void draw() {
    +  background(204);
    +  // If the 'A' key is pressed draw a line
    +  if ((keyPressed == true) && (key == 'A')) {
    +    line(50, 25, 50, 75);
    +  } else { // Otherwise, draw an ellipse
    +    ellipse(50, 50, 50, 50);
    +  }
    +}
    +
    +
    + + + + +

    + The previous example works with an uppercase A, but not if the lowercase letter is pressed. To check for both uppercase and lowercase letters, extend the relational expression with a logical OR, the || relational operator. Line 9 in the previous program would be changed to: +

    + +
    +if ((keyPressed == true) && ((key == 'a') || (key == 'A'))) {
    +
    + +

    + Because each character has a numeric value as defined by the ASCII table (p. 605), the value of the key variable can be used like any other number to control visual attributes such as the position and color of shape elements. For instance, the ASCII table defines the uppercase A as the number 65, and the digit 1 is defined as 49. +

    + + + + + + + +
    + +
    + +
    +
    +void setup() {
    +  size(100, 100);
    +  stroke(0);
    +}
    +
    +void draw() {
    +  if (keyPressed == true) {
    +    int x = key - 32;
    +    line(x, 0, x, height);
    +  }
    +}
    +
    +
    + +
    + + + + + - + +
    + +
    + +
    +
    +float angle = 0;
    +
    +void setup() {
    +  size(100, 100);
    +  fill(0);
    +} 
     
     void draw() {
       background(204);
    -  // If the 'A' key is pressed draw a line
    -  if ((keyPressed == true) && (key == 'A')) {
    -    line(50, 25, 50, 75);
    -  } else { // Otherwise, draw an ellipse
    -    ellipse(50, 50, 50, 50);
    +  if (keyPressed == true) {
    +    if ((key >= 32) && (key <= 126)) {
    +      // If the key is alphanumeric, // use its value as an angle
    +      angle = (key - 32) * 3;
    +    }
       }
    +  arc(50, 50, 66, 66, 0, radians(angle));
     }
     
    -
    -

    -The previous example works with an uppercase A, but not if the lowercase letter is pressed. To check for both uppercase and lowercase letters, extend the relational expression with a logical OR, the || relational operator. Line 9 in the previous program would be changed to -
    -
    -

    -if ((keyPressed == true) && ((key == 'a') || (key == 'A'))) {
    -
    -Because each character has a numeric value as defined by the ASCII table (p. 605), the value of the key variable can be used like any other number to control visual attributes such as the position and color of shape elements. For instance, the ASCII table defines the uppercase A as the number 65, and the digit 1 is defined as 49. -

    + + + + + +

    Coded keys

    + +

    + In addition to reading key values for numbers, letters, and symbols, Processing can also read the values from other keys including the arrow keys and the Alt, Control, Shift, Backspace, Tab, Enter, Return, Escape, and Delete keys. The variable keyCode stores the ALT, CONTROL, SHIFT, UP, DOWN, LEFT, and RIGHT keys as constants. Before determining which coded key is pressed, it’s necessary to check first to see if the key is coded. The expression key==CODED is true if the key is coded and false otherwise. Even though not alphanumeric, the keys included in the ASCII specification (BACKSPACE, TAB, ENTER, RETURN, ESC, and DELETE) will not be identified as a coded key. If you’re making cross-platform projects, note that the Enter key is commonly used on PCs and UNIX and the Return key is used on Macintosh. Check for both Enter and Return to make sure your program will work for all platforms (see code 12-17). +

    + + + + + + + +
    + +
    + +
    + +
    +
    +int y = 35;
    +
    +void setup() {
    +  size(100, 100);
    +}
    +
    +void draw() {
    +  background(204);
    +  line(10, 50, 90, 50);
    +  if (key == CODED) { 
    +    if (keyCode == UP) {
    +      y = 20;
    +    } else if (keyCode == DOWN) {
    +      y = 50;
    +    }
    +  } else {
    +    y = 35;
    +  }
    +  rect(25, y, 50, 30);
    +}
    +
    +
    + + + + + + +

    Events

    + +

    + A category of functions called events alter the normal flow of a program when an action such as a key press or mouse movement takes place. An event is a polite interruption of the normal flow of a program. Key presses and mouse movements are stored until the end of draw(), where they can take action that won’t disturb drawing that’s currently in progress. The code inside an event function is run once each time the corresponding event occurs. For example, if a mouse button is pressed, the code inside the mousePressed() function will run once and will not run again until the button is pressed again. This allows data produced by the mouse and keyboard to be read independently from what is happening in the rest of the program. +

    + + +

    Mouse events

    + +

    + The mouse event functions are mousePressed(), mouseReleased(), mouseMoved(), and mouseDragged(): +

    + + + + + + + + + + + + + + + + + + +
    + mousePressed() + + Code inside this block is run one time when a mouse button is pressed +
    + mouseReleased() + + Code inside this block is run one time when a mouse button is released +
    + mouseMoved() + + Code inside this block is run one time when the mouse is moved +
    + mouseDragged() + + Code inside this block is run one time when the mouse is moved while a mouse button is pressed +
    + + + +

    + The mousePressed() function works differently than the mousePressed variable. The value of the mousePressed variable is true until the mouse button is released. It can therefore be used within draw() to have a line of code run while the mouse is pressed. In contrast, the code inside the mousePressed() function only runs once when a button is pressed. This makes it useful when a mouse click is used to trigger an action, such as clearing the screen. In the following example, the background value becomes lighter each time a mouse button is pressed. Run the example on your computer to see the change in response to your finger. +

    + + + + + + + +
    + +
    + +
    +
    +int gray = 0;
    +
    +void setup() {
    +  size(100, 100);
    +}
    +
    +void draw() {
    +  background(gray);
    +} 
    +
    +void mousePressed() {
    +  gray += 20;
    +}
    +
    +
    + + + + +

    + The following example is the same as the one above, but the gray variable is set in the mouseReleased() event function, which is called once every time a button is released. This difference can be seen only by running the program and clicking the mouse button. Keep the mouse button pressed for a long time and notice that the background value changes only when the button is released. +

    + + + + + + + +
    + +
    + +
    +
    +int gray = 0;
    +
    +void setup() {
    +  size(100, 100);
    +}
    +
    +void draw() {
    +  background(gray);
    +} 
    +
    +void mouseReleased() {
    +  gray += 20;
    +}
    +
    +
    + + + + +

    + It is generally not a good idea to draw inside an event function, but it can be done under certain conditions. Before drawing inside these functions, it’s important to think about the flow of the program. In this example, squares are drawn inside mousePressed() and they remain on screen because there is no background() inside draw(). But if background() is used, visual elements drawn within one of the mouse event functions will appear on screen for only a single frame, or, by default, 1/60th of a second. In fact, you’ll notice this example has nothing at all inside draw(), but it needs to be there to force Processing to keep listening for the events. If a background() function were run inside draw(), the rectangles would flash onto the screen and disappear. +

    + + + + + + + +
    + +
    + +
    +
    +void setup() {
    +  size(100, 100);
    +  fill(0, 102);
    +} 
    +
    +void draw() {
    +} // Empty draw() keeps the program running
    +
    +void mousePressed() {
    +  rect(mouseX, mouseY, 33, 33);
    +}
    +
    +
    + + + + +

    + The code inside the mouseMoved() and mouseDragged() event functions are run when there is a change in the mouse position. The code in the mouseMoved() block is run at the end of each frame when the mouse moves and no button is pressed. The code in the mouseDragged() block does the same when the mouse button is pressed. If the mouse stays in the same position from frame to frame, the code inside these functions does not run. In this example, the gray circle follows the mouse when the button is not pressed, and the black circle follows the mouse when a mouse button is pressed. +

    + + + + + + +
    + +
    + +
    + +
    +
    +int dragX, dragY, moveX, moveY;
    +
    +void setup() {
    +  size(100, 100);
    +  noStroke();
    +}
    +
    +void draw() {
    +  background(204);
    +  fill(0); 
    +  ellipse(dragX, dragY, 33, 33); // Black circle
    +  fill(153);
    +  ellipse(moveX, moveY, 33, 33); // Gray circle
    +}
    +
    +void mouseMoved() { // Move gray circle
    +  moveX = mouseX;
    +  moveY = mouseY;
    +}
    +
    +void mouseDragged() { // Move black circle
    +  dragX = mouseX;
    +  dragY = mouseY;
    +}
    +
    +
    + + + + + +

    Key events

    + +

    + Each key press is registered through the keyboard event functions keyPressed() and keyReleased(): +

    + + + + + + + + + + +
    + keyPressed() + + Code inside this block is run one time when any key is pressed +
    + keyReleased() + + Code inside this block is run one time when any key is released +
    + + + +

    + Each time a key is pressed, the code inside the keyPressed() block is run once. Within this block, it’s possible to test which key has been pressed and to use this value for any purpose. If a key is held down for an extended time, the code inside the keyPressed() block might run many times in a rapid succession because most operating systems will take over and repeatedly call the keyPressed() function. The amount of time it takes to start repeating and the rate of repetitions will be different from computer to computer, depending on the keyboard preference settings. In this example, the value of the boolean variable drawT is set from false to true when the T key is pressed; this causes the lines of code to render the rectangles in draw() to start running. +

    + + + + + + + +
    + +
    + +
    +
    +boolean drawT = false;
    +
    +void setup() {
    +  size(100, 100);
    +  noStroke();
    +} 
    +
    +void draw() {
    +  background(204);
    +  if (drawT == true) {
    +    rect(20, 20, 60, 20);
    +    rect(39, 40, 22, 45);
    +  }
    +}
    +
    +void keyPressed() {
    +  if ((key == 'T') || (key == 't')) {
    +    drawT = true;
    +  }
    +}
    +
    +
    + + + +

    + Each time a key is released, the code inside the keyReleased() block is run once. The following example builds on the previous code; each time the key is released the boolean variable drawT is set back to false to stop the shape from displaying within draw(). +

    + + + + + + +
    + +
    + +
    + +
    +
    +boolean drawT = false;
    +
    +void setup() {
    +  size(100, 100);
    +  noStroke();
    +} 
    +
    +void draw() {
    +  background(204);
    +  if (drawT == true) { 
    +    rect(20, 20, 60, 20);
    +    rect(39, 40, 22, 45);
    +  }
    +}
    +
    +void keyPressed() {
    +  if ((key == 'T') || (key == 't')) {
    +    drawT = true;
    +  }
    +}
    +
    +void keyReleased() {
    +  drawT = false;
    +}
    +
    +
    + + + + + +

    Event flow

    +

    + As discussed previously, programs written with draw() display frames to the screen sixty frames each second. The frameRate() function is used to set a limit on the number of frames that will display each second, and the noLoop() function can be used to stop draw() from looping. The additional functions loop() and redraw() provide more options when used in combination with the mouse and keyboard event functions. If a program has been paused with noLoop(), running loop() resumes its action. Because the event functions are the only elements that continue to run when a program is paused with noLoop(), the loop() function can be used within these events to continue running the code in draw(). The following example runs the draw() function for about two seconds each time a mouse button is pressed and then pauses the program after that time has elapsed. +

    +

     int frame = 0;
     
    @@ -1090,9 +1860,10 @@ 

    Event flow

    }
    -The redraw() function runs the code in draw() one time and then halts the execution. It’s helpful when the display needn’t be updated continuously. The following example runs the code in draw() once each time a mouse button is pressed. -

    -
    +

    + The redraw() function runs the code in draw() one time and then halts the execution. It’s helpful when the display needn’t be updated continuously. The following example runs the code in draw() once each time a mouse button is pressed. +

    +
     void setup() {
       size(100, 100);
    @@ -1109,11 +1880,15 @@ 

    Event flow

    redraw(); // Run the code in draw one time }
    -

    -

    Cursor icon

    -The cursor can be hidden with the noCursor() function and can be set to appear as a different icon or image with the cursor() function. When the noCursor() function is run, the cursor icon disappears as it moves into the display window. To give feedback about the location of the cursor within the software, a custom cursor can be drawn and controlled with the mouseX and mouseY variables. -
    -
    + + + +

    Cursor icon

    + +

    + The cursor can be hidden with the noCursor() function and can be set to appear as a different icon or image with the cursor() function. When the noCursor() function is run, the cursor icon disappears as it moves into the display window. To give feedback about the location of the cursor within the software, a custom cursor can be drawn and controlled with the mouseX and mouseY variables. +

    +
     void setup() {
       size(100, 100);
    @@ -1126,9 +1901,11 @@ 

    Cursor icon

    ellipse(mouseX, mouseY, 10, 10); }
    -If noCursor() is run, the cursor will be hidden while the program is running until the cursor() function is run to reveal it. -
    -
    + +

    + If noCursor() is run, the cursor will be hidden while the program is running until the cursor() function is run to reveal it. +

    +
     void setup() {
       size(100, 100);
    @@ -1142,9 +1919,10 @@ 

    Cursor icon

    } }
    -Add a parameter to the cursor() function to change it to another icon or image. Either load and use image, or use the self-descriptive options are ARROW, CROSS, HAND, MOVE, TEXT, and WAIT. -
    -
    + +

    + Add a parameter to the cursor() function to change it to another icon or image. Either load and use image, or use the self-descriptive options are ARROW, CROSS, HAND, MOVE, TEXT, and WAIT. +

     void setup() {
    @@ -1159,12 +1937,13 @@ 

    Cursor icon

    cursor(CROSS); } line(mouseX, 0, mouseX, height); - line(0, mouseY, height, mouseY); + line(0, mouseY, width, mouseY); }
    -These cursor icons are part of your computer’s operating system and will appear different on different machines. -

    -
    -

    \ No newline at end of file + +

    + These cursor icons are part of your computer’s operating system and will appear different on different machines. +

    + + + diff --git a/content/static/tutorials/network/index.html b/content/static/tutorials/network/index.html index 8e87af64d..03bd0c8d7 100644 --- a/content/static/tutorials/network/index.html +++ b/content/static/tutorials/network/index.html @@ -1,319 +1,351 @@ -

    Network

    -

    By Alexander R. Galloway

    + + +
    - +

    + This tutorial is “Extension 2” from Processing: A Programming Handbook for Visual Designers and Artists, Second Edition, published by MIT Press. © 2014 MIT Press. If you see any errors or have comments, please let us know. +

    - - +
    - -
    -

    This tutorial is Extension 3 from the second edition of Processing: A Programming Handbook for Visual Designers and Artists, published by MIT Press. Copyright 2013 MIT Press. This tutorial is for Processing version 2.0+. If you see any errors or have comments, please let us know.

    -
    -
    -

    -Networks are complex organizational forms. They bring into association discrete entities or nodes, allowing these nodes to connect to other nodes and indeed to other networks. Networks exist in the world in a vast variety of forms and in even more contexts: political, social, biological, and otherwise. While artists have used networks in many ways–from postal networks used to disseminate work, to informal networks of artistic collaborators and larger aesthetic movements–this section looks specifically at a single instance of network technology, the Internet, and how artists have incorporated this technology into their work. There are two general trends: art-making where the Internet is used as a tool for quick and easy dissemination of the work, and art–making where the Internet is the actual medium of the work. These two trends are not mutually exclusive, however. Some of the most interesting online work weaves the two techniques together into exciting new forms that surpass the affordances of either technique. -

    -
    -

    -

    The Internet and the arts

    -“In December 1995, Vuk Cosic got a message . . .” or so begins the tale of how “net.art,” the niche art movement concerned with making art in and of the Internet, got its start and its name. As Alexei Shulgin explains in a posting to the Nettime email list two years later, Cosic, a Slovenian artist, received an email posted from an anonymous mailer. Apparently mangled in transit, the message was barely legible. “The only fragment of it that made any sense looked something like: […] J8~g#|\;Net. Art{-^s1 […].” -
    -
    - Anonymous, accidental, glitchy, and slightly apocryphal–these are all distinctive characteristics of the net.art style, as seen in web-based work from Cosic, Shulgin, Olia Lialina, Jodi, Heath Bunting, and many others. As Marina Grzinic writes, the “delays in transmission–time, busy signals from service providers, [and] crashing web browsers” contributed greatly to the way artists envisioned the aesthetic potential of the web, a tendency that ran counter to the prevailing wisdom at the time of dot–com go, go, go. Indeed many unsuspecting users assume that Jodi’s web-based and downloadable software projects have as their primary goal the immediate infection and ruin of one’s personal computer. (Upon greater scrutiny, it must be granted that this is only a secondary goal.) Perhaps peaking in 1998 with the absurd, anarchist experiments shoveled out on the 7–11 email list–spoofs and shenanigans were par for the course due to the fact that the list administration tool, including subscriptions, header and footer variables, and moderation rules, was world read-writable by any web surfer—the net.art movement is today viewable in captivity in such catchall publications as the hundred–contributor–strong anthology Readme!, edited in several cities simultaneously and published by Autonomedia in 1999; the equally ecumenical anthology NTNTNT that emerged from CalArts in 2003; or Tilman Baumgärtel’s two volumes of interviews, net.art (1999) and net.art 2.0 (2001). -
    -
    - At the same time, buoyed by the dynamism of programming environments like Java and Flash, artists and designers began making online work that not only was “in and of” the Internet, but leveraged the net as a tool for quick and easy dissemination of executable code, both browser-based and otherwise. John Maeda created a number of sketches and games dating from the mid–1990s, including a series of interactive calendars using visual motifs borrowed from both nature and mathematics. Joshua Davis also emerged as an important figure through his online works Praystation and Once–Upon–A–Forest. Like Maeda, Davis fused algorithmic drawing techniques with an organic sense of composition. -
    -
    - It is worth recalling the profound sense of optimism and liberation that the web brought to art and culture in the mid–1990s. All of a sudden, tattooed skaters like Davis were being shuttled around the globe to speak to bespectacled venture capitalists about the possibilities of networking, generative code, and open software projects. And bespectacled philosophers like Geert Lovink were being shuttled around the globe to speak to tattooed skaters about–what else—the possibilities of networking, generative code, and open software projects. Everything was topsy–turvy. Even the net.art movement, which was in part influenced by Lovink’s suspicion of all things “wired” and Californian, was nonetheless propelled by the utopian promise of networks, no matter that sometimes those networks had to be slashed and hacked in the process. Networks have, for several decades, acted as tonics for and inoculations against all things centralized and authoritarian, be they Paul Baran’s 1964 schematics for routing around both the AT&T/Bell national telephone network and the then-impending sorties of Soviet ICBMs; or the grassroots networks of the 1960s new social movements, which would later gain the status of art in Deleuze and Guattari’s emblematic literary concept of the “rhizome,” quite literally a grassroots model of networked being; or indeed the much earlier and oft–cited remarks from Bertolt Brecht on the early revolutionary potential of radio networks (reprised, famously, in Hans Magnus Enzensberger’s 1974 essay on new media, “Constituents for a Theory of the Media”). In other words, the arrival of the web in the middle to late 1990s generated much excitement in both art and culture, for it seemed like a harbinger for the coming of some new and quite possibly revolutionary mode of social interaction. Or, as Cosic said once, with typical bravado, “all art to now has been merely a substitute for the Internet.” -
    -
    - It is also helpful to contextualize these remarks through reference to the different software practices of various artists and movements. Each software environment is a distinct medium. Each grants particular aesthetic affordances to the artist and diminishes others. Each comes with a number of side effects that may be accentuated or avoided, given the proclivities of the artist. So, while acknowledging that digital artists’ tools and materials tend to vary widely, it is perhaps helpful to observe that the net.art scene (Bunting, Shulgin, Lialina, Jodi, et al.), particularly during the period 1995–2000, coded primarily in browser–based markup languages such as HTML, with the addition of Javascript for the execution of basic algorithms. A stripped-down, “text only” format was distinctive of this period. One gag used by a number of different artists was not to have a proper homepage at all, but instead to use Apache’s default directory index of files and folders. The stripped-down approach did not always deliver simplicity to the user, however, as in the case of Jodi’s early homepage (now archived at http://wwwwwwwww.jodi.org) in which they neglected a crucial pre tag and then, in an apparent attempt to overcompensate for the first glitch, encircled the page in a blink tag that was no less prickly on the eyes than the missing pre tag is disorienting. The blinking page throbbed obscenely in the browser window, one glitch thus compounding the other. Created as an unauthorized addition to HTML by Netscape Navigator, the blink tag essentially vanished from the Internet as Internet Explorer became more dominant in the late 1990s. Today, the Jodi page doesn’t blink. One wonders which exactly is the work: the op-art strobe effect that appeared in the Netscape browser window during the years when people used Netscape, or the HTML source still online today in which the work is “explained” to any sleuth willing to trace the narrative of markup tags missing and misplaced? -
    -
    - While artists had used fixed–width ASCII fonts and ANSI characters as design elements long before the popularization of the web in the mid-1990s, it was the creation of HTML in 1993 (synchronized with its use in the newly invented web servers and web browsers like Netscape) that transformed the Internet into a space for the visual arts. HTML established itself quickly as the most influential mark–up language and graphic design protocol for two reasons: first, the text-only nature of HTML made it low–bandwidth–friendly during a time when most users connected via modems and phone lines; and second, HTML is a protocol, meaning that it acts as a common denominator (the blink tag notwithstanding) bridging a wide variety of dissimilar technical platforms. But, as seen in the work of Davis, which gravitates toward Flash but also includes web, print, and video, one must not overemphasize HTML as an aesthetic medium. During this same period, the network delivery of executable code (Java applets, Flash, Shockwave, and so on) also became more and more exciting as a medium for art–making, as did CUSeeMe, web radio, video, and other streaming content that operates outside of the normal bounds of the browser frame. John Simon’s 1997 Every Icon was written as a Java applet and therefore easily deliverable online as executable code. In what Lev Manovich has dubbed “Generation Flash,” a whole new community sprang up, involving artists like Yugo Nakamura, Matt Owens, and James Paterson and intersecting with both dot–com startups like i|o 360° and Razorfish (or the artist’s own design shops) and indie youth culture. Their medium is not solely the text-only markup codes of HTML but also the more sophisticated Macromedia languages (ActionScript and Lingo) as well as Javascript, Java, and server-side languages like Perl and PHP. -

    -
    -
    -

    -

    Internet protocols and concepts

    -In order to understand how online works are made and viewed, it will be useful to address a number of key concepts in the area of computer networking. A computer network consists of two or more machines connected via a data link. If a networked computer acts primarily as a source of data, it is called a server. A server typically has a fixed address, is online continuously, and functions as a repository for files which are transmitted back to any other computers on the network that request them. If a networked computer acts primarily as a solicitor of information, it is called a client. For example, in checking one’s email, one acts as a client. Likewise, the machine where the email is stored (the machine named after the @ sign in the email address) acts as a server. These terms are flexible; a machine may act as a server in one context and a client in another. -
    -
    - Any machine connected to the Internet, be it client or server, is obligated to have an address. On the Internet, these addresses are called IP addresses and come in the form 123.45.67.89. (A new addressing standard is currently being rolled out that makes the addresses slightly longer.) Since IP addresses change from time to time and are difficult to remember, a system of natural–language shortcuts called the Domain Name System (DNS) allows IP addresses to be substituted by domain names such as “processing.org” or “google.com.” In a web address the word immediately preceding the domain name is the host name; for web servers it is customary to name the host machine “www” after the World Wide Web. But this is only customary. In fact, a web server’s host name can be most anything at all. -
    -
    - One of the main ways in which visual artists have used the Internet in their work is to conceive of the network as one giant database, an input stream that may be spidered, scanned, and parsed using automated clients. This is an artistic methodology that acknowledges the fundamental mutability of data (what programmers call “casting” a variable from one data type to another) and uses various data sources as input streams to power animations, to populate arrays of numbers with pseudo–random values, to track behavior, or quite simply for “content.” Lisa Jevbratt’s work 1:1 does this through the premise that every IP address might be represented by a single pixel. Her work scans the IP address namespace, number by number, pinging each address to determine whether a machine is online at that location. The results are visualized as pixels in a gigantic bitmap that, quite literally, represents the entire Internet (or at least all those machines with fixed IP addresses). In a very different way, Mark Napier’s two works Shredder and Digital Landfill rely on a seemingly endless influx of online data, rearranging and overlaying source material in ways unintended by the original creators. Works like Carnivore (more on this below) and Minitasking approach the network itself as a data source, the former tapping into real-time web traffic, and the latter tapping into real–time traffic on the Gnutella peer–to–peer network. Earlier works such as >I/O/D 4 (known as “The Webstalker”), or Jodi’s Wrongbrowser series of alternative web browsers also illustrate this approach, that the network itself is the art. All of these works automate the process of grabbing data from the Internet and manipulating it in some way. One of the most common types is a web client, a piece of software that automates the process of requesting and receiving remote files on the World Wide Web. -
    -
    -Example 1: Web client -
    -Processing’s Net library includes ready–made classes for both servers and clients. In order to fetch a page from the web, first one creates a client and connects to the address of the remote server. Using a simple call–and–response technique, the client requests the file and the file is returned by the server. This call–and-response is defined by a protocol called Hypertext Transfer Protocol (HTTP). HTTP consists of a handful of simple commands that are used to describe the state of the server and client, to request files, and to post data back to the server if necessary. The most basic HTTP command is GET. This command is similar to filling out a book request form in a library: the client requests a file by name, the server “gets” that file, and returns it to the client. HTTP also includes a number of response codes to indicate that the file was found successfully, or to indicate if any errors were encountered (for example, if the requested file doesn’t exist). The command GET/HTTP/1.0\n means that the client is requesting the default file in the root web directory (/) and that the client is able to communicate using HTTP version 1.0. The trailing \n is the newline character, or roughly equivalent to hitting the return key. If the default file exists, the server transmits it back to the client. -
    -
    -While most computers have only a single Ethernet port (or wireless connection), the entire connectivity of each machine is able to sustain more connections than a single input or output, because the concept of a port is abstracted into software and the functionality of the port is thus duplicated many times over. In this way, each networked computer is able to multitask its single network connection across scores of different connections (there are 1,024 well-known ports, and 65,535 ports in all). Thus ports allow a networked computer to communicate simultaneously on a large number of “channels” without blocking other channels or impeding the data flow of applications. For example, it is possible to read email and surf the web simultaneously because email arrives through one port while websites use another. The union of IP address and port number (example: 123.45.67.89:80) is called a socket. Socket connections are the bread and butter of networking. -
    -
    -Example 2: Shared drawing canvas -
    -Using the Processing Net library, it is possible to create a simple server. The example shows a server that shares a drawing canvas between two computers. In order to open a socket connection, a server must select a port on which to listen for incoming clients and through which to communicate. Although any port number may be used, it is best practice to avoid using port numbers already assigned to other network applications and protocols. Once the socket is established, a client may connect to the server and send or receive commands and data. -
    -
    - Paired with this server, the Processing Client class is instantiated by specifying a remote address and port number to which the socket connection should be made. Once the connection is made, the client may read (or write) data to the server. Because clients and servers are two sides of the same coin, the code examples are nearly identical for both. For this example, current and previous mouse coordinates are sent between client and server several times per second. -
    -
    -Example 3: Carnivore Client -
    -If a lower–level examination of the flows of data networks is desired, the Carnivore library for Processing allows the programmer to run a packet sniffer from within the Processing environment. A packet sniffer is any application that is able to indiscriminately eavesdrop on data traffic traveling through a local area network (LAN), even traffic not addressed to the machine running the sniffer. While this might sound unorthodox, and indeed a machine running a sniffer is described as being in “promiscuous mode,” packet-sniffing technologies are as ubiquitous as the Internet itself and just as old. Systems administrators use packet sniffers to troubleshoot networking bugs. All Macintosh machines ship with the packet sniffer tcpdump preinstalled, while Windows and Linux users have an assortment of free sniffers (including tcpdump and its variants) to choose from. The Carnivore library for Processing merely simplifies the act of sniffing packets, making real-time traffic monitoring simple and easy to implement for any artist wishing to do so. Packets captured via Carnivore can be visualized in map form, parsed for keywords, or simply used for any type of algorithm that requires a steady stream of nonrandom event triggers. -
    -
    -Carnivore is a good stepping stone into the final area of computer networking discussed here: the Internet protocols. A protocol is a technological standard. The Internet protocols are a series of documents that describe how to implement standard Internet technologies such as data routing, handshaking between two machines, network addressing, and many other technologies. Two protocols have already been discussed–HTML, which is the language protocol for hypertext layout and design; and HTTP, which is the protocol for accessing web-accessible files—but there are a few other protocols worth discussing in this context. -
    -
    - Protocols are abstract concepts, but they are also quite material and manifest themselves in the form of structured data headers that prepend and encapsulate all content traveling through the Internet. For example, in order for a typical HTML page to travel from server to client, the page is prepended by an HTTP header (a few lines of text similar to the GET command referenced previously). This glob of data is itself prepended by two additional headers, first a Transmission Control Protocol (TCP) header and next by an Internet Protocol (IP) header. Upon arrival at its destination, the message is unwrapped: the IP header is removed, followed by the TCP header, and finally the HTTP header is removed to reveal the original HTML page. All of this is done in the blink of an eye. All headers contain useful information about the packet. But perhaps the four most useful pieces of information are the sender IP address, receiver IP address, sender port, and receiver port. These four pieces are significant because they indicate the network addresses of the machines in question, plus, via a reverse lookup of the port numbers, the type of data being transferred (port 80 indicating web data, port 23 indicating a Telnet connection, and so on). See the /etc/services file on any Macintosh, Linux, or UNIX machine, or browse IANA’s registry for a complete listing of port numbers. The addresses are contained in the IP header from byte 12 to byte 29 (counting from 0), while the ports are contained in bytes zero through three of the TCP header. -
    -
    - The two elements of the socket connection (IP address and port) are separated into two different protocols because of the different nature of IP and TCP. The IP protocol is concerned with routing data from one place to another and hence requires having an IP address in order to route correctly but cares little about the type of data in its payload. TCP is concerned with establishing a virtual circuit between server and client and thus requires slightly more information about the type of Internet communication being attempted. IP and TCP work so closely together that they are often described in one breath as the “TCP/IP suite.” -
    -
    - While most data on the Internet relies on the TCP/IP suite to get around, certain forms of networked communication are better suited to the UDP/IP combination. User Datagram Protocol (UDP) has a much leaner implementation than TCP, and while it therefore sacrifices many of the features of TCP, it is nevertheless useful for stateless data connections and connections that require a high throughput of packets per second, such as online games. -

    -
    -
    -

    -

    Network tools

    -There are a number of existing network tools that a programmer may use beyond the Processing environment. Carnivore and tcpdump, two different types of packet sniffers that allow one to receive LAN packets in real time, have already been mentioned. The process of scanning networks for available hosts, called network discovery, is also possible using port scanner tools such as Nmap. These tools use a variety of methods for looping through a numerical set of IP addresses (example: 192.168.1.x where x is incremented from 0 to 255), testing to see if a machine responds at that address. Then, if a machine is known to be online, the port scanner is used to loop through a range of ports on the machine (example: 192.168.1.1:x where x is a port number incremented from 1 to 1024) in order to determine which ports are open, thereby determining which application services are available. Port scans can also be used to obtain “fingerprints” for remote machines, which aid in the identification of the machine’s current operating system, type, and version information for known application services. +

    Network

    +

    Alexander R. Galloway

    -

    - - Perhaps the most significant advance in popular networking since the emergence of the web in the mid-1990s was the development of peer-to-peer systems like Gnutella or BitTorrent. Coming on the heels of Napster, Gnutella fully distributed the process of file sharing and transfer, but also fully distributed the network’s search algorithm, a detail that had created bottlenecks (not to mention legal liabilities) for the more centralized Napster. With a distributed search algorithm, search queries hopscotch from node to node, just like the “hot potato” method used in IP routing; they do not pass through any centralized server. The Gnutella protocol has been implemented in dozens of peer-to-peer applications. -
    -
    - Yet more recently Gnutella has been superseded by systems like BitTorrent, a peer–to–peer application that allows file transfers to happen simultaneously between large numbers of users. BitTorrent has gained wide popularity for its increased efficiencies, particularly for transfers of large files such as video and software. -
    -
    - Many software projects requiring networked audio have come to rely on the Open Sound Control (OSC) protocol. OSC is a protocol for communication between multimedia devices such as computers and synthesizers. OSC has been integrated into SuperCollider and Max/MSP and has been ported to most modern languages including Perl and Java. Andreas Schlegel’s “oscP5” is an OSC extension library for Processing. -
    -
    - The Internet has become more peer-oriented in other ways too, not simply through file sharing but also through friend communities and other kinds of social interaction. Web 2.0 platforms like Facebook, Twitter, or YouTube allow groups of people to network with each other, whether it be a small group of five or ten, or a larger group of several thousands. While the more traditional client-server model relied on a clear distinction between information providers and information consumers, newer systems have disrupted some of the old hierarchies, allowing networked users to act as both producers and consumers of content. Such systems thus rely heavily on user-generated content and expect a higher amount of participation and interaction from their user base. -

    -
    -
    +

    + Networks are complex organizational forms. They bring into association discrete entities or nodes, allowing these nodes to connect to other nodes and indeed to other networks. Networks exist in the world in a vast variety of forms and in even more contexts: political, social, biological, and otherwise. While artists have used networks in many ways–from postal networks used to disseminate work, to informal networks of artistic collaborators and larger aesthetic movements–this section looks specifically at a single instance of network technology, the Internet, and how artists have incorporated this technology into their work. There are two general trends: art-making where the Internet is used as a tool for quick and easy dissemination of the work, and art–making where the Internet is the actual medium of the work. These two trends are not mutually exclusive, however. Some of the most interesting online work weaves the two techniques together into exciting new forms that surpass the affordances of either technique. +

    + -

    Conclusion

    -

    -Programmers are often required to consider interconnections between webs of objects and events. Because of this, programming for networks is a natural extension of programming for a single machine. Classes send messages to other classes just like hosts send messages to other hosts. An object has an interface, and so does an Ethernet adapter. The algorithmic construction of entities in dialogue–pixels, bits, frames, nodes–is central to what Processing is all about. Networking these entities by moving some of them to one machine and some to another is but a small additional step. What is required, however, is a knowledge of the various standards and techniques at play when bona fide networking takes place. -
    -
    - Historically, there have been two basic strands of networked art: art where the network is used as the actual medium of art–making, or art where the network is used as the transportation medium for dissemination of the work. The former might be understood as art of the Internet, while the latter as art for the Internet. The goal of this text has been to introduce some of the basic conditions, both technological and aesthetic, for making networked art, in the hopes that entirely new techniques and approaches will spring forth in the future as both strands blend together into exciting new forms. -
    -
    -Notes -
    -1. Alexei Shulgin, “Net.Art – the origin,” Nettime mailing list archives, 18 March 1997, http://nettime.org/Lists-Archives/nettime-l-9703/msg00094.html. -
    -2. Marina Grzinic, “Exposure Time, the Aura, and Telerobotics,” in The Robot in the Garden: Telerobotics and Telepistemology in the Age of the Internet, edited by Ken Goldberg (MIT Press, 2000), p. TC. -

    -
    -
    -

    -

    Code

    -
    -
    -Example 1: Web client -
    -// A simple web client using HTTP + +

    The Internet and the arts

    + +

    + “In December 1995, Vuk Cosic got a message . . .” or so begins the tale of how “net.art,” the niche art movement concerned with making art in and of the Internet, got its start and its name. As Alexei Shulgin explains in a posting to the Nettime email list two years later, Cosic, a Slovenian artist, received an email posted from an anonymous mailer. Apparently mangled in transit, the message was barely legible. “The only fragment of it that made any sense looked something like: […] J8~g#|\;Net. Art{-^s1 […].”1 +

    + +

    + Anonymous, accidental, glitchy, and slightly apocryphal–these are all distinctive characteristics of the net.art style, as seen in web-based work from Cosic, Shulgin, Olia Lialina, Jodi, Heath Bunting, and many others. As Marina Grzinic writes, the “delays in transmission–time, busy signals from service providers, [and] crashing web browsers” contributed greatly to the way artists envisioned the aesthetic potential of the web, a tendency that ran counter to the prevailing wisdom at the time of dot–com go, go, go.2 Indeed many unsuspecting users assume that Jodi’s web-based and downloadable software projects have as their primary goal the immediate infection and ruin of one’s personal computer. (Upon greater scrutiny, it must be granted that this is only a secondary goal.) Perhaps peaking in 1998 with the absurd, anarchist experiments shoveled out on the 7–11 email list–spoofs and shenanigans were par for the course due to the fact that the list administration tool, including subscriptions, header and footer variables, and moderation rules, was world read-writable by any web surfer—the net.art movement is today viewable in captivity in such catchall publications as the hundred–contributor–strong anthology Readme!, edited in several cities simultaneously and published by Autonomedia in 1999; the equally ecumenical anthology NTNTNT that emerged from CalArts in 2003; or Tilman Baumgärtel’s two volumes of interviews, net.art (1999) and net.art 2.0 (2001). +

    + + +

    + At the same time, buoyed by the dynamism of programming environments like Java and Flash, artists and designers began making online work that not only was “in and of” the Internet, but leveraged the net as a tool for quick and easy dissemination of executable code, both browser-based and otherwise. John Maeda created a number of sketches and games dating from the mid–1990s, including a series of interactive calendars using visual motifs borrowed from both nature and mathematics. Joshua Davis also emerged as an important figure through his online works Praystation and Once–Upon–A–Forest. Like Maeda, Davis fused algorithmic drawing techniques with an organic sense of composition. +

    + +

    + It is worth recalling the profound sense of optimism and liberation that the web brought to art and culture in the mid–1990s. All of a sudden, tattooed skaters like Davis were being shuttled around the globe to speak to bespectacled venture capitalists about the possibilities of networking, generative code, and open software projects. And bespectacled philosophers like Geert Lovink were being shuttled around the globe to speak to tattooed skaters about–what else—the possibilities of networking, generative code, and open software projects. Everything was topsy–turvy. Even the net.art movement, which was in part influenced by Lovink’s suspicion of all things “wired” and Californian, was nonetheless propelled by the utopian promise of networks, no matter that sometimes those networks had to be slashed and hacked in the process. Networks have, for several decades, acted as tonics for and inoculations against all things centralized and authoritarian, be they Paul Baran’s 1964 schematics for routing around both the AT&T/Bell national telephone network and the then-impending sorties of Soviet ICBMs; or the grassroots networks of the 1960s new social movements, which would later gain the status of art in Deleuze and Guattari’s emblematic literary concept of the “rhizome,” quite literally a grassroots model of networked being; or indeed the much earlier and oft–cited remarks from Bertolt Brecht on the early revolutionary potential of radio networks (reprised, famously, in Hans Magnus Enzensberger’s 1974 essay on new media, “Constituents for a Theory of the Media”). In other words, the arrival of the web in the middle to late 1990s generated much excitement in both art and culture, for it seemed like a harbinger for the coming of some new and quite possibly revolutionary mode of social interaction. Or, as Cosic said once, with typical bravado, “all art to now has been merely a substitute for the Internet.” +

    + +

    + It is also helpful to contextualize these remarks through reference to the different software practices of various artists and movements. Each software environment is a distinct medium. Each grants particular aesthetic affordances to the artist and diminishes others. Each comes with a number of side effects that may be accentuated or avoided, given the proclivities of the artist. So, while acknowledging that digital artists’ tools and materials tend to vary widely, it is perhaps helpful to observe that the net.art scene (Bunting, Shulgin, Lialina, Jodi, et al.), particularly during the period 1995–2000, coded primarily in browser–based markup languages such as HTML, with the addition of Javascript for the execution of basic algorithms. A stripped-down, “text only” format was distinctive of this period. One gag used by a number of different artists was not to have a proper homepage at all, but instead to use Apache’s default directory index of files and folders. The stripped-down approach did not always deliver simplicity to the user, however, as in the case of Jodi’s early homepage (now archived at http://wwwwwwwww.jodi.org) in which they neglected a crucial pre tag and then, in an apparent attempt to overcompensate for the first glitch, encircled the page in a blink tag that was no less prickly on the eyes than the missing pre tag is disorienting. The blinking page throbbed obscenely in the browser window, one glitch thus compounding the other. Created as an unauthorized addition to HTML by Netscape Navigator, the blink tag essentially vanished from the Internet as Internet Explorer became more dominant in the late 1990s. Today, the Jodi page doesn’t blink. One wonders which exactly is the work: the op-art strobe effect that appeared in the Netscape browser window during the years when people used Netscape, or the HTML source still online today in which the work is “explained” to any sleuth willing to trace the narrative of markup tags missing and misplaced? +

    + +

    + While artists had used fixed–width ASCII fonts and ANSI characters as design elements long before the popularization of the web in the mid-1990s, it was the creation of HTML in 1993 (synchronized with its use in the newly invented web servers and web browsers like Netscape) that transformed the Internet into a space for the visual arts. HTML established itself quickly as the most influential mark–up language and graphic design protocol for two reasons: first, the text-only nature of HTML made it low–bandwidth–friendly during a time when most users connected via modems and phone lines; and second, HTML is a protocol, meaning that it acts as a common denominator (the blink tag notwithstanding) bridging a wide variety of dissimilar technical platforms. But, as seen in the work of Davis, which gravitates toward Flash but also includes web, print, and video, one must not overemphasize HTML as an aesthetic medium. During this same period, the network delivery of executable code (Java applets, Flash, Shockwave, and so on) also became more and more exciting as a medium for art–making, as did CUSeeMe, web radio, video, and other streaming content that operates outside of the normal bounds of the browser frame. John Simon’s 1997 Every Icon was written as a Java applet and therefore easily deliverable online as executable code. In what Lev Manovich has dubbed “Generation Flash,” a whole new community sprang up, involving artists like Yugo Nakamura, Matt Owens, and James Paterson and intersecting with both dot–com startups like i|o 360° and Razorfish (or the artist’s own design shops) and indie youth culture. Their medium is not solely the text-only markup codes of HTML but also the more sophisticated Macromedia languages (ActionScript and Lingo) as well as Javascript, Java, and server-side languages like Perl and PHP. +

    + + + +

    Internet concepts

    + +

    + In order to understand how online works are made and viewed, it will be useful to address a number of key concepts in the area of computer networking. A computer network consists of two or more machines connected via a data link. If a networked computer acts primarily as a source of data, it is called a server. A server typically has a fixed address, is online continuously, and functions as a repository for files which are transmitted back to any other computers on the network that request them. If a networked computer acts primarily as a solicitor of information, it is called a client. For example, in checking one’s email, one acts as a client. Likewise, the machine where the email is stored (the machine named after the @ sign in the email address) acts as a server. These terms are flexible; a machine may act as a server in one context and a client in another. +

    + +

    + Any machine connected to the Internet, be it client or server, is obligated to have an address. On the Internet, these addresses are called IP addresses and come in the form 123.45.67.89. (A new addressing standard is currently being rolled out that makes the addresses slightly longer.) Since IP addresses change from time to time and are difficult to remember, a system of natural–language shortcuts called the Domain Name System (DNS) allows IP addresses to be substituted by domain names such as “processing.org” or “google.com.” In a web address the word immediately preceding the domain name is the host name; for web servers it is customary to name the host machine “www” after the World Wide Web. But this is only customary. In fact, a web server’s host name can be most anything at all. +

    + +

    + One of the main ways in which visual artists have used the Internet in their work is to conceive of the network as one giant database, an input stream that may be spidered, scanned, and parsed using automated clients. This is an artistic methodology that acknowledges the fundamental mutability of data (what programmers call “casting” a variable from one data type to another) and uses various data sources as input streams to power animations, to populate arrays of numbers with pseudo–random values, to track behavior, or quite simply for “content.” Lisa Jevbratt’s work 1:1 does this through the premise that every IP address might be represented by a single pixel. Her work scans the IP address namespace, number by number, pinging each address to determine whether a machine is online at that location. The results are visualized as pixels in a gigantic bitmap that, quite literally, represents the entire Internet (or at least all those machines with fixed IP addresses). In a very different way, Mark Napier’s two works Shredder and Digital Landfill rely on a seemingly endless influx of online data, rearranging and overlaying source material in ways unintended by the original creators. Works like Carnivore (more on this below) and Minitasking approach the network itself as a data source, the former tapping into real-time web traffic, and the latter tapping into real–time traffic on the Gnutella peer–to–peer network. Earlier works such as >I/O/D 4 (known as “The Webstalker”), or Jodi’s Wrongbrowser series of alternative web browsers also illustrate this approach, that the network itself is the art. All of these works automate the process of grabbing data from the Internet and manipulating it in some way. One of the most common types is a web client, a piece of software that automates the process of requesting and receiving remote files on the World Wide Web. +

    + + + + +

    Example 1: Web client

    + +

    + Processing’s Net library includes ready–made classes for both servers and clients. In order to fetch a page from the web, first one creates a client and connects to the address of the remote server. Using a simple call–and–response technique, the client requests the file and the file is returned by the server. This call–and-response is defined by a protocol called Hypertext Transfer Protocol (HTTP). HTTP consists of a handful of simple commands that are used to describe the state of the server and client, to request files, and to post data back to the server if necessary. The most basic HTTP command is GET. This command is similar to filling out a book request form in a library: the client requests a file by name, the server “gets” that file, and returns it to the client. HTTP also includes a number of response codes to indicate that the file was found successfully, or to indicate if any errors were encountered (for example, if the requested file doesn’t exist). The command GET/HTTP/1.0\n means that the client is requesting the default file in the root web directory (/) and that the client is able to communicate using HTTP version 1.0. The trailing \n is the newline character, or roughly equivalent to hitting the return key. If the default file exists, the server transmits it back to the client. +

    + +

    + While most computers have only a single Ethernet port (or wireless connection), the entire connectivity of each machine is able to sustain more connections than a single input or output, because the concept of a port is abstracted into software and the functionality of the port is thus duplicated many times over. In this way, each networked computer is able to multitask its single network connection across scores of different connections (there are 1,024 well-known ports, and 65,535 ports in all). Thus ports allow a networked computer to communicate simultaneously on a large number of “channels” without blocking other channels or impeding the data flow of applications. For example, it is possible to read email and surf the web simultaneously because email arrives through one port while websites use another. The union of IP address and port number (example: 123.45.67.89:80) is called a socket. Socket connections are the bread and butter of networking. +

    -import processing.net.*; 
    -
    -Client c; 
    -String data;
    -
    -void setup() { 
    -  size(200, 200); 
    -  background(50); 
    -  fill(200);
    -  c = new Client(this, "www.processing.org", 80);  // Connect to server on port 80 
    -  c.write("GET / HTTP/1.0\n");  // Use the HTTP "GET" command to ask for a webpage
    -  c.write("Host: my_domain_name.com\n\n"); // Be polite and say who we are
    -} 
    -
    -void draw() {
    -  if (c.available() > 0) {    // If there's incoming data from the client...
    -    data += c.readString();   // ...then grab it and print it 
    -    println(data); 
    -  } 
    +// 1: A simple web client using HTTP
    +
    +import processing.net.*; 
    +
    +Client c; 
    +String data;
    +
    +void setup() { 
    +  size(200, 200); 
    +  background(50); 
    +  fill(200);
    +  c = new Client(this, "www.ucla.edu", 80);  // Connect to server on port 80 
    +  c.write("GET / HTTP/1.0\n");  // Use the HTTP "GET" command to ask for a webpage
    +  c.write("Host: www.ucla.edu\n\n"); // Tell the server for which domain you are making the request
    +} 
    +
    +void draw() {
    +  if (c.available() > 0) {    // If there's incoming data from the client...
    +    data += c.readString();   // ...then grab it and print it 
    +    println(data); 
    +  } 
     }
     
    -
    -
    -Example 2A: Shared drawing canvas (server) -
    -
    import processing.net.*;
    -
    -Server s; 
    -Client c;
    -String input;
    -int data[];
    -
    -void setup() { 
    -  size(450, 255);
    -  background(204);
    -  stroke(0);
    -  frameRate(5); // Slow it down a little
    -  s = new Server(this, 12345);  // Start a simple server on a port
    -} 
    -void draw() { 
    -  if (mousePressed == true) {
    -    // Draw our line
    -    stroke(255);
    -    line(pmouseX, pmouseY, mouseX, mouseY); 
    -    // Send mouse coords to other person
    -    s.write(pmouseX + " " + pmouseY + " " + mouseX + " " + mouseY + "\n");
    -  }
    -  
    -  // Receive data from client
    -  c = s.available();
    -  if (c != null) {
    -    input = c.readString(); 
    -    input = input.substring(0, input.indexOf("\n"));  // Only up to the newline
    -    data = int(split(input, ' '));  // Split values into an array
    -    // Draw line using received coords
    -    stroke(0);
    -    line(data[0], data[1], data[2], data[3]); 
    -  }
    -} 
    -
    -Example 2B: Shared drawing canvas (client) - -
    import processing.net.*; 
    -Client c; 
    -String input;
    -int data[]; 
    -
    -void setup() { 
    -  size(450, 255); 
    -  background(204);
    -  stroke(0);
    -  frameRate(5); // Slow it down a little
    -  // Connect to the server’s IP address and port­
    -  c = new Client(this, "127.0.0.1", 12345); // Replace with your server’s IP and port
    -} 
    -
    -void draw() {         
    -  if (mousePressed == true) {
    -    // Draw our line
    -    stroke(255);
    -    line(pmouseX, pmouseY, mouseX, mouseY); 
    -    // Send mouse coords to other person
    -    c.write(pmouseX + " " + pmouseY + " " + mouseX + " " + mouseY + "\n");
    -  }
    -
    -  // Receive data from server
    -  if (c.available() > 0) { 
    -    input = c.readString(); 
    -    input = input.substring(0,input.indexOf("\n"));  // Only up to the newline
    -    data = int(split(input, ' '));  // Split values into an array
    -    // Draw line using received coords
    -    stroke(0);
    -    line(data[0], data[1], data[2], data[3]); 
    -  } 
    -}
    +

    Example 2: Shared drawing canvas

    + +

    + Using the Processing Net library, it is possible to create a simple server. The example shows a server that shares a drawing canvas between two computers. In order to open a socket connection, a server must select a port on which to listen for incoming clients and through which to communicate. Although any port number may be used, it is best practice to avoid using port numbers already assigned to other network applications and protocols. Once the socket is established, a client may connect to the server and send or receive commands and data. +

    + +

    + Paired with this server, the Processing Client class is instantiated by specifying a remote address and port number to which the socket connection should be made. Once the connection is made, the client may read (or write) data to the server. Because clients and servers are two sides of the same coin, the code examples are nearly identical for both. For this example, current and previous mouse coordinates are sent between client and server several times per second. +

    + + +
    +// 2A: Shared drawing canvas (Server)
    +
    +import processing.net.*;
    +
    +Server s; 
    +Client c;
    +String input;
    +int data[];
    +
    +void setup() { 
    +  size(450, 255);
    +  background(204);
    +  stroke(0);
    +  frameRate(5); // Slow it down a little
    +  s = new Server(this, 12345);  // Start a simple server on a port
    +} 
    +void draw() { 
    +  if (mousePressed == true) {
    +    // Draw our line
    +    stroke(255);
    +    line(pmouseX, pmouseY, mouseX, mouseY); 
    +    // Send mouse coords to other person
    +    s.write(pmouseX + " " + pmouseY + " " + mouseX + " " + mouseY + "\n");
    +  }
    +  
    +  // Receive data from client
    +  c = s.available();
    +  if (c != null) {
    +    input = c.readString(); 
    +    input = input.substring(0, input.indexOf("\n"));  // Only up to the newline
    +    data = int(split(input, ' '));  // Split values into an array
    +    // Draw line using received coords
    +    stroke(0);
    +    line(data[0], data[1], data[2], data[3]); 
    +  }
    +}
    +

    -
    -Example 3: Carnivore client +
    +
    +// 2B: Shared drawing canvas (Client)
    +
    +import processing.net.*; 
    +
    +Client c; 
    +String input;
    +int data[]; 
    +
    +void setup() { 
    +  size(450, 255); 
    +  background(204);
    +  stroke(0);
    +  frameRate(5); // Slow it down a little
    +  // Connect to the server’s IP address and port­
    +  c = new Client(this, "127.0.0.1", 12345); // Replace with your server’s IP and port
    +} 
    +
    +void draw() {         
    +  if (mousePressed == true) {
    +    // Draw our line
    +    stroke(255);
    +    line(pmouseX, pmouseY, mouseX, mouseY); 
    +    // Send mouse coords to other person
    +    c.write(pmouseX + " " + pmouseY + " " + mouseX + " " + mouseY + "\n");
    +  }
    +
    +  // Receive data from server
    +  if (c.available() > 0) { 
    +    input = c.readString(); 
    +    input = input.substring(0,input.indexOf("\n"));  // Only up to the newline
    +    data = int(split(input, ' '));  // Split values into an array
    +    // Draw line using received coords
    +    stroke(0);
    +    line(data[0], data[1], data[2], data[3]); 
    +  } 
    +}
    +
    + + +

    Example 3: Carnivore Client

    + +

    + If a lower–level examination of the flows of data networks is desired, the Carnivore library for Processing allows the programmer to run a packet sniffer from within the Processing environment. A packet sniffer is any application that is able to indiscriminately eavesdrop on data traffic traveling through a local area network (LAN), even traffic not addressed to the machine running the sniffer. While this might sound unorthodox, and indeed a machine running a sniffer is described as being in “promiscuous mode,” packet-sniffing technologies are as ubiquitous as the Internet itself and just as old. Systems administrators use packet sniffers to troubleshoot networking bugs. All Macintosh machines ship with the packet sniffer tcpdump preinstalled, while Windows and Linux users have an assortment of free sniffers (including tcpdump and its variants) to choose from. The Carnivore library for Processing merely simplifies the act of sniffing packets, making real-time traffic monitoring easy to implement for any artist wishing to do so. Packets captured via Carnivore can be visualized in map form, parsed for keywords, or simply used for any type of algorithm that requires a steady stream of nonrandom event triggers. +

    -// Note: requires Carnivore Library for Processing v4 (http://r-s-g.org/carnivore)
    -// Windows, first install winpcap (http://winpcap.org)
    -// Mac, first open a Terminal and execute this commmand: sudo chmod 777 /dev/bpf*
    -// (must be done each time you reboot your Mac)
    -
    -import java.util.Iterator;
    -import org.rsg.carnivore.*;
    -import org.rsg.carnivore.net.*;
    -import org.rsg.lib.Log;
    -
    -HashMap nodes = new HashMap();
    -float startDiameter = 100.0;
    -float shrinkSpeed = 0.97;
    -int splitter, x, y;
    -CarnivoreP5 c;
    -PFont font12;
    -
    -void setup(){
    -  size(800, 600);
    -  ellipseMode(CENTER);
    -
    -  Log.setDebug(true); // Uncomment this for verbose mode
    -  c = new CarnivoreP5(this);
    -  //c.setVolumeLimit(4);
    -  
    -  // Use the "Create Font" tool to add a 12-point font to your sketch,
    -  // then use its name as the parameter to loadFont().
    -  font12 = loadFont("CourierNew-12.vlw");
    -  textFont(font12, 12); 
    +/**
    + * 3: Carnivore Client
    + *  
    + * This example requires the Carnivore Library for Processing (http://r-s-g.org/carnivore)
    + * On Windows, first install winpcap (http://winpcap.org)
    + * On Mac OS X, first open a Terminal and execute this commmand: sudo chmod 777 /dev/bpf*
    + * (This must be done each time you reboot your Mac)
    + */
    +
    +import java.util.Iterator;
    +import org.rsg.carnivore.*;
    +import org.rsg.carnivore.net.*;
    +import org.rsg.lib.Log;
    +
    +HashMap nodes = new HashMap();
    +float startDiameter = 100.0;
    +float shrinkSpeed = 0.97;
    +int splitter, x, y;
    +CarnivoreP5 c;
    +
    +void setup(){
    +  size(800, 600);
    +  ellipseMode(CENTER);
    +
    +  Log.setDebug(true); // Uncomment this for verbose mode
    +  c = new CarnivoreP5(this);
    +  //c.setVolumeLimit(4);
     }
     
    -void draw() {
    -  background(255);
    -  drawNodes();
    +void draw() {
    +  background(255);
    +  drawNodes();
     }
     
    -// Iterate through each node
    -synchronized void drawNodes() {
    -  Iterator it = nodes.keySet().iterator();
    -  while (it.hasNext()){
    -    String ip = (String)it.next();
    -    float d = float(nodes.get(ip).toString());
    -
    -    // Use last two IP address bytes for x/y coords
    -
    -    String ip_as_array[] = split(ip, '.');
    -    x = int(ip_as_array[2]) * width / 255; // Scale to applet size
    -    y = int(ip_as_array[3]) * height / 255; // Scale to applet size
    -    
    -    // Draw the node
    -    stroke(0);
    -    fill(color(100, 200));  // Rim
    -    ellipse(x, y, d, d);    // Node circle
    -    noStroke();
    -    fill(color(100, 50));   // Halo
    -    ellipse(x, y, d + 20, d + 20);
    -    
    -    // Draw the text
    -    fill(0);
    -    text(ip, x, y);
    -    
    -    // Shrink the nodes a little
    -    if(d > 50) {
    -        nodes.put(ip, str(d * shrinkSpeed));
    -    }
    -  }  
    +// Iterate through each node
    +synchronized void drawNodes() {
    +  Iterator it = nodes.keySet().iterator();
    +  while (it.hasNext()){
    +    String ip = (String)it.next();
    +    float d = float(nodes.get(ip).toString());
    +
    +    // Use last two IP address bytes for x/y coords
    +
    +    String ip_as_array[] = split(ip, '.');
    +    x = int(ip_as_array[2]) * width / 255; // Scale to applet size
    +    y = int(ip_as_array[3]) * height / 255; // Scale to applet size
    +    
    +    // Draw the node
    +    stroke(0);
    +    fill(color(100, 200));  // Rim
    +    ellipse(x, y, d, d);    // Node circle
    +    noStroke();
    +    fill(color(100, 50));   // Halo
    +    ellipse(x, y, d + 20, d + 20);
    +    
    +    // Draw the text
    +    fill(0);
    +    text(ip, x, y);
    +    
    +    // Shrink the nodes a little
    +    if(d > 50) {
    +        nodes.put(ip, str(d * shrinkSpeed));
    +    }
    +  }  
     }
     
    -// Called each time a new packet arrives
    -synchronized void packetEvent(CarnivorePacket packet){
    -  println("[PDE] packetEvent: " + packet);
    +// Called each time a new packet arrives
    +synchronized void packetEvent(CarnivorePacket packet){
    +  println("[PDE] packetEvent: " + packet);
     
    -  // Remember these nodes in our hash map
    -  nodes.put(packet.receiverAddress.toString(), str(startDiameter));
    -  nodes.put(packet.senderAddress.toString(), str(startDiameter));
    +  // Remember these nodes in our hash map
    +  nodes.put(packet.receiverAddress.toString(), str(startDiameter));
    +  nodes.put(packet.senderAddress.toString(), str(startDiameter));
     }
     
    -

    -
    -
    -
    + +

    Internet protocols

    + +

    + Carnivore is a good stepping stone into the final area of computer networking discussed here: the Internet protocols. A protocol is a technological standard. The Internet protocols are a series of documents that describe how to implement standard Internet technologies such as data routing, handshaking between two machines, network addressing, and many other technologies. Two protocols have already been discussed–HTML, which is the language protocol for hypertext layout and design; and HTTP, which is the protocol for accessing web-accessible files—but there are a few other protocols worth discussing in this context. +

    + +

    + Protocols are abstract concepts, but they are also quite material and manifest themselves in the form of structured data headers that prepend and encapsulate all content traveling through the Internet. For example, in order for a typical HTML page to travel from server to client, the page is prepended by an HTTP header (a few lines of text similar to the GET command referenced previously). This glob of data is itself prepended by two additional headers, first a Transmission Control Protocol (TCP) header and next by an Internet Protocol (IP) header. Upon arrival at its destination, the message is unwrapped: the IP header is removed, followed by the TCP header, and finally the HTTP header is removed to reveal the original HTML page. All of this is done in the blink of an eye. All headers contain useful information about the packet. But perhaps the four most useful pieces of information are the sender IP address, receiver IP address, sender port, and receiver port. These four pieces are significant because they indicate the network addresses of the machines in question, plus, via a reverse lookup of the port numbers, the type of data being transferred (port 80 indicating web data, port 23 indicating a Telnet connection, and so on). See the /etc/services file on any Macintosh, Linux, or UNIX machine, or browse IANA’s registry for a complete listing of port numbers. The addresses are contained in the IP header from byte 12 to byte 29 (counting from 0), while the ports are contained in bytes zero through three of the TCP header. +

    + +

    + The two elements of the socket connection (IP address and port) are separated into two different protocols because of the different nature of IP and TCP. The IP protocol is concerned with routing data from one place to another and hence requires having an IP address in order to route correctly but cares little about the type of data in its payload. TCP is concerned with establishing a virtual circuit between server and client and thus requires slightly more information about the type of Internet communication being attempted. IP and TCP work so closely together that they are often described in one breath as the “TCP/IP suite.” +

    + +

    + While most data on the Internet relies on the TCP/IP suite to get around, certain forms of networked communication are better suited to the UDP/IP combination. User Datagram Protocol (UDP) has a much leaner implementation than TCP, and while it therefore sacrifices many of the features of TCP, it is nevertheless useful for stateless data connections and connections that require a high throughput of packets per second, such as online games. +

    + + + +

    Network tools

    + + +

    + There are a number of existing network tools that a programmer may use beyond the Processing environment. Carnivore and tcpdump, two different types of packet sniffers that allow one to receive LAN packets in real time, have already been mentioned. The process of scanning networks for available hosts, called network discovery, is also possible using port scanner tools such as Nmap. These tools use a variety of methods for looping through a numerical set of IP addresses (example: 192.168.1.x where x is incremented from 0 to 255), testing to see if a machine responds at that address. Then, if a machine is known to be online, the port scanner is used to loop through a range of ports on the machine (example: 192.168.1.1:x where x is a port number incremented from 1 to 1024) in order to determine which ports are open, thereby determining which application services are available. Port scans can also be used to obtain “fingerprints” for remote machines, which aid in the identification of the machine’s current operating system, type, and version information for known application services. +

    + +

    + Perhaps the most significant advance in popular networking since the emergence of the web in the mid-1990s was the development of peer-to-peer systems like Gnutella or BitTorrent. Coming on the heels of Napster, Gnutella fully distributed the process of file sharing and transfer, but also fully distributed the network’s search algorithm, a detail that had created bottlenecks (not to mention legal liabilities) for the more centralized Napster. With a distributed search algorithm, search queries hopscotch from node to node, just like the “hot potato” method used in IP routing; they do not pass through any centralized server. The Gnutella protocol has been implemented in dozens of peer-to-peer applications. +

    + +

    + Yet more recently Gnutella has been superseded by systems like BitTorrent, a peer–to–peer application that allows file transfers to happen simultaneously between large numbers of users. BitTorrent has gained wide popularity for its increased efficiencies, particularly for transfers of large files such as video and software. +

    + +

    + Many software projects requiring networked audio have come to rely on the Open Sound Control (OSC) protocol. OSC is a protocol for communication between multimedia devices such as computers and synthesizers. OSC has been integrated into SuperCollider and Max/MSP and has been ported to most modern languages including Perl and Java. Andreas Schlegel’s “oscP5” is an OSC extension library for Processing. +

    + +

    + The Internet has become more peer-oriented in other ways too, not simply through file sharing but also through friend communities and other kinds of social interaction. Web 2.0 platforms like Facebook, Twitter, or YouTube allow groups of people to network with each other, whether it be a small group of five or ten, or a larger group of several thousands. While the more traditional client-server model relied on a clear distinction between information providers and information consumers, newer systems have disrupted some of the old hierarchies, allowing networked users to act as both producers and consumers of content. Such systems thus rely heavily on user-generated content and expect a higher amount of participation and interaction from their user base. +

    + + + +

    Conclusion

    + + +

    + Programmers are often required to consider interconnections between webs of objects and events. Because of this, programming for networks is a natural extension of programming for a single machine. Classes send messages to other classes just like hosts send messages to other hosts. An object has an interface, and so does an Ethernet adapter. The algorithmic construction of entities in dialogue–pixels, bits, frames, nodes–is central to what Processing is all about. Networking these entities by moving some of them to one machine and some to another is but a small additional step. What is required, however, is a knowledge of the various standards and techniques at play when bona fide networking takes place. +

    + +

    + Historically, there have been two basic strands of networked art: art where the network is used as the actual medium of art–making, or art where the network is used as the transportation medium for dissemination of the work. The former might be understood as art of the Internet, while the latter as art for the Internet. The goal of this text has been to introduce some of the basic conditions, both technological and aesthetic, for making networked art, in the hopes that entirely new techniques and approaches will spring forth in the future as both strands blend together into exciting new forms. +

    + + + +

    Notes

    + +

    +

      +
    1. Alexei Shulgin, “Net.Art – the origin,” Nettime mailing list archives, 18 March 1997, http://nettime.org/Lists-Archives/nettime-l-9703/msg00094.html.
    2. +
    3. Marina Grzinic, “Exposure Time, the Aura, and Telerobotics,” in The Robot in the Garden: Telerobotics and Telepistemology in the Age of the Internet, edited by Ken Goldberg (MIT Press, 2000), p. 215.
    4. +
    +

    + + + -
    \ No newline at end of file diff --git a/content/static/tutorials/objects/imgs/class.jpg b/content/static/tutorials/objects/imgs/class.jpg index 68bc79461..f40a63437 100644 Binary files a/content/static/tutorials/objects/imgs/class.jpg and b/content/static/tutorials/objects/imgs/class.jpg differ diff --git a/content/static/tutorials/objects/index.html b/content/static/tutorials/objects/index.html index f2e36d892..5422ea42e 100644 --- a/content/static/tutorials/objects/index.html +++ b/content/static/tutorials/objects/index.html @@ -1,16 +1,16 @@ -

    Objects

    - -

    - - - -

    This tutorial is for Processing version 1.1+. If you see any errors or have comments, please let us know. This tutorial is from the book, Learning Processing, by Daniel Shiffman, published by Morgan Kaufmann Publishers, Copyright © 2008 Elsevier Inc. All rights reserved.

    - -

     

    - -

    I'm Down with OOP

    -

    -Before we begin examining the details of how object-oriented programming (OOP) works in Processing, let's embark on a short conceptual discussion of "objects" themselves. Imagine you were not programming in Processing, but were instead writing out a program for your day, a list of instructions, if you will. It might start out something like: +

    + +
    + +

    + This tutorial is from the book Learning Processing by Daniel Shiffman, published by Morgan Kaufmann, © 2008 Elsevier Inc. All rights reserved. If you see any errors or have comments, please let us know. +

    + +

    Objects

    +

    Daniel Shiffman

    + +

    +Before we begin examining the details of how object-oriented programming (OOP) works in Processing, let's embark on a short conceptual discussion of "objects" themselves. Imagine you were not programming in Processing, but were instead writing out a program for your day—a list of instructions, if you will. It might start out something like:

    • Wake up.
    • @@ -19,9 +19,9 @@

      I'm Down with OOP

    • Ride the subway.
    -What is involved here? Specifically, what things are involved? First, although it may not be immediately apparent from how we wrote the above instructions, the main thing is you, a human being, a person. You exhibit certain properties. You look a certain way; perhaps you have brown hair, wear glasses, and appear slightly nerdy. You also have the ability to do stuff, such as wake up (presumably you can also sleep), eat, or ride the subway. An object is just like you, a thing that has properties and can do stuff. +What is involved here? Specifically, what things are involved? First, although it may not be immediately apparent from how we wrote the above instructions, the main thing is you—a human being, a person. You exhibit certain properties. You look a certain way; perhaps you have brown hair, wear glasses, and appear slightly nerdy. You also have the ability to do stuff, such as wake up (presumably, you can also sleep), eat, or ride the subway. An object is just like you, a thing that has properties and can do stuff.

    -So how does this relate to programming? The properties of an object are variables; and the things an object can do are functions. Object-oriented programming is the marriage of all of the programming fundamentals: data and functionality. +So, how does this relate to programming? The properties of an object are variables, and the things an object can do are functions. Object-oriented programming is the marriage of all of the programming fundamentals: data and functionality.

    Let's map out the data and functions for a very simple human object:

    @@ -76,7 +76,7 @@

    Using an Object

  • Increment car's location by speed.
  • -To implement the above pseudo-code, we would define global variables at the top of the program, initialized them in setup(), and call functions to move and display the car in draw(). Something like: +To implement the above pseudo-code, we would define global variables at the top of the program, initialize them in setup(), and call functions to move and display the car in draw(). Something like:

    @@ -109,7 +109,7 @@ 

    Using an Object


    -Object-oriented programming allows us to take all of the variables and functions out of the main program and store them inside a car object. A car object will know about its data - color, location, speed. The object will also know about the stuff it can do, the methods (functions inside an object) - the car can drive and it can be displayed. +Object-oriented programming allows us to take all of the variables and functions out of the main program and store them inside a car object. A car object will know about its data—color, location, speed. The object will also know about the stuff it can do, the methods (functions inside an object)—the car can drive and it can be displayed.

    Using object-oriented design, the pseudocode improves to look something like this:

    @@ -131,7 +131,7 @@

    Using an Object

  • Drive car object.
  • -Notice we removed all of the global variables from the first example. Instead of having separate variables for car color, car location, and car speed, we now have only one variable, a Car variable! And instead of initializing those three variables, we initialize one thing, the Car object. Where did those variables go? They still exist, only now they live inside of the Car object (and will be defined in the Car class, which we will get to in a moment). +Notice: we removed all of the global variables from the first example. Instead of having separate variables for car color, car location, and car speed, we now have only one variable: a Car variable! And, instead of initializing those three variables, we initialize one thing: the Car object. Where did those variables go? They still exist, only now they live inside of the Car object (and will be defined in the Car class, which we will get to in a moment).

    Moving beyond pseudocode, the actual body of the sketch might look like:

    @@ -155,7 +155,7 @@

    Using an Object

    Writing the Cookie Cutter

    -The simple Car example above demonstrates how the use of objects in Processing makes for clean, readable code. The hard work goes into writing the object template, that is the class itself. When you are first learning about object-oriented programming, it is often a useful exercise to take a program written without objects and, not changing the functionality at all, rewrite it using objects. We will do exactly this with the car example, recreating exactly the same look and behavior in an object-oriented manner. +The simple Car example above demonstrates how the use of objects in Processing makes for clean, readable code. The hard work goes into writing the object template—that is, the class itself. When you are first learning about object-oriented programming, it is often a useful exercise to take a program written without objects and, not changing the functionality at all, rewrite it using objects. We will do exactly this with the car example, recreating exactly the same look and behavior in an object-oriented manner.

    All classes must include four elements: name, data, constructor, and methods. (Technically, the only actual required element is the class name, but the point of doing object-oriented programming is to include all of these.)

    @@ -227,7 +227,7 @@

    Using an Object: The Details



    Step 2. Initializing an object.

    -In order to initialize a variable (i.e., give it a starting value), we use an assignment operation - variable equals something. With a primitive (such as integer), it looks like this: +In order to initialize a variable (i.e., give it a starting value), we use an assignment operation—variable equals something. With a primitive (such as integer), it looks like this:

    @@ -247,11 +247,11 @@ 

    Using an Object: The Details

    In the above example, "myCar" is the object variable name and "=" indicates we are setting it equal to something, that something being a new instance of a Car object. What we are really doing here is initializing a Car object. When you initialize a primitive variable, such as an integer, you just set it equal to a number. But an object may contain multiple pieces of data. Recalling the Car class, we see that this line of code calls the constructor, a special function named Car() that initializes all of the object's variables and makes sure the Car object is ready to go.

    -One other thing; with the primitive integer "var," if you had forgotten to initialize it (set it equal to 10), Processing would have assigned it a default value, zero. An object (such as "myCar"), however, has no default value. If you forget to initialize an object, Processing will give it the value null. null means nothing. Not zero. Not negative one. Utter nothingness. Emptiness. If you encounter an error in the message window that says "NullPointerException" (and this is a pretty common error), that error is most likely caused by having forgotten to initialize an object. +One other thing: with the primitive integer "var," if you had forgotten to initialize it (set it equal to 10), Processing would have assigned it a default value—zero. An object (such as "myCar"), however, has no default value. If you forget to initialize an object, Processing will give it the value null. null means nothing. Not zero. Not negative one. Utter nothingness. Emptiness. If you encounter an error in the message window that says "NullPointerException" (and this is a pretty common error), that error is most likely caused by having forgotten to initialize an object.

    Step 3. Using an object

    -Once we have successfully declared and initialized an object variable, we can use it. Using an object involves calling functions that are built into that object. A human object can eat, a car can drive, a dog can bark. Calling a function inside of an object is accomplished via dot syntax: variableName.objectFunction(Function Arguments); +Once we have successfully declared and initialized an object variable, we can use it. Using an object involves calling functions that are built into that object. A human object can eat; a car can drive; a dog can bark. Calling a function inside of an object is accomplished via dot syntax: variableName.objectFunction(Function Arguments);

    In the case of the car, none of the available functions has an argument so it looks like:

    @@ -313,13 +313,13 @@

    Constructor Arguments

    }

    -In my experience, the use of constructor arguments to initialize object variables can be somewhat bewildering. Please do not blame yourself. The code is strange-looking and can seem awfully redundant: "For every single variable I want argument to that constructor?" +In my experience, the use of constructor arguments to initialize object variables can be somewhat bewildering. Please do not blame yourself. The code is strange-looking and can seem awfully redundant: "I need to place arguments inside the constructor for every single variable?"

    -Nevertheless, this is quite an important skill to learn, and, ultimately, is one of the things that makes object-oriented programming powerful. But for now, it may feel painful. Let's looks at how parameter works in this context. +Nevertheless, this is quite an important skill to learn, and, ultimately, is one of the things that makes object-oriented programming powerful. But for now, it may feel painful. Let's looks at how parameters work in this context.



    -Arguments are local variables used inside the body of a function that get filled with values when the function is called. In the examples, they have one purpose only, to initialize the variables inside of an object. These are the variables that count, the car's actual color, the car's actual x location, and so on. The constructor's arguments are just temporary, and exist solely to pass a value from where the object is made into the object itself. +Arguments are local variables used inside the body of a function that get filled with values when the function is called. In the examples, they have one purpose only: to initialize the variables inside of an object. These are the variables that count—the car's actual color, the car's actual x location, and so on. The constructor's arguments are just temporary, and exist solely to pass a value from where the object is made into the object itself.

    This allows us to make a variety of objects using the same constructor. You might also just write the word temp in your argument names to remind you of what is going on (c vs. tempC). You will also see programmers use an underscore (c vs. c_) in many examples. You can name these whatever you want, of course. However, it is advisable to choose a name that makes sense to you, and also to stay consistent.

    @@ -327,7 +327,7 @@

    Constructor Arguments



    -// Example: Two Car objects
    +// Example: Two Car objects
     Car myCar1;
     Car myCar2; // Two objects!
     
    @@ -384,7 +384,7 @@ 

    Objects are data types too!



    If you were programming the Space Invaders game, for example, you might create a Spaceship class, an Enemy class, and a Bullet class, using an object for each entity in your game.

    -In addition, although not primitive, classes are data types just like integers and floats. And since classes are made up of data, an object can therefore contain other objects! For example, let's assume you had just finished programming a Fork and Spoon class. Moving on to a PlaceSetting class, you would likely include variables for both a Fork object and a Spoon object inside that class itself. This is perfectly reasonable and quite common in object-oriented programming. +In addition, although not primitive, classes are data types, just like integers and floats. And since classes are made up of data, an object can therefore contain other objects! For example, let's assume you had just finished programming a Fork and Spoon class. Moving on to a PlaceSetting class, you would likely include variables for both a Fork object and a Spoon object inside that class itself. This is perfectly reasonable and quite common in object-oriented programming.

    @@ -413,16 +413,10 @@ 

    Objects are data types too!


    -When a primitive value (integer, float, etc.) is passed in a function, a copy is made. With objects, this is not the case, and the result is a bit more intuitive. If changes are made to an object after it is passed into a function, those changes will affect that object used anywhere else throughout the sketch. This is known as pass by reference since instead of a copy, a reference to the actual object itself is passed into the function. +When a primitive value (integer, float, etc.) is passed in a function, a copy is made. With objects, this is not the case, and the result is a bit more intuitive. If changes are made to an object after it is passed into a function, those changes will affect that object used anywhere else throughout the sketch. This is known as pass by reference since, instead of a copy, a reference to the actual object itself is passed into the function.

    - - -

     

    - -

    This tutorial is for Processing version 1.1+. If you see any errors or have comments, please let us know. This tutorial is from the book, Learning Processing, by Daniel Shiffman, published by Morgan Kaufmann Publishers, Copyright © 2008 Elsevier Inc. All rights reserved.

    -

    diff --git a/content/static/tutorials/overview/index.html b/content/static/tutorials/overview/index.html index 1fb0a00b2..8b9987eff 100644 --- a/content/static/tutorials/overview/index.html +++ b/content/static/tutorials/overview/index.html @@ -1,79 +1,102 @@ -

    Processing Overview

    - -

    - - - + +
    + + +
    -

    This tutorial is for Processing 2+. If you see any errors or have comments, please let us know. This tutorial is adapted from the book, Visualizing Data by Ben Fry, O'Reilly 2007. Copyright © 2008 Ben Fry. All rights reserved.

    - -

     

    - -

    Processing is a simple programming environment that was created to make it easier to develop visually oriented applications with an emphasis on animation and providing users with instant feedback through interaction. The developers wanted a means to “sketch” ideas in code. As its capabilities have expanded over the past decade, Processing has come to be used for more advanced production-level work in addition to its sketching role. Originally built as a domain-specific extension to Java targeted towards artists and designers, Processing has evolved into a full-blown design and prototyping tool used for large-scale installation work, motion graphics, and complex data visualization.
    -
    - Processing is based on Java, but because program elements in Processing are fairly simple, you can learn to use it even if you don't know any Java. If you're familiar with Java, it's best to forget that Processing has anything to do with Java for a while, until you get the hang of how the API works.
    -
    -The latest version of Processing can be downloaded at http://processing.org/download
    -
    -An important goal for the project was to make this type of programming accessible to a wider audience. For this reason, Processing is free to download, free to use, and open source. But projects developed using the Processing environment and core libraries can be used for any purpose. This model is identical to GCC, the GNU Compiler Collection. GCC and its associated libraries (e.g. libc) are open source under the GNU Public License (GPL), which stipulates that changes to the code must be made available. However, programs created with GCC (examples too numerous to mention) are not themselves required to be open source.
    - -
    -Processing consists of:

    -
    • The Processing Development Environment (PDE). This is the software that runs when you double-click the Processing icon. The PDE is an Integrated Development Environment (IDE) with a minimalist set of features designed as a simple introduction to programming or for testing one-off ideas. -
    • A collection of functions (also referred to as commands or methods) that make up the “core” programming interface, or API, as well as several libraries that support more advanced features such as sending data over a network, reading live images from a webcam, and saving complex imagery in PDF format. -
    • A language syntax, identical to Java but with a few modifications. -
    • An active online community, based at http://processing.org.
    +

    + This tutorial is adapted from the book, Visualizing Data by Ben Fry, O'Reilly 2007. © 2007 Ben Fry. If you see any errors or have comments, please let us know. +

    +

    Processing Overview

    +

    Ben Fry and Casey Reas

    + +

    + Processing is a simple programming environment that was created to make it easier to develop visually oriented applications with an emphasis on animation and providing users with instant feedback through interaction. The developers wanted a means to “sketch” ideas in code. As its capabilities have expanded over the past decade, Processing has come to be used for more advanced production-level work in addition to its sketching role. Originally built as a domain-specific extension to Java targeted towards artists and designers, Processing has evolved into a full-blown design and prototyping tool used for large-scale installation work, motion graphics, and complex data visualization. +

    + +

    + Processing is based on Java, but because program elements in Processing are fairly simple, you can learn to use it even if you don't know any Java. If you're familiar with Java, it's best to forget that Processing has anything to do with Java for a while, until you get the hang of how the API works. +

    + +

    + The latest version of Processing can be downloaded at http://processing.org/download
    +

    + + +

    + An important goal for the project was to make this type of programming accessible to a wider audience. For this reason, Processing is free to download, free to use, and open source. But projects developed using the Processing environment and core libraries can be used for any purpose. This model is identical to GCC, the GNU Compiler Collection. GCC and its associated libraries (e.g. libc) are open source under the GNU Public License (GPL), which stipulates that changes to the code must be made available. However, programs created with GCC (examples too numerous to mention) are not themselves required to be open source. +

    + +

    + Processing consists of: +

      +
    • The Processing Development Environment (PDE). This is the software that runs when you double-click the Processing icon. The PDE is an Integrated Development Environment (IDE) with a minimalist set of features designed as a simple introduction to programming or for testing one-off ideas. +
    • A collection of functions (also referred to as commands or methods) that make up the “core” programming interface, or API, as well as several libraries that support more advanced features such as sending data over a network, reading live images from a webcam, and saving complex imagery in PDF format. +
    • A language syntax, identical to Java but with a few modifications. +
    • An active online community, based at http://processing.org.
    +

    -
    For this reason, references to “Processing” can be somewhat ambiguous. Are we talking about the API, the development environment, or the web site? We'll be careful in this text when referring to each.

    +

    + For this reason, references to “Processing” can be somewhat ambiguous. Are we talking about the API, the development environment, or the web site? We'll be careful in this text when referring to each. +

    -

    Sketching with Processing

    +

    Sketching with Processing

    -

    - A Processing program is called a sketch. The idea is to make Java-style programming feel more like scripting, and adopt the process of scripting to quickly write code. Sketches are stored in the sketchbook, a folder that's used as the default location for saving all of your projects. Sketches that are stored in the sketchbook can be accessed from File → Sketchbook. Alternatively, File → Open... can be used to open a sketch from elsewhere on the system.
    -
    - Advanced programmers need not use the PDE, and may instead choose to use its libraries with the Java environment of choice. However, if you're just getting started, it's recommended that you use the PDE for your first few projects to gain familiarity with the way things are done. While Processing is based on Java, it was never meant to be a Java IDE with training wheels. To better address our target audience, the conceptual model (how programs work, how interfaces are built, and how files are handled) is somewhat different from Java.
    +

    + A Processing program is called a sketch. The idea is to make Java-style programming feel more like scripting, and adopt the process of scripting to quickly write code. Sketches are stored in the sketchbook, a folder that's used as the default location for saving all of your projects. Sketches that are stored in the sketchbook can be accessed from File → Sketchbook. Alternatively, File → Open... can be used to open a sketch from elsewhere on the system. +

    + +

    + Advanced programmers need not use the PDE, and may instead choose to use its libraries with the Java environment of choice. However, if you're just getting started, it's recommended that you use the PDE for your first few projects to gain familiarity with the way things are done. While Processing is based on Java, it was never meant to be a Java IDE with training wheels. To better address our target audience, the conceptual model (how programs work, how interfaces are built, and how files are handled) is somewhat different from Java.

    -

    Hello world

    +

    Hello world

    -

    The Processing equivalent of a "Hello World" program is simply to draw a line: -
    +

    + The Processing equivalent of a "Hello World" program is simply to draw a line: +

    -

         line(15, 25, 70, 90);
    -
    -Enter this example and press the Run button, which is an icon that looks like the Play button from any audio or video device. Your code will appear in a new window, with a gray background and a black line from coordinate (15, 25) to (70, 90). The (0, 0) coordinate is the upper left-hand corner of the display window. Building on this program to change the size of the display window and set the background color, type in the code below:
    -
    -
         size(400, 400);
    +
         line(15, 25, 70, 90);
    + +

    + Enter this example and press the Run button, which is an icon that looks like the Play button from any audio or video device. Your code will appear in a new window, with a gray background and a black line from coordinate (15, 25) to (70, 90). The (0, 0) coordinate is the upper left-hand corner of the display window. Building on this program to change the size of the display window and set the background color, type in the code below:
    +

    + +
    +     size(400, 400);
          background(192, 64, 0);
          stroke(255);
    -     line(150, 25, 270, 350);
    -
    - This version sets the window size to 400 x 400 pixels, sets the background to an orange-red, and draws the line in white, by setting the stroke color to 255. By default, colors are specified in the range 0 to 255. Other variations of the parameters to the stroke() function provide alternate results:
    + line(150, 25, 270, 350); +
    + +

    + This version sets the window size to 400 x 400 pixels, sets the background to an orange-red, and draws the line in white, by setting the stroke color to 255. By default, colors are specified in the range 0 to 255. Other variations of the parameters to the stroke() function provide alternate results: +

    -
    -
         stroke(255);               // sets the stroke color to white
    +
    +     stroke(255);               // sets the stroke color to white
          stroke(255, 255, 255);     // identical to the line above
          stroke(255, 128, 0);       // bright orange (red 255, green 128, blue 0)
          stroke(#FF8000);           // bright orange as a web color
    -     stroke(255, 128, 0, 128);  // bright orange with 50% transparency
    -
    -The same alternatives work for the fill() function, which sets the fill color, and the background() function, which clears the display window. Like all Processing functions that affect drawing properties, the fill and stroke colors affect all geometry drawn to the screen until the next fill and stroke functions. -
    -
    -

    + stroke(255, 128, 0, 128); // bright orange with 50% transparency +
    + +

    + The same alternatives work for the fill() function, which sets the fill color, and the background() function, which clears the display window. Like all Processing functions that affect drawing properties, the fill and stroke colors affect all geometry drawn to the screen until the next fill and stroke functions. +

    Hello mouse

    -

    A program written as a list of statements (like the previous examples) is called a static sketch. In a static sketch, a series of functions are used to perform tasks or create a single image without any animation or interaction. Interactive programs are drawn as a series of frames, which you can create by adding functions titled setup() and draw() as shown in the code below. These are built-in functions that are called automatically.
    +

    + A program written as a list of statements (like the previous examples) is called a static sketch. In a static sketch, a series of functions are used to perform tasks or create a single image without any animation or interaction. Interactive programs are drawn as a series of frames, which you can create by adding functions titled setup() and draw() as shown in the code below. These are built-in functions that are called automatically. +

    -
    -
         void setup() {
    +
    +     void setup() {
            size(400, 400);
            stroke(255);
            background(192, 64, 0);
    @@ -81,15 +104,19 @@ 

    Hello mouse

    void draw() { line(150, 25, mouseX, mouseY); - }
    -
    - The setup() block runs once, and the draw() block runs repeatedly. As such, setup() can be used for any initialization; in this case, setting the screen size, making the background orange, and setting the stroke color to white. The draw() block is used to handle animation. The size() function must always be the first line inside setup().
    + } +
    -
    +

    + The setup() block runs once, and the draw() block runs repeatedly. As such, setup() can be used for any initialization; in this case, setting the screen size, making the background orange, and setting the stroke color to white. The draw() block is used to handle animation. The size() function must always be the first line inside setup().
    +

    + +

    Because the background() function is used only once, the screen will fill with lines as the mouse is moved. To draw just a single line that follows the mouse, move the background() function to the draw() function, which will clear the display window (filling it with orange) each time draw() runs.
    +

    -
    -
         void setup() {
    +
    +     void setup() {
            size(400, 400);
            stroke(255);
          }
    @@ -97,14 +124,19 @@ 

    Hello mouse

    void draw() { background(192, 64, 0); line(150, 25, mouseX, mouseY); - }
    -
    + } +
    + +

    Static programs are most commonly used for extremely simple examples, or for scripts that run in a linear fashion and then exit. For instance, a static program might start, draw a page to a PDF file, and exit.
    -
    -Most programs will use the setup() and draw() blocks. More advanced mouse handling can also be introduced; for instance, the mousePressed() function will be called whenever the mouse is pressed. In the following example, when the mouse is pressed, the screen is cleared via the background() function:
    +

    -
    -
         void setup() {
    +    

    + Most programs will use the setup() and draw() blocks. More advanced mouse handling can also be introduced; for instance, the mousePressed() function will be called whenever the mouse is pressed. In the following example, when the mouse is pressed, the screen is cleared via the background() function: +

    + +
    +    void setup() {
            size(400, 400);
            stroke(255);
          }
    @@ -115,184 +147,257 @@ 

    Hello mouse

    void mousePressed() { background(192, 64, 0); - }
    -
    - -

    + } +

    Exporting and distributing your work

    -

    One of the most significant features of the Processing environment is its ability to bundle your sketch into an application with just one click. Select File → Export Application to package your current sketch as an application. This will bundle your sketch as an application for Windows, Mac OS X, or Linux depending on which operating system you're exporting from. The application folders are overwritten whenever you export—make a copy or remove them from the sketch folder before making changes to the contents of the folder. Alternatively, you can turn off the automatic file erasure in the Preferences.
    -
    - More about the export features can be found in the reference at http://processing.org/reference/environment/#Export
    -

    +

    + One of the most significant features of the Processing environment is its ability to bundle your sketch into an application with just one click. Select File → Export Application to package your current sketch as an application. This will bundle your sketch as an application for Windows, Mac OS X, or Linux depending on which operating system you're exporting from. The application folders are overwritten whenever you export—make a copy or remove them from the sketch folder before making changes to the contents of the folder. Alternatively, you can turn off the automatic file erasure in the Preferences. +

    + +

    + More about the export features can be found in the reference at http://processing.org/reference/environment/#Export +

    Creating images from your work

    -

    If you don't want to distribute the actual project, you might want to create images of its output instead. Images are saved with the saveFrame() function. Adding saveFrame() at the end of draw() will produce a numbered sequence of TIFF-format images of the program's output, named screen-0001.tif, screen-0002.tif, and so on. A new file will be saved each time draw() runs — watch out, this can quickly fill your sketch folder with hundreds of files. You can also specify your own name and file type for the file to be saved with a function like: -

         saveFrame("output.png")
    +

    + If you don't want to distribute the actual project, you might want to create images of its output instead. Images are saved with the saveFrame() function. Adding saveFrame() at the end of draw() will produce a numbered sequence of TIFF-format images of the program's output, named screen-0001.tif, screen-0002.tif, and so on. A new file will be saved each time draw() runs — watch out, this can quickly fill your sketch folder with hundreds of files. You can also specify your own name and file type for the file to be saved with a function like: +

    -
    - To do the same for a numbered sequence, use # (hash marks) where the numbers should be placed:
    -
    -
         saveFrame("output-####.png");
    -
    - For high quality output, you can write geometry to PDF files instead of the screen, as described in the later section about the size() function.
    +
         saveFrame("output.png")
    -

    +

    + To do the same for a numbered sequence, use # (hash marks) where the numbers should be placed: +

    + +
         saveFrame("output-####.png");
    + +

    + For high quality output, you can write geometry to PDF files instead of the screen, as described in the later section about the size() function. +

    + +

    Examples and reference

    -

    While many programmers learn to code in school, others teach themselves and learn on their own. Learning on your own involves looking at lots of other code: running, altering, breaking, and enhancing it until you can reshape it into something new. With this learning model in mind, the Processing software download includes hundreds of examples that demonstrate different features of the environment and API.
    -
    - The examples can be accessed from the File → Examples menu. They're grouped into categories based on their function (such as Motion, Typography, and Image) or the libraries they use (PDF, Network, and Video).
    -
    - Find an interesting topic in the list and try an example. You'll see functions that are familiar, e.g. stroke(), line(), and background(), as well as others that have not yet been covered. To see how a function works, select its name, and then right-click and choose Find in Reference from the pop-up menu (Find in Reference can also be found beneath the Help menu). This will open the reference for that function in your default web browser.
    -
    - In addition to a description of the function's syntax, each reference page includes an example that uses the function. The reference examples are much shorter (usually four or five lines apiece) and easier to follow than the longer code examples.
    -

    +

    + While many programmers learn to code in school, others teach themselves and learn on their own. Learning on your own involves looking at lots of other code: running, altering, breaking, and enhancing it until you can reshape it into something new. With this learning model in mind, the Processing software download includes hundreds of examples that demonstrate different features of the environment and API. +

    + +

    + The examples can be accessed from the File → Examples menu. They're grouped into categories based on their function (such as Motion, Typography, and Image) or the libraries they use (PDF, Network, and Video). +

    + +

    + Find an interesting topic in the list and try an example. You'll see functions that are familiar, e.g. stroke(), line(), and background(), as well as others that have not yet been covered. To see how a function works, select its name, and then right-click and choose Find in Reference from the pop-up menu (Find in Reference can also be found beneath the Help menu). This will open the reference for that function in your default web browser. +

    + +

    + In addition to a description of the function's syntax, each reference page includes an example that uses the function. The reference examples are much shorter (usually four or five lines apiece) and easier to follow than the longer code examples. +

    + +

    More about size()

    -

    The size() function sets the global variables width and height. For objects whose size is dependent on the screen, always use the width and height variables instead of a number. This prevents problems when the size() line is altered. -

         size(400, 400);
    +		

    + The size() function sets the global variables width and height. For objects whose size is dependent on the screen, always use the width and height variables instead of a number. This prevents problems when the size() line is altered. +

    + +
    +     size(400, 400);
     
          // The wrong way to specify the middle of the screen
    -     ellipse(200, 200, 50, 50); 

    + ellipse(200, 200, 50, 50); // Always the middle, no matter how the size() line changes - ellipse(width/2, height/2, 50, 50);
    -
    - In the earlier examples, the size() function specified only a width and height for the window to be created. An optional parameter to the size() function specifies how graphics are rendered. A renderer handles how the Processing API is implemented for a particular output function (whether the screen, or a screen driven by a high-end graphics card, or a PDF file). The default renderer does an excellent job with high-quality 2D vector graphics, but at the expense of speed. In particular, working with pixels directly is slow. Several other renderers are included with Processing, each having a unique function. At the risk of getting too far into the specifics, here's a description of the other possible drawing modes to use with Processing.
    + ellipse(width/2, height/2, 50, 50); +
    + +

    + In the earlier examples, the size() function specified only a width and height for the window to be created. An optional parameter to the size() function specifies how graphics are rendered. A renderer handles how the Processing API is implemented for a particular output function (whether the screen, or a screen driven by a high-end graphics card, or a PDF file). The default renderer does an excellent job with high-quality 2D vector graphics, but at the expense of speed. In particular, working with pixels directly is slow. Several other renderers are included with Processing, each having a unique function. At the risk of getting too far into the specifics, here's a description of the other possible drawing modes to use with Processing. +

    -
         size(400, 400, P2D);
    -
    + +

    The P2D renderer uses OpenGL for faster rendering of two-dimensional graphics, while using Processing's simpler graphics APIs and the Processing development environment's easy application export.
    -
    +

         size(400, 400, P3D);
    -
    + + +

    The P3D renderer also uses OpenGL for faster rendering. It can draw three-dimensional objects and two-dimensional object in space as well as lighting, texture, and materials.
    -
    +

         size(400, 400, PDF, "output.pdf");
    -
    - The PDF renderer draws all geometry to a file instead of the screen. To use PDF, in addition to altering your size() function, you must select Import Library, then PDF from the Sketch menu. This is a cousin of the default renderer, but instead writes directly to PDF files.
    -
    -

    + + +

    + The PDF renderer draws all geometry to a file instead of the screen. To use PDF, in addition to altering your size() function, you must select Import Library, then PDF from the Sketch menu. This is a cousin of the default renderer, but instead writes directly to PDF files. +

    Loading and displaying data

    -

    One of the unique aspects of the Processing API is the way files are handled. The loadImage() and loadStrings() functions each expect to find a file inside a folder named data, which is a subdirectory of the sketch folder.
    +

    + One of the unique aspects of the Processing API is the way files are handled. The loadImage() and loadStrings() functions each expect to find a file inside a folder named data, which is a subdirectory of the sketch folder. +

    - - -
    Advanced Topic: Notes on the data folder
    -
    + + + +
    Advanced Topic: Notes on the data folder
    +
    The data folder addresses a common frustration when dealing with code that is tested locally but deployed over the web. Like Java, software written with Processing is subject to security restrictions that determine how a program can access resources such as the local hard disk or other servers via the Internet. This prevents malicious developers from writing code that could harm your computer or compromise your data.
    -
    - The security restrictions can be tricky to work with during development. When running a program locally, data can be read directly from the disk, though it must be placed relative to the user's “working directory,” generally the location of the application. When running online, data must come from a location on the same server. It might be bundled with the code itself (in a JAR archive, discussed later; or from another URL on the same server). For a local file, Java's FileInputStream class can be used. If the file is bundled in a JAR archive, the getResource() function is used. For a file on the server, URL.openStream() might be employed. During the journey from development to deployment, it may be necessary to use all three of these functions.
    +
    + The security restrictions can be tricky to work with during development. When running a program locally, data can be read directly from the disk, though it must be placed relative to the user's “working directory,” generally the location of the application. When running online, data must come from a location on the same server. It might be bundled with the code itself (in a JAR archive, discussed later; or from another URL on the same server). For a local file, Java's FileInputStream class can be used. If the file is bundled in a JAR archive, the getResource() function is used. For a file on the server, URL.openStream() might be employed. During the journey from development to deployment, it may be necessary to use all three of these functions.
    +
    + With Processing, each of these scenarios (and some others) is handled transparently by the file API functions. By placing resources in the data folder, Processing packages the files as necessary for online and offline use. +
    + +

     

    -
    - With Processing, each of these scenarios (and some others) is handled transparently by the file API functions. By placing resources in the data folder, Processing packages the files as necessary for online and offline use.

    -
    - File handling functions include loadStrings(), which reads a text file into an array of String objects, and loadImage() which reads an image into a PImage object, the container for image data in Processing.
    -
    +

    + File handling functions include loadStrings(), which reads a text file into an array of String objects, and loadImage() which reads an image into a PImage object, the container for image data in Processing. +

    -
         // Examples of loading a text file and a JPEG image
    +
    +     // Examples of loading a text file and a JPEG image
          // from the data folder of a sketch.
          String[] lines = loadStrings("something.txt");
    -     PImage image = loadImage("picture.jpg");
    -
    - These examples may be a bit easier to read if you know the programming concepts of data types and classes. Each variable has to have a data type, such as String or PImage.
    -
    + PImage image = loadImage("picture.jpg"); +
    -The String[] syntax means “an array of data of the class String.” This array is created by the loadStrings function and is given the name lines; it will presumably be used later in the program under this name. The reason loadStrings creates an array is that it splits the something.txt file into its individual lines. The following function creates a single variable of class PImage, with the name image.
    +

    + These examples may be a bit easier to read if you know the programming concepts of data types and classes. Each variable has to have a data type, such as String or PImage. +

    -
    -To add a file to the data folder of a Processing sketch, use the Sketch → Add File menu option, or drag the file into the editor window of the PDE. The data folder will be created if it does not exist already.
    -
    - To view the contents of the sketch folder, use the Sketch → Show Sketch Folder menu option. This opens the sketch window in your operating system's file browser.
    -

    +

    + The String[] syntax means “an array of data of the class String.” This array is created by the loadStrings function and is given the name lines; it will presumably be used later in the program under this name. The reason loadStrings creates an array is that it splits the something.txt file into its individual lines. The following function creates a single variable of class PImage, with the name image. +

    + +

    + To add a file to the data folder of a Processing sketch, use the Sketch → Add File menu option, or drag the file into the editor window of the PDE. The data folder will be created if it does not exist already. +

    + +

    + To view the contents of the sketch folder, use the Sketch → Show Sketch Folder menu option. This opens the sketch window in your operating system's file browser. +

    +

    Libraries add new features

    - - -

    A library is a collection of code in a specified format that makes it easy to use within Processing. Libraries have been important to the growth of the project, because they let developers make new features accessible to users without needing to make them part of the core Processing API.
    -
    - Several core libraries come with Processing. These can be seen in the Libraries section of the online reference (also available from the Help menu from within the PDE.) These libraries can be seen at http://processing.org/reference/libraries/
    -
    + +

    + A library is a collection of code in a specified format that makes it easy to use within Processing. Libraries have been important to the growth of the project, because they let developers make new features accessible to users without needing to make them part of the core Processing API. +

    + +

    + Several core libraries come with Processing. These can be seen in the Libraries section of the online reference (also available from the Help menu from within the PDE.) These libraries can be seen at http://processing.org/reference/libraries/ +

    + +

    One example is the PDF Export library. This library makes it possible to write PDF files directly from Processing. These vector graphics files can be scaled to any size and output at very high resolutions.
    +

    -
    +

    To use the PDF library in a project, choose Sketch → Import Library → pdf. This will add the following line to the top of the sketch: +

    +
         import processing.pdf.*;
    -
    - Java programmers will recognize the import command. In Processing, this line is also used to determine what code is packaged with a sketch when it is exported as an applet or application.
    -
    - Now that the PDF library is imported, you may use it to create a file. For instance, the following line of code creates a new PDF file named lines.pdf that you can draw to.
    -
    -
         beginRecord(PDF, "lines.pdf");
    -
    +

    + Java programmers will recognize the import command. In Processing, this line is also used to determine what code is packaged with a sketch when it is exported as an applet or application. +

    - Each drawing function such as line() and ellipse() will now draw to the screen as well as to the PDF.
    -
    - Other libraries provide features such as reading images from a camera, sending and receiving MIDI and OSC commands, sophisticated 3D camera control, and access to MySQL databases.
    +

    + Now that the PDF library is imported, you may use it to create a file. For instance, the following line of code creates a new PDF file named lines.pdf that you can draw to. +

    +
         beginRecord(PDF, "lines.pdf");
    + +

    + Each drawing function such as line() and ellipse() will now draw to the screen as well as to the PDF. +

    + +

    + Other libraries provide features such as reading images from a camera, sending and receiving MIDI and OSC commands, sophisticated 3D camera control, and access to MySQL databases.

    +

    Sketching and scripting

    -

    Processing sketches are made up of one or more tabs, with each tab representing a piece of code. The environment is designed around projects that are a few pages of code, and often three to five tabs in total. This covers a significant number of projects developed to test and prototype ideas, often before embedding them into a larger project or building a more robust application for broader deployment.
    -
    - The idea of sketching is identical to that of scripting, except that you're not working in an interpreted scripting language, but rather gaining the performance benefit of compiling to Java class files. Of course, strictly speaking, Java is itself an interpreted language, but its bytecode compilation brings it much closer to the "metal" than languages such as JavaScript, Python, or Ruby.
    -
    +

    + Processing sketches are made up of one or more tabs, with each tab representing a piece of code. The environment is designed around projects that are a few pages of code, and often three to five tabs in total. This covers a significant number of projects developed to test and prototype ideas, often before embedding them into a larger project or building a more robust application for broader deployment. +

    +

    + The idea of sketching is identical to that of scripting, except that you're not working in an interpreted scripting language, but rather gaining the performance benefit of compiling to Java class files. Of course, strictly speaking, Java is itself an interpreted language, but its bytecode compilation brings it much closer to the "metal" than languages such as JavaScript, Python, or Ruby. +

    + +

    Processing was never intended as the ultimate language for programming visuals; instead, we set out to make something that was: -

    • A sketchbook for our own work, simplifying the majority of tasks that we undertake.
      -
    • A programming environment suitable for teaching programming to a non-traditional audience.
      -
    • A stepping stone from scripting languages to more complicated or difficult languages such as full-blown Java or C++.
    -
    - At the intersection of these points is a tradeoff between speed and simplicity of use. If we didn't care about speed, it might make sense to use Python, Ruby, or many other scripting languages. This is especially true for the education side. If we didn't care about making a transition to more advanced languages, we'd probably avoid a C++ or Java-style syntax. But Java makes a nice starting point for a sketching language because it's far more forgiving than C/C++ and also allows users to export sketches for distribution via the web.
    -
    - - Processing assembles our experience in building software of this kind (sketches of interactive works or data-driven visualization) and simplifies the parts that we felt should be easier, such as getting started quickly, and insulating new users from issues like those associated with setting up Java.
    +

    + +
      +
    • A sketchbook for our own work, simplifying the majority of tasks that we undertake.
    • +
    • A programming environment suitable for teaching programming to a non-traditional audience.
    • +
    • A stepping stone from scripting languages to more complicated or difficult languages such as full-blown Java or C++.
    • +
    + +

    + At the intersection of these points is a tradeoff between speed and simplicity of use. If we didn't care about speed, it might make sense to use Python, Ruby, or many other scripting languages. This is especially true for the education side. If we didn't care about making a transition to more advanced languages, we'd probably avoid a C++ or Java-style syntax. But Java makes a nice starting point for a sketching language because it's far more forgiving than C/C++ and also allows users to export sketches for distribution via the web. +

    + +

    + Processing assembles our experience in building software of this kind (sketches of interactive works or data-driven visualization) and simplifies the parts that we felt should be easier, such as getting started quickly, and insulating new users from issues like those associated with setting up Java.

    +

    Don't start by trying to build a cathedral

    -

    If you're already familiar with programming, it's important to understand how Processing differs from other development environments and languages. The Processing project encourages a style of work that builds code quickly, understanding that either the code will be used as a quick sketch, or ideas are being tested before developing a final project. This could be misconstrued as software engineering heresy. Perhaps we're not far from “hacking,” but this is more appropriate for the roles in which Processing is used. Why force students or casual programmers to learn about graphics contexts, threading, and event handling functions before they can show something on the screen that interacts with the mouse? The same goes for advanced developers: why should they always need to start with the same two pages of code whenever they begin a project?
    -
    +

    + If you're already familiar with programming, it's important to understand how Processing differs from other development environments and languages. The Processing project encourages a style of work that builds code quickly, understanding that either the code will be used as a quick sketch, or ideas are being tested before developing a final project. This could be misconstrued as software engineering heresy. Perhaps we're not far from “hacking,” but this is more appropriate for the roles in which Processing is used. Why force students or casual programmers to learn about graphics contexts, threading, and event handling functions before they can show something on the screen that interacts with the mouse? The same goes for advanced developers: why should they always need to start with the same two pages of code whenever they begin a project? +

    + +

    In another scenario, the ability to try things out quickly is a far higher priority than sophisticated code structure. Usually you don't know what the outcome will be, so you might build something one week to try an initial hypothesis, and build something new the next based on what was learned in the first week. To this end, remember the following considerations as you begin writing code with Processing: +

    -
    • Be careful about creating unnecessary structures in your code. As you learn about encapsulating your code into classes, it's tempting to make ever-smaller classes, because data can always be distilled further. Do you need classes at the level of molecules, atoms, or quarks? Just because atoms go smaller doesn't mean that we need to work at a lower level of abstraction. If a class is half a page, does it make sense to have six additional subclasses that are each half a page long? Could the same thing be accomplished with a single class that is a page and a half in total? -
    • Consider the scale of the project. It's not always necessary to build enterprise-level software on the first day. Explore first: figure out the minimum code necessary to help answer your questions and satisfy your curiosity. -
    - The argument is not to avoid continually rewriting, but rather to delay engineering work until it's appropriate. The threshold for where to begin engineering a piece of software is much later than for traditional programming projects because there is a kind of art to the early process of quick iteration.
    -
    -Of course, once things are working, avoid the urge to rewrite for its own sake. A rewrite should be used when addressing a completely different problem. If you've managed to hit the nail on the head, you should refactor to clean up function names and class interactions. But a full rewrite of already finished code is almost always a bad idea, no matter how "ugly" it may seem.
    +
      +
    • + Be careful about creating unnecessary structures in your code. As you learn about encapsulating your code into classes, it's tempting to make ever-smaller classes, because data can always be distilled further. Do you need classes at the level of molecules, atoms, or quarks? Just because atoms go smaller doesn't mean that we need to work at a lower level of abstraction. If a class is half a page, does it make sense to have six additional subclasses that are each half a page long? Could the same thing be accomplished with a single class that is a page and a half in total? +
    • +
    • + Consider the scale of the project. It's not always necessary to build enterprise-level software on the first day. Explore first: figure out the minimum code necessary to help answer your questions and satisfy your curiosity. +
    • +
    + +

    + The argument is not to avoid continually rewriting, but rather to delay engineering work until it's appropriate. The threshold for where to begin engineering a piece of software is much later than for traditional programming projects because there is a kind of art to the early process of quick iteration. +

    -

     

    - -

    This tutorial is for Processing 2+. If you see any errors or have comments, please let us know. This tutorial is adapted from the book, Visualizing Data by Ben Fry, O'Reilly 2007. Copyright © 2008 Ben Fry. All rights reserved.

    +

    + Of course, once things are working, avoid the urge to rewrite for its own sake. A rewrite should be used when addressing a completely different problem. If you've managed to hit the nail on the head, you should refactor to clean up function names and class interactions. But a full rewrite of already finished code is almost always a bad idea, no matter how "ugly" it may seem. +

    -

    + diff --git a/content/static/tutorials/p3d/index.html b/content/static/tutorials/p3d/index.html index 2fefa6ac1..22bfd8eb1 100644 --- a/content/static/tutorials/p3d/index.html +++ b/content/static/tutorials/p3d/index.html @@ -1,25 +1,26 @@ -

    P3D

    - -

    - + +
    -

    This tutorial is for Processing version 2.0+. If you see any errors or have comments, please let us know. This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

    +

    If you see any errors in this tutorial or have comments, please let us know. This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

    -

    What is P3D?

    +

    P3D

    +

    Daniel Shiffman

    - In Processing 2.0, there are four render modes: the default renderer, P2D, P3D, and PDF. To use a non-default renderer, you can specify via the size() function. + There are five render modes: the default renderer, P2D, P3D, PDF, and SVG. To use a non-default renderer, you can specify via the size() function. +

    -void setup() {
    -  size(200,200,P3D);
    +void setup() {
    +  size(200,200,P3D);
     }
    -

    + - Now, you may be wondering: "Which render mode should I choose and why?" The mode itself tells Processing what to do behind the scenes when drawing the display window. For example, the default renderer employs existing Java 2D libraries to draw shapes, set colors, display text, etc. When deciding which renderer to use, you are balancing a number of factors: speed, accuracy, and general usefulness of the available features. In most cases, particularly when you are first learning Processing, you will want to use the default renderer setting. It provides the most elegant and accurate results when drawing in 2D. +

    + Now, you may be wondering: "Which render mode should I choose and why?" The mode itself tells Processing what to do behind the scenes when drawing the display window. For example, the default renderer employs existing Java 2D libraries to draw shapes, set colors, display text, etc. When deciding which renderer to use, you are balancing a number of factors: speed, accuracy, and general usefulness of the available features. In most cases, particularly when you are first learning Processing, you will want to use the default renderer setting. It provides the most elegant and accurate results when drawing in 2D.

    @@ -27,8 +28,8 @@

    What is P3D?

    • You are drawing in 3D! In three-dimensional space, a third axis (the z-axis) refers to the depth of any given point. How far in front or behind the window does a pixel live? Now, we all know there are no actual pixels floating in the air in front of or behind your screen! What we're talking about here is how to use the theoretical z-axis to create the illusion of three-dimensional space in your Processing window. P3D is required for this.
    • -
    • You want your sketch to run faster! P2D and P3D make use of OpenGL-compatible graphics hardware. In other words, some of the work required to draw all the pixels in the window can happen on your computer's graphics card which is often more effecient. Keep in mind that OpenGL is not magic pixie dust that makes any sketch faster (though it's close), you will also need to carefully consider the techniques you are using to do the drawing as well. In particular, using the new "shape recording" functionality available in PShape (see PShape tutorial) can greatly increase speed in P3D mode.
    • -
    • You are drawing in 2D but want to use a particular graphic effect not available in default renderer! Some graphics functions are only available in P2D such as textures and lighting (see below).
    • +
    • You want your sketch to run faster! P2D and P3D make use of OpenGL-compatible graphics hardware. In other words, some of the work required to draw all the pixels in the window can happen on your computer's graphics card which is often more efficient. Keep in mind that OpenGL is not magic pixie dust that makes any sketch faster (though it's close), you will also need to carefully consider the techniques you are using to do the drawing as well. In particular, using the new "shape recording" functionality available in PShape (see PShape tutorial) can greatly increase speed in P3D mode.
    • +
    • You are drawing in 2D but want to use a particular graphic effect not available in default renderer! Some graphics functions are only available in P3D such as textures and lighting (see below).

    @@ -40,7 +41,7 @@

    3D Transformations

    - In order to draw something at a point in three dimensions the coordinates are specified in the order you would expect: x, y, z. Cartesian 3D systems are often described as "left-handed" or "right-handed." If you point your index finger in the positive y direction (up) and your thumb in the positive x direction (to the right), the rest of your fingers will point towards the positive z direction. It's left-handed if you use your left hand and do the same. In Processing, the system is left-handed, as follows: + In order to draw something at a point in three dimensions the coordinates are specified in the order you would expect: x, y, z. Cartesian 3D systems are often described as "left-handed" or "right-handed." If you point your index finger in the positive y direction (down) and your thumb in the positive x direction (to the right), the rest of your fingers will point towards the positive z direction. It's left-handed if you use your left hand and do the same. In Processing, the system is left-handed, as follows:

    @@ -200,16 +201,11 @@

    3D Shapes

    Textures

    - In P3D mode, you can load and display images just like you do in 2D (see: Images and Pixels Tutorial). Everything we covered under transformations can be applied to images; they can be translated, rotated, and scaled in a virtual 3D space. In addition to drawing an image the old-fashioned way, however, images can be made into "textures" and applied to a shape. This is particularly useful when you want a 3D shape to resemble a real-world object. For example, applying an image of earth as a texture on a sphere will result in a globe.

    - -


    - Example: Textured Sphere

    - -

    To apply an image as a texture to a shape, we first need to define the shape using beginShape() and endShape() as demonstrated in the previous section. Let's say you are drawing a rectangle, like so:

    + With the P3D renderer, you can load and display images just like you do in 2D (see: Images and Pixels Tutorial). Everything covered under transformations can be applied to images; they can be translated, rotated, and scaled in a virtual 3D space. In addition to drawing an image the old-fashioned way, however, images can be made into "textures" and applied to a shape. This is particularly useful when you want a 3D shape to resemble a real-world object. For example, applying an image of earth as a texture on a sphere will result in a globe. To apply an image as a texture to a shape, we first need to define the shape using beginShape() and endShape() as demonstrated in the previous section. Let's say you are drawing a rectangle, like so:


    -size(640, 360,P3D);
    +size(640, 360, P3D);
     background(0);
     translate(width/2, height/2);
     stroke(255);
    @@ -274,9 +270,24 @@ 

    Textures


    - If the above seems like a trivial example, that's because it is. After all, if we're just going to texture a square, we can just draw the image using image(). Nevertheless, understanding the above process opens up a world of possibilities as we can now apply image textures to arbitrary 2D and 3D shapes. For some examples of more sophisticated mappings, check out Texture Triangle, Texture Cylinder, and Texture Cube. + If the above seems like a trivial example, that's because it is. After all, if we're just going to texture a square, we can just draw the image using image(). Nevertheless, understanding the above process opens up a world of possibilities as we can now apply image textures to arbitrary 2D and 3D shapes. For some examples of more sophisticated mappings, check out Texture Triangle, Texture Cylinder, Texture Cube, and Textured Sphere.

    +

    + As mentioned in the PShape tutorial, you can also texture PShape objects with the setTexture() function. PShape's setTexture() automatically textures the shape without having to specify uv coordinates and is useful for simple scenarios like texturing a sphere (where doing it with beginShape() and endShape() would be extraordinarily complex (as seen in Textured Sphere). The following code demonstrates how easy it is to texture with PShape. +

    + +
    +PImage img;
    +PShape globe;
    +	
    +void setup() {
    +  img = loadImage("earth.jpg");
    +  globe = createShape(SPHERE, 50);
    +  globe.setTexture(img);
    +}
    +
    +

    Lighting

    In P3D, you can also manipulate the lighting of the elements in your scene. Of course, just as drawing in three-dimensions is an illusion, the addition of lighting to a Processing sketch is a simulation of the idea of real world lighting for the purpose of creating a variety of effects. This is particularly useful since some objects (such as a sphere) do not appear three-dimensional until they are lit.

    @@ -302,7 +313,7 @@

    Lighting


    -

    Note how the call to the lights() function is included in draw(). Just as with matrix transformations, the 3D scene is reset each time through draw() any therefore any lighting must be included in order to remain persistent.

    +

    Note how the call to the lights() function is included in draw(). Just as with matrix transformations, the 3D scene is reset each time through draw() and therefore any lighting must be included in order to remain persistent.

    In order to set custom lighting for your scene there are four different kinds of lights.

    @@ -383,7 +394,7 @@

    Perspective

    float cameraZ = (height/2.0) / tan(fov/2.0); perspective(fov, float(width)/float(height), cameraZ/2.0, cameraZ*2.0); } else { - ortho(0, width, 0, height); + ortho(-width/2, width/2, -height/2, height/2); } translate(width/2, height/2, 0); rotateX(-PI/6); @@ -446,15 +457,10 @@

    Camera

    box(200); }

    -For other examples that make use of the camera() function, take a look at: Move Eye. -

    -

    This tutorial is for Processing version 2.0+. If you see any errors or have comments, please let us know. This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

    +
    - -

    - diff --git a/content/static/tutorials/pixels/index.html b/content/static/tutorials/pixels/index.html index f5fc18d7c..126d87c9d 100644 --- a/content/static/tutorials/pixels/index.html +++ b/content/static/tutorials/pixels/index.html @@ -1,29 +1,32 @@ -

    Images and Pixels

    - -

    - - - -

    This tutorial is for Processing version 1.1+. If you see any errors or have comments, please let us know. This tutorial is from the book, Learning Processing, by Daniel Shiffman, published by Morgan Kaufmann Publishers, Copyright © 2008 Elsevier Inc. All rights reserved.

    - -

     

    +
    + + diff --git a/content/static/tutorials/print/imgs/fg40-1.svg b/content/static/tutorials/print/imgs/fg40-1.svg index 4d6bda944..1e51f3742 100644 --- a/content/static/tutorials/print/imgs/fg40-1.svg +++ b/content/static/tutorials/print/imgs/fg40-1.svg @@ -1,84 +1,311 @@ - + + width="650px" height="210px" viewBox="0 0 650 210" enable-background="new 0 0 650 210" xml:space="preserve"> - + - - - - - - - + + + + + + + + + + + - + - - - - - - - + + + + + + + + + + + - + - - - - - - - + + + + + + + + + + + -Vector image enlarged 800% -Raster image enlarged 800% + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - +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 +b5w+s4ZwzhnDOGcM4ZwzhnDOGcM4ZwzhnDP/2Q==" transform="matrix(0.9495 0 0 0.9565 357.4785 40.293)"> diff --git a/content/static/tutorials/print/index.html b/content/static/tutorials/print/index.html index 12741fc59..bc07ea49f 100644 --- a/content/static/tutorials/print/index.html +++ b/content/static/tutorials/print/index.html @@ -1,35 +1,40 @@ -

    Print

    -

    By Casey Reas

    -
    +

    + This tutorial is from the book Learning Processing by Daniel Shiffman, published by Morgan Kaufmann, © 2008 Elsevier Inc. All rights reserved. If you see any errors or have comments, please let us know. +

    -A digital image is nothing more than data -- numbers indicating variations of red, green, and blue at a particular location on a grid of pixels. Most of the time, we view these pixels as miniature rectangles sandwiched together on a computer screen. With a little creative thinking and some lower level manipulation of pixels with code, however, we can display that information in a myriad of ways. This tutorial is dedicated to breaking out of simple shape drawing in Processing and using images (and their pixels) as the building blocks of Processing graphics. +

    Images and Pixels

    +

    Daniel Shiffman

    -

    Getting started with images.

    +

    + A digital image is nothing more than data—numbers indicating variations of red, green, and blue at a particular location on a grid of pixels. Most of the time, we view these pixels as miniature rectangles sandwiched together on a computer screen. With a little creative thinking and some lower level manipulation of pixels with code, however, we can display that information in a myriad of ways. This tutorial is dedicated to breaking out of simple shape drawing in Processing and using images (and their pixels) as the building blocks of Processing graphics. +

    -Hopefully, you are comfortable with the idea of data types. You probably specify them often -- a float variable "speed", an int "x", etc. These are all primitive data types, bits sitting in the computer's memory ready for our use. Though perhaps a bit trickier, you hopefully also use objects, complex data types that store multiple pieces of data (along with functionality) -- a "Ball" class, for example, might include floating point variables for location, size, and speed as well as methods to move, display itself, and so on. -

    -In addition to user-defined objects (such as Ball), Processing has a bunch of handy classes all ready to go without us writing any code. In this tutorial, we'll examine PImage, a class for loading and displaying an image as well as looking at its pixels. +

    Getting started with images.

    + +

    + Hopefully, you are comfortable with the idea of data types. You probably specify them often—a float variable "speed", an int "x", etc. These are all primitive data types, bits sitting in the computer's memory ready for our use. Though perhaps a bit trickier, you hopefully also use objects, complex data types that store multiple pieces of data (along with functionality)—a "Ball" class, for example, might include floating point variables for location, size, and speed as well as methods to move, display itself, and so on. +

    + +

    + In addition to user-defined objects (such as Ball), Processing has a bunch of handy classes all ready to go without us writing any code. In this tutorial, we'll examine PImage, a class for loading and displaying an image as well as looking at its pixels. +

    + -

    -Example: "Hello World" images -
    -// Declaring a variable of type PImage
    -PImage img;	
    +PImage img;	// Declare a variable of type PImage
     
     void setup() {
       size(320,240);
    @@ -37,105 +40,140 @@ 

    Getting started with images.

    image(img,0,0); }
    -
    -Using an instance of a PImage object is no different than using a user-defined class. First, a variable of type PImage, named "img," is declared. Second, a new instance of a PImage object is created via the loadImage() method. loadImage() takes one argument, a String indicating a file name, and loads the that file into memory. loadImage() looks for image files stored in your Processing sketch's "data" folder. - -

    - -
    -The Data Folder: How do I get there? -

    -Images can be added to the data folder automatically via: -

    -Sketch --> Add File. . . -

    -or manually: -

    -Sketch --> Show Sketch Folder -

    -This will open up the sketch folder. If there is no data directory create one. Otherwise, place your image files inside. -

    -Processing accepts the following file formats for images: GIF, JPG, TGA, PNG. -
    -
    -
    -

    -In the above example, it may seem a bit peculiar that we never called a "constructor" to instantiate the PImage object, saying "new PImage()". After all, in most object-related examples, a constructor is a must for producing an object instance. -

    + +

    + Using an instance of a PImage object is no different than using a user-defined class. First, a variable of type PImage, named "img," is declared. Second, a new instance of a PImage object is created via the loadImage() method. loadImage() takes one argument, a String indicating a file name, and loads the that file into memory. loadImage() looks for image files stored in your Processing sketch's "data" folder. +

    + + + +
    + The Data Folder: How do I get there? +

    + Images can be added to the data folder automatically via: +

    + Sketch → Add File. . . +

    + or manually: +

    + Sketch → Show Sketch Folder +

    + This will open up the sketch folder. If there is no data directory create one. Otherwise, place your image files inside. +

    + Processing accepts the following file formats for images: GIF, JPG, TGA, PNG. +
    + + + + +

    + In the above example, it may seem a bit peculiar that we never called a "constructor" to instantiate the PImage object, saying "new PImage()". After all, in most object-related examples, a constructor is a must for producing an object instance. +

    +
     Spaceship ss = new Spaceship();
     Flower flr = new Flower(25);
     
    -

    -yet: -
    + +

    + yet: +

    +
     PImage img = loadImage("file.jpg");
     
    -
    -In fact, the loadImage() function performs the work of a constructor, returning a brand new instance of a PImage object generated from the specified filename. We can think of it as the PImage constructor for loading images from a file. For creating a blank image, the createimage() function is used. -

    + +

    + In fact, the loadImage() function performs the work of a constructor, returning a brand new instance of a PImage object generated from the specified filename. We can think of it as the PImage constructor for loading images from a file. For creating a blank image, the createimage() function is used. +

    +
    -// Create a blank image, 200x200 pixels with RGB color
    -PImage img = createImage(200,200,RGB);
    +// Create a blank image, 200 x 200 pixels with RGB color
    +PImage img = createImage(200, 200,RGB);
     
    -
    -We should also note that the process of loading the image from the hard drive into memory is a slow one, and we should make sure our program only has to do it once, in setup(). Loading images in draw() may result in slow performance as well as "Out of Memory" errors. -

    -Once the image is loaded, it is displayed with the image() function. The image() function must include 3 arguments -- the image to be displayed, the x location, and the y location. Optionally two arguments can be added to resize the image to a certain width and height. -

    + +

    + We should also note that the process of loading the image from the hard drive into memory is a slow one, and we should make sure our program only has to do it once, in setup(). Loading images in draw() may result in slow performance as well as "Out of Memory" errors. +

    + +

    + Once the image is loaded, it is displayed with the image() function. The image() function must include 3 arguments—the image to be displayed, the x location, and the y location. Optionally two arguments can be added to resize the image to a certain width and height. +

    +
     image(img,10,20,90,60);
     
    -

    Your very first image processing filter

    -When displaying an image, you might like to alter its appearance. Perhaps you would like the image to appear darker, transparent, blue-ish, etc. This type of simple image filtering is achieved with Processing's tint() function. tint() is essentially the image equivalent of shape's fill(), setting the color and alpha transparency for displaying an image on screen. An image, nevertheless, is not usually all one color. The arguments for tint() simply specify how much of a given color to use for every pixel of that image, as well as how transparent those pixels should appear. -

    -For the following examples, we will assume that two images (a sunflower and a dog) have been loaded and the dog is displayed as the background (which will allow us demonstrate transparency.) -

    + + +

    Your very first image processing filter

    + + +

    + When displaying an image, you might like to alter its appearance. Perhaps you would like the image to appear darker, transparent, blue-ish, etc. This type of simple image filtering is achieved with Processing's tint() function. tint() is essentially the image equivalent of shape's fill(), setting the color and alpha transparency for displaying an image on screen. An image, nevertheless, is not usually all one color. The arguments for tint() simply specify how much of a given color to use for every pixel of that image, as well as how transparent those pixels should appear. +

    + +

    + For the following examples, we will assume that two images (a sunflower and a dog) have been loaded and the dog is displayed as the background (which will allow us demonstrate transparency.) +

    +
     PImage sunflower = loadImage("sunflower.jpg");
     PImage dog = loadImage("dog.jpg");
     background(dog);
     
    -
    -If tint() receives one argument, only the brightness of the image is affected. -

    - + +

    + If tint() receives one argument, only the brightness of the image is affected. +

    + + +
     // The image retains its original state.
     tint(255);  
     image(sunflower,0,0);
     
    -

    -
    + + + +
     //The image appears darker.
     tint(100);  
     image(sunflower,0,0);
     
    -
    -A second argument will change the image's alpha transparency. -

    -
    + +

    + A second argument will change the image's alpha transparency. +

    + + +
     // The image is at 50% opacity.
     tint(255,127);  
     image(sunflower,0,0);
     
    -
    -Three arguments affect the brightness of the red, green, and blue components of each color. -

    - + +

    + Three arguments affect the brightness of the red, green, and blue components of each color. +

    + + +
     // None of its red, most of its green, and all of its blue.
     tint(0,200,255);
     image(sunflower,0,0);
     
    -
    -Finally, adding a fourth argument to the method manipulates the alpha (same as with 2). Incidentally, the range of values for tint() can be specified with colorMode(). -

    - + +

    + Finally, adding a fourth argument to the method manipulates the alpha (same as with 2). Incidentally, the range of values for tint() can be specified with colorMode(). +

    + + +
     // The image is tinted red and transparent.
     tint(255,0,0,100);
    @@ -143,21 +181,29 @@ 

    Your very first image processing filter

    -

    Pixels, pixels, and more pixels

    -If you've just begun using Processing you may have mistakenly thought that the only offered means for drawing to the screen is through a function call. "Draw a line between these points" or "Fill an ellipse with red" or "load this JPG image and place it on the screen here." But somewhere, somehow, someone had to write code that translates these function calls into setting the individual pixels on the screen to reflect the requested shape. A line doesn't appear because we say line(), it appears because we color all the pixels along a linear path between two points. Fortunately, we don't have to manage this lower-level-pixel-setting on a day-to-day basis. We have the developers of Processing (and Java) to thank for the many drawing functions that take care of this business. -

    -Nevertheless, from time to time, we do want to break out of our mundane shape drawing existence and deal with the pixels on the screen directly. Processing provides this functionality via the pixels array. -

    -We are familiar with the idea of each pixel on the screen having an X and Y position in a two dimensional window. However, the array pixels has only one dimension, storing color values in linear sequence. +

    Pixels, pixels, and more pixels

    + +

    + If you've just begun using Processing you may have mistakenly thought that the only offered means for drawing to the screen is through a function call. "Draw a line between these points" or "Fill an ellipse with red" or "load this JPG image and place it on the screen here." But somewhere, somehow, someone had to write code that translates these function calls into setting the individual pixels on the screen to reflect the requested shape. A line doesn't appear because we say line(), it appears because we color all the pixels along a linear path between two points. Fortunately, we don't have to manage this lower-level-pixel-setting on a day-to-day basis. We have the developers of Processing (and Java) to thank for the many drawing functions that take care of this business. +

    + +

    + Nevertheless, from time to time, we do want to break out of our mundane shape drawing existence and deal with the pixels on the screen directly. Processing provides this functionality via the pixels array. +

    + +

    + We are familiar with the idea of each pixel on the screen having an X and Y position in a two dimensional window. However, the array pixels has only one dimension, storing color values in linear sequence. +

    + + + +

    + Take the following simple example. This program sets each pixel in a window to a random grayscale value. The pixels array is just like an other array, the only difference is that we don't have to declare it since it is a Processing built-in variable. +

    + +Example: Setting Pixels -

    - -

    -Take the following simple example. This program sets each pixel in a window to a random grayscale value. The pixels array is just like an other array, the only difference is that we don't have to declare it since it is a Processing built-in variable. -

    -Example: Setting Pixels -

     size(200, 200);
     // Before we deal with pixels
    @@ -174,32 +220,44 @@ 

    Pixels, pixels, and more pixels

    // When we are finished dealing with pixels updatePixels();
    -
    -First, we should point out something important in the above example. Whenever you are accessing the pixels of a Processing window, you must alert Processing to this activity. This is accomplished with two functions: + + +

    + First, we should point out something important in the above example. Whenever you are accessing the pixels of a Processing window, you must alert Processing to this activity. This is accomplished with two functions: +

    +
    • loadPixels() This function is called before you access the pixel array, saying "load the pixels, I would like to speak with them!"
    • updatePixels() This function is called after you finish with the pixel array saying "Go ahead and update the pixels, I'm all done!"
    + + In the above example, because the colors are set randomly, we didn't have to worry about where the pixels are onscreen as we access them, since we are simply setting all the pixels with no regard to their relative location. However, in many image processing applications, the XY location of the pixels themselves is crucial information. A simple example of this might be, set every even column of pixels to white and every odd to black. How could you do this with a one dimensional pixel array? How do you know what column or row any given pixel is in? -

    + In programming with pixels, we need to be able to think of every pixel as living in a two dimensional world, but continue to access the data in one (since that is how it is made available to us). We can do this via the following formula: -

    -1. Assume a window or image with a given WIDTH and HEIGHT.
    -2. We then know the pixel array has a total number of elements equaling WIDTH * HEIGHT.
    -3. For any given X, Y point in the window, the location in our 1 dimensional pixel array is: -

    - -LOCATION = X + Y*WIDTH -

    - -

    -This may remind you of our two dimensional arrays tutorial. In fact, we'll need to use the same nested for loop technique. The difference is that, although we want to use for loops to think about the pixels in two dimensions, when we go to actually access the pixels, they live in a one dimensional array, and we have to apply the formula from the above illustration. -

    -Let's look at how it is done. -

    -Example: Setting Pixels according to their 2D location -

    + + +
      +
    1. Assume a window or image with a given WIDTH and HEIGHT.
    2. +
    3. We then know the pixel array has a total number of elements equaling WIDTH * HEIGHT.
    4. +
    5. For any given X, Y point in the window, the location in our 1 dimensional pixel array is: LOCATION = X + Y*WIDTH
    6. +
    + + + + + +

    + This may remind you of our two dimensional arrays tutorial. In fact, we'll need to use the same nested for loop technique. The difference is that, although we want to use for loops to think about the pixels in two dimensions, when we go to actually access the pixels, they live in a one dimensional array, and we have to apply the formula from the above illustration. +

    + +

    + Let's look at how it is done. +

    + +Example: Setting Pixels according to their 2D location +
     size(200, 200);
     loadPixels();  
    @@ -219,25 +277,36 @@ 

    Pixels, pixels, and more pixels

    updatePixels();
    -

    Intro To Image Processing

    -The previous section looked at examples that set pixel values according to an arbitrary calculation. We will now look at how we might set pixels according those found in an existing PImage object. Here is some pseudo-code. -

    -(1) Load the image file into a PImage object
    -(2) For each pixel in the PImage, retrieve the pixel's color and set the display pixel to that color. -

    -The PImage class includes some useful fields that store data related to the image -- width, height, and pixels. Just as with our user-defined classes, we can access these fields via the dot syntax. -

    + + +

    Intro To Image Processing

    + +

    + The previous section looked at examples that set pixel values according to an arbitrary calculation. We will now look at how we might set pixels according those found in an existing PImage object. Here is some pseudo-code. +

    + +
      +
    1. Load the image file into a PImage object
    2. +
    3. For each pixel in the PImage, retrieve the pixel's color and set the display pixel to that color.
    4. +
    + +

    + The PImage class includes some useful fields that store data related to the image—width, height, and pixels. Just as with our user-defined classes, we can access these fields via the dot syntax. +

    +
     PImage img = createImage(320,240,RGB);  // Make a PImage object
     println(img.width);  // Yields 320
     println(img.height); // Yields 240
     img.pixels[0] = color(255,0,0); // Sets the first pixel of the image to red
     
    -
    -Access to these fields allows us to loop through all the pixels of an image and display them onscreen. -

    -Example: Displaying the pixels of an image -

    + +

    + Access to these fields allows us to loop through all the pixels of an image and display them onscreen. +

    + +Example: Displaying the pixels of an image +
     PImage img;
     
    @@ -260,7 +329,8 @@ 

    Intro To Image Processing

    float b = blue(img.pixels[loc]); // Image Processing would go here - // If we were to change the RGB values, we would do it here, before setting the pixel in the display window. + // If we were to change the RGB values, we would do it here, + // before setting the pixel in the display window. // Set the display pixel to the image pixel pixels[loc] = color(r,g,b); @@ -269,23 +339,30 @@

    Intro To Image Processing

    updatePixels(); }
    -
    -Now, we could certainly come up with simplifications in order to merely display the image (for example, the nested loop is not required, not to mention that using the image() function would allow us to skip all this pixel work entirely.) However, example 15-7 provides a basic framework for getting the red, green, and blue values for each pixel based on its spatial orientation (XY location); ultimately, this will allow us to develop more advanced image processing algorithms. -

    -Before we move on, I should stress that this example works because the display area has the same dimensions as the source image. If this were not the case, you would simply have to have two pixel location calculations, one for the source image and one for the display area. -

    + +

    + Now, we could certainly come up with simplifications in order to merely display the image (for example, the nested loop is not required, not to mention that using the image() function would allow us to skip all this pixel work entirely.) However, example 15-7 provides a basic framework for getting the red, green, and blue values for each pixel based on its spatial orientation (XY location); ultimately, this will allow us to develop more advanced image processing algorithms. +

    + +

    + Before we move on, I should stress that this example works because the display area has the same dimensions as the source image. If this were not the case, you would simply have to have two pixel location calculations, one for the source image and one for the display area. +

    +
     int imageLoc = x + y*img.width;
    -
     int displayLoc = x + y*width;
     
    -

    Our second image filter, making our own "tint"

    -Just a few paragraphs ago, we were enjoying a relaxing coding session, colorizing images and adding alpha transparency with the friendly tint() method. For basic filtering, this method did the trick. The pixel by pixel method, however, will allow us to develop custom algorithms for mathematically altering the colors of an image. Consider brightness -- brighter colors have higher values for their red, green, and blue components. It follows naturally that we can alter the brightness of an image by increasing or decreasing the color components of each pixel. In the next example, we dynamically increase or decrease those values based on the mouse's horizontal location. (Note, the next two examples include only the image processing loop itself, the rest of the code is assumed.) -

    -Example: Adjusting image brightness -

    + +

    Our second image filter, making our own "tint"

    + +

    + Just a few paragraphs ago, we were enjoying a relaxing coding session, colorizing images and adding alpha transparency with the friendly tint() method. For basic filtering, this method did the trick. The pixel by pixel method, however, will allow us to develop custom algorithms for mathematically altering the colors of an image. Consider brightness—brighter colors have higher values for their red, green, and blue components. It follows naturally that we can alter the brightness of an image by increasing or decreasing the color components of each pixel. In the next example, we dynamically increase or decrease those values based on the mouse's horizontal location. (Note, the next two examples include only the image processing loop itself, the rest of the code is assumed.) +

    + +Example: Adjusting image brightness +
     for (int x = 0; x < img.width; x++) {
       for (int y = 0; y < img.height; y++ ) {
    @@ -310,13 +387,15 @@ 

    Our second image filter, making our own "tint"

    } }
    -
    -Since we are altering the image on a per pixel basis, all pixels need not be treated equally. For example, we can alter the brightness of each pixel according to its distance from the mouse. -

    - -

    -Example: Adjusting image brightness based on pixel location -

    + +

    + Since we are altering the image on a per pixel basis, all pixels need not be treated equally. For example, we can alter the brightness of each pixel according to its distance from the mouse. +

    + + + +Example: Adjusting image brightness based on pixel location +
     for (int x = 0; x < img.width; x++) {
       for (int y = 0; y < img.height; y++ ) {
    @@ -344,15 +423,23 @@ 

    Our second image filter, making our own "tint"

    }
    -

    Writing to another PImage object's pixels

    -All of our image processing examples have read every pixel from a source image and written a new pixel to the Processing window directly. However, it's often more convenient to write the new pixels to a destination image (that you then display using the image() function). We'll demonstrate this technique while looking at another simple pixel operation: threshold. -

    -A threshold filter displays each pixel of an image in only one of two states, black or white. That state is set according to a particular threshold value. If the pixel's brightness is greater than the threshold, we color the pixel white, less than, black. In the code below, we use an arbitrary threshold of 100. -

    - -

    -Example: Brightness Threshold -

    + + +

    Writing to another PImage object's pixels

    + + +

    + All of our image processing examples have read every pixel from a source image and written a new pixel to the Processing window directly. However, it's often more convenient to write the new pixels to a destination image (that you then display using the image() function). We'll demonstrate this technique while looking at another simple pixel operation: threshold. +

    + +

    + A threshold filter displays each pixel of an image in only one of two states, black or white. That state is set according to a particular threshold value. If the pixel's brightness is greater than the threshold, we color the pixel white, less than, black. In the code below, we use an arbitrary threshold of 100. +

    + + + +Example: Brightness Threshold +
     PImage source;       // Source image
     PImage destination;  // Destination image
    @@ -389,52 +476,70 @@ 

    Writing to another PImage object's pixels

    image(destination,0,0); }
    -
    -This particular functionality is available without per pixel processing as part of Processing's filter() function. Understanding the lower level code, however, is crucial if you want to implement your own image processing algorithms, not available with filter(). -

    -But if all you want to do is threshold, here is how: -
    -
    // Draw the image
    +     

    + This particular functionality is available without per pixel processing as part of Processing's filter() function. Understanding the lower level code, however, is crucial if you want to implement your own image processing algorithms, not available with filter(). +

    + +

    + But if all you want to do is threshold, here is how: +

    + +
    +// Draw the image
     image(img,0,0);
     // Filter the window with a threshold effect
     // 0.5 means threshold is 50% brightness
     filter(THRESHOLD,0.5);
     
    -

    Level II: Pixel Group Processing

    -In previous examples, we've seen a one-to-one relationship between source pixels and destination pixels. To increase an image's brightness, we take one pixel from the source image, increase the RGB values, and display one pixel in the output window. In order to perform more advanced image processing functions, we must move beyond the one-to-one pixel paradigm into pixel group processing. -

    -Let's start by creating a new pixel out of a two pixels from a source image -- a pixel and its neighbor to the left. -

    -If we know the pixel is located at (x,y): -

    + +

    Level II: Pixel Group Processing

    + +

    + In previous examples, we've seen a one-to-one relationship between source pixels and destination pixels. To increase an image's brightness, we take one pixel from the source image, increase the RGB values, and display one pixel in the output window. In order to perform more advanced image processing functions, we must move beyond the one-to-one pixel paradigm into pixel group processing. +

    + +

    + Let's start by creating a new pixel out of a two pixels from a source image—a pixel and its neighbor to the left. +

    + +

    + If we know the pixel is located at (x,y): +

    +
     int loc = x + y*img.width;
     color pix = img.pixels[loc];
     
    -
    -Then its left neighbor is located at (x-1,y): -

    + +

    + Then its left neighbor is located at (x-1,y): +

    +
     int leftLoc = (x-1) + y*img.width;
     color leftPix = img.pixels[leftLoc];
     
    -
    -We could then make a new color out of the difference between the pixel and its neighbor to the left. -

    + +

    + We could then make a new color out of the difference between the pixel and its neighbor to the left. +

    +
     float diff = abs(brightness(pix) - brightness(leftPix));
     pixels[loc] = color(diff);
     
    -
    -Here is the full algorithm: -

    - -

    -Example: Pixel neighbor differences (edges) -

    + +

    + Here is the full algorithm: +

    + + + +Example: Pixel neighbor differences (edges) +
     // Since we are looking at left neighbors
     // We skip the first column
    @@ -454,20 +559,29 @@ 

    Level II: Pixel Group Processing

    } }
    -
    -This example is a simple horizontal edge detection algorithm. When pixels differ greatly from their neighbors, they are most likely "edge" pixels. For example, think of a picture of white piece of paper on a black tabletop. The edges of that paper are where the colors are most different, where white meets black. -

    -In the previous example, we looked at two pixels to find edges. More sophisticated algorithms, however, usually involve looking at many pixels at a time. After all, each pixel has 8 immediate neighbors: top left, top, top right, right, bottom right, bottom, bottom left, left. -

    - - -

    -These image processing algorithms are often referred to as a "spatial convolution." The process uses a weighted average of an input pixel and its neighbors to calculate an output pixel. In other words, that new pixel is a function of an area of pixels. Neighboring areas of different sizes can be employed, such as a 3x3 matrix, 5x5, etc. -

    -Different combinations of weights for each pixel result in various effects. For example, we "sharpen" an image by subtracting the neighboring pixel values and increasing the center point pixel. A blur is achieved by taking the average of all neighboring pixels. (Note that the values in the convolution matrix add up to 1). -

    -For example, -

    + +

    + This example is a simple horizontal edge detection algorithm. When pixels differ greatly from their neighbors, they are most likely "edge" pixels. For example, think of a picture of white piece of paper on a black tabletop. The edges of that paper are where the colors are most different, where white meets black. +

    + +

    + In the previous example, we looked at two pixels to find edges. More sophisticated algorithms, however, usually involve looking at many pixels at a time. After all, each pixel has 8 immediate neighbors: top left, top, top right, right, bottom right, bottom, bottom left, left. +

    + + + +

    + These image processing algorithms are often referred to as a "spatial convolution." The process uses a weighted average of an input pixel and its neighbors to calculate an output pixel. In other words, that new pixel is a function of an area of pixels. Neighboring areas of different sizes can be employed, such as a 3x3 matrix, 5x5, etc. +

    + +

    + Different combinations of weights for each pixel result in various effects. For example, we "sharpen" an image by subtracting the neighboring pixel values and increasing the center point pixel. A blur is achieved by taking the average of all neighboring pixels. (Note that the values in the convolution matrix add up to 1). +

    + +

    + For example, +

    +
     Sharpen:
     -1   -1   -1
    @@ -479,178 +593,192 @@ 

    Level II: Pixel Group Processing

    1/9 1/9 1/9 1/9 1/9 1/9
    -
    + +

    Following is an example that performs a convolution using a 2D array (see Chapter 13, p. XX for a review of 2D arrays) to store the pixel weights of a 3x3 matrix. This example is probably the most advanced example we've encountered in this book so far since it involves so many elements (nested loops, 2D arrays, PImage pixels, and so on.) -

    - -

    -Example: Sharpen with Convolution -

    +

    + + + +Example: Sharpen with Convolution +
    -PImage img;
    -int w = 80;
    +PImage img;
    +int w = 80;
     
    -// It's possible to perform a convolution
    -// the image with different matrices
    +// It's possible to perform a convolution
    +// the image with different matrices
     
    -float[][] matrix = { { -1, -1, -1 },
    -                     { -1,  9, -1 },
    -                     { -1, -1, -1 } }; 
    +float[][] matrix = { { -1, -1, -1 },
    +                     { -1,  9, -1 },
    +                     { -1, -1, -1 } }; 
     
    -void setup() {
    -  size(200, 200);
    -  frameRate(30);
    -  img = loadImage("sunflower.jpg");
    +void setup() {
    +  size(200, 200);
    +  frameRate(30);
    +  img = loadImage("sunflower.jpg");
     }
     
    -void draw() {
    -  // We're only going to process a portion of the image
    -  // so let's set the whole image as the background first
    -  image(img,0,0);
    -  // Where is the small rectangle we will process
    -  int xstart = constrain(mouseX-w/2,0,img.width);
    -  int ystart = constrain(mouseY-w/2,0,img.height);
    -  int xend = constrain(mouseX+w/2,0,img.width);
    -  int yend = constrain(mouseY+w/2,0,img.height);
    -  int matrixsize = 3;
    -  loadPixels();
    -  // Begin our loop for every pixel
    -  for (int x = xstart; x < xend; x++) {
    -    for (int y = ystart; y < yend; y++ ) {
    -      // Each pixel location (x,y) gets passed into a function called convolution() 
    -      // which returns a new color value to be displayed.
    -      color c = convolution(x,y,matrix,matrixsize,img);
    -      int loc = x + y*img.width;
    -      pixels[loc] = c;
    -    }
    -  }
    -  updatePixels();
    -
    -  stroke(0);
    -  noFill();
    -  rect(xstart,ystart,w,w);
    +void draw() {
    +  // We're only going to process a portion of the image
    +  // so let's set the whole image as the background first
    +  image(img,0,0);
    +  // Where is the small rectangle we will process
    +  int xstart = constrain(mouseX-w/2,0,img.width);
    +  int ystart = constrain(mouseY-w/2,0,img.height);
    +  int xend = constrain(mouseX+w/2,0,img.width);
    +  int yend = constrain(mouseY+w/2,0,img.height);
    +  int matrixsize = 3;
    +  loadPixels();
    +  // Begin our loop for every pixel
    +  for (int x = xstart; x < xend; x++) {
    +    for (int y = ystart; y < yend; y++ ) {
    +      // Each pixel location (x,y) gets passed into a function called convolution() 
    +      // which returns a new color value to be displayed.
    +      color c = convolution(x,y,matrix,matrixsize,img);
    +      int loc = x + y*img.width;
    +      pixels[loc] = c;
    +    }
    +  }
    +  updatePixels();
    +
    +  stroke(0);
    +  noFill();
    +  rect(xstart,ystart,w,w);
     }
     
    -color convolution(int x, int y, float[][] matrix, int matrixsize, PImage img) {
    -  float rtotal = 0.0;
    -  float gtotal = 0.0;
    -  float btotal = 0.0;
    -  int offset = matrixsize / 2;
    -  // Loop through convolution matrix
    -  for (int i = 0; i < matrixsize; i++){
    -    for (int j= 0; j < matrixsize; j++){
    -      // What pixel are we testing
    -      int xloc = x+i-offset;
    -      int yloc = y+j-offset;
    -      int loc = xloc + img.width*yloc;
    -      // Make sure we have not walked off the edge of the pixel array
    -      loc = constrain(loc,0,img.pixels.length-1);
    -      // Calculate the convolution
    -      // We sum all the neighboring pixels multiplied by the values in the convolution matrix.
    -      rtotal += (red(img.pixels[loc]) * matrix[i][j]);
    -      gtotal += (green(img.pixels[loc]) * matrix[i][j]);
    -      btotal += (blue(img.pixels[loc]) * matrix[i][j]);
    -    }
    -  }
    -  // Make sure RGB is within range
    -  rtotal = constrain(rtotal,0,255);
    -  gtotal = constrain(gtotal,0,255);
    -  btotal = constrain(btotal,0,255);
    -  // Return the resulting color
    -  return color(rtotal,gtotal,btotal);
    +color convolution(int x, int y, float[][] matrix, int matrixsize, PImage img) {
    +  float rtotal = 0.0;
    +  float gtotal = 0.0;
    +  float btotal = 0.0;
    +  int offset = matrixsize / 2;
    +  // Loop through convolution matrix
    +  for (int i = 0; i < matrixsize; i++){
    +    for (int j= 0; j < matrixsize; j++){
    +      // What pixel are we testing
    +      int xloc = x+i-offset;
    +      int yloc = y+j-offset;
    +      int loc = xloc + img.width*yloc;
    +      // Make sure we have not walked off the edge of the pixel array
    +      loc = constrain(loc,0,img.pixels.length-1);
    +      // Calculate the convolution
    +      // We sum all the neighboring pixels multiplied by the values in the convolution matrix.
    +      rtotal += (red(img.pixels[loc]) * matrix[i][j]);
    +      gtotal += (green(img.pixels[loc]) * matrix[i][j]);
    +      btotal += (blue(img.pixels[loc]) * matrix[i][j]);
    +    }
    +  }
    +  // Make sure RGB is within range
    +  rtotal = constrain(rtotal,0,255);
    +  gtotal = constrain(gtotal,0,255);
    +  btotal = constrain(btotal,0,255);
    +  // Return the resulting color
    +  return color(rtotal,gtotal,btotal);
     }
     
    -

    Visualizing the Image

    - -You may be thinking: "Gosh, this is all very interesting, but seriously, when I want to blur an image or change its brightness, do I really need to write code? I mean, can't I use Photoshop?" Indeed, what we have achieved here is an merely an introductory understanding of what highly skilled programmers at Adobe do. The power of Processing, however, is the potential for real-time, interactive graphics applications. There is no need for us to live within the confines of "pixel point" and "pixel group" processing. -

    -Following are two examples of algorithms for drawing processing shapes. Instead of coloring the shapes randomly or with hard-coded values as we have in the past, we select colors from pixels inside of a PImage object. The image itself is never displayed; rather, it serves as a database of information that we can exploit for a multitude of creative pursuits. -

    -In this first example, for every cycle through draw(), we fill one ellipse at a random location onscreen with a color taken from its corresponding location in the source image. The result is a basic "pointillist-like" effect: -

    - -

    -Example: "Pointillism" -

    -
    -PImage img;
    -int pointillize = 16;
     
    -void setup() {
    -  size(200,200);
    -  img = loadImage("sunflower.jpg");
    -  background(0);
    -  smooth();
    +
    +    

    Visualizing the Image

    + +

    + You may be thinking: "Gosh, this is all very interesting, but seriously, when I want to blur an image or change its brightness, do I really need to write code? I mean, can't I use Photoshop?" Indeed, what we have achieved here is an merely an introductory understanding of what highly skilled programmers at Adobe do. The power of Processing, however, is the potential for real-time, interactive graphics applications. There is no need for us to live within the confines of "pixel point" and "pixel group" processing. +

    + +

    + Following are two examples of algorithms for drawing processing shapes. Instead of coloring the shapes randomly or with hard-coded values as we have in the past, we select colors from pixels inside of a PImage object. The image itself is never displayed; rather, it serves as a database of information that we can exploit for a multitude of creative pursuits. +

    + +

    + In this first example, for every cycle through draw(), we fill one ellipse at a random location onscreen with a color taken from its corresponding location in the source image. The result is a basic "pointillist-like" effect: +

    + + + +Example: "Pointillism" + +
    +PImage img;
    +int pointillize = 16;
    +
    +void setup() {
    +  size(200,200);
    +  img = loadImage("sunflower.jpg");
    +  background(0);
    +  smooth();
     }
     
    -void draw() {
    -  // Pick a random point
    -  int x = int(random(img.width));
    -  int y = int(random(img.height));
    -  int loc = x + y*img.width;
    -  
    -  // Look up the RGB color in the source image
    -  loadPixels();
    -  float r = red(img.pixels[loc]);
    -  float g = green(img.pixels[loc]);
    -  float b = blue(img.pixels[loc]);
    -  noStroke();
    -  
    -  // Draw an ellipse at that location with that color
    -  fill(r,g,b,100);
    -  ellipse(x,y,pointillize,pointillize);
    +void draw() {
    +  // Pick a random point
    +  int x = int(random(img.width));
    +  int y = int(random(img.height));
    +  int loc = x + y*img.width;
    +  
    +  // Look up the RGB color in the source image
    +  loadPixels();
    +  float r = red(img.pixels[loc]);
    +  float g = green(img.pixels[loc]);
    +  float b = blue(img.pixels[loc]);
    +  noStroke();
    +  
    +  // Draw an ellipse at that location with that color
    +  fill(r,g,b,100);
    +  ellipse(x,y,pointillize,pointillize);
     }
     
    -
    -In this next example, we take the data from a two-dimensional image and using the 3D translation techniques described in chapter 14, render a rectangle for each pixel in three-dimensional space. The z location is determined by the brightness of the color. Brighter colors appear closer to the viewer and darker ones farther away. - -

    - -

    -Example: 2D image mapped to 3D -

    -
    -PImage img;       // The source image
    -int cellsize = 2; // Dimensions of each cell in the grid
    -int cols, rows;   // Number of columns and rows in our system
     
    -void setup() {
    -  size(200, 200, P3D); 
    -  img  = loadImage("sunflower.jpg"); // Load the image
    -  cols = width/cellsize;             // Calculate # of columns
    -  rows = height/cellsize;            // Calculate # of rows
    +    

    + In this next example, we take the data from a two-dimensional image and using the 3D translation techniques described in chapter 14, render a rectangle for each pixel in three-dimensional space. The z location is determined by the brightness of the color. Brighter colors appear closer to the viewer and darker ones farther away. +

    + + + + + + + +
    + +Example: 2D image mapped to 3D + +
    +PImage img;       // The source image
    +int cellsize = 2; // Dimensions of each cell in the grid
    +int cols, rows;   // Number of columns and rows in our system
    +
    +void setup() {
    +  size(200, 200, P3D); 
    +  img  = loadImage("sunflower.jpg"); // Load the image
    +  cols = width/cellsize;             // Calculate # of columns
    +  rows = height/cellsize;            // Calculate # of rows
     }
     
    -void draw() {
    -  background(0);
    -  loadPixels();
    -  // Begin loop for columns
    -  for ( int i = 0; i < cols;i++) {
    -    // Begin loop for rows
    -    for ( int j = 0; j < rows;j++) {
    -      int x = i*cellsize + cellsize/2; // x position
    -      int y = j*cellsize + cellsize/2; // y position
    -      int loc = x + y*width;           // Pixel array location
    -      color c = img.pixels[loc];       // Grab the color
    -      // Calculate a z position as a function of mouseX and pixel brightness
    -      float z = (mouseX/(float)width) * brightness(img.pixels[loc]) - 100.0;
    -      // Translate to the location, set fill and stroke, and draw the rect
    -      pushMatrix();
    -      translate(x,y,z);
    -      fill(c);
    -      noStroke();
    -      rectMode(CENTER);
    -      rect(0,0,cellsize,cellsize);
    -      popMatrix();
    -    }
    -  }
    +void draw() {
    +  background(0);
    +  loadPixels();
    +  // Begin loop for columns
    +  for ( int i = 0; i < cols;i++) {
    +    // Begin loop for rows
    +    for ( int j = 0; j < rows;j++) {
    +      int x = i*cellsize + cellsize/2; // x position
    +      int y = j*cellsize + cellsize/2; // y position
    +      int loc = x + y*width;           // Pixel array location
    +      color c = img.pixels[loc];       // Grab the color
    +      // Calculate a z position as a function of mouseX and pixel brightness
    +      float z = (mouseX/(float)width) * brightness(img.pixels[loc]) - 100.0;
    +      // Translate to the location, set fill and stroke, and draw the rect
    +      pushMatrix();
    +      translate(x,y,z);
    +      fill(c);
    +      noStroke();
    +      rectMode(CENTER);
    +      rect(0,0,cellsize,cellsize);
    +      popMatrix();
    +    }
    +  }
     }
     
    -

     

    - -

    This tutorial is for Processing version 1.1+. If you see any errors or have comments, please let us know. This tutorial is from the book, Learning Processing, by Daniel Shiffman, published by Morgan Kaufmann Publishers, Copyright © 2008 Elsevier Inc. All rights reserved.

    + + - - -
    -
    -
    -

    This tutorial is Extension 5 from the second edition of Processing: A Programming Handbook for Visual Designers and Artists, published by MIT Press. Copyright 2013 MIT Press. This tutorial is for Processing version 2.0+. If you see any errors or have comments, please let us know.

    -
    -
    -

    -Digital technologies have spawned many changes to printing within the arts. The introduction of laser printers and personal computers into design offices in the mid-1980s was a catalyst for years of experimentation and innovation in typeface design, layout, and printing. Artists have produced prints from software since the 1960s, but these techniques have surged since 1990. Innovations have given digitally made prints a longer estimated life than color photographs printed from film. The recent deluge of digital cameras provided another change. Amateurs and professionals are skipping the lab and printing their images in the studio and at home. -
    -
    - This short text provides a brief history of the digital printing technologies that have led to these new techniques. It presents examples of software written to produce print output, and discusses a few common contemporary print technologies. The industry surrounding digital printing is full of trademarked names and buzzwords, so this text aspires to demystify some of the terminology and provide pointers to additional information. The content that follows is tailored for printing at home or working with a vendor to produce small editions. - -

    -
    -

    -

    Print and computers

    -When they originated in the 1960s, computer graphics were more often seen printed on paper than on screens. Computers of this time were enormous, expensive machines that were accessible only at research centers and universities, but prints found their way into galleries, journals, and newspapers. In 1963, the Computers and Automation journal announced the first competition for computer graphics to be judged using aesthetic criteria.1 The U.S. Army Ballistic Missile Research Laboratories won the first two competitions, but A. Michael Noll and Frieder Nake won the following two. In 1965 in Stuttgart, Georg Nees and Frieder Nake were the first individuals to exhibit their computer-generated images in a gallery. The same year, the work of A. Michael Noll and Bela Julesz was exhibited at the Howard Wise Gallery in New York.2 These shows presented drawings defined by code and output using a plotter. A plotter is a machine that controls the position of a physical pen on a drawing surface. Nake described his plotter in an essay for the Cybernetic Serendipity exhibition catalog: “I used the Graphomat Zuse Z 64 drawing machine controlled by punch tape. The machine has a drawing head guiding four pens, fed by Indian ink of different colours with nibs of varying thicknesses.”3 Because of mechanical and software limitations, the drawings exhibited in these shows were sparse, mostly geometric, black-and-white images. The plotter remained one of the most common output devices into the 1980s and is still in use today. Over the years, artists have explored many drawing surfaces and have attached brushes, pencils, and other marking instruments to the plotter’s head. -
    -
    - Another area of printed computer graphics produced during the 1960s was more similar to photography than to drawings. At Bell Laboratories, the engineers Kenneth Knowlton and Leon Harmon explored what they called “picture processing.” To create their 1966 Studies in Perception I, a 5 × 12 foot print of a reclining nude, they scanned a photograph with a device similar to a television camera to convert it to a series of numbers stored on a magnetic tape.4 The picture’s range of gray values was reduced to eight levels, and when it was printed using a microfilm plotter, each gray level was replaced with a corresponding icon with a similar density that, when viewed at a distance, simulated the gray value. The icons used for the print included mathematical symbols (multiplication and division signs) and electronics symbols for diodes and transistors. The final enlargement was made from the microfilm using a photographic process. The techniques used to create this work envisioned the now familiar technologies of scanning and image filtering. -
    -
    - During the 1980s, the cost of computers and printing technology fell to levels within reach of individual artists and designers. Mark Wilson started to work with personal computers and plotters in 1980. He utilized the resolution and precision of the plotter to produce dense, geometric textures. He has continued to explore new printing techniques and has produced work using the plotter to deposit acrylic onto linen and to draw with ink on mylar. In his 1985 book Drawing with Computers, Wilson explained how to use a personal computer and the BASIC programming language to control a plotter. The following program from the book draws a line from coordinate (100, 100) to (200, 200). The text following each apostrophe is a comment explaining the purpose of each line: -
    -
    -
    +

    + This tutorial is “Extension 4” from Processing: A Programming Handbook for Visual Designers and Artists, Second Edition, published by MIT Press. © 2014 MIT Press. If you see any errors or have comments, please let us know. +

    + +

    Print

    +

    Casey Reas

    + +

     

    + +

    + Digital technologies have spawned many changes to printing within the arts. The introduction of laser printers and personal computers into design offices in the mid-1980s was a catalyst for years of experimentation and innovation in typeface design, layout, and printing. Artists have produced prints from software since the 1960s, but these techniques have surged since 1990. Innovations have given digitally made prints a longer estimated life than color photographs printed from film. The recent deluge of digital cameras provided another change. Amateurs and professionals are skipping the lab and printing their images in the studio and at home. +

    + +

    + This short text provides a brief history of the digital printing technologies that have led to these new techniques. It presents examples of software written to produce print output, and discusses a few common contemporary print technologies. The industry surrounding digital printing is full of trademarked names and buzzwords, so this text aspires to demystify some of the terminology and provide pointers to additional information. The content that follows is tailored for printing at home or working with a vendor to produce small editions. +

    + + +

    Print and computers

    + +

    + When they originated in the 1960s, computer graphics were more often seen printed on paper than on screens. Computers of this time were enormous, expensive machines that were accessible only at research centers and universities, but prints found their way into galleries, journals, and newspapers. In 1963, the Computers and Automation journal announced the first competition for computer graphics to be judged using aesthetic criteria.1 The U.S. Army Ballistic Missile Research Laboratories won the first two competitions, but A. Michael Noll and Frieder Nake won the following two. In 1965 in Stuttgart, Georg Nees and Frieder Nake were the first individuals to exhibit their computer-generated images in a gallery. The same year, the work of A. Michael Noll and Bela Julesz was exhibited at the Howard Wise Gallery in New York.2 These shows presented drawings defined by code and output using a plotter. A plotter is a machine that controls the position of a physical pen on a drawing surface. Nake described his plotter in an essay for the Cybernetic Serendipity exhibition catalog: “I used the Graphomat Zuse Z 64 drawing machine controlled by punch tape. The machine has a drawing head guiding four pens, fed by Indian ink of different colours with nibs of varying thicknesses.”3 Because of mechanical and software limitations, the drawings exhibited in these shows were sparse, mostly geometric, black-and-white images. The plotter remained one of the most common output devices into the 1980s and is still in use today. Over the years, artists have explored many drawing surfaces and have attached brushes, pencils, and other marking instruments to the plotter’s head. +

    + +

    + Another area of printed computer graphics produced during the 1960s was more similar to photography than to drawings. At Bell Laboratories, the engineers Kenneth Knowlton and Leon Harmon explored what they called “picture processing.” To create their 1966 Studies in Perception I, a 5 × 12 foot print of a reclining nude, they scanned a photograph with a device similar to a television camera to convert it to a series of numbers stored on a magnetic tape.4 The picture’s range of gray values was reduced to eight levels, and when it was printed using a microfilm plotter, each gray level was replaced with a corresponding icon with a similar density that, when viewed at a distance, simulated the gray value. The icons used for the print included mathematical symbols (multiplication and division signs) and electronics symbols for diodes and transistors. The final enlargement was made from the microfilm using a photographic process. The techniques used to create this work envisioned the now familiar technologies of scanning and image filtering. +

    + +

    + During the 1980s, the cost of computers and printing technology fell to levels within reach of individual artists and designers. Mark Wilson started to work with personal computers and plotters in 1980. He utilized the resolution and precision of the plotter to produce dense, geometric textures. He has continued to explore new printing techniques and has produced work using the plotter to deposit acrylic onto linen and to draw with ink on mylar. In his 1985 book Drawing with Computers, Wilson explained how to use a personal computer and the BASIC programming language to control a plotter. The following program from the book draws a line from coordinate (100, 100) to (200, 200). The text following each apostrophe is a comment explaining the purpose of each line: +

    + +

     100 OPEN "COM1,1200,0,7,1" AS #1               'Serial communications opened
     110 PRINT #1,"!AE"                             'Initialize plotter
    @@ -40,13 +45,17 @@ 

    Print and computers

    160 PRINT #1,"!AX"+STR$(STARTX)+STR$(STARTY); 'Move pen head to coordinate (100,100) 170 PRINT #1,"!AY"+STR$(ENDX)+STR$(ENDY); 'Draw line to coordinate (200,200)
    -Each plotter manufacturer (e.g., Hewlett-Packard, Tektronix, IBM) had its own commands, but they all provided the ability to move the pen up and down and from one location to another. The above example was written for a Tektronix plotter. -
    -
    - The LaserWriter printer, introduced for Apple’s Macintosh computer in 1985, was an important innovation in printing technology. Combined with page-layout software and the Mac’s GUI interface, this early laser printer was the catalyst for the desktop publishing revolution. The LaserWriter printed at 300 dots per inch (dpi), while the more common dot matrix printers at that time printed at 72 dpi. The PostScript programming language was the essential software component of the LaserWriter. Each printer had a processor that ran the PostScript interpreter to rasterize the data for printing. Forms in a PostScript file are defined by coordinates and shape commands. This makes it possible to transform elements within a composition without losing resolution. The PostScript equivalent of the BASIC program presented above is: -
    -
    -
    +

    + +

    + Each plotter manufacturer (e.g., Hewlett-Packard, Tektronix, IBM) had its own commands, but they all provided the ability to move the pen up and down and from one location to another. The above example was written for a Tektronix plotter. +

    + +

    + The LaserWriter printer, introduced for Apple’s Macintosh computer in 1985, was an important innovation in printing technology. Combined with page-layout software and the Mac’s GUI interface, this early laser printer was the catalyst for the desktop publishing revolution. The LaserWriter printed at 300 dots per inch (dpi), while the more common dot matrix printers at that time printed at 72 dpi. The PostScript programming language was the essential software component of the LaserWriter. Each printer had a processor that ran the PostScript interpreter to rasterize the data for printing. Forms in a PostScript file are defined by coordinates and shape commands. This makes it possible to transform elements within a composition without losing resolution. The PostScript equivalent of the BASIC program presented above is: +

    + +

     /startX 100 def             % Create and assign startX variable
     /startY 100 def             % Create and assign startY variable
    @@ -55,315 +64,379 @@ 

    Print and computers

    startX startY moveto % Move to coordinate (100,100) endX endY lineto stroke % Draw line to coordinate (200,200)
    -Over time, the PostScript language became the de facto standard for printed output, and it served as a basis for ambitious visual experimentation. Rather than programming PostScript files directly, most people used software like Aldus PageMaker to design pages. Graphic designers started to use this technology to assert more personal control over typographic layout and to explore new visual possibilities. -
    -
    - This expanded freedom was manifested in Emigre magazine, started in 1984 with Rudy Vanderlans as editor/designer and his partner Zuzana Licko supplying new typefaces. Emigre is a digital type foundry, and the magazine simultaneously promoted the fonts and served as a protagonist in the wider debate on digital aesthetics within the design community. The pages of Emigre were filled with portfolios and interviews with the most interesting designers of that time, including P. Scott Makela, Rick Valicenti, and The Designers Republic. In the time before the Web and blogs, Emigre magazine was a place to be informed of new ideas and to discuss possible futures. When the last issue was published in 2005, Rick Poynor, founder of Eye magazine, wrote: “Emigre emerged at a time when technology was changing design forever, and the magazine sizzled with this energy and excitement.” With regard to Vanderlans, Poynor stated, “His page designs were exemplary demonstrations of the new digital design aesthetic.”5 -
    -
    - In The End of Print (1995), the design writer Lewis Blackwell wrote, “The designer of today works with resources that did not exist just a decade (or less) ago. The digital age has transformed the tools available and the processes by which ideas are realized. The functionality of earlier production methods has been emulated and superseded by this new technology.”6 The typographic flexibility encouraged by desktop publishing software was pushed to its limit in the pages of Beach Culture and Ray Gun. David Carson’s designs for these magazines about surfing and music were exciting and controversial. The visual style from page to page was wildly idiosyncratic, and the multiple layers of stressed typography and photography often bordered on illegibility, but the design was in the spirit of the content and the time. Carson explored the extremes of letter spacing, typographic texture, and mixing typefaces, but always with a sensitive eye for composition. -
    -
    - Printed work in the 1980s and 1990s was not all created using commercial desktop publishing software. Many artists and designers wrote custom software to realize their vision. The Beowolf typeface designed by LettError utilized code to produce a font that randomizes the design of every letter as it is printed. John Maeda’s early printed works from the 1990s fostered a surge of interest in programming images for print. These commercial posters for Japanese printers and type foundries utilize algorithms to generate images of astonishing complexity and resolution. Each of the ten posters for Morisawa use only the company’s logo to create a diverse range of dense, delicate typographic compositions. The work of Kenneth A. Huff is more representational than the graphic work of Maeda, yet it too is rooted in algorithmic abstraction. Influenced by organic patterns such as those found in lichen and drying mud, Huff develops unique numerical formulas to use as the basis of his compositions. He places an emphasis on accurate rendering of textures and lighting to evoke tactility, but his work diverges from the constraints of physical materials. -
    -
    - Rapid advancements in inks and paper technology have made it possible for digital prints to have the longevity necessary for the art market. Artists who previously worked with traditional materials and techniques have started to use digital printing technologies in place of etching and lithography, and photographers have replaced darkrooms with computers. In the early 1990s, Iris prints became the first digital prints to be heavily used by established printmakers and photographers. At this time, Robert Rauschenberg, wellknown for his lithographs, began making Iris prints with vegetable dyes and transferring the images to another piece of paper to make collages. This technique was similar to his transferred lithograph images and silkscreen painting from the 1960s, but gave him more control. Other well-known early adopters of digital printing include Chuck Close, Jim Dine, and William Wegman. -
    -
    - Artists have also started to combine new digital techniques with traditional art materials. For example, recent prints from Jean-Pierre Hébert use a computer-controlled machine to etch a copper plate, and the physical printing process is executed traditionally. Manfred Mohr prints onto canvas and then stretches the prints over frames. Subsequent technologies have again changed the landscape of digital printing, and more artists continue to use the technology. -

    -
    -
    -

    -

    High-resolution file export

    -Images saved directly from screen are created at the screen’s resolution, typically around 100 pixels per inch (ppi). This low resolution is clearly visible when the images are printed with a high-resolution printer. In contrast to screen resolution, printers are capable of 9600 dpi. Two primary techniques are used to create high-resolution files with software. The first technique saves a vector file, and the second saves a raster (bitmap) file. The vector technique creates files that store shape information as coordinate points. Common vector formats are PDF, AI, EPS, and SVG. The raster technique stores shape information as pixels. Common raster formats are TIFF, JPEG, TARGA, and PNG. A vector file can be output at any size without loss of resolution, but raster files do not scale gracefully. -
    -The difference is illustrated with this diagram: -
    -
    - -
    -
    -Use the vector technique to export line art, type, or shapes that can be printed professionally, published, or printed at very large sizes. It’s also helpful to create a file that can be edited further with a program like Inkscape or Adobe Illustrator. Raster images are useful when exporting an image from a program that does not refresh its background each frame. If the image accumulates by adding each new frame to the display window, it may not be possible for vector data to achieve the same effect, or it may be too much geometry to store in a single file. A raster file does not represent each visual element separately (it saves it as a series of pixels), so it is editable only by programs like GIMP and Photoshop. A raster file can be printed with as much resolution as a vector file if it is output with a large enough width and height setting to give the file a high resolution when scaled for print. For example, to print a four-inch image at 600 dpi would require size(2400,2400) inside setup(). Vector files are eventually rasterized during the printing process, so it’s simply a matter of when the rasterizing takes place—whether directly from the program, or inside a professional raster image processor (RIP). The following examples clarify the strengths and weaknesses of each technique. -
    -
    -Example 1: Render to PDF
    -When PDF is used as the third parameter to the size() function, the program renders to a PDF file instead of drawing to the display window. The file name is set by a fourth parameter to size() and the file is saved to the sketch’s folder. Most sketches can be rendered as PDF by simply adding the two parameters to the size() command and selecting Sketch -> Import Library -> PDF. Once you do this, you’ll no longer see the image on-screen as it is running, but it becomes possible to create PDF files at sizes much larger than the screen. -
    -
    -Example 2: Render to screen, export to PDF -
    -This example saves a PDF file while simultaneously drawing to the screen. The beginRecord() function opens a new file, and all subsequent drawing functions are echoed to this file as well as to the display window. The endRecord() function stops the recording process and closes the file. The beginRecord() function requires two parameters; the first is the renderer to use (in this example, PDF), and the second is the file name. -
    -
    -Example 3: Save one frame from a continuous program -
    -This example saves a PDF file each time the mouse is pressed. The boolean variable saveOneFrame is set to true when a mouse button is pressed, causing beginRecord() to run the next time through draw(). At the end of draw(), endRecord() is run and the variable is set to false so another file won’t be saved while drawing the next frame. Each PDF file is numbered with the current frame (the number of elapsed frames since the program started). -
    -
    -Example 4: Accumulate many frames into one PDF -
    -This example saves multiple frames drawn to the screen within a single PDF file. The file opens when the B key is pressed, and everything drawn in subsequent frames is saved into it, until the E key is pressed. The background function is run after beginRecord() to clear the background within the PDF document as well as in the display window. This example draws only one new line to the PDF file each frame so the file remains small, but it’s possible to write thousands of lines each frame. However, when vector files get very large, computers can have difficulty opening and printing them. -
    -
    -Example 5: Save a TIFF image from a high-resolution off-screen buffer -
    -This example creates a TIFF file larger than the screen and draws into it directly, rather than drawing to the screen. The createGraphics() function creates an object from the PGraphics class (PGraphics is the main graphics and rendering context for Processing). The beginDraw() method is necessary to prepare for drawing, then each subsequent drawing function is written into the large raster object. The endDraw() and save() methods are necessary to complete the file and then save it to the machine so that it can later be viewed in a different program such as GIMP or Photoshop. -
    -
    -Example 6: Scale and segment an image -
    -This example saves a series of image files at screen resolution from a single image enlarged to any dimension. These files can be tiled within an image editor such as Photoshop to create a single, high-resolution file. Another program can also be written to tile the images together automatically. A scaleValue of 2 tiles the image to 4 files, a scaleValue of 3 tiles the image to 9 files, etc. This example code works only with 2D images. -
    -
    -After a file is generated through software, it is often modified before it is printed. Common changes include tweaking color or changing the weight of the lines after print tests. To make changes, load raster files into a program such as GIMP or Photoshop. Load vector files into a program such as Inkscape, Illustrator, or CorelDRAW. -

    -
    -
    +

    -

    -

    Production

    -Like traditional printing technologies, creating a high-quality digital print is a craft that requires knowledge and experience in addition to excellent tools and machines. The quality of a print is affected by the quality of the printer, ink, and paper, the preparation of the digital file, and the printer settings. Each of these components is introduced below. -
    -
    -Printing technologies -
    -Many different printing technologies are currently in use by artists and designers, and each has unique attributes. This list presents some of the most popular ones. Because printing technology changes rapidly, specific printer models are not discussed. -
    -
    - Laser. Laser printers are exceptional because of their high resolution, speed, and low cost per page. For these reasons, they are ubiquitous in office environments. Laser printers use a technology similar to that of photocopiers. When a print is made, a cylindrical drum inside the printer is electrically charged. A high-precision laser is reflected to strike the drum, and it reverses the electrical charge where it hits. When the drum comes in contact with charged toner (small particles of carbon blended with a polymer), the toner is attracted to the drum where the laser hit. A sheet of paper is then passed over the drum, and the toner is transferred and then fused to the paper surface with heat. -
    -
    - Inkjet. Inkjet prints are the most common technology for home printers because of their low cost and high image quality. They have also become a dominant technology for professional photographic printing. In comparison to laser printers, inkjet printers are slow, but they can produce images with a much higher resolution. They achieve this resolution by precisely squirting tiny droplets of ink onto the page. For this reason, the actual resolution of an inkjet can’t compare directly to that of a laser printer, which is more precise. A 600 dpi inkjet printer may produce distinguishable shapes down to 150 dpi, while a laser printer at 600 dpi maintains precision almost to the full 600 dpi. Each inkjet printer operates using one of three technologies: thermal, piezoelectric, or continuous. The thermal technique forces a drop of ink onto the paper by using heat to cause a tiny steam explosion within a chamber. The piezoelectric technique bends a piezoelectric crystal to force a droplet out of the ink chamber. The continuous technique sends a constant flow of droplets but charges each with a varying electrostatic field that determines how or whether it will hit the paper. Inkjet printers are sometimes also called bubblejet printers. -
    -
    - Digital chromogenic print (C Print). A digital C print is similar to a traditional color photographic print, but a digital file is used instead of a negative. A C print is made by exposing photographic paper to light (either an LED or laser) inside the printer. It is then processed using chemicals, just like a photographic print. Chromira and Lightjet are two popular types of printers that use this technique. -
    -
    - Iris. Iris printers were developed to make full-color proofs before a job was printed in large numbers on a commercial press. They started to be used as fine art printers in the early 1990s. The most distinct aspect of this technology is the ability to print on many different flexible substrates including paper, silk, and canvas. To make an Iris print, the substrate is attached to a metal drum and spun at a high speed while tiny drops of ink are applied to the substrate in a high-pressure stream. An Iris printer is a specific type of inkjet printer. -
    -
    - Giclée. Giclée (pronounced zhee-CLAY) is not a specific printing technology; it is a term used to define a high-quality, digitally produced fine art print. The term giclée was selected to distance the technique from connotations to digital technology and computers, as a tactic to gain acceptance within the art community. The first giclée prints were made using the Iris printing technology, but they are now made using other technologies as well. -
    -
    - Other techniques. In addition to the printing technologies mentioned above, commercial printers offer a wide selection of specialized printers for creating large-format prints for buses, billboards, and buildings. These printing techniques produce lower-resolution images, but they look crisp at a distance. -
    -
    -Ink -
    - The various printing technologies use different types of inks. Laser printers use toner, inkjet printers use liquid inks, and C prints don’t use inks because they are made with a photographic process. Toner must be fixed with heat, but liquid inks are absorbed into the paper. Inkjet inks can be divided into two broad categories: dye-based and pigmented. In comparison to pigmented inks, the more common dye-based inks are not water-resistant, are less expensive, are less resistant to fading, and can create more vivid colors. -
    -
    - Ink selection partially determines how long a print will last. Inkjet inks have been notorious for fading color (early prints could fade within six months), but prints from some of the current generation of printers are rated to hold their color for over 100 years when used with special papers. Ultraviolet (UV) light is a huge contributing factor to fading. Use frames with UV-filtering glass or plexiglass to significantly increase the life of the print. -
    -
    -Paper -
    - Paper is defined by its surface, material, and weight. Basic surface options include matte, luster, semigloss, gloss, and supergloss with textures ranging from extremely smooth to rough. Paper is typically made from wood fibers, but fibers from cotton, hemp, linen, and rice are also used. Paper made from wood is naturally acidic, so look for papers that are acid-free (pH neutral) to increase the longevity of prints. Paper made from 100 percent rag is the most stable and will not grow brittle with age. The weight of a paper affects its thickness. Fine art papers are usually measured in units of grams per square meter (gsm or g/m2). Common weights range from 110 (thin) to 350 (thick). -
    -
    - The selection of papers available for digital printing is extremely limited in comparison to those manufactured for traditional fine art and commercial printing, but the selection is still broad. Printer manufacturers such as Hewlett-Packard, Canon, and Epson offer their own papers, but the finest-quality paper can arguably be found at companies that specialize in making paper. Companies like Hahnemühle and Somerset have recently started producing papers specifically for digital printing technologies. Some inkjet printers require paper to be coated with a special layer to stop the ink from bleeding into the paper and dulling the color. Iris printers offer the widest selection of printable media. An Iris printer can print on any absorbent material and still produce strong color. -
    - Paper for printers comes in sheets and rolls, but depending on where you live, it will either be sized according to the international ISO 216 standard (A4, A3, etc.) or North American sizes (letter, tabloid, etc.). +

    + Over time, the PostScript language became the de facto standard for printed output, and it served as a basis for ambitious visual experimentation. Rather than programming PostScript files directly, most people used software like Aldus PageMaker to design pages. Graphic designers started to use this technology to assert more personal control over typographic layout and to explore new visual possibilities. +

    -
    -
    -File preparation -
    - The format, resolution, and color profile are the most important components of preparing a file. For the best printing results, files should be saved in a format that does not compress the data in a way that loses information. For instance, the JPEG image format compresses a file by removing color data. Each type of printer produces the best results when files are at a specific resolution. Images should typically be saved at 300 dpi or higher. Images produced for Inkjet printers should be prepared at a dpi resolution that is an increment of the maximum printer resolution. For example, an image file prepared for a 2880 dpi printer should be saved at 360 dpi (360 × 8 = 2880). The 360 dpi resolution is suggested for photographic images, but the quality of an image with fine lines can be improved by doubling the resolution to 720 dpi (720 × 4 = 2880). A higher dpi resolution won’t help a great deal (with inkjet) and will significantly increase file size. The color profile for a file is essential to match color when working with other people or across different computers. Each file should be tagged with a color profile to specify the color space of the document (e.g., ColorMatch RGB or Adobe RGB 1998). A color profile tells an output device such as a monitor or printer how to interpret the file’s numerical color data to display it correctly on that device. -
    -
    - Our experience has shown that complex vector files should be rasterized in a program such as Adobe Photoshop before they are sent to a vendor for printing. Most printers specialize in printing photographs and have more competence in working with image formats like TIFF and PSD. Printers eventually rasterize the image, and it’s a good idea to have complete control over this process, unless the print shop specifies otherwise. -
    -
    -Inkjet printer settings -
    - C prints and Iris prints are typically made through a vendor and laser printing is straightforward. Making a high-quality print with an inkjet printer, however, is often done at home but requires following a few important protocols. Because every type of paper behaves differently with each printer, it’s necessary to define the paper type within the print dialog box. Most printers offer selections for their proprietary papers. If you are using one of these papers, select it from the list. If you are using a different paper, you may want to install the ICC profile for the paper that matches the printer.7 The dialog box will also offer an option to set the dpi of the print. Sometimes it’s necessary to go into the advanced settings to gain access to this. There are a few things to consider when selecting the dpi. Glossy papers can hold a higher resolution than matte papers, and higher-resolution prints require more ink. Unless your print has extremely precise details and will be viewed close up, 1440 dpi is an adequate resolution. -
    -
    - Making test prints is an essential step toward producing a high-quality print. Precise colors and line weights look very different on-screen than on paper. If working with a vendor, always have a small test print made to check the quality before producing the final print. -

    -
    -
    +

    + This expanded freedom was manifested in Emigre magazine, started in 1984 with Rudy Vanderlans as editor/designer and his partner Zuzana Licko supplying new typefaces. Emigre is a digital type foundry, and the magazine simultaneously promoted the fonts and served as a protagonist in the wider debate on digital aesthetics within the design community. The pages of Emigre were filled with portfolios and interviews with the most interesting designers of that time, including P. Scott Makela, Rick Valicenti, and The Designers Republic. In the time before the Web and blogs, Emigre magazine was a place to be informed of new ideas and to discuss possible futures. When the last issue was published in 2005, Rick Poynor, founder of Eye magazine, wrote: “Emigre emerged at a time when technology was changing design forever, and the magazine sizzled with this energy and excitement.” With regard to Vanderlans, Poynor stated, “His page designs were exemplary demonstrations of the new digital design aesthetic.”5 +

    -

    Conclusion

    +

    + In The End of Print (1995), the design writer Lewis Blackwell wrote, “The designer of today works with resources that did not exist just a decade (or less) ago. The digital age has transformed the tools available and the processes by which ideas are realized. The functionality of earlier production methods has been emulated and superseded by this new technology.”6 The typographic flexibility encouraged by desktop publishing software was pushed to its limit in the pages of Beach Culture and Ray Gun. David Carson’s designs for these magazines about surfing and music were exciting and controversial. The visual style from page to page was wildly idiosyncratic, and the multiple layers of stressed typography and photography often bordered on illegibility, but the design was in the spirit of the content and the time. Carson explored the extremes of letter spacing, typographic texture, and mixing typefaces, but always with a sensitive eye for composition. +

    + +

    + Printed work in the 1980s and 1990s was not all created using commercial desktop publishing software. Many artists and designers wrote custom software to realize their vision. The Beowolf typeface designed by LettError utilized code to produce a font that randomizes the design of every letter as it is printed. John Maeda’s early printed works from the 1990s fostered a surge of interest in programming images for print. These commercial posters for Japanese printers and type foundries utilize algorithms to generate images of astonishing complexity and resolution. Each of the ten posters for Morisawa use only the company’s logo to create a diverse range of dense, delicate typographic compositions. The work of Kenneth A. Huff is more representational than the graphic work of Maeda, yet it too is rooted in algorithmic abstraction. Influenced by organic patterns such as those found in lichen and drying mud, Huff develops unique numerical formulas to use as the basis of his compositions. He places an emphasis on accurate rendering of textures and lighting to evoke tactility, but his work diverges from the constraints of physical materials. +

    + +

    + Rapid advancements in inks and paper technology have made it possible for digital prints to have the longevity necessary for the art market. Artists who previously worked with traditional materials and techniques have started to use digital printing technologies in place of etching and lithography, and photographers have replaced darkrooms with computers. In the early 1990s, Iris prints became the first digital prints to be heavily used by established printmakers and photographers. At this time, Robert Rauschenberg, wellknown for his lithographs, began making Iris prints with vegetable dyes and transferring the images to another piece of paper to make collages. This technique was similar to his transferred lithograph images and silkscreen painting from the 1960s, but gave him more control. Other well-known early adopters of digital printing include Chuck Close, Jim Dine, and William Wegman. +

    + +

    + Artists have also started to combine new digital techniques with traditional art materials. For example, recent prints from Jean-Pierre Hébert use a computer-controlled machine to etch a copper plate, and the physical printing process is executed traditionally. Manfred Mohr prints onto canvas and then stretches the prints over frames. Subsequent technologies have again changed the landscape of digital printing, and more artists continue to use the technology. +

    + + + + +

    High-resolution file export

    + + +

    + Images saved directly from screen are created at the screen’s resolution, typically around 100 pixels per inch (ppi). This low resolution is clearly visible when the images are printed with a high-resolution printer. In contrast to screen resolution, printers are capable of 9600 dpi. Two primary techniques are used to create high-resolution files with software. The first technique saves a vector file, and the second saves a raster (bitmap) file. The vector technique creates files that store shape information as coordinate points. Common vector formats are PDF, AI, EPS, and SVG. The raster technique stores shape information as pixels. Common raster formats are TIFF, JPEG, TARGA, and PNG. A vector file can be output at any size without loss of resolution, but raster files do not scale gracefully. +

    + +

    + The difference is illustrated with this diagram: +

    + + + + + + +

    + Use the vector technique to export line art, type, or shapes that can be printed professionally, published, or printed at very large sizes. It’s also helpful to create a file that can be edited further with a program like Inkscape or Adobe Illustrator. Raster images are useful when exporting an image from a program that does not refresh its background each frame. If the image accumulates by adding each new frame to the display window, it may not be possible for vector data to achieve the same effect, or it may be too much geometry to store in a single file. A raster file does not represent each visual element separately (it saves it as a series of pixels), so it is editable only by programs like GIMP and Photoshop. A raster file can be printed with as much resolution as a vector file if it is output with a large enough width and height setting to give the file a high resolution when scaled for print. For example, to print a four-inch image at 600 dpi would require size(2400,2400) inside setup(). Vector files are eventually rasterized during the printing process, so it’s simply a matter of when the rasterizing takes place—whether directly from the program, or inside a professional raster image processor (RIP). After a file is generated through software, it is often modified before it is printed. Common changes include tweaking color or changing the weight of the lines after print tests. To make changes, load raster files into a program such as GIMP or Photoshop. Load vector files into a program such as Inkscape, Illustrator, or CorelDRAW. The following examples clarify the strengths and weaknesses of each technique. +

    + + + +

    Example 1: Render to PDF

    + +

    + When PDF is used as the third parameter to the size() function, the program renders to a PDF file instead of drawing to the display window. The file name is set by a fourth parameter to size() and the file is saved to the sketch’s folder. Most sketches can be rendered as PDF by simply adding the two parameters to the size() command and selecting Sketch -> Import Library -> PDF. Once you do this, you’ll no longer see the image on-screen as it is running, but it becomes possible to create PDF files at sizes much larger than the screen. +

    -

    - Only within the last fifteen years have digital printing technologies begun to rival traditional printing techniques in their resolution and longevity, but there is a vast discrepancy between the physical qualities of a digital print and an original Hokusai (1760–1849) woodblock print or an Albrecht Dürer (1472–1528) etching. Each printing technique has its constraints and advantages. One arguable advantage of digital printing is the absence of a physical representation of the print. A lithograph has a corresponding stone, and offset printing has a metal plate, but the information for a digital print is stored in a computer’s memory and is therefore easier to modify. The primary advantage of digital printing is the ease with which a software image can be manifested as a physical image. In contrast to an image on-screen, a print can have a much higher resolution and will exist long after the software becomes incompatible with future computers. -
    -
    - There are also disadvantages to printing software images. The ability to animate the image is lost, and the color palette is reduced. Digital printing technology evolves rapidly, and it’s possible that the current research into electronic paper (e-paper, e-ink) and organic light-emitting diodes (OLEDs) will allow the best aspects of printed images to merge with the best elements of digital screens. These or other emerging technologies may make it possible for digital printing to evolve into an original area of image-making rather than simply mimicking traditional printing technologies. -
    -
    -Notes -
    -1. H. W. Franke, Computer Graphics, Computer Art (Phaidon, 1971), p. 60.
    -2. Ibid., p. 69.
    -3. Frieder Nake, “Notes on the Programming of Computer Graphics,” In Cybernetic Serendipity, edited by Jasia Reichardt (Praeger, 1969), p. 77.
    -4. This work is also credited as Mural in the exhibition catalog Cybernetic Serendipity.
    -5. Rick Poynor, “Emigre: An Ending,” Design Observer, 10 November 2005.
    - http://www.designobserver.com/archives/007816.html.
    -6. Lewis Blackwell, The End of Print: The Graphic Design of David Carson (Chronicle Books, 1995), p. 173.
    -7. ICC profiles are files that define the mappings between a print’s data and the specific paper and printer specifications. Well-designed profiles can increase the quality of a print. Check the website of the paper manufacturer to see if it has created one for your printer. -

    -
    -
    -

    -

    Code

    -
    -
    -Example 1: Render to PDF
    +/*
    + * Example 1: Render to PDF
    + */
     
    -import processing.pdf.*;          // Import PDF code
    +import processing.pdf.*;          // Import PDF code
    +
    +size(600, 600, PDF, "line.pdf");  // Set PDF as the renderer
    +background(255);                  
    +stroke(0);                                   
    +line(200, 0, width/2, height);    // Draw line to PDF
    +exit();                           // Stop the program
     
    -size(600, 600, PDF, "line.pdf");  // Set PDF as the renderer
    -background(255);                  
    -stroke(0);                                   
    -line(200, 0, width/2, height);    // Draw line to PDF
    -exit();                           // Stop the program
     
    -
    -
    -Example 2: Render to screen, export to PDF -
    + +

    Example 2: Render to screen, export to PDF

    + +

    + This example saves a PDF file while simultaneously drawing to the screen. The beginRecord() function opens a new file, and all subsequent drawing functions are echoed to this file as well as to the display window. The endRecord() function stops the recording process and closes the file. The beginRecord() function requires two parameters; the first is the renderer to use (in this example, PDF), and the second is the file name. +

    -import processing.pdf.*;          // Import PDF code
    -
    -size(600, 600);
    -beginRecord(PDF, "line.pdf");     // Start writing to PDF
    -background(255);                  
    -stroke(0, 20);		                 
    -strokeWeight(20);                 
    -line(200, 0, 400, height);        // Draw line to screen and to PDF
    -endRecord();                      // Stop writing to PDF
    +/*
    + * Example 2:  Render to screen, export to PDF
    + */
    +
    +import processing.pdf.*;          // Import PDF code
    +
    +size(600, 600);
    +beginRecord(PDF, "line.pdf");     // Start writing to PDF
    +background(255);                  
    +stroke(0, 20);                     
    +strokeWeight(20);                 
    +line(200, 0, 400, height);        // Draw line to screen and to PDF
    +endRecord();                      // Stop writing to PDF
    +
     
    -
    -
    -Example 3: Save one frame from a continuous program +

    Example 3: Save one frame from a continuous program

    + +

    + This example saves a PDF file each time the mouse is pressed. The boolean variable saveOneFrame is set to true when a mouse button is pressed, causing beginRecord() to run the next time through draw(). At the end of draw(), endRecord() is run and the variable is set to false so another file won’t be saved while drawing the next frame. Each PDF file is numbered with the current frame (the number of elapsed frames since the program started). +

    +
    -import processing.pdf.*;  // Import PDF code
    +/*
    + * Example 3:  Save one frame from a continuous program
    + */
     
    -boolean saveOneFrame = false;
    +import processing.pdf.*;  // Import PDF code
     
    -void setup() {
    -  size(600, 600);
    +boolean saveOneFrame = false;
    +
    +void setup() {
    +  size(600, 600);
     }
     
    -void draw() {
    -  if (saveOneFrame == true) {             // When the saveOneFrame boolean is true,
    -    beginRecord(PDF, "line-####.pdf");    // start recording to the PDF
    -  }
    -  background(255);
    -  stroke(0, 20);
    -  strokeWeight(20);
    -  line(mouseX, 0, width-mouseY, height);
    -  if (saveOneFrame == true) {             // If the PDF has been recording,
    -    endRecord();                          // stop recording, 
    -    saveOneFrame = false;                 // and set the boolean value to false
    -  }
    +void draw() {
    +  if (saveOneFrame == true) {             // When the saveOneFrame boolean is true,
    +    beginRecord(PDF, "line-####.pdf");    // start recording to the PDF
    +  }
    +  background(255);
    +  stroke(0, 20);
    +  strokeWeight(20);
    +  line(mouseX, 0, width-mouseY, height);
    +  if (saveOneFrame == true) {             // If the PDF has been recording,</em>
    +    endRecord();                          // stop recording, 
    +    saveOneFrame = false;                 // and set the boolean value to false
    +  }
     }
     
    -void mousePressed() {                     // When a mouse button is pressed,
    -  saveOneFrame = true;                    // trigger PDF recording within the draw()
    +void mousePressed() {                     // When a mouse button is pressed,
    +  saveOneFrame = true;                    // trigger PDF recording within the draw()
     }
    +
     
    -
    -
    -Example 4: Accumulate many frames into one PDF + +

    Example 4: Accumulate many frames into one PDF

    + +

    + This example saves multiple frames drawn to the screen within a single PDF file. The file opens when the B key is pressed, and everything drawn in subsequent frames is saved into it, until the E key is pressed. The background function is run after beginRecord() to clear the background within the PDF document as well as in the display window. This example draws only one new line to the PDF file each frame so the file remains small, but it’s possible to write thousands of lines each frame. However, when vector files get very large, computers can have difficulty opening and printing them. +

    -import processing.pdf.*;  // Import PDF code
    +/*
    + * Example 4:  Accumulate many frames into one PDF
    + */
    +
    +import processing.pdf.*;  // Import PDF code
     
    -void setup() {
    -  size(600, 600);
    -  background(255);
    +void setup() {
    +  size(600, 600);
    +  background(255);
     }
     
    -void draw() {
    -  stroke(0, 20);
    -  strokeWeight(20);
    -  line(mouseX, 0, width-mouseY, height);
    +void draw() {
    +  stroke(0, 20);
    +  strokeWeight(20);
    +  line(mouseX, 0, width-mouseY, height);
     }
     
    -void keyPressed() {
    -  if (key == 'B' || key == 'b') {         // When 'B' or 'b' is pressed,
    -    beginRecord(PDF, "lines.pdf");        // start recording to the PDF 
    -    background(255);                      // Set a white background
    -  } else if (key == 'E' || key == 'e') {  // When 'E' or 'e' is pressed,
    -    endRecord();                          // stop recording the PDF and
    -    exit();                               // quit the program
    -  }
    +void keyPressed() {
    +  if (key == 'B' || key == 'b') {         // When 'B' or 'b' is pressed,
    +    beginRecord(PDF, "lines.pdf");        // start recording to the PDF 
    +    background(255);                      // Set a white background
    +  } else if (key == 'E' || key == 'e') {  // When 'E' or 'e' is pressed,
    +    endRecord();                          // stop recording the PDF and
    +    exit();                               // quit the program
    +  }
     }
    +
     
    -
    -
    -Example 5: Save a TIFF image from a high-resolution off-screen buffer + + +

    Example 5: High-resolution off-screen buffer

    + +

    + This example creates a TIFF file larger than the screen and draws into it directly, rather than drawing to the screen. The createGraphics() function creates an object from the PGraphics class (PGraphics is the main graphics and rendering context for Processing). The beginDraw() method is necessary to prepare for drawing, then each subsequent drawing function is written into the large raster object. The endDraw() and save() methods are necessary to complete the file and then save it to the machine so that it can later be viewed in a different program such as GIMP or Photoshop. +

    -PGraphics big;  // Declare a PGraphics variable
    -
    -void setup() {
    -  big = createGraphics(3000, 3000);  // Create a new PGraphics object
    -  big.beginDraw();                           // Start drawing to the PGraphics object 
    -  big.background(128);                       // Set the background
    -  big.line(20, 1800, 1800, 900);             // Draw a line
    -  big.endDraw();                             // Stop drawing to the PGraphics object 
    -  big.save("big.tif");
    +/* 
    + * Example 5: High-resolution off-screen buffer
    + */
    +
    +PGraphics big;  // Declare a PGraphics variable
    +
    +void setup() {
    +  big = createGraphics(3000, 3000);  // Create a new PGraphics object
    +  big.beginDraw();                   // Start drawing to the PGraphics object 
    +  big.background(128);               // Set the background
    +  big.line(20, 1800, 1800, 900);     // Draw a line
    +  big.endDraw();                     // Stop drawing to the PGraphics object 
    +  big.save("big.tif");
     }
    +
     
    -
    -
    -Example 6: Scale and segment an image -
    -// Draws an image larger than the screen by tiling it into small sections.
    -// The scaleValue variable sets amount of scaling: 1 is 100%, 2 is 200%, etc.
    +	

    Example 6: Scale and segment an image

    -int scaleValue = 3; // Multiplication factor -int xoffset = 0; // x-axis offset -int yoffset = 0; // y-axis offset +

    + This example saves a series of image files at screen resolution from a single image enlarged to any dimension. These files can be tiled within an image editor such as Photoshop to create a single, high-resolution file. Another program can also be written to tile the images together automatically. A scaleValue of 2 tiles the image to 4 files, a scaleValue of 3 tiles the image to 9 files, etc. This example code works only with 2D images. +

    -void setup() { - size(600, 600); - stroke(0, 100); +
    +/* 
    + * Example 6: Scale and segment an image
    + * 
    + * Draws an image larger than the screen by tiling it into small sections.
    + * The scaleValue variable sets amount of scaling: 1 is 100%, 2 is 200%, etc.
    + */
    +
    +int scaleValue = 3;  // Multiplication factor
    +int xoffset = 0;     // x-axis offset 
    +int yoffset = 0;     // y-axis offset
    +
    +void setup() {
    +  size(600, 600);
    +  stroke(0, 100);
     }
     
    -void draw() {
    -  scale(scaleValue);
    -  translate(xoffset * (-width/scaleValue), yoffset * (-height/scaleValue));
    -  line(10, 150, 500, 50);
    -  line(0, 600, 600, 0); 
    -  setOffset();
    +void draw() {
    +  scale(scaleValue);
    +  translate(xoffset * (-width/scaleValue), yoffset * (-height/scaleValue));
    +  line(10, 150, 500, 50);
    +  line(0, 600, 600, 0); 
    +  setOffset();
     }
     
    -void setOffset() {
    -  save("lines-" + xoffset + "-" + yoffset + ".jpg");
    -  xoffset++;
    -  if (xoffset == scaleValue) {
    -    xoffset = 0;
    -    yoffset++;
    -    if (yoffset == scaleValue) {
    -      exit();
    -    } 
    -  }
    -  background(204);
    +void setOffset() {
    +  save("lines-" + xoffset + "-" + yoffset + ".jpg");
    +  xoffset++;
    +  if (xoffset == scaleValue) {
    +    xoffset = 0;
    +    yoffset++;
    +    if (yoffset == scaleValue) {
    +      exit();
    +    } 
    +  }
    +  background(204);
     }
    +
     
    -

    -
    -
    + + +

    Printing technologies

    + +

    + Like traditional printing technologies, creating a high-quality digital print is a craft that requires knowledge and experience in addition to excellent tools and machines. The quality of a print is affected by the quality of the printer, ink, and paper, the preparation of the digital file, and the printer settings. Each of these components is introduced below. Many different printing technologies are currently in use by artists and designers, and each has unique attributes. This list presents some of the most popular ones. Because printing technology changes rapidly, specific printer models are not discussed. +

    + +

    + Laser
    + Laser printers are exceptional because of their high resolution, speed, and low cost per page. For these reasons, they are ubiquitous in office environments. Laser printers use a technology similar to that of photocopiers. When a print is made, a cylindrical drum inside the printer is electrically charged. A high-precision laser is reflected to strike the drum, and it reverses the electrical charge where it hits. When the drum comes in contact with charged toner (small particles of carbon blended with a polymer), the toner is attracted to the drum where the laser hit. A sheet of paper is then passed over the drum, and the toner is transferred and then fused to the paper surface with heat. +

    + +

    + Inkjet
    + Inkjet prints are the most common technology for home printers because of their low cost and high image quality. They have also become a dominant technology for professional photographic printing. In comparison to laser printers, inkjet printers are slow, but they can produce images with a much higher resolution. They achieve this resolution by precisely squirting tiny droplets of ink onto the page. For this reason, the actual resolution of an inkjet can’t compare directly to that of a laser printer, which is more precise. A 600 dpi inkjet printer may produce distinguishable shapes down to 150 dpi, while a laser printer at 600 dpi maintains precision almost to the full 600 dpi. Each inkjet printer operates using one of three technologies: thermal, piezoelectric, or continuous. The thermal technique forces a drop of ink onto the paper by using heat to cause a tiny steam explosion within a chamber. The piezoelectric technique bends a piezoelectric crystal to force a droplet out of the ink chamber. The continuous technique sends a constant flow of droplets but charges each with a varying electrostatic field that determines how or whether it will hit the paper. Inkjet printers are sometimes also called bubblejet printers. +

    + +

    + Digital chromogenic print (C Print)
    + A digital C print is similar to a traditional color photographic print, but a digital file is used instead of a negative. A C print is made by exposing photographic paper to light (either an LED or laser) inside the printer. It is then processed using chemicals, just like a photographic print. Chromira and Lightjet are two popular types of printers that use this technique. +

    + +

    + Iris
    + Iris printers were developed to make full-color proofs before a job was printed in large numbers on a commercial press. They started to be used as fine art printers in the early 1990s. The most distinct aspect of this technology is the ability to print on many different flexible substrates including paper, silk, and canvas. To make an Iris print, the substrate is attached to a metal drum and spun at a high speed while tiny drops of ink are applied to the substrate in a high-pressure stream. An Iris printer is a specific type of inkjet printer. +

    + +

    + Giclée
    + Giclée (pronounced zhee-CLAY) is not a specific printing technology; it is a term used to define a high-quality, digitally produced fine art print. The term giclée was selected to distance the technique from connotations to digital technology and computers, as a tactic to gain acceptance within the art community. The first giclée prints were made using the Iris printing technology, but they are now made using other technologies as well. +

    + +

    + Other techniques
    + In addition to the printing technologies mentioned above, commercial printers offer a wide selection of specialized printers for creating large-format prints for buses, billboards, and buildings. These printing techniques produce lower-resolution images, but they look crisp at a distance. +

    + + + +

    Ink

    + +

    + The various printing technologies use different types of inks. Laser printers use toner, inkjet printers use liquid inks, and C prints don’t use inks because they are made with a photographic process. Toner must be fixed with heat, but liquid inks are absorbed into the paper. Inkjet inks can be divided into two broad categories: dye-based and pigmented. In comparison to pigmented inks, the more common dye-based inks are not water-resistant, are less expensive, are less resistant to fading, and can create more vivid colors. +

    + +

    + Ink selection partially determines how long a print will last. Inkjet inks have been notorious for fading color (early prints could fade within six months), but prints from some of the current generation of printers are rated to hold their color for over 100 years when used with special papers. Ultraviolet (UV) light is a huge contributing factor to fading. Use frames with UV-filtering glass or plexiglass to significantly increase the life of the print. +

    + + + +

    Paper

    + +

    + Paper is defined by its surface, material, and weight. Basic surface options include matte, luster, semigloss, gloss, and supergloss with textures ranging from extremely smooth to rough. Paper is typically made from wood fibers, but fibers from cotton, hemp, linen, and rice are also used. Paper made from wood is naturally acidic, so look for papers that are acid-free (pH neutral) to increase the longevity of prints. Paper made from 100 percent rag is the most stable and will not grow brittle with age. The weight of a paper affects its thickness. Fine art papers are usually measured in units of grams per square meter (gsm or g/m2). Common weights range from 110 (thin) to 350 (thick). +

    + +

    + The selection of papers available for digital printing is extremely limited in comparison to those manufactured for traditional fine art and commercial printing, but the selection is still broad. Printer manufacturers such as Hewlett-Packard, Canon, and Epson offer their own papers, but the finest-quality paper can arguably be found at companies that specialize in making paper. Companies like Hahnemühle and Somerset have recently started producing papers specifically for digital printing technologies. Some inkjet printers require paper to be coated with a special layer to stop the ink from bleeding into the paper and dulling the color. Iris printers offer the widest selection of printable media. An Iris printer can print on any absorbent material and still produce strong color. +

    + +

    + Paper for printers comes in sheets and rolls, but depending on where you live, it will either be sized according to the international ISO 216 standard (A4, A3, etc.) or North American sizes (letter, tabloid, etc.) +

    + + + + +

    File preparation

    + +

    + The format, resolution, and color profile are the most important components of preparing a file. For the best printing results, files should be saved in a format that does not compress the data in a way that loses information. For instance, the JPEG image format compresses a file by removing color data. Each type of printer produces the best results when files are at a specific resolution. Images should typically be saved at 300 dpi or higher. Images produced for Inkjet printers should be prepared at a dpi resolution that is an increment of the maximum printer resolution. For example, an image file prepared for a 2880 dpi printer should be saved at 360 dpi (360 × 8 = 2880). The 360 dpi resolution is suggested for photographic images, but the quality of an image with fine lines can be improved by doubling the resolution to 720 dpi (720 × 4 = 2880). A higher dpi resolution won’t help a great deal (with inkjet) and will significantly increase file size. The color profile for a file is essential to match color when working with other people or across different computers. Each file should be tagged with a color profile to specify the color space of the document (e.g., ColorMatch RGB or Adobe RGB 1998). A color profile tells an output device such as a monitor or printer how to interpret the file’s numerical color data to display it correctly on that device. +

    + +

    + Our experience has shown that complex vector files should be rasterized in a program such as Adobe Photoshop before they are sent to a vendor for printing. Most printers specialize in printing photographs and have more competence in working with image formats like TIFF and PSD. Printers eventually rasterize the image, and it’s a good idea to have complete control over this process, unless the print shop specifies otherwise. +

    + + + + +

    Inkjet printer settings

    + +

    + C prints and Iris prints are typically made through a vendor and laser printing is straightforward. Making a high-quality print with an inkjet printer, however, is often done at home but requires following a few important protocols. Because every type of paper behaves differently with each printer, it’s necessary to define the paper type within the print dialog box. Most printers offer selections for their proprietary papers. If you are using one of these papers, select it from the list. If you are using a different paper, you may want to install the ICC profile for the paper that matches the printer.7 The dialog box will also offer an option to set the dpi of the print. Sometimes it’s necessary to go into the advanced settings to gain access to this. There are a few things to consider when selecting the dpi. Glossy papers can hold a higher resolution than matte papers, and higher-resolution prints require more ink. Unless your print has extremely precise details and will be viewed close up, 1440 dpi is an adequate resolution. +

    + +

    + Making test prints is an essential step toward producing a high-quality print. Precise colors and line weights look very different on-screen than on paper. If working with a vendor, always have a small test print made to check the quality before producing the final print. +

    + + + +

    Conclusion

    + +

    + Only within the last fifteen years have digital printing technologies begun to rival traditional printing techniques in their resolution and longevity, but there is a vast discrepancy between the physical qualities of a digital print and an original Hokusai (1760–1849) woodblock print or an Albrecht Dürer (1472–1528) etching. Each printing technique has its constraints and advantages. One arguable advantage of digital printing is the absence of a physical representation of the print. A lithograph has a corresponding stone, and offset printing has a metal plate, but the information for a digital print is stored in a computer’s memory and is therefore easier to modify. The primary advantage of digital printing is the ease with which a software image can be manifested as a physical image. In contrast to an image on-screen, a print can have a much higher resolution and will exist long after the software becomes incompatible with future computers. +

    + +

    + There are also disadvantages to printing software images. The ability to animate the image is lost, and the color palette is reduced. Digital printing technology evolves rapidly, and it’s possible that the current research into electronic paper (e-paper, e-ink) and organic light-emitting diodes (OLEDs) will allow the best aspects of printed images to merge with the best elements of digital screens. These or other emerging technologies may make it possible for digital printing to evolve into an original area of image-making rather than simply mimicking traditional printing technologies. +

    + + + + +

    Notes

    + +

    +

      +
    1. H. W. Franke, Computer Graphics, Computer Art (Phaidon, 1971), p. 60.
    2. +
    3. Ibid., p. 69.
    4. +
    5. Frieder Nake, “Notes on the Programming of Computer Graphics,” In Cybernetic Serendipity, edited by Jasia Reichardt (Praeger, 1969), p. 77.
    6. +
    7. This work is also credited as Mural in the exhibition catalog Cybernetic Serendipity.
    8. +
    9. Rick Poynor, “Emigre: An Ending,” Design Observer, 10 November 2005.
      + http://www.designobserver.com/archives/007816.html.
    10. +
    11. Lewis Blackwell, The End of Print: The Graphic Design of David Carson (Chronicle Books, 1995), p. 173.
    12. +
    13. ICC profiles are files that define the mappings between a print’s data and the specific paper and printer specifications. Well-designed profiles can increase the quality of a print. Check the website of the paper manufacturer to see if it has created one for your printer.
    14. +
    +

    + + + -
    \ No newline at end of file +

    \ No newline at end of file diff --git a/content/static/tutorials/pshader/imgs/pipeline.png b/content/static/tutorials/pshader/imgs/pipeline.png index 389e0b840..12132bf4e 100644 Binary files a/content/static/tutorials/pshader/imgs/pipeline.png and b/content/static/tutorials/pshader/imgs/pipeline.png differ diff --git a/content/static/tutorials/pshader/index.html b/content/static/tutorials/pshader/index.html index fca91c502..5ac13895c 100644 --- a/content/static/tutorials/pshader/index.html +++ b/content/static/tutorials/pshader/index.html @@ -1,47 +1,56 @@ -

    Shaders

    - -

    - - - -

    This tutorial is for Processing version 2.0+. If you see any errors or have comments, please let us know. This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

    +
    + +
    -

    The code for this tutorial is available here.

    - -

     

    +

    If you see any errors in this tutorial or have comments, please let us know. This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

    -

    What is a Shader?

    +

    Shaders

    +

    Andres Colubri

    -

    A new feature in Processing 2 is the inclusion of GLSL shaders. In fact, everything that Processing draws on the screen with the P2D and P3D renderers is the output of an appropriate "default shader" running behind the scenes. Processing handles these default shaders transparently so that the user doesn't need to worry about them, and she or he can continue to use the well-known drawing functions and expect the same visual results as with previous versions of Processing. However, Processing 2 incorporates a new set of functions and variables that allows advanced users to replace the default shaders with her or his own. This opens up many exciting possibilities: rendering 3D scenes using more sophisticated lighting and texturing algorithms, applying image post-processing effects in real-time, creating complex procedural objects that would be very hard or impossible to generate with other techniques, and sharing shader effects between desktop, mobile, and web platforms with minimal code changes.

    +

    + (The code for this tutorial is available here.)
    +

    -

    In order to understand how shaders work and how they can be used to extend the drawing capabilities of Processing, it is necessary to have an overview of the key concepts of shader programming, first in general and then from the "point of view" of a Processing sketch. So, get ready and grab a beverage of your preference, because this is going to be a very long tutorial.

    +

    + Everything that Processing draws on the screen with the P2D and P3D renderers is the output of an appropriate "default shader" running behind the scenes. Processing handles these default shaders transparently so that the user doesn't need to worry about them, and she or he can continue to use the well-known drawing functions and expect the same visual results as with previous versions of Processing. However, Processing incorporates a new set of functions and variables that allows advanced users to replace the default shaders with her or his own. This opens up many exciting possibilities: rendering 3D scenes using more sophisticated lighting and texturing algorithms, applying image post-processing effects in real-time, creating complex procedural objects that would be very hard or impossible to generate with other techniques, and sharing shader effects between desktop, mobile, and web platforms with minimal code changes. +

    -

    Answering the question alluded by the title of this section, a shader is basically a program that runs on the Graphics Processing Unit (GPU) of the computer, and generates the visual output we see on the screen given the information that defines a 2D or 3D scene: vertices, colors, textures, lights, etc. The term "shader" itself might be slightly misleading, since the word shading in the context of drawing implies the process of representing different levels of darkness on the surface of an object due to the surrounding lights in order to create the illusion of depth. The first computer shaders were mainly concerned with the synthetic calculation of these shading levels given the mathematical representation of a three-dimensional scene and the material properties of the objects in it, and attempted to create photorealistic renderings of such scenes. Nowadays, the shaders are not only used to calculate the shading or lighting levels in a virtual scene, but they are responsible of all the rendering stages, starting with camera transformations that are applied on the raw geometry, and ending at the evaluation of the final color of each visible pixel in the screen. -

    +

    + In order to understand how shaders work and how they can be used to extend the drawing capabilities of Processing, it is necessary to have an overview of the key concepts of shader programming, first in general and then from the "point of view" of a Processing sketch. So, get ready and grab a beverage of your preference, because this is going to be a very long tutorial. +

    -

    There are several languages that can be used to write shaders, such as Cg, HLSL and GLSL. The latter is the shader language included in OpenGL, the standard rendering library and API used across a wide variety of computing devices, ranging from high-end desktop computers to smartphones. GLSL simply stands for OpenGL Shading Language. Since Processing uses OpenGL as the basis for its P2D and P3D renderers, GLSL is the shader language that one has to use to write custom shaders to include in Processing sketches.

    +

    + Answering the question alluded by the title of this section, a shader is basically a program that runs on the Graphics Processing Unit (GPU) of the computer, and generates the visual output we see on the screen given the information that defines a 2D or 3D scene: vertices, colors, textures, lights, etc. The term "shader" itself might be slightly misleading, since the word shading in the context of drawing implies the process of representing different levels of darkness on the surface of an object due to the surrounding lights in order to create the illusion of depth. The first computer shaders were mainly concerned with the synthetic calculation of these shading levels given the mathematical representation of a three-dimensional scene and the material properties of the objects in it, and attempted to create photorealistic renderings of such scenes. Nowadays, the shaders are not only used to calculate the shading or lighting levels in a virtual scene, but they are responsible of all the rendering stages, starting with camera transformations that are applied on the raw geometry, and ending at the evaluation of the final color of each visible pixel in the screen. +

    -

    Writing shaders requires an understanding of the individual stages involved in the rendering a scene with the GPU, and how we can use GLSL to program them. The sequence of these stages is called the "graphical pipeline" in the technical parlance of computer graphics, and we will now take a look at the main stages in the pipeline from the perspective of a Processing sketch.

    +

    + There are several languages that can be used to write shaders, such as Cg, HLSL and GLSL. The latter is the shader language included in OpenGL, the standard rendering library and API used across a wide variety of computing devices, ranging from high-end desktop computers to smartphones. GLSL simply stands for OpenGL Shading Language. Since Processing uses OpenGL as the basis for its P2D and P3D renderers, GLSL is the shader language that one has to use to write custom shaders to include in Processing sketches. +

    -

    Note that the goal of this document is not to provide a programming guide to GLSL, but to describe in detail the new shader API in Processing so that users already familiar with GLSL can write their own custom shaders and then use them in Processing. There are several resources, such as online tutorials and forums, books, and coding sandboxes, that can be recommended for learning GLSL programming. Furthermore, the GLSL experience gained using a different programming interface, platform or toolkit (openFrameworks, Cinder, webGL, iOS, Android, etc.) can be easily translated over to Processing.

    +

    + Writing shaders requires an understanding of the individual stages involved in the rendering a scene with the GPU, and how we can use GLSL to program them. The sequence of these stages is called the "graphical pipeline" in the technical parlance of computer graphics, and we will now take a look at the main stages in the pipeline from the perspective of a Processing sketch. +

    + +

    Note that the goal of this document is not to provide a programming guide to GLSL, but to describe in detail the new shader API in Processing so that users already familiar with GLSL can write their own custom shaders and then use them in Processing. There are several resources, such as online tutorials and forums, books, and web coding sandboxes (for example Shader Toy, GLSL Sandbox, and Vertex Shader Art), that can be recommended for learning GLSL programming. Furthermore, the GLSL experience gained using a different programming interface, platform or toolkit (openFrameworks, Cinder, webGL, iOS, Android, etc.) can be easily translated over to Processing.

    Let's start with a simple 3D sketch as the model to understand the relationship between the Processing functions and variables and the underlying pipeline running on the GPU. This sketch draws a quad with lights and some geometric transformations applied to it: - +Code listing 1.1: Simple 3D sketch that draws a lit rotating rectangle
    Code listing 1.1: Simple 3D sketch that draws a lit rotating rectangle
     float angle;
    -void setup() {
    +
    +void setup() {
       size(400, 400, P3D);
    -  noStroke();  
    +  noStroke();
     }
     
    -void draw() {
    +void draw() {
       background(0);
    -  
       camera(width/2, height/2, 300, width/2, height/2, 0, 0, 1, 0);
    -  pointLight(200, 200, 200, width/2, height/2, 200);
    +  
    +  pointLight(200, 200, 200, width/2, height/2, -200);
       
       translate(width/2, height/2);
       rotateY(angle);
    @@ -54,7 +63,7 @@ 

    What is a Shader?

      fill(200, 50, 50);   vertex(+100, -100);   vertex(-100, -100); -  endShape(); +  endShape();      angle += 0.01; } @@ -79,7 +88,7 @@

    What is a Shader?

    -The vertex shader doesn't know how the vertices are connected to each other forming a shape since it receives each vertex independently of the others. Therefore, the immediate output of the vertex stage is just the list of vertices projected onto the screen plane. In Processing we set how the vertices of a shape are connected with each other by passing an argument to beginShape(). This argument, which in the case of this example is QUADS, determines how the next stage in the pipeline, called primitive assembly, builds geometric primitives out of the individual vertices that come out of the vertex shader. +The vertex shader doesn't know how the vertices are connected to each other forming a shape since it receives each vertex independently of the others. Therefore, the immediate output of the vertex stage is just the list of vertices projected onto the screen plane. In Processing we set how the vertices of a shape are connected with each other by passing an argument to beginShape(). This argument, which in the case of this example is QUADS, determines how the next stage in the pipeline, called primitive assembly, builds geometric primitives out of the individual vertices that come out of the vertex shader.

    @@ -101,7 +110,7 @@

    What is a Shader?

     function vertexShader(vertex) {
       projPos = projection * modelview * vertex.position;
    -  litColor = lightColor * dot(vertex.normal, lightDirection);    
    +  litColor = lightColor * dot(vertex.normal, lightDirection);
       return (projPos, litColor);
     }
     
    @@ -125,11 +134,11 @@

    What is a Shader?

    -The fragment shader can perform additional operations on each fragment, and in fact these could be potentially very complex. It is possible to implement a ray-tracer entirely in the fragment shader, and we will touch on this topic briefly with some more advanced examples. One important limitation of the fragment shader to keep in mind is that it cannot access fragments other than the one is currently processing (same as the vertex shader cannot access a vertex other than the one is currently operating on). +The fragment shader can perform additional operations on each fragment, and in fact these could be potentially very complex. It is possible to implement a ray-tracer entirely in the fragment shader, and we will touch on this topic briefly with some more advanced examples. One important limitation of the fragment shader to keep in mind is that it cannot access fragments other than the one is currently processing (same as the vertex shader cannot access a vertex other than the one is currently operating on). The Book of Shaders by Patricio Gonzalez Vivo and Jen Lowe gives an excellent illustrated introduction to GLSL shaders, and it is a terrific resource for programming of fragment shaders in general.

    -From all the stages described in our simplified pipeline, only the vertex and fragment shaders can be modified to run our own custom code. The other stages are all hard-coded in the GPU. With this picture in mind, we can move forward and start working through the actual shader API in Processing. +From all the stages described in our simplified pipeline, only the vertex and fragment shaders can be modified to run our own custom code. The other stages are all hard-coded in the GPU. With this picture in mind, we can move forward and start working through the actual shader API in Processing.

    The PShader class

    @@ -143,12 +152,12 @@

    The PShader class

    - +Code listing 2.1: Sketch that uses a toon effect shader to render a sphere.
    Code listing 2.1: Sketch that uses a toon effect shader to render a sphere.
     PShader toon;
     
    -void setup() {
    +void setup() {
       size(640, 360, P3D);
       noStroke();
       fill(204);
    @@ -156,9 +165,9 @@ 

    The PShader class

      toon.set("fraction", 1.0); } -void draw() { +void draw() {   shader(toon); -  background(0); +  background(0);   float dirY = (mouseY / float(height) - 0.5) * 2;   float dirX = (mouseX / float(width) - 0.5) * 2;   directionalLight(204, 204, 204, -dirX, -dirY, -1); @@ -166,13 +175,13 @@

    The PShader class

      sphere(120); } -ToonVert.glsl: +ToonVert.glsl: uniform mat4 transform; uniform mat3 normalMatrix; uniform vec3 lightNormal; -attribute vec4 vertex; +attribute vec4 position; attribute vec4 color; attribute vec3 normal; @@ -181,28 +190,26 @@

    The PShader class

    varying vec3 vertLightDir; void main() { - gl_Position = transform * vertex; + gl_Position = transform * position; vertColor = color; vertNormal = normalize(normalMatrix * normal); vertLightDir = -lightNormal; } -ToonFrag.glsl: +ToonFrag.glsl: #ifdef GL_ES precision mediump float; precision mediump int; #endif -#define PROCESSING_LIGHT_SHADER - uniform float fraction; varying vec4 vertColor; varying vec3 vertNormal; varying vec3 vertLightDir; -void main() { +void main() { float intensity; vec4 color; intensity = max(0.0, dot(vertLightDir, vertNormal)); @@ -217,14 +224,14 @@

    The PShader class

    color = vec4(vec3(0.2), 1.0); } - gl_FragColor = color * vertColor; + gl_FragColor = color * vertColor; }

    -The ifdef section in the fragment shader is required to make the shader compatible with OpenGL ES and WebGL. It sets the precision of the float and integer numbers to medium, which should be fine for most devices. These precision statements are optional on the desktop. There is also a #define line declaring the PROCESSING_LIGHT_SHADER symbol. This define is used by Processing to determine the type of shader, and whether or not it is valid to render the geometry in the sketch. This topic will be explain in detail in the next section. +The ifdef section in the fragment shader is required to make the shader compatible with OpenGL ES and WebGL. It sets the precision of the float and integer numbers to medium, which should be fine for most devices. These precision statements are optional on the desktop.

    @@ -239,7 +246,7 @@

    The PShader class

    Types of shaders in Processing

    -From the code and pseudo-code examples presented in the previous sections, it can be appreciated that different shaders have different uniform and attribute variables. Clearly, a shader that does not compute lighting does not need uniforms holding the light source's position and color, for example. If we work with a low-level toolkit in C or C++ with direct access to the OpenGL API, we are free to name the uniforms and attributes of a shader in any way we like, since we have absolute control on the way the geometry is stored in our application, and how and when it is passed over to the GPU pipeline using the OpenGL functions. This is different when working in Processing, since the shaders are handled automatically by the renderers and should be able to handle the geometry that is described with the drawing API of Processing. This doesn't imply that custom shaders must render things in the same way as Processing does by default, quite in the contrary, the use of custom shaders opens up the possibility of greatly altering the rendering pipeline in Processing. However, custom shaders meant to be used in conjunction with the standard drawing API have to follow certain naming conventions, and are bound by some limitations. +From the code and pseudo-code examples presented in the previous sections, it can be appreciated that different shaders have different uniform and attribute variables. For example, a shader that does not compute lighting does not need uniforms holding the light source's position and color, for example. If we work with a low-level toolkit in C or C++ with direct access to the OpenGL API, we are free to name the uniforms and attributes of a shader in any way we like, since we have absolute control on the way the geometry is stored in our application, and how and when it is passed over to the GPU pipeline using the OpenGL functions. This is different when working in Processing, since the shaders are handled automatically by the renderers and should be able to handle the geometry that is described with the drawing API of Processing. This doesn't imply that custom shaders must render things in the same way as Processing does by default, quite in the contrary, the use of custom shaders opens up the possibility of greatly altering the rendering pipeline in Processing. However, custom shaders meant to be used in conjunction with the standard drawing API have to follow certain naming conventions, and are bound by some limitations.

    @@ -251,20 +258,20 @@

    Types of shaders in Processing

      -
    • POINT shaders: used to render stroke points.
    • -
    • LINE shaders: used to render stroke lines.
    • -
    • TRIANGLE shaders: used to render anything else, which means that they will handle (lit/unlit, textured/non-textured) shapes. Because all shapes in Processing are ultimately made out of triangles, they are can be called TRIANGLE shaders.
    • +
    • POINT shaders: used to render stroke points.
    • +
    • LINE shaders: used to render stroke lines.
    • +
    • TRIANGLE shaders: used to render anything else, which means that they will handle (lit/unlit, textured/non-textured) shapes. Because all shapes in Processing are ultimately made out of triangles, they are can be called TRIANGLE shaders.

    -When setting a shader with the shader() function, if no type argument is specified then the shader will be assumed to be a triangle shader: +When setting a shader with the shader() function, we can specify the shader type explicitly:

    -void draw() {
    +void draw() {
       shader(pointShader, POINTS);
       shader(lineShader, LINES);
    -  shader(polyShader); // same as shader(polyShader, TRIANGLE);
    +  shader(polyShader); // Processing will autodetect
     
       stroke(255);
       beginShape(POLYGON);
    @@ -273,7 +280,7 @@ 

    Types of shaders in Processing

    -This code will result in Processing using pointShader to render stroke points, lineShader to render lines, and polyShader to render triangles (anything else). +This code will result in Processing using pointShader to render stroke points, lineShader to render lines, and polyShader to render the appropriate kind of geometry.

    @@ -292,7 +299,7 @@

    Types of shaders in Processing

    -As mentioned earlier, a shader for rendering lit geometry requires additional attributes and uniform variables to be sent from Processing that are not needed by a shader that only renders flat-colored geometry without lights or textures. Similarly, a shader for rendering textured polygons needs its own uniforms and attributes (texture sampler and texture coordinates) that would not be required otherwise. Although it could have been possible to have a generic shader in Processing that takes care of all different rendering scenarios, this would be very inefficient because of all the branching that should take place inside the shaders to choose the appropriate rendering path. In general, GPUs are not very efficient at handling branches in their shaders, particularly those available on mobile devices. +As mentioned earlier, a shader for rendering lit geometry requires additional attributes and uniform variables to be sent from Processing that are not needed by a shader that only renders flat-colored geometry without lights or textures. Similarly, a shader for rendering textured polygons needs its own uniforms and attributes (texture sampler and texture coordinates) that would not be required otherwise. Depending on what uniforms and attributes are defined in the shader, it will be capable of rendering the current scene correctly or not.

    In consequence, the triangle shaders are further discriminated in 4 types:

    @@ -305,52 +312,19 @@

    Types of shaders in Processing

    -Together with the POINT and LINE shaders mentioned earlier, we end up having 6 different types of shaders in Processing. -

    - -

    -Processing needs to use the right type of shader when drawing a piece of geometry, and by default it picks the correct shader by checking whether the geometry about to be rendered has lights or textures associated to it and then enabling the appropriate shader. When we set our own custom shader, we need to make sure that it belongs to the correct type to handle the subsequent drawing calls. For example, if simpleShader below is of type COLOR, then in the following code the rectangle will be renderer using simpleShader: -

    - -
    -shader(simpleShader);
    -noLights();
    -fill(180);
    -rect(0, 0, 100, 100);
    -
    - -

    However, if we do:

    - -
    -shader(simpleShader);
    -lights();
    -fill(180);
    -rect(0, 0, 100, 100);
    -
    - -

    -then Processing will simply ignore simpleShader and will render the lit rectangle with its own default LIGHT shader. -

    +Together with the POINT and LINE shaders mentioned earlier, we end up having 6 different types of shaders in Processing. In the next sections we will describe each type of shader in detail.

    -

    -The type of a shader can be specified inside the GLSL code, either in the vertex shader or the fragment shader (or both), by using a #define line, which are the following: -

    +

    The shader type can be set explicitly in the source code of the shader using pre-processor #defines, which override Processing's autodetection. The supported #defines are the following:

      -
    • #define PROCESSING_POINT_SHADER for POINT shaders
    • -
    • #define PROCESSING_LINE_SHADER for LINE shaders
    • -
    • #define PROCESSING_COLOR_SHADER for COLOR shaders
    • -
    • #define PROCESSING_LIGHT_SHADER for LIGHT shaders
    • -
    • #define PROCESSING_TEXTURE_SHADER for TEXTURE shaders
    • -
    • #define PROCESSING_TEXLIGHT_SHADER for TEXLIGHT shaders
    • +
    • #define PROCESSING_POINT_SHADER
    • +
    • #define PROCESSING_LINE_SHADER
    • +
    • #define PROCESSING_COLOR_SHADER
    • +
    • #define PROCESSING_LIGHT_SHADER
    • +
    • #define PROCESSING_TEXTURE_SHADER
    • +
    • #define PROCESSING_TEXLIGHT_SHADER
    -

    -These defines are in fact hints for the renderer, and could be absent from the shader code altogether. This is convenient for more advanced applications where the data used by the shader is not necessarily determined by the texture/lighting state of the scene, but we will leave the discussion of this functionality for a future tutorial. -

    - -

    In the next sections we will describe each type of shader in detail.

    -

    Color shaders

    @@ -358,23 +332,23 @@

    Color shaders

    - +Code listing 4.1: Base cylinder.
    Code listing 4.1: Base cylinder.
     PShape can;
     float angle;
     PShader colorShader;
     
    -void setup() {
    +void setup() {
       size(640, 360, P3D);
       can = createCan(100, 200, 32);
     }
     
    -void draw() {    
    +void draw() {
       background(0);
       translate(width/2, height/2);
    -  rotateY(angle);  
    -  shape(can);  
    +  rotateY(angle);
    +  shape(can);
       angle += 0.01;
     }
     
    @@ -390,9 +364,9 @@ 

    Color shaders

        float u = float(i) / detail;     sh.normal(x, 0, z);     sh.vertex(x * r, -h/2, z * r, u, 0); -    sh.vertex(x * r, +h/2, z * r, u, 1); +    sh.vertex(x * r, +h/2, z * r, u, 1);   } -  sh.endShape(); +  sh.endShape();   return sh; }
    @@ -408,26 +382,24 @@

    Color shaders

    - +Code listing 4.2: Vertex and fragment shaders for color rendering.
    Code listing 4.2: Vertex and fragment shaders for color rendering.
    -colorvert.glsl:
    -
    -#define PROCESSING_COLOR_SHADER
    +colorvert.glsl:
     
     uniform mat4 transform;
     
    -attribute vec4 vertex;
    +attribute vec4 position;
     attribute vec4 color;
     
     varying vec4 vertColor;
     
     void main() {
    -  gl_Position = transform * vertex;    
    +  gl_Position = transform * position;
       vertColor = color;
     }
     
    -colorfrag.glsl:
    +colorfrag.glsl:
     
     #ifdef GL_ES
     precision mediump float;
    @@ -447,7 +419,7 @@ 

    Color shaders

    Now, we need to make two changes to our main program to make use of our new shader. At the end of our setup function we need to add

    -
      colorShader = loadShader("colorfrag.glsl", "colorvert.glsl");
    +
      colorShader = loadShader("colorfrag.glsl", "colorvert.glsl");

    to load the shader files. Then, right after background(), add @@ -460,7 +432,7 @@

    Color shaders

    -The type of shader is indicated here with the define in the vertex shader, but it could also be in the fragment shader. In this example, there is only one uniform variable, transform, which is a 4x4 matrix holding the product of the projection and the modelview matrices. The multiplication of a vertex in world coordinates by the transform matrix gives the clip coordinates. The vertex and color attributes hold the position and color of the input vertex, respectively. The input color is copied without any modification to the vertColor varying, which passes the value down to the fragment shader. The fragment shader is nothing more than a pass-through shader since the color is sent to the output without any further modifications. The uniform transform and the attributes vertex and color are automatically set by Processing. +The type of shader is indicated here with the define in the vertex shader, but it could also be in the fragment shader. In this example, there is only one uniform variable, transform, which is a 4x4 matrix holding the product of the projection and the modelview matrices. The multiplication of a position in world coordinates by the transform matrix gives the clip coordinates. The position and color attributes hold the position and color of the input vertex, respectively. The input color is copied without any modification to the vertColor varying, which passes the value down to the fragment shader. The fragment shader is nothing more than a pass-through shader since the color is sent to the output without any further modifications. The uniform transform and the attributes position and color are automatically set by Processing.

    @@ -480,7 +452,7 @@

    Texture shaders

    - +Code listing 5.1: Sketch for textured rendering (no lights).
    Code listing 5.1: Sketch for textured rendering (no lights).
     PImage label;
    @@ -489,21 +461,21 @@ 

    Texture shaders

    PShader texShader; -void setup() { -  size(640, 360, P3D); +void setup() { +  size(640, 360, P3D);   label = loadImage("lachoy.jpg");   can = createCan(100, 200, 32, label);   texShader = loadShader("texfrag.glsl", "texvert.glsl"); } -void draw() { +void draw() {   background(0);      -  shader(texShader); +  shader(texShader);        translate(width/2, height/2); -  rotateY(angle); -  shape(can); +  rotateY(angle); +  shape(can);   angle += 0.01; } @@ -520,20 +492,18 @@

    Texture shaders

        float u = float(i) / detail;     sh.normal(x, 0, z);     sh.vertex(x * r, -h/2, z * r, u, 0); -    sh.vertex(x * r, +h/2, z * r, u, 1); +    sh.vertex(x * r, +h/2, z * r, u, 1);   } -  sh.endShape(); +  sh.endShape();   return sh; } -texvert.glsl: - -#define PROCESSING_TEXTURE_SHADER +texvert.glsl: uniform mat4 transform; uniform mat4 texMatrix; -attribute vec4 vertex; +attribute vec4 position; attribute vec4 color; attribute vec2 texCoord; @@ -541,13 +511,13 @@

    Texture shaders

    varying vec4 vertTexCoord; void main() { - gl_Position = transform * vertex; - + gl_Position = transform * position; + vertColor = color; vertTexCoord = texMatrix * vec4(texCoord, 1.0, 1.0); } -texfrag.glsl: +texfrag.glsl: #ifdef GL_ES precision mediump float; @@ -579,7 +549,7 @@

    Texture shaders

     void main() {
       int si = int(vertTexCoord.s * 50.0);
    -  int sj = int(vertTexCoord.t * 50.0);  
    +  int sj = int(vertTexCoord.t * 50.0);
       gl_FragColor = texture2D(texture, vec2(float(si) / 50.0, float(sj) / 50.0)) * vertColor;
     }
     
    @@ -603,7 +573,7 @@

    Light shaders

    - +Code listing 6.1: Sketch for simple (per-vertex) lighting. The implementation of the createCan() function in the sketch code is omitted since it is identical to that of listing 3.
    Code listing 6.1: Sketch for simple (per-vertex) lighting. The implementation of the createCan() function in the sketch code is omitted since it is identical to that of listing 3.
     PShape can;
    @@ -611,13 +581,13 @@ 

    Light shaders

    PShader lightShader; -void setup() { +void setup() {   size(640, 360, P3D);   can = createCan(100, 200, 32);   lightShader = loadShader("lightfrag.glsl", "lightvert.glsl"); } -void draw() { +void draw() {   background(0);   shader(lightShader); @@ -625,14 +595,12 @@

    Light shaders

      pointLight(255, 255, 255, width/2, height, 200);   translate(width/2, height/2); -  rotateY(angle); -  shape(can); +  rotateY(angle); +  shape(can);   angle += 0.01; } -lightvert.glsl: - -#define PROCESSING_LIGHT_SHADER +lightvert.glsl: uniform mat4 modelview; uniform mat4 transform; @@ -640,23 +608,23 @@

    Light shaders

    uniform vec4 lightPosition; -attribute vec4 vertex; +attribute vec4 position; attribute vec4 color; attribute vec3 normal; varying vec4 vertColor; void main() { - gl_Position = transform * vertex; - vec3 ecVertex = vec3(modelview * vertex); + gl_Position = transform * position; + vec3 ecPosition = vec3(modelview * position); vec3 ecNormal = normalize(normalMatrix * normal); - vec3 direction = normalize(lightPosition.xyz - ecVertex); + vec3 direction = normalize(lightPosition.xyz - ecPosition); float intensity = max(0.0, dot(direction, ecNormal)); - vertColor = vec4(intensity, intensity, intensity, 1) * color; + vertColor = vec4(intensity, intensity, intensity, 1) * color; } -lightfrag.glsl: +lightfrag.glsl: #ifdef GL_ES precision mediump float; @@ -673,7 +641,7 @@

    Light shaders

    -In the vertex shader, the ecVertex variable is the position of the input vertex expressed in eye-coordinates, since it is obtained by multiplying vertex by the modelview matrix. Similarly, multiplying the input normal vector by the normalMatrix yields its coordinates in the eye-system. Once all the vectors are expressed in the same coordinate system, they can be used to calculate the intensity of the incident light at the current vector. From the formula used in the shader, the intensity is directly proportional to the angle between the normal and the vector between the vertex and the light source. +In the vertex shader, the ecPosition variable is the position of the input vertex expressed in eye-coordinates, since it is obtained by multiplying vertex by the modelview matrix. Similarly, multiplying the input normal vector by the normalMatrix yields its coordinates in the eye-system. Once all the vectors are expressed in the same coordinate system, they can be used to calculate the intensity of the incident light at the current vector. From the formula used in the shader, the intensity is directly proportional to the angle between the normal and the vector between the vertex and the light source.

    @@ -692,7 +660,7 @@

    Light shaders

    -The values in this uniforms completely specify any lighting configuration set in the sketch using the ambientLight(), pointLight(), directionalLight() and spotLight() functions in Processing. To see how all these uniforms are used in the default light shader, which covers all the possible lighting combinations, take a look at its source code from the Processing core. However, a valid light shader doesn't need to declare all of these uniforms, for example in the previous example we only needed the lightPosition uniform. +The values in this uniforms completely specify any lighting configuration set in the sketch using the ambientLight(), pointLight(), directionalLight() and spotLight() functions in Processing. To see how all these uniforms are used in the default light shader, which covers all the possible lighting combinations, take a look at its source code from the Processing core. However, a valid light shader doesn't need to declare all of these uniforms, for example in the previous example we only needed the lightPosition uniform.

    @@ -700,12 +668,10 @@

    Light shaders

    - +Code listing 6.2: Vertex and fragment shaders for simple per-pixel lighting.
    Code listing 6.2: Vertex and fragment shaders for simple per-pixel lighting.
    -pixlightvert.glsl:
    -
    -#define PROCESSING_LIGHT_SHADER
    +pixlightvert.glsl:
     
     uniform mat4 modelview;
     uniform mat4 transform;
    @@ -714,7 +680,7 @@ 

    Light shaders

    uniform vec4 lightPosition; uniform vec3 lightNormal; -attribute vec4 vertex; +attribute vec4 position; attribute vec4 color; attribute vec3 normal; @@ -723,15 +689,15 @@

    Light shaders

    varying vec3 lightDir; void main() { - gl_Position = transform * vertex; - vec3 ecVertex = vec3(modelview * vertex); - + gl_Position = transform * position; + vec3 ecPosition = vec3(modelview * position); + ecNormal = normalize(normalMatrix * normal); - lightDir = normalize(lightPosition.xyz - ecVertex); + lightDir = normalize(lightPosition.xyz - ecPosition); vertColor = color; } -pixlightfrag.glsl: +pixlightfrag.glsl: #ifdef GL_ES precision mediump float; @@ -742,7 +708,7 @@

    Light shaders

    varying vec3 ecNormal; varying vec3 lightDir; -void main() { +void main() { vec3 direction = normalize(lightDir); vec3 normal = normalize(ecNormal); float intensity = max(0.0, dot(direction, normal)); @@ -773,7 +739,7 @@

    Texture-light shaders

    - +Code listing 7.1: Sketch combining texturing and per-vertex lighting. The implementation of the createCan() function in the sketch code is omitted since it is identical to that of listing 5.1. +
    + +
    Code listing 7.1: Sketch combining texturing and per-vertex lighting. The implementation of the createCan() function in the sketch code is omitted since it is identical to that of listing 5.1.
     PImage label;
    @@ -782,29 +748,27 @@ 

    Texture-light shaders

    PShader texlightShader; -void setup() { -  size(640, 360, P3D); +void setup() { +  size(640, 360, P3D);   label = loadImage("lachoy.jpg");   can = createCan(100, 200, 32, label);   texlightShader = loadShader("texlightfrag.glsl", "texlightvert.glsl"); } -void draw() { +void draw() {   background(0);      shader(texlightShader); -  pointLight(255, 255, 255, width/2, height, 200); +  pointLight(255, 255, 255, width/2, height, 200);        translate(width/2, height/2); -  rotateY(angle); -  shape(can); +  rotateY(angle); +  shape(can);   angle += 0.01; } -texlightvert.glsl: - -#define PROCESSING_TEXLIGHT_SHADER +texlightvert.glsl: uniform mat4 modelview; uniform mat4 transform; @@ -813,7 +777,7 @@

    Texture-light shaders

    uniform vec4 lightPosition; -attribute vec4 vertex; +attribute vec4 position; attribute vec4 color; attribute vec3 normal; attribute vec2 texCoord; @@ -822,18 +786,18 @@

    Texture-light shaders

    varying vec4 vertTexCoord; void main() { - gl_Position = transform * vertex; - vec3 ecVertex = vec3(modelview * vertex); + gl_Position = transform * position; + vec3 ecPosition = vec3(modelview * position); vec3 ecNormal = normalize(normalMatrix * normal); - vec3 direction = normalize(lightPosition.xyz - ecVertex); + vec3 direction = normalize(lightPosition.xyz - ecPosition); float intensity = max(0.0, dot(direction, ecNormal)); - vertColor = vec4(intensity, intensity, intensity, 1) * color; - - vertTexCoord = texMatrix * vec4(texCoord, 1.0, 1.0); + vertColor = vec4(intensity, intensity, intensity, 1) * color; + + vertTexCoord = texMatrix * vec4(texCoord, 1.0, 1.0); } -texlightfrag.glsl: +texlightfrag.glsl: #ifdef GL_ES precision mediump float; @@ -857,12 +821,10 @@

    Texture-light shaders

    - +Code listing 7.2: Shaders for texturing and per-pixel lighting. - + +
    Code listing 7.2: Shaders for texturing and per-pixel lighting.
    -pixlightxvert.glsl:
    -
    -#define PROCESSING_TEXLIGHT_SHADER
    +pixlightxvert.glsl:
     
     uniform mat4 modelview;
     uniform mat4 transform;
    @@ -871,7 +833,7 @@ 

    Texture-light shaders

    uniform vec4 lightPosition; -attribute vec4 vertex; +attribute vec4 position; attribute vec4 color; attribute vec3 normal; attribute vec2 texCoord; @@ -882,17 +844,17 @@

    Texture-light shaders

    varying vec4 vertTexCoord; void main() { - gl_Position = transform * vertex; - vec3 ecVertex = vec3(modelview * vertex); - - ecNormal = normalize(normalMatrix * normal); - lightDir = normalize(lightPosition.xyz - ecVertex); - vertColor = color; - - vertTexCoord = texMatrix * vec4(texCoord, 1.0, 1.0); + gl_Position = transform * position; + vec3 ecPosition = vec3(modelview * position); + + ecNormal = normalize(normalMatrix * normal); + lightDir = normalize(lightPosition.xyz - ecPosition); + vertColor = color; + + vertTexCoord = texMatrix * vec4(texCoord, 1.0, 1.0); } -pixlightxfrag.glsl: +pixlightxfrag.glsl: #ifdef GL_ES precision mediump float; @@ -921,6 +883,19 @@

    Texture-light shaders

    Note that a texlight cannot be used to render a scene only with textures or only with lights, in those cases either a texture or light shader will be needed.

    +

    Aliases for uniforms and attributes

    + +

    A few of the most common vertex attributes and shader uniforms have an alternative short-hand name, listed below:

    + +
      +
    • position or vertex
    • +
    • transform or transformMatrix
    • +
    • modelview or modelviewMatrix
    • +
    • projection or projectionMatrix
    • +
    • texture or texMap
    • +
    + +

    Image post-processing effects

    @@ -933,8 +908,6 @@

    Image post-processing effects

    precision mediump int; #endif -#define PROCESSING_TEXTURE_SHADER - uniform sampler2D texture; varying vec4 vertColor; @@ -949,7 +922,7 @@

    Image post-processing effects

    gl_FragColor = vertColor; } else { gl_FragColor = vec4(0, 0, 0, 1); - } + } }
    @@ -958,7 +931,7 @@

    Image post-processing effects

    - +Code listing 8.1: Sketch using the black&white shader.
    Code listing 8.1: Sketch using the black&white shader.
     PImage label;
    @@ -967,21 +940,21 @@ 

    Image post-processing effects

    PShader bwShader; -void setup() { -  size(640, 360, P3D); +void setup() { +  size(640, 360, P3D);   label = loadImage("lachoy.jpg");   can = createCan(100, 200, 32, label);   bwShader = loadShader("bwfrag.glsl"); } -void draw() { +void draw() {   background(0);      shader(bwShader);        translate(width/2, height/2); -  rotateY(angle); -  shape(can); +  rotateY(angle); +  shape(can);   angle += 0.01; }
    @@ -989,7 +962,7 @@

    Image post-processing effects

    -You will notice that this time the loadShader() function only receives the filename of the fragment shader. Because the GLSL code contains the #define PROCESSING_TEXTURE_SHADER line, Processing will know that we are providing the fragment stage of a texture shader. How does it complete the entire shader program? The answer is that it uses the default vertex stage for texture shaders. As a consequence of this, and since the varying variables are first declared in the vertex stage, the fragment shader has to follow the varying names adopted in the default shader. In this case, the varying variables for the fragment color and texture coordinate must be named vertColor and vertTexCoord, respectively. +You will notice that this time the loadShader() function only receives the filename of the fragment shader. How does Processing complete the entire shader program? The answer is that it uses the default vertex stage for texture shaders. As a consequence of this, and since the varying variables are first declared in the vertex stage, the fragment shader has to follow the varying names adopted in the default shader. In this case, the varying variables for the fragment color and texture coordinate must be named vertColor and vertTexCoord, respectively.

    @@ -997,7 +970,7 @@

    Image post-processing effects

    - +Code listing 8.2: Edge-detection shader.
    Code listing 8.2: Edge-detection shader.
     #ifdef GL_ES
    @@ -1005,8 +978,6 @@ 

    Image post-processing effects

    precision mediump int; #endif -#define PROCESSING_TEXTURE_SHADER - uniform sampler2D texture; uniform vec2 texOffset; @@ -1025,7 +996,7 @@

    Image post-processing effects

    vec2 tc6 = vertTexCoord.st + vec2(-texOffset.s, +texOffset.t); vec2 tc7 = vertTexCoord.st + vec2( 0.0, +texOffset.t); vec2 tc8 = vertTexCoord.st + vec2(+texOffset.s, +texOffset.t); - + vec4 col0 = texture2D(texture, tc0); vec4 col1 = texture2D(texture, tc1); vec4 col2 = texture2D(texture, tc2); @@ -1036,15 +1007,15 @@

    Image post-processing effects

    vec4 col7 = texture2D(texture, tc7); vec4 col8 = texture2D(texture, tc8); - vec4 sum = 8.0 * col4 - (col0 + col1 + col2 + col3 + col5 + col6 + col7 + col8); - gl_FragColor = vec4(sum.rgb, 1.0) * vertColor; + vec4 sum = 8.0 * col4 - (col0 + col1 + col2 + col3 + col5 + col6 + col7 + col8); + gl_FragColor = vec4(sum.rgb, 1.0) * vertColor; }
    - +Code listing 8.3: Emboss shader. @@ -1100,7 +1069,7 @@

    Putting all together

    In all of the examples we have seen so far, only one shader is used throughout the execution of the entire sketch. However, we can load and use as many shaders as we need. At each given time, one shader will be selected and running, but we can change the selected shader using the shader() function, and restore the default shaders with resetShader(). The following example combines all the shaders from the previous sections, so they can be enabled/disabled using the keyboard:

    Code listing 8.3: Emboss shader.
     #ifdef GL_ES
    @@ -1052,8 +1023,6 @@ 

    Image post-processing effects

    precision mediump int; #endif -#define PROCESSING_TEXTURE_SHADER - uniform sampler2D texture; uniform vec2 texOffset; @@ -1069,7 +1038,7 @@

    Image post-processing effects

    vec2 tc3 = vertTexCoord.st + vec2(+texOffset.s, 0.0); vec2 tc4 = vertTexCoord.st + vec2( 0.0, +texOffset.t); vec2 tc5 = vertTexCoord.st + vec2(+texOffset.s, +texOffset.t); - + vec4 col0 = texture2D(texture, tc0); vec4 col1 = texture2D(texture, tc1); vec4 col2 = texture2D(texture, tc2); @@ -1079,7 +1048,7 @@

    Image post-processing effects

    vec4 sum = vec4(0.5) + (col0 + col1 + col2) - (col3 + col4 + col5); float lum = dot(sum, lumcoeff); - gl_FragColor = vec4(lum, lum, lum, 1.0) * vertColor; + gl_FragColor = vec4(lum, lum, lum, 1.0) * vertColor; }
    - +Code listing 9.1: All the shaders we have seen so far. - - + + +
    Code listing 9.1: All the shaders we have seen so far.
     float canSize = 60;
    @@ -1123,14 +1092,14 @@ 

    Putting all together

    PShader edgesShader; PShader embossShader; -void setup() { -  size(480, 480, P3D); +void setup() { +  size(480, 480, P3D);   label = loadImage("lachoy.jpg");   can = createCan(canSize, 2 * canSize, 32, label);   cap = createCap(canSize, 32);      colorShader = loadShader("colorfrag.glsl", "colorvert.glsl"); -  lightShader = loadShader("lightfrag.glsl", "lightvert.glsl"); +  lightShader = loadShader("lightfrag.glsl", "lightvert.glsl");   texShader = loadShader("texfrag.glsl", "texvert.glsl");      texlightShader = loadShader("texlightfrag.glsl", "texlightvert.glsl"); @@ -1144,10 +1113,10 @@

    Putting all together

      selShader = texlightShader;   useLight = true;   useTexture = true; -  println("Vertex lights, texture shading"); +  println("Vertex lights, texture shading"); } -void draw() { +void draw() {   background(0);      float x = 1.88 * canSize; @@ -1172,7 +1141,7 @@

    Putting all together

      if (useLight) {     pointLight(255, 255, 255, centerx, centery, 200);   }     -  shader(selShader); +  shader(selShader);        translate(centerx, centery, 65);   rotateY(rotAngle); @@ -1184,15 +1153,15 @@

    Putting all together

      shape(can);   noLights();      -  resetShader(); +  resetShader();        pushMatrix(); -  translate(0, canSize - 5, 0); +  translate(0, canSize - 5, 0);   shape(cap);   popMatrix();   pushMatrix(); -  translate(0, -canSize + 5, 0); +  translate(0, -canSize + 5, 0);   shape(cap);   popMatrix();    @@ -1212,9 +1181,9 @@

    Putting all together

        float u = float(i) / detail;     sh.normal(x, 0, z);     sh.vertex(x * r, -h/2, z * r, u, 0); -    sh.vertex(x * r, +h/2, z * r, u, 1); +    sh.vertex(x * r, +h/2, z * r, u, 1);   } -  sh.endShape(); +  sh.endShape();   return sh; } @@ -1231,55 +1200,55 @@

    Putting all together

        sh.vertex(x * r, 0, z * r);   }     sh.endShape(); -  return sh; +  return sh; } -void keyPressed() { +void keyPressed() {   if (key == '1') {     println("No lights, no texture shading");     selShader = colorShader;     useLight = false; -    useTexture = false; +    useTexture = false;   } else if (key == '2') {     println("Vertex lights, no texture shading");     selShader = lightShader;     useLight = true; -    useTexture = false; +    useTexture = false;   } else if (key == '3') {     println("No lights, texture shading");     selShader = texShader;     useLight = false; -    useTexture = true; +    useTexture = true;   } else if (key == '4') {     println("Vertex lights, texture shading");     selShader = texlightShader;     useLight = true; -    useTexture = true; +    useTexture = true;   } else if (key == '5') {     println("Pixel lights, no texture shading");     selShader = pixlightShader;     useLight = true; -    useTexture = false; +    useTexture = false;   } else if (key == '6') {     println("Pixel lights, texture shading");     selShader = texlightxShader;     useLight = true; -    useTexture = true; +    useTexture = true;   } else if (key == '7') {     println("Black&white texture filtering");     selShader = bwShader;     useLight = false; -    useTexture = true; +    useTexture = true;   } else if (key == '8') {     println("Edge detection filtering");     selShader = edgesShader;     useLight = false; -    useTexture = true; +    useTexture = true;   } else if (key == '9') {     println("Emboss filtering");     selShader = embossShader;     useLight = false; -    useTexture = true; +    useTexture = true;   } }
    @@ -1318,12 +1287,12 @@

    10. Point and line shaders

    - +Code listing 10.1: Simple point rendering sketch with associated shaders. - - + + +
    Code listing 10.1: Simple point rendering sketch with associated shaders.
     PShader pointShader;
     
    -void setup() {
    +void setup() {
       size(640, 360, P3D);
       
       pointShader = loadShader("pointfrag.glsl", "pointvert.glsl");
    @@ -1334,36 +1303,34 @@ 

    10. Point and line shaders

      background(0); } -void draw() { +void draw() {   shader(pointShader, POINTS); -  if (mousePressed) { +  if (mousePressed) {     point(mouseX, mouseY);   }   } -pointvert.glsl: - -#define PROCESSING_POINT_SHADER +pointvert.glsl: uniform mat4 projection; uniform mat4 modelview; -attribute vec4 vertex; +attribute vec4 position; attribute vec4 color; attribute vec2 offset; varying vec4 vertColor; void main() { - vec4 pos = modelview * vertex; + vec4 pos = modelview * position; vec4 clip = projection * pos; - + gl_Position = clip + projection * vec4(offset, 0, 0); - + vertColor = color; } -pointfrag.glsl: +pointfrag.glsl: #ifdef GL_ES precision mediump float; @@ -1372,7 +1339,7 @@

    10. Point and line shaders

    varying vec4 vertColor; -void main() { +void main() { gl_FragColor = vertColor; }
    @@ -1388,7 +1355,7 @@

    10. Point and line shaders

    The default point shader doesn't allow to apply any texturing to the points, but this limitation can be circumvented with a custom shader with an additional uniform for the texture sampler. Let's see in the next example how we can use this trick to create a shader that renders textured point sprites.

    - +Code listing 10.2: Sketch that renders sprites using a custom point shader. - + +
    Code listing 10.2: Sketch that renders sprites using a custom point shader.
     PShader pointShader;
    @@ -1398,14 +1365,14 @@ 

    10. Point and line shaders

    float weight = 100; -void setup() { +void setup() {   size(640, 360, P3D);      pointShader = loadShader("spritefrag.glsl", "spritevert.glsl");   pointShader.set("weight", weight);   cloud1 = loadImage("cloud1.png");   cloud2 = loadImage("cloud2.png"); -  cloud3 = loadImage("cloud3.png"); +  cloud3 = loadImage("cloud3.png");   pointShader.set("sprite", cloud1);        strokeWeight(weight); @@ -1415,14 +1382,14 @@

    10. Point and line shaders

      background(0); } -void draw() { +void draw() {   shader(pointShader, POINTS); -  if (mousePressed) { +  if (mousePressed) {     point(mouseX, mouseY);   }   } -void mousePressed() { +void mousePressed() {   if (key == '1') {     pointShader.set("sprite", cloud1);   } else if (key == '2') { @@ -1432,16 +1399,14 @@

    10. Point and line shaders

      } } -spritevert.glsl: - -#define PROCESSING_POINT_SHADER +spritevert.glsl: uniform mat4 projection; uniform mat4 modelview; uniform float weight; - -attribute vec4 vertex; + +attribute vec4 position; attribute vec4 color; attribute vec2 offset; @@ -1449,17 +1414,17 @@

    10. Point and line shaders

    varying vec2 texCoord; void main() { - vec4 pos = modelview * vertex; + vec4 pos = modelview * position; vec4 clip = projection * pos; - + gl_Position = clip + projection * vec4(offset, 0, 0); - + texCoord = (vec2(0.5) + offset / weight); - + vertColor = color; } -spritefrag.glsl: +spritefrag.glsl: #ifdef GL_ES precision mediump float; @@ -1471,7 +1436,7 @@

    10. Point and line shaders

    varying vec4 vertColor; varying vec2 texCoord; -void main() { +void main() { gl_FragColor = texture2D(sprite, texCoord) * vertColor; }
    @@ -1491,7 +1456,7 @@

    10. Point and line shaders

    -Another limitation of the default point rendering in Processing that we can overcome with a custom point shader is the use of many vertices to represent a single point. We saw that in the case of square points, actually 5 vertices are sent to the GPU per point. In the case of rounds points, this number could be significantly higher since the point circles are approximated with regular polygons of n sides. The number n grows as the point is larger on the screen. +Another limitation of the default point rendering in Processing that we can overcome with a custom point shader is the use of many vertices to represent a single point. We saw that in the case of square points, actually 5 vertices are sent to the GPU per point. In the case of rounds points, this number could be significantly higher since the point circles are approximated with regular polygons of n sides. The number n grows as the point is larger on the screen.

    @@ -1499,22 +1464,22 @@

    10. Point and line shaders

    - +Code listing 10.3: Sketch that draws procedurally-generated round points. @@ -1587,7 +1550,7 @@

    10. Point and line shaders

    Code listing 10.3: Sketch that draws procedurally-generated round points.
     PShader pointShader;
     
    -void setup() {
    +void setup() {
       size(640, 360, P3D);
       
    -  pointShader = loadShader("pointfrag.glsl", "pointvert.glsl");  
    +  pointShader = loadShader("pointfrag.glsl", "pointvert.glsl");
       pointShader.set("sharpness", 0.9);
       
       strokeCap(SQUARE);
    -  background(0);  
    +  background(0);
     }
     
    -void draw() {
    +void draw() {
       if (mousePressed) {
         shader(pointShader, POINTS);
         
    @@ -1522,19 +1487,17 @@ 

    10. Point and line shaders

        pointShader.set("weight", w);     strokeWeight(w);      -    stroke(random(255), random(255), random(255)); +    stroke(random(255), random(255), random(255));     point(mouseX, mouseY);   } } -pointvert.glsl: - -#define PROCESSING_POINT_SHADER +pointvert.glsl: uniform mat4 projection; uniform mat4 transform; - -attribute vec4 vertex; + +attribute vec4 position; attribute vec4 color; attribute vec2 offset; @@ -1543,15 +1506,15 @@

    10. Point and line shaders

    varying vec2 pos; void main() { - vec4 clip = transform * vertex; + vec4 clip = transform * position; gl_Position = clip + projection * vec4(offset, 0, 0); - + vertColor = color; center = clip.xy; pos = offset; } -pointfrag.glsl: +pointfrag.glsl: #ifdef GL_ES precision mediump float; @@ -1565,12 +1528,12 @@

    10. Point and line shaders

    varying vec2 center; varying vec2 pos; -void main() { +void main() { float len = weight/2.0 - length(pos); vec4 color = vec4(1.0, 1.0, 1.0, len); - color = mix(vec4(0.0), color, sharpness); - color = clamp(color, 0.0, 1.0); - gl_FragColor = color * vertColor; + color = mix(vec4(0.0), color, sharpness); + color = clamp(color, 0.0, 1.0); + gl_FragColor = color * vertColor; }
    - +Code listing 10.4: Simple line shader.
    Code listing 10.4: Simple line shader.
     PShape cube;
    @@ -1596,7 +1559,7 @@ 

    10. Point and line shaders

    float weight = 10; -void setup() { +void setup() {   size(640, 360, P3D);      lineShader = loadShader("linefrag.glsl", "linevert.glsl"); @@ -1607,7 +1570,7 @@

    10. Point and line shaders

      cube.setStrokeWeight(weight); } -void draw() { +void draw() {   background(0);      translate(width/2, height/2); @@ -1620,42 +1583,40 @@

    10. Point and line shaders

      angle += 0.01;   } -linevert.glsl: - -#define PROCESSING_LINE_SHADER +linevert.glsl: uniform mat4 transform; uniform vec4 viewport; -attribute vec4 vertex; +attribute vec4 position; attribute vec4 color; attribute vec4 direction; varying vec4 vertColor; - + vec3 clipToWindow(vec4 clip, vec4 viewport) { vec3 dclip = clip.xyz / clip.w; vec2 xypos = (dclip.xy + vec2(1.0, 1.0)) * 0.5 * viewport.zw; return vec3(xypos, dclip.z * 0.5 + 0.5); } - + void main() { - vec4 clip0 = transform * vertex; + vec4 clip0 = transform * position; vec4 clip1 = clip0 + transform * vec4(direction.xyz, 0); float thickness = direction.w; - - vec3 win0 = clipToWindow(clip0, viewport); - vec3 win1 = clipToWindow(clip1, viewport); + + vec3 win0 = clipToWindow(clip0, viewport); + vec3 win1 = clipToWindow(clip1, viewport); vec2 tangent = win1.xy - win0.xy; - + vec2 normal = normalize(vec2(-tangent.y, tangent.x)); vec2 offset = normal * thickness; gl_Position.xy = clip0.xy + offset.xy; gl_Position.zw = clip0.zw; - vertColor = color; + vertColor = color; } -linefrag.glsl: +linefrag.glsl: #ifdef GL_ES precision mediump float; @@ -1686,7 +1647,7 @@

    10. Point and line shaders

    - +Code listing 10.5: Line shader with transparency effect on the edges of the strokes.
    Code listing 10.5: Line shader with transparency effect on the edges of the strokes.
     PShape cube;
    @@ -1695,7 +1656,7 @@ 

    10. Point and line shaders

    float weight = 20; -void setup() { +void setup() {   size(640, 360, P3D);      lineShader = loadShader("linefrag.glsl", "linevert.glsl"); @@ -1709,7 +1670,7 @@

    10. Point and line shaders

      hint(DISABLE_DEPTH_MASK); } -void draw() { +void draw() {   background(0);      translate(width/2, height/2); @@ -1722,46 +1683,44 @@

    10. Point and line shaders

      angle += 0.01;   } -linevert.glsl: - -#define PROCESSING_LINE_SHADER +linevert.glsl: uniform mat4 transform; uniform vec4 viewport; -attribute vec4 vertex; +attribute vec4 position; attribute vec4 color; attribute vec4 direction; varying vec2 center; varying vec2 normal; varying vec4 vertColor; - + vec3 clipToWindow(vec4 clip, vec4 viewport) { vec3 dclip = clip.xyz / clip.w; vec2 xypos = (dclip.xy + vec2(1.0, 1.0)) * 0.5 * viewport.zw; return vec3(xypos, dclip.z * 0.5 + 0.5); } - + void main() { - vec4 clip0 = transform * vertex; + vec4 clip0 = transform * position; vec4 clip1 = clip0 + transform * vec4(direction.xyz, 0); float thickness = direction.w; - - vec3 win0 = clipToWindow(clip0, viewport); - vec3 win1 = clipToWindow(clip1, viewport); + + vec3 win0 = clipToWindow(clip0, viewport); + vec3 win1 = clipToWindow(clip1, viewport); vec2 tangent = win1.xy - win0.xy; - + normal = normalize(vec2(-tangent.y, tangent.x)); vec2 offset = normal * thickness; gl_Position.xy = clip0.xy + offset.xy; gl_Position.zw = clip0.zw; - vertColor = color; - + vertColor = color; + center = (win0.xy + win1.xy) / 2.0; } -linefrag.glsl: +linefrag.glsl: #ifdef GL_ES precision mediump float; @@ -1776,23 +1735,19 @@

    10. Point and line shaders

    void main() { vec2 v = gl_FragCoord.xy - center; - float alpha = 1.0 - abs(2.0 * dot(normalize(normal), v) / weight); + float alpha = 1.0 - abs(2.0 * dot(normalize(normal), v) / weight); gl_FragColor = vec4(vertColor.rgb, alpha); }
    -

    The key calculation here is the dot product between the normal vector and the vector from the center of the stroke quad and the current fragment position, dot(normalize(normal), v), which will be exactly 0 along the spine of the quad, and so, giving alpha equal to 1. +

    The key calculation here is the dot product between the normal vector and the vector from the center of the stroke quad and the current fragment position, dot(normalize(normal), v), which will be exactly 0 along the spine of the quad, and so, giving alpha equal to 1.

    The DISABLE_DEPTH_MASK hint in the sketch code is a simple (but not perfect) trick to avoid obvious visual artifacts due to the use of semi-transparent geometry together with alpha blending.

    -

     

    - -

    This tutorial is for Processing version 2.0+. If you see any errors or have comments, please let us know. This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

    -

    diff --git a/content/static/tutorials/pshape/index.html b/content/static/tutorials/pshape/index.html index 3ad667c55..534538502 100644 --- a/content/static/tutorials/pshape/index.html +++ b/content/static/tutorials/pshape/index.html @@ -1,20 +1,23 @@ -

    PShape

    + + +
    -

    - - +

    If you see any errors in this tutorial or have comments, please let us know. This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

    + +

    PShape

    +

    Daniel Shiffman

    -

    This tutorial is for Processing version 2.0+. If you see any errors or have comments, please let us know. This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

    +

    + (The source code for this tutorial are in the Processing Examples. Select File → Examples in the Processing IDE, then select Topics → Create Shapes.) +

    -

    The source code contained in this tutorial can be found by selecting File > Examples in the Processing IDE. Then select Topics > Create Shapes.

    + -

    Before we should begin, it should also be noted that the features of this tutorial (i.e. the use of createShape()) are currently only supported by the P2D and P3D drawing modes.

    - -

    What is a PShape?

    - -

    One of the very first things you learn when programming with Processing is how to draw "primitive" shapes to the screen: rectangles, ellipses, lines, triangles, and more.

    +

    + One of the very first things you learn when programming with Processing is how to draw "primitive" shapes to the screen: rectangles, ellipses, lines, triangles, and more. +

     rect(x,y,w,h);
    @@ -23,7 +26,9 @@ 

    What is a PShape?

    triangle(x1,y1,x2,y2,x3,y3);
    -

    A more advanced drawing option is to use beginShape() and endShape() to specify the vertices of a custom polygon:

    +

    + A more advanced drawing option is to use beginShape() and endShape() to specify the vertices of a custom polygon +

     beginShape();
    @@ -35,7 +40,9 @@ 

    What is a PShape?

    endShape();
    -

    And you can build more complex shapes by grouping a set of drawing functions together, even perhaps organizing them into a class.

    +

    + And you can build more complex shapes by grouping a set of drawing functions together, even perhaps organizing them into a class. +

     class MyWackyShape {
    @@ -60,15 +67,23 @@ 

    What is a PShape?

    }
    -

    This is all well and good and will get you pretty far. There's very little you can't draw just knowing the above. However, there is another step. A step that can, in some cases, improve the speed of your rendering as well as offer a more advanced organizational model for your code—PShape.

    +

    + This is all well and good and will get you pretty far. There's very little you can't draw just knowing the above. However, there is another step. A step that can, in some cases, improve the speed of your rendering as well as offer a more advanced organizational model for your code—PShape. +

    + +

    + PShape is a datatype for storing shapes. These can be shapes that you build out of custom geometry or shapes that you load from an external file, such as an SVG. +

    -

    PShape is a datatype for storing shapes. These can be shapes that you build out of custom geometry or shapes that you load from an external file, such as an SVG.

    -

    Primitive PShapes

    -

    Let's begin with one of the simplest cases for use of a PShape. Here's a simple Processing draw() method that draws an rectangle following the mouse.

    +

    Primitive PShapes

    -

    +

    + Let's begin with one of the simplest cases for use of a PShape. Here's a simple Processing draw() method that draws an rectangle following the mouse. +

    + +
     void draw() {
    @@ -79,7 +94,9 @@ 

    Primitive PShapes

    }
    -

    Pretty basic stuff. If this was all the code we had, there's not necessarily a good reason for using a PShape instead, but we're going to push ahead and make a PShape rectangle anyway as a demonstration. Our goal here is to have a variable that stores the color and dimensions of that variable, allowing our draw function to look like this.

    +

    + Pretty basic stuff. If this was all the code we had, there's not necessarily a good reason for using a PShape instead, but we're going to push ahead and make a PShape rectangle anyway as a demonstration. Our goal here is to have a variable that stores the color and dimensions of that variable, allowing our draw function to look like this. +

     void draw() {
    @@ -88,13 +105,18 @@ 

    Primitive PShapes

    }
    -

    And what is this "rectangle"? It's a PShape.

    +

    + And what is this "rectangle"? It's a PShape. +

     PShape rectangle;
     
    -

    To initialize a PShape, use the createShape() method. The first argument for createShape() is a constant, and this constant specifies the type of PShape you intend to make. As we'll see throughout this tutorial there are a number of options: ELLIPSE, RECT, ARC, TRIANGLE, SPHERE, BOX, LINE, GROUP, and more. Here we are making a primitive shape, a rectangle, so we use the constant "RECT." The arguments that follow are the (x,y) location for the shape as well as its dimensions (width,height). So now our setup() should look like:

    + +

    + To initialize a PShape, use the createShape() method. The first argument for createShape() is a constant, and this constant specifies the type of PShape you intend to make. As we'll see throughout this tutorial there are a number of options: ELLIPSE, RECT, ARC, TRIANGLE, SPHERE, BOX, LINE, GROUP, and more. Here we are making a primitive shape, a rectangle, so we use the constant "RECT." The arguments that follow are the (x,y) location for the shape as well as its dimensions (width,height). So now our setup() should look like: +

     PShape rectangle;
    @@ -105,7 +127,9 @@ 

    Primitive PShapes

    }
    -

    There's a big problem though. Yes, we want the rectangle to appear at the mouse location, but when a sketch first begins mouseX and mouseY are set to zero. mouseX and mouseY don't come to life until we are looping through draw(). It's important to remember that when using PShape, what we're really doing is configuring the geometry relative to the origin (0,0). It's generally then advantageous to then move that shape about the screen using transformations: translate(), rotate(), etc. So now we have:

    +

    + There's a big problem though. Yes, we want the rectangle to appear at the mouse location, but when a sketch first begins mouseX and mouseY are set to zero. mouseX and mouseY don't come to life until we are looping through draw(). It's important to remember that when using PShape, what we're really doing is configuring the geometry relative to the origin (0,0). It's generally then advantageous to then move that shape about the screen using transformations: translate(), rotate(), etc. So now we have: +

     PShape rectangle;
    @@ -116,7 +140,9 @@ 

    Primitive PShapes

    }
    -

    and if we wanted the Rectangle to be drawn from its center:

    +

    + and if we wanted the Rectangle to be drawn from its center: +

     PShape rectangle;
    @@ -127,7 +153,9 @@ 

    Primitive PShapes

    }
    -

    We can then move it according to the mouse with translate.

    +

    + We can then move it according to the mouse with translate. +

     void draw() {
    @@ -137,7 +165,9 @@ 

    Primitive PShapes

    }
    -

    One of the nice things about the PShape object is that it can also store color information in addition to geometry. Once a shape has been created in order to alter its fill or stroke, use the methods setFill(), setStroke(), setStrokeWeight(), etc.

    +

    + One of the nice things about the PShape object is that it can also store color information in addition to geometry. Once a shape has been created in order to alter its fill or stroke, use the methods setFill(), setStroke(), setStrokeWeight(), etc. +

     void setup() {
    @@ -149,9 +179,11 @@ 

    Primitive PShapes

    }
    -

    These methods can be called during draw() as well if you want to change the color of the shape dynamically.

    +

    + These methods can be called during draw() as well if you want to change the color of the shape dynamically. +

    -

    +

     void draw() {
    @@ -162,15 +194,23 @@ 

    Primitive PShapes

    }
    -

    It should be noted that unlike with fill() and stroke() you must pass a full color as an argument. i.e. instead of saying "setFill(255,0,0)" for a red fill, you'll need to say "setFill(color(255,0,0))". In addition, setFill() and setStroke() can take a boolean argument (e.g. setFill(false)) to turn the fill or stroke on or off for a given vertex as well as an integer (e.g. setFill(i,color(255,0,0))) to set the fill or stroke for a specific vertex. +

    + It should be noted that unlike with fill() and stroke() you must pass a full color as an argument. i.e. instead of saying "setFill(255,0,0)" for a red fill, you'll need to say "setFill(color(255,0,0))". In addition, setFill() and setStroke() can take a boolean argument (e.g. setFill(false)) to turn the fill or stroke on or off for a given vertex as well as an integer (e.g. setFill(i,color(255,0,0))) to set the fill or stroke for a specific vertex. +

    + +

    + See Example "PrimitivePShape" (under File → Examples → Topics → Create Shapes) for an example that demonstrates all of the above code. +

    -

    See Example "PrimitivePShape" (under File > Examples > Topics > Create Shapes) for an example that demonstrates all of the above code.

    -

    Custom PShapes

    -

    PShapes also can be configured with custom vertices. You've probably done this before, without PShape, just using beginShape() and endShape(). For example, let's say you wanted to draw a star in Processing. You might have some code as follows:

    +

    Custom PShapes

    -

    +

    + PShapes also can be configured with custom vertices. You've probably done this before, without PShape, just using beginShape() and endShape(). For example, let's say you wanted to draw a star in Processing. You might have some code as follows: +

    + +

     void draw() {
    @@ -194,7 +234,9 @@ 

    Custom PShapes

    }
    -

    Here, just as in the previous example, our goal will be to draw the shape itself as an object in draw().

    +

    + Here, just as in the previous example, our goal will be to draw the shape itself as an object in draw(). +

     void draw() {
    @@ -204,7 +246,9 @@ 

    Custom PShapes

    }
    -

    To make a PShape with custom vertices, you must first call createShape() to make the shape object and then call beginShape() and endShape() on that object

    +

    + To make a PShape with custom vertices, you must first call createShape() to make the shape object and then call beginShape() and endShape() on that object: +

     PShape star;
    @@ -220,7 +264,9 @@ 

    Custom PShapes

    }
    -

    Then all the vertices (and colors) can be specified by calling the functions on the new PShape object "star." Note that setFill() and setStroke() are not required here, only if you choose to alter the colors after the shape has been initially created.

    +

    + Then all the vertices (and colors) can be specified by calling the functions on the new PShape object "star." Note that setFill() and setStroke() are not required here, only if you choose to alter the colors after the shape has been initially created. +

    void setup() {
       size(640,360,P2D);
    @@ -247,11 +293,17 @@ 

    Custom PShapes

    }
    -

    See Example "PolygonPShape" (under File > Examples > Topics > Create Shapes) for an example that demonstrates all of the above code.

    +

    + See Example "PolygonPShape" (under File > Examples > Topics > Create Shapes) for an example that demonstrates all of the above code. +

    + + -

    Many PShapes

    +

    Many PShapes

    -

    As we mentioned earlier, one reason to use PShape is just to help you organize your geometry. However, there's another reason. Let's assume for a moment that you have a Star class, with a display() function that looks like so:

    +

    + As we mentioned earlier, one reason to use PShape is just to help you organize your geometry. However, there's another reason. Let's assume for a moment that you have a Star class, with a display() function that looks like so: +

     void display() {
    @@ -276,9 +328,11 @@ 

    Many PShapes

    }
    -

    and in draw(), you are iterating through an array of Star objects, displaying each one.

    +

    + and in draw(), you are iterating through an array of Star objects, displaying each one. +

    -

    +
     void draw() {
    @@ -289,7 +343,9 @@ 

    Many PShapes

    }
    -

    Try to draw around 500 stars and your sketch may run rather slowly, about 10 FPS. This is because this style of drawing, often referred to as "immediate" mode, requires the renderer to compute the geometry each time through draw for each and every star. But is this necessary? After all, it's the same star over and over and over again. Using a PShape allows Processing to essentially "memorize" the geometry of that star. Drawing the memorized geometry (called a "Vertex Buffer Object" in lower-level OpenGL syntax) is called "retained" mode and is a great deal faster. Those 500 stars render easily at 60 FPS using a PShape instead. This can be achieved by including a PShape variable as part of the Star class.

    +

    + Try to draw around 500 stars and your sketch may run rather slowly, about 10 FPS. This is because this style of drawing, often referred to as "immediate" mode, requires the renderer to compute the geometry each time through draw for each and every star. But is this necessary? After all, it's the same star over and over and over again. Using a PShape allows Processing to essentially "memorize" the geometry of that star. Drawing the memorized geometry (called a "Vertex Buffer Object" in lower-level OpenGL syntax) is called "retained" mode and is a great deal faster. Those 500 stars render easily at 60 FPS using a PShape instead. This can be achieved by including a PShape variable as part of the Star class. +

     class Star {
    @@ -297,7 +353,9 @@ 

    Many PShapes

    float x, y;
    -

    That PShape then needs to be initialized in the constructor. This can be done directly, right there in the class.

    +

    + That PShape then needs to be initialized in the constructor. This can be done directly, right there in the class. +

       Star() {
    @@ -323,7 +381,9 @@ 

    Many PShapes

    }
    -

    This method makes sense if each object itself has its own geometry, generated via an algorithm. However, if each object is displaying the identical PShape, it likely makes more sense to pass in a reference to a PShape in the constructor itself. Let's take a look at how this might work. Let's say we create a generic class called "Polygon" which has a reference to a PShape (which is draws in a display method).

    +

    + This method makes sense if each object itself has its own geometry, generated via an algorithm. However, if each object is displaying the identical PShape, it likely makes more sense to pass in a reference to a PShape in the constructor itself. Let's take a look at how this might work. Let's say we create a generic class called "Polygon" which has a reference to a PShape (which is draws in a display method). +

     class Polygon {
    @@ -335,7 +395,9 @@ 

    Many PShapes

    }
    -

    TIn the previous example, the shape was created right there in the object's constructor. Here we are going to demonstrate a different way to write the constructor where the shape is set via an argument.

    +

    + In the previous example, the shape was created right there in the object's constructor. Here we are going to demonstrate a different way to write the constructor where the shape is set via an argument. +

       Polygon(PShape s_) {
    @@ -343,7 +405,9 @@ 

    Many PShapes

    }
    -

    For this to work, however, a PShape must be passed into when the object is created. Here is how this would look in the main tab with setup():

    +

    + For this to work, however, a PShape must be passed into when the object is created. Here is how this would look in the main tab with setup(): +

     Polygon poly;                   // An object of type Polygon
    @@ -366,50 +430,60 @@ 

    Many PShapes

    star.vertex(-47, -15); star.vertex(-14, -20); star.endShape(CLOSE); - - poly = new Polygon(star); // Then we make the Polygon object by passing in the reference to the PShape - + + // Make the Polygon object by passing in the reference to the PShape + poly = new Polygon(star); }
    -

    This is a very flexible approach. For example if you had an array of PShape objects, you could create new Polygon objects each one with a random PShape. Here is a simple implementation.

    +

    + This is a very flexible approach. For example if you had an array of PShape objects, you could create new Polygon objects each one with a random PShape. Here is a simple implementation. +

    -

    +
     ArrayList polygons;
    -PShape[] shapes = new PShape[2];                       // An array of PShapes
    +PShape[] shapes = new PShape[2];                 // An array of PShapes
     
     void setup() {
       size(640, 360, P2D);
       smooth();
    -  shapes[0] = createShape(ELLIPSE,0,0,100,100);        // Two PShapes
    +  shapes[0] = createShape(ELLIPSE,0,0,100,100);  // Two PShapes
       shapes[1] = createShape(RECT,0,0,100,100);
     
       polygons = new ArrayList();
     
       for (int i = 0; i < 25; i++) {
    -    int selection = int(random(shapes.length));        // Pick a random index
    -    Polygon p = new Polygon(shapes[selection]);        // Use corresponding PShape to create Polygon
    +    int selection = int(random(shapes.length));  // Pick a random index
    +    Polygon p = new Polygon(shapes[selection]);  // Use corresponding PShape to create Polygon
         polygons.add(p);
       }
     }
     
    -

    For the full examples, take a look at "PolygonPShapeOOP1", "PolygonPShapeOOP2", and "PolygonPShapeOOP3" (Under File > Examples > Topics > Create Shapes).

    +

    + For the full examples, take a look at "PolygonPShapeOOP1", "PolygonPShapeOOP2", and "PolygonPShapeOOP3" (Under File → Examples → Topics → Create Shapes). +

    + -

    More Custom PShapes

    -

    PShapes support all the same types of shapes you can draw in immediate mode. These include: POINTS, LINES, TRIANGLES, TRIANGLE_FAN, TRIANGLE_STRIP, QUADS, and QUAD_STRIP. For example, if you want to create a quad strip, you would say:

    +

    More Custom PShapes

    + +

    + PShapes support all the same types of shapes you can draw in immediate mode. These include: POINTS, LINES, TRIANGLES, TRIANGLE_FAN, TRIANGLE_STRIP, QUADS, and QUAD_STRIP. For example, if you want to create a quad strip, you would say: +

     PShape s = createShape();
     s.beginShape(QUAD_STRIP);
     
    -

    If no mode is specified, the shape can be any irregular polygon as we saw in the previous star example. A PShape can also be a path by not closing the shape. Here is an example of a path that follows a sine wave as a PShape object.

    +

    + If no mode is specified, the shape can be any irregular polygon as we saw in the previous star example. A PShape can also be a path by not closing the shape. Here is an example of a path that follows a sine wave as a PShape object. +

    -

    +

       PShape path = createShape();
    @@ -424,11 +498,15 @@ 

    More Custom PShapes

    path.endShape();
    -

    See Example "PathPShape" for the full implementation.

    +

    + See Example "PathPShape" for the full implementation. +

    -

    PShapes also include the methods beginContour() and endContour(). These methods allow you to cut a shape out of another and make shapes with holes in them. Think of drawing the outline of a letter, like P (for Processing). The outline of the P can be drawn as a series of vertices, but to get the counter shape knocked out of the middle of the P, you need begin/endContour and draw the path of the interior. Here's a simple example that draws an interior square inside of an exterior one.

    +

    + PShapes also include the methods beginContour() and endContour(). These methods allow you to cut a shape out of another and make shapes with holes in them. Think of drawing the outline of a letter, like P (for Processing). The outline of the P can be drawn as a series of vertices, but to get the counter shape knocked out of the middle of the P, you need begin/endContour and draw the path of the interior. Here's a simple example that draws an interior square inside of an exterior one. +

    -

    +

     // Make a shape
    @@ -454,13 +532,20 @@ 

    More Custom PShapes

    s.endShape();
    -

    Note that the vertices that define a negative shape must "wind" in the opposite direction from the exterior shape. First draw vertices for the exterior shape in clockwise order, then for internal shapes, draw vertices counter-clockwise.

    +

    + Note that the vertices that define a negative shape must "wind" in the opposite direction from the exterior shape. First draw vertices for the exterior shape in clockwise order, then for internal shapes, draw vertices counter-clockwise. +

    + +

    + See Example "BeginEndContour" (under File → Examples → Topics → Create Shapes) for the full implementation. +

    -

    See Example "BeginEndContour" (under File > Examples > Topics > Create Shapes) for the full implementation.

    -

    PShape Groups

    +

    PShape Groups

    -

    Another convenience of PShape is the ability to group shapes. For example, what if you wanted to create an alien creatures out of a set of circles, rectangles, and custom polygons. If the head were a circle and the body a rectangle, you might think you need:

    +

    + Another convenience of PShape is the ability to group shapes. For example, what if you wanted to create an alien creatures out of a set of circles, rectangles, and custom polygons. If the head were a circle and the body a rectangle, you might think you need: +

     PShape head = createShape(ELLIPSE,0,0,50,50);
    @@ -469,9 +554,11 @@ 

    PShape Groups

    shape(body);
    -

    While of course this would work, it would be a great deal more convenient if you could group the head and body into one PShape. With a PShape "GROUP", you can.

    +

    + While of course this would work, it would be a great deal more convenient if you could group the head and body into one PShape. With a PShape "GROUP", you can. +

    -

    +

     // Make the parent shape
    @@ -490,14 +577,21 @@ 

    PShape Groups

    shape(alien);
    -

    For a full example that demonstrates a PShape that groups together a primitive shape, custom polygon, and path, see "GroupPShape" (under File > Examples > Topics > Create Shapes). +

    + For a full example that demonstrates a PShape that groups together a primitive shape, custom polygon, and path, see "GroupPShape" (under File > Examples > Topics > Create Shapes). +

    + +

    + PShape groups allow you build a sophisticated hierarchy of shapes. This in turn allows you to set the color and attributes of the child shapes by calling the corresponding method at the parent level. Similarly, by calling the transformation functions at a given level of the hierarchy, you only affect the shapes below. +

    -PShape groups allow you build a sophisticated hierarchy of shapes. This in turn allows you to set the color and attributes of the child shapes by calling the corresponding method at the parent level. Similarly, by calling the transformation functions at a given level of the hierarchy, you only affect the shapes below. -

    -

    Loading External Shapes

    -

    PShapes also support loading shape files, such as an SVG (for 2D shapes) or OBJ (for 3D shapes). This can be achieved with the loadShape() method.

    +

    Loading External Shapes

    + +

    + PShapes also support loading shape files, such as an SVG (for 2D shapes) or OBJ (for 3D shapes). This can be achieved with the loadShape() method. +

     PShape svg;
    @@ -513,18 +607,26 @@ 

    Loading External Shapes

    }
    -

    Manipulating the Vertices of a PShape in Real-Time

    -

    After about five minutes of working with PShape, the question inevitably arises: "What do I do if I want to wiggle all of my vertices?" PShape allows you to dynamically access and alter the vertices through the methods getVertex() and setVertex().

    -

    To iterate over the vertices of a PShape, you can loop from 0 to the total number of vertices (getVertexCount()). Assuming a PShape "s", this would look something like:

    +

    Manipulating the Vertices of a PShape in Real-Time

    + +

    + After about five minutes of working with PShape, the question inevitably arises: "What do I do if I want to wiggle all of my vertices?" PShape allows you to dynamically access and alter the vertices through the methods getVertex() and setVertex(). +

    + +

    + To iterate over the vertices of a PShape, you can loop from 0 to the total number of vertices (getVertexCount()). Assuming a PShape "s", this would look something like: +

     for (int i = 0; i < s.getVertexCount(); i++) {
     }
     
    -

    The vertices can be retrieved as PVector objects with getVertex().

    +

    + The vertices can be retrieved as PVector objects with getVertex(). +

     for (int i = 0; i < s.getVertexCount(); i++) {
    @@ -532,7 +634,9 @@ 

    Manipulating the Vertices of a PShape in Real-Time

    }
    -

    You could then move that vertex by manipulating the PVector and setting new values with setVertex().

    +

    + You could then move that vertex by manipulating the PVector and setting new values with setVertex(). +

     for (int i = 0; i < s.getVertexCount(); i++) {
    @@ -543,13 +647,30 @@ 

    Manipulating the Vertices of a PShape in Real-Time

    }
    -

    For an example that wiggles a polygon's vertices using Perlin noise, see "WigglePShape" (under File > Examples > Topics > Create Shapes).

    +

    + For an example that wiggles a polygon's vertices using Perlin noise, see "WigglePShape" (under File → Examples > Topics → Create Shapes). +

    -

     

    +

    3D and Textures

    + +

    + This tutorial has focused on the basics of working with PShape objects in the context of 2D drawing. However, all of the 3D functionality described in the P3D tutorial is also available with PShape. The main difference is that in 3D vertices are specified with an x, y, and z coordinate. In addition, PShape objects can be textured automatically using the setTexture() function. For complex shapes like a sphere, this makes things quite easy. +

    + +
    +PImage img;
    +PShape globe;
    +	
    +void setup() {
    +  // Load an image
    +  img = loadImage("earth.jpg");
    +  globe = createShape(SPHERE, 50);
    +  // Automatically texture the shape with the image
    +  globe.setTexture(img);
    +}
    +
    -

    This tutorial is for Processing version 2.0+. If you see any errors or have comments, please let us know. This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

    - + -
    -

    +
    diff --git a/content/static/tutorials/pvector/imgs/add.svg b/content/static/tutorials/pvector/imgs/add.svg index 9d23e312b..0a398a332 100644 --- a/content/static/tutorials/pvector/imgs/add.svg +++ b/content/static/tutorials/pvector/imgs/add.svg @@ -2,37 +2,73 @@ - - -u - - -6 - - - -v - - -8 - - - - -w - - - -w - - -u - - -v - - -= -+ + viewBox="0 296 612 200" enable-background="new 0 296 612 200" xml:space="preserve"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + += ++ diff --git a/content/static/tutorials/pvector/imgs/definition.svg b/content/static/tutorials/pvector/imgs/definition.svg index 3059cbc6f..408fe7e92 100644 --- a/content/static/tutorials/pvector/imgs/definition.svg +++ b/content/static/tutorials/pvector/imgs/definition.svg @@ -2,12 +2,232 @@ - - - - -Point B -Point A -A Vector (drawn as an arrow)represents the differencebeteen points A and B. + viewBox="-16.5 246 645 300" enable-background="new -16.5 246 645 300" xml:space="preserve"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/pvector/imgs/div.svg b/content/static/tutorials/pvector/imgs/div.svg index 117dc672d..dcca3cb7a 100644 --- a/content/static/tutorials/pvector/imgs/div.svg +++ b/content/static/tutorials/pvector/imgs/div.svg @@ -2,36 +2,75 @@ - -u --4 --2 - - -8 -4 - - -w - - -u - - -2 -= -/ - - - - - - - -w - - - - + viewBox="-16.5 314.5 645 163" enable-background="new -16.5 314.5 645 163" xml:space="preserve"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + += +/ + + + + + + + + + + + + + + diff --git a/content/static/tutorials/pvector/imgs/howtogetthere.svg b/content/static/tutorials/pvector/imgs/howtogetthere.svg index 2139d8d23..3832d1762 100644 --- a/content/static/tutorials/pvector/imgs/howtogetthere.svg +++ b/content/static/tutorials/pvector/imgs/howtogetthere.svg @@ -2,16 +2,271 @@ - - -NewLocation -OriginalLocation -A Vector telling ushow to get there! - - - -VerticalSteps -HorizontalSteps - + viewBox="-16.5 286 645 220" enable-background="new -16.5 286 645 220" xml:space="preserve"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/pvector/imgs/mag.svg b/content/static/tutorials/pvector/imgs/mag.svg index 3912d4ed8..21dc49665 100644 --- a/content/static/tutorials/pvector/imgs/mag.svg +++ b/content/static/tutorials/pvector/imgs/mag.svg @@ -2,20 +2,85 @@ -3 -4 - - - - -v - - - - -How long is the vector? - - + viewBox="-16.5 314.5 645 163" enable-background="new -16.5 314.5 645 163" xml:space="preserve"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/pvector/imgs/mouseaccelerate1.svg b/content/static/tutorials/pvector/imgs/mouseaccelerate1.svg index e478d643c..bc42489e4 100644 --- a/content/static/tutorials/pvector/imgs/mouseaccelerate1.svg +++ b/content/static/tutorials/pvector/imgs/mouseaccelerate1.svg @@ -2,12 +2,266 @@ - - - - -mouselocation -moverobject -This is what we wantour acceleration vectorto look like (only not this big). + viewBox="-16.5 296 645 200" enable-background="new -16.5 296 645 200" xml:space="preserve"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/pvector/imgs/mouseaccelerate2.svg b/content/static/tutorials/pvector/imgs/mouseaccelerate2.svg index 74cf6d11f..6fd4dda8c 100644 --- a/content/static/tutorials/pvector/imgs/mouseaccelerate2.svg +++ b/content/static/tutorials/pvector/imgs/mouseaccelerate2.svg @@ -2,14 +2,129 @@ - - - - -(mouseX,mouseY) -(x,y) -dy = mouseY-y -dx = mouseX-x - + viewBox="-16.5 299.5 645 193" enable-background="new -16.5 299.5 645 193" xml:space="preserve"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/pvector/imgs/mult.svg b/content/static/tutorials/pvector/imgs/mult.svg index a98190c81..0a631c266 100644 --- a/content/static/tutorials/pvector/imgs/mult.svg +++ b/content/static/tutorials/pvector/imgs/mult.svg @@ -2,38 +2,76 @@ - -u --3 - - -7 - - -w - - -w - - -u - - -3 -= -* - - - --9 -21 - - - - - - - - + viewBox="-16.5 221 645 350" enable-background="new -16.5 221 645 350" xml:space="preserve"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + += +* + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/pvector/imgs/normalize1.svg b/content/static/tutorials/pvector/imgs/normalize1.svg index 27c76fa87..0713c19ec 100644 --- a/content/static/tutorials/pvector/imgs/normalize1.svg +++ b/content/static/tutorials/pvector/imgs/normalize1.svg @@ -2,27 +2,360 @@ - - -This vector has a length of 10. -v - - -This vector points in the samedirection and nowhas a length of 1.(unit vector) -v - - - - - -10 - - - -1 -Process of Normalization - + viewBox="-16.5 271.5 645 249" enable-background="new -16.5 271.5 645 249" xml:space="preserve"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/pvector/imgs/normalize2.svg b/content/static/tutorials/pvector/imgs/normalize2.svg index cca0afeac..c6a924fee 100644 --- a/content/static/tutorials/pvector/imgs/normalize2.svg +++ b/content/static/tutorials/pvector/imgs/normalize2.svg @@ -2,29 +2,196 @@ -3 -4 - 5 (magnitude) - - - - - - - -3 / 5 -4 / 5 - 5 / 5 = 1 - - - - - - - -Normalization(Divide by magnitude.) - - - + viewBox="-16.5 320.5 645 151" enable-background="new -16.5 320.5 645 151" xml:space="preserve"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/pvector/imgs/pythagorean.svg b/content/static/tutorials/pvector/imgs/pythagorean.svg index 9f6859a33..58d3a0057 100644 --- a/content/static/tutorials/pvector/imgs/pythagorean.svg +++ b/content/static/tutorials/pvector/imgs/pythagorean.svg @@ -2,11 +2,51 @@ -b -a -a2 + b2 = c2 - - -c + viewBox="-16.5 314.5 645 163" enable-background="new -16.5 314.5 645 163" xml:space="preserve"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/pvector/imgs/steps.svg b/content/static/tutorials/pvector/imgs/steps.svg index cb766a227..f9d92c388 100644 --- a/content/static/tutorials/pvector/imgs/steps.svg +++ b/content/static/tutorials/pvector/imgs/steps.svg @@ -2,45 +2,729 @@ - - -3 StepsEast -15 StepsWest - - - - - - - - - -N -W -E -S - - - -5 StepsNorth -3 StepsNorth - - - -2 StepsEast -1 StepSouth - - - - - - - -(3,5) --> Walk three steps East, turn and walk five steps North. -(2,-1) --> Walk two steps East, turn and walk one step South. -(-15,3) --> Walk fifteen steps West, turn and walk three steps North. -(3,5) -(2,-1) -(-15,3) + viewBox="-16.5 46 645 700" enable-background="new -16.5 46 645 700" xml:space="preserve"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/pvector/imgs/sub.svg b/content/static/tutorials/pvector/imgs/sub.svg index 39c6ed068..4462f9bfe 100644 --- a/content/static/tutorials/pvector/imgs/sub.svg +++ b/content/static/tutorials/pvector/imgs/sub.svg @@ -2,42 +2,83 @@ - -u - - -2 - - --v - - -+v - - --2 - - - - - -w - - - -w - - -u - - -v - - -= -- - - - + viewBox="-16.5 295 645 202" enable-background="new -16.5 295 645 202" xml:space="preserve"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + += +- + + + diff --git a/content/static/tutorials/pvector/imgs/v.svg b/content/static/tutorials/pvector/imgs/v.svg index 6d3e47915..34f82eac4 100644 --- a/content/static/tutorials/pvector/imgs/v.svg +++ b/content/static/tutorials/pvector/imgs/v.svg @@ -2,27 +2,50 @@ - - -u - - - -2 - - - -v - - -5 - - - - - -4 - -3 + viewBox="-16.5 321 645 150" enable-background="new -16.5 321 645 150" xml:space="preserve"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/pvector/index.html b/content/static/tutorials/pvector/index.html index 44c0c86b1..81039248b 100644 --- a/content/static/tutorials/pvector/index.html +++ b/content/static/tutorials/pvector/index.html @@ -1,34 +1,31 @@ -

    PVector

    - -

    - - - -

    This tutorial is for Processing version 1.1+. If you see any errors or have comments, please let us know. This tutorial is adapted from The Nature of Code by Daniel Shiffman. This work is licensed under a Creative Commons Attribution-NonCommercial 3.0 Unported License.

    +
    + + - - + +
    + + +

    This tutorial is adapted from The Nature of Code by Daniel Shiffman. This work is licensed under a Creative Commons Attribution-NonCommercial 3.0 Unported License. If you see any errors or have comments, please let us know.

    + +

    PVector

    +

    Daniel Shiffman

    + -

    The source code contained in this tutorial is also available on GitHub.

    + -

     

    - - +

    + The most basic building block for programming motion is the vector. And so this is where we begin. Now, the word vector can mean a lot of different things. Vector is the name of a new wave rock band formed in Sacramento, CA in the early 1980s. It's the name of a breakfast cereal manufactured by Kellogg's Canada. In the field of epidemiology, a vector is used to describe an organism that transmits infection from one host to another. In the C++ programming language, a Vector (std::vector) is an implementation of a dynamically resizable array data structure. While all interesting, these are not the definitions we are looking for. Rather, what we want is this vector: +

    + A vector is a collection of values that describe relative position in space. +

    -

    The most basic building block for programming motion is the vector. And so this is where we begin. Now, the word vector can mean a lot of different things: -

    -Vector is the name of a new wave rock band formed in Sacremento, CA in the early 1980s. It's the name of a breakfast cereal manufactured by Kellogg's Canada. In the field of epidemiology, a vector is used to describe an organism that transmits infection from one host to another. In the C++ programming language, a Vector (std::vector) is an implementation of a dynamically resizable array data structure. -

    -While all interesting, these are not the definitions we are looking for. Rather, what we want is this vector: -

    -A vector is a collection of values that describe relative position in space. -

    - - +

    Vectors: You Complete Me

    -Before we get into vectors themselves, let's look at a beginner Processing example that demonstrates why it is in the first place we should care. If you've read any of the introductory Processing textbooks or taken a class on programming with Processing (and hopefully you've done one of these things to help prepare you for this book), you probably, at one point or another, learned to how to write a simple bouncing ball sketch. +

    +Before we get into vectors themselves, let's look at a beginner Processing example that demonstrates why it is in the first place we should care. If you've read any of the introductory Processing textbooks or taken a class on programming with Processing (and hopefully you've done one of these things to help prepare you for this book), you probably, at one point or another, learned how to write a simple bouncing ball sketch.

    -
    +

    Example: Bouncing Ball with No Vectors

     
    @@ -79,7 +76,7 @@ 

    Vectors: You Complete Me

  • WIND: xwind and ywind
  • FRICTION: xfriction and yfriction
  • -
    + It's becoming more and more clear that for every singular concept in this world (wind, location, acceleration, etc.), we need two variables. And this is only a two-dimensional world, in a 3D world, we'd need x, y, z, xspeed, yspeed, zspeed, etc. Our first goal in this chapter is learn the fundamental concepts behind using vectors and rewrite this bouncing ball example. After all, wouldn't it be nice if we could simple write our code like the following?

    Instead of: @@ -101,15 +98,15 @@

    Vectors: You Complete Me

    Vectors aren't going to allow us to do anything new. Using vectors won't suddenly make your Processing sketches magically simulate physics, however, they will simplify your code and provide a set of functions for common mathematical operations that happen over and over and over again while programming motion.

    As an introduction to vectors, we're going to live in 2 dimensions for quite some time (at least until we get through the first several chapters.) All of these examples can be fairly easily extended to three dimensions (and the class we will use -- PVector -- allows for three dimensions.) However, for the time being, it's easier to start with just two. -

    +

    Vectors: What are they to us, the Processing programmer?

    Technically speaking, the definition of a vector is the difference between two points. Consider how you might go about providing instructions to walk from one point to another.

    Here are some vectors and possible translations: -

    +
    - +
    You've probably done this before when programming motion. For every frame of animation (i.e. single cycle through Processing's draw() loop), you instruct each object on the screen to move a certain number of pixels horizontally and a certain number of pixels (vertically).

    @@ -120,7 +117,7 @@

    Vectors: What are they to us, the Processing programmer?

    location = location + velocity

    - +

    If velocity is a vector (the difference between two points), what is location? Is it a vector too? Technically, one might argue that location is not a vector, it's not describing the change between two points, it's simply describing a singular point in space -- a location. And so conceptually, we think of a location as different: a single point rather than the difference between two points.

    @@ -164,7 +161,7 @@

    Vectors: What are they to us, the Processing programmer?

    PVector velocity = new PVector(1,3.3);

    -Now that we have two vector objects ("location" and "velocity") we're ready to implement the algorithm for motion -- location = location + velocity. In the bouncing ball example, without vectors, we had: +Now that we have two vector objects ("location" and "velocity"), we're ready to implement the algorithm for motion -- location = location + velocity. In the bouncing ball example, without vectors, we had:
     
       // Add the current speed to the location.
    @@ -191,7 +188,7 @@ 

    Vectors: Addition

    Let's say I have the following two vectors:

    - +

    u = (5,2)
    v = (3,4) @@ -215,7 +212,7 @@

    Vectors: Addition

    w = (8,6)

    - +

    Now that we understand how to add two vectors together, we can look at how addition is implemented in the PVector class itself. Let's write a function called add() that takes as its argument another PVector object.
    @@ -310,20 +307,20 @@ 

    Vectors: More Algebra

    Addition was really just the first step. There is a long list of common mathematical operations that are used with vectors when programming the motion of objects on the screen. Following is a comprehensive list of all of the mathematical operations available as functions in the PVector class. We'll then go through a few of the key ones now. As our examples get more and more sophisticated we'll continue to reveal the details of these functions.

      -
    • add() -- add vectors
    • -
    • sub() -- subtract vectors
    • -
    • mult() -- scale the vector with multiplication
    • -
    • div() -- scale the vector with division
    • -
    • mag() -- calculate the magnitude of a vector
    • -
    • normalize() -- normalize the vector to unit length of 1
    • -
    • limit() -- limit the magnitude of a vector
    • -
    • heading() -- the heading of a vector expressed as an angle
    • -
    • dist() -- the euclidean distance between two vectors (considered as points)
    • -
    • angleBetween() -- find the angle between two vectors
    • -
    • dot() -- the dot product of two vectors
    • -
    • cross() -- the cross product of two vectors
    • +
    • add() — add vectors
    • +
    • sub() — subtract vectors
    • +
    • mult() — scale the vector with multiplication
    • +
    • div() — scale the vector with division
    • +
    • mag() — calculate the magnitude of a vector
    • +
    • normalize() — normalize the vector to unit length of 1
    • +
    • limit() — limit the magnitude of a vector
    • +
    • heading() — the heading of a vector expressed as an angle
    • +
    • dist() — the euclidean distance between two vectors (considered as points)
    • +
    • angleBetween() — find the angle between two vectors
    • +
    • dot() — the dot product of two vectors
    • +
    • cross() — the cross product of two vectors
    -

    +
    Having already run through addition, let's start with subtraction. This one's not so bad, just take the plus sign from addition and replace it with a minus!

    Vector subtraction: w = u - v @@ -340,15 +337,15 @@

    Vectors: More Algebra

    x = x - v.x; y = y - v.y; } -

    +
    -

    +
    Following is an example that demonstrates vector subtraction by taking the difference between two points -- the mouse location and the center of the window.

    -
    +

    Example: Vector subtraction
     
    @@ -372,7 +369,7 @@ 

    Vectors: More Algebra

    line(0,0,mouse.x,mouse.y); } -

    +
    @@ -413,7 +410,7 @@

    Vectors: More Algebra



    w = (-9, 21)

    - +

    The function inside the PVector class therefore is written as:
     
    @@ -486,7 +483,7 @@ 

    Vectors: Magnitude



    -

    +
    The length or "magnitude" of a vector is often written as: ||v||

    Understanding how to calculate the length (referred from here on out as magnitude) is incredibly useful and important. @@ -495,7 +492,7 @@

    Vectors: Magnitude



    -

    +
    The Pythagorean theorem: a squared plus b squared equals c squared.

    Armed with this lovely formula, we can now compute the magnitude of as follows: @@ -544,7 +541,7 @@

    Vectors: Normalizing



    -

    +
    Being able to quickly access the unit vector is useful since it describes a vector's direction without regard to length. For any given vector u, its unit vector (written as û) is calculated as follows:

    û = u / ||u|| @@ -553,7 +550,7 @@

    Vectors: Normalizing



    -

    +
    In the PVector class, we therefore write our normalization function as follows:
     
    @@ -962,7 +959,7 @@ 

    Vectors: Static vs. Non-Static

    y = y + v.y; }

    -. . . we see that it does not accomplish our goal. Number one, it does not return a new PVector (the return type is "void") and number two, it changes the value of the PVector upon which it is called. In order to add two PVector objects together and return the result as a new PVector, we must use the static add() function. +. . . we see that it does not accomplish our goal. Number one, it does not return a new PVector and number two, it changes the value of the PVector upon which it is called. In order to add two PVector objects together and return the result as a new PVector, we must use the static add() function.

    Functions that we call from the class name itself (rather than from a specific object instance) are known as static functions. @@ -982,10 +979,9 @@

    Vectors: Static vs. Non-Static

    return v3; }

    -There are several differences here: +There are two key differences here:
    • The function is labeled as static.
    • -
    • The function does not have a void return type, but rather returns a PVector.
    • The function creates a new PVector (v3) and returns the result of adding the components of v1 and v2 in that new PVector.
    When you call a static function, instead of referencing an actual object instance, you simply reference the name of the class itself. @@ -1001,18 +997,37 @@

    Vectors: Static vs. Non-Static


    The PVector class has static versions of add(), sub(), mult(), div(). +

    Vectors: Chaining

    + +

    One detail left out of the above discussion is that all of the methods discussed above return an object of type PVector. The key distinction is that the static versions return a new PVector object rather than act on the existing one. The non-static versions return a reference to that existing one. While this feature is not typically used in most Processing examples, it allows for the methods to be called in a single line of code. This is known as chaining. For example, let's say you would like to add to a PVector and then multiply it by two.

    + +
    +  PVector a = new PVector(0, 0);
    +  // Add (5,3) to a
    +  a.add(5, 3);
    +  // Multiply a by 2
    +  a.mult(2);
    +
    + +

    With chaining the above can be written as:

    + +
    +  PVector a = new PVector(0, 0);
    +  a.add(5, 3).mult(2);
    +
    +

    Vectors: Interactivity

    Ok, to finish out this tutorial, let's try something a bit more complex and a great deal more useful. Let's dynamically calculate an object's acceleration according to a rule, acceleration algorithm #4 -- "the object accelerates towards the mouse."

    - - -

    + + +
    Anytime we want to calculate a vector based on a rule/formula, we need to compute two things: magnitude and direction. Let's start with direction. We know the acceleration vector should point from the object's location towards the mouse location. Let's say the object is located at the point (x,y) and the mouse at (mouseX,mouseY).

    - + -

    +
    As illustrated in the above diagram, we see that we can get a vector (dx,dy) by subtracting the object's location from the mouse's location. After all, this is precisely where we started this chapter -- the definition of a vector is "the difference between two points in space!"

    dx = mouseX - x @@ -1068,7 +1083,7 @@

    Vectors: Interactivity

    location.add(velocity); } -
    + @@ -1166,12 +1181,7 @@

    Vectors: Interactivity

    -

     

    - -

    This tutorial is for Processing version 1.1+. If you see any errors or have comments, please let us know. This tutorial is adapted from The Nature of Code by Daniel Shiffman. This work is licensed under a Creative Commons Attribution-NonCommercial 3.0 Unported License.

    -
    -

    \ No newline at end of file diff --git a/content/static/tutorials/rendering/index.html b/content/static/tutorials/rendering/index.html index ddcb7109f..28a8c00e5 100644 --- a/content/static/tutorials/rendering/index.html +++ b/content/static/tutorials/rendering/index.html @@ -1,28 +1,34 @@ -
    - - - + +
    -

    Render Techniques

    -

    This tutorial is the Render Techniques chapter from the second edition of Processing: A Programming Handbook for Visual Designers and Artists, published by MIT Press. Copyright 2013 MIT Press. This tutorial is for Processing version 2.0+. If you see any errors or have comments, please let us know.

    -
    -
    -

    -Throughout this book, everything has drawn to the primary display window. Sometimes, however, there is an advantage in drawing to another graphics surface. All of the drawing features available in the display window can be applied to an offscreen drawing surface and then drawn back into the display window as an image or texture. This technique makes it easier to imagine a program as a stack of layers similar to the technique used in photo editing and vector drawing software. Similarly, drawing surfaces in Processing can be moved around, drawn using blending effects and transparency, and drawn in different orders to change how the layers combine. Before the discussion moves to multiple drawing surfaces, this chapter starts with a discussion of the different renderers used by Processing. -

    -
    -

    + + + - -
    + + +

    This tutorial is the Render Techniques chapter from Processing: A Programming Handbook for Visual Designers and Artists, Second Edition, published by MIT Press. © 2014 MIT Press. If you see any errors or have comments, please let us know.

    + +

    Render Techniques

    +

    Casey Reas and Ben Fry

    + + +

    + By default, everything is drawn to the primary display window. Sometimes, however, there is an advantage in drawing to another graphics surface. All of the drawing features available in the display window can be applied to an offscreen drawing surface and then drawn back into the display window as an image or texture. This technique makes it easier to imagine a program as a stack of layers similar to the technique used in photo editing and vector drawing software. Similarly, drawing surfaces in Processing can be moved around, drawn using blending effects and transparency, and drawn in different orders to change how the layers combine. Before the discussion moves to multiple drawing surfaces, this chapter starts with a discussion of the different renderers used by Processing. +

    + +

    Renderers

    - This short text provides a brief history of the digital printing technologies that have led to these new techniques. It presents examples of software written to produce print output, and discusses a few common contemporary print technologies. The industry surrounding digital printing is full of trademarked names and buzzwords, so this text aspires to demystify some of the terminology and provide pointers to additional information. The content that follows is tailored for printing at home or working with a vendor to produce small editions. + +

    + This short text provides a brief history of the digital printing technologies that have led to these new techniques. It presents examples of software written to produce print output, and discusses a few common contemporary print technologies. The industry surrounding digital printing is full of trademarked names and buzzwords, so this text aspires to demystify some of the terminology and provide pointers to additional information. The content that follows is tailored for printing at home or working with a vendor to produce small editions.

    - Processing has three primary renderers: the default renderer, P3D, and P2D. The default renderer is used for the majority of the programs in this book; it’s for 2D drawing. It’s used when one of the other renders aren’t defined as the third parameter to size(). The P3D renderer for drawing in three dimensions is discussed in the 3D Drawing chapter (p. 21). The P2D renderer is an alternative 2D renderer that is substantially faster than the default renderer for most tasks, but it sacrifices some visual quality for speed. Both P2D and P3D utilize a software specification called OpenGL that is supported on many GPUs (the Graphics Processing Unit on a computer’s graphics card) to accelerate drawing. The visual quality of the OpenGL renderers, P2D and P3D, can be adjusted with the smooth() and hint() functions. + Processing has three primary renderers: the default renderer, P3D, and P2D. The default renderer is used for the majority of the programs in this book; it’s for 2D drawing. It’s used when one of the other renders aren’t defined as the third parameter to size(). The P3D renderer for drawing in three dimensions is discussed in the 3D Drawing chapter (p. 21). The P2D renderer is an alternative 2D renderer that is substantially faster than the default renderer for most tasks, but it sacrifices some visual quality for speed. Both P2D and P3D utilize a software specification called OpenGL that is supported on many GPUs (the Graphics Processing Unit on a computer’s graphics card) to accelerate drawing. The visual quality of the OpenGL renderers, P2D and P3D, can be adjusted with the smooth() and hint() functions.

    - All programs have smoothing enabled by default, but an optional parameter to smooth() can improve the quality of the OpenGL rendering with P2D and P3D. For instance, smooth(4) will enhance the quality of anti-aliasing to improve the image quality. The optional parameters from low to high are 2, 4, and 8, with 2 as the default. These options are only available on graphics cards that support them and may slow a program down or require more memory. + All programs have smoothing enabled by default, but an optional parameter to smooth() can improve the quality of the OpenGL rendering with P2D and P3D. For instance, smooth(4) will enhance the quality of anti-aliasing to improve the image quality. The optional parameters from low to high are 2, 4, and 8, with 2 as the default. These options are only available on graphics cards that support them and may slow a program down or require more memory.

    - The hint() function is available for advanced users to modify details about how geometry is drawn to the screen. By default, when rendering a scene, each renderer makes decisions about drawing order, shape occlusion, perspective distortion, and so on based on what is more likely to be useful and efficient for the largest number of users. Hints are used to change these defaults if other decisions are better for a specific program. There is a single hint() function, but the parameters for it enable and disable a range of rendering decisions. For example, to make lines appear in perspective, write hint(ENABLE_STROKE_PERSPECTIVE) and to turn this back off, write hint(DISABLE_STROKE_PERSPECTIVE). This feature is not enabled by default because it’s slower and will make lines in predominantly flat scenes appear strangely. But it’s a useful necessity when drawing many lines that make use of a large 3D space. The parameters to hint() change over time, so please consult the Processing reference for the current options. + The hint() function is available for advanced users to modify details about how geometry is drawn to the screen. By default, when rendering a scene, each renderer makes decisions about drawing order, shape occlusion, perspective distortion, and so on based on what is more likely to be useful and efficient for the largest number of users. Hints are used to change these defaults if other decisions are better for a specific program. There is a single hint() function, but the parameters for it enable and disable a range of rendering decisions. For example, to make lines appear in perspective, write hint(ENABLE_STROKE_PERSPECTIVE) and to turn this back off, write hint(DISABLE_STROKE_PERSPECTIVE). This feature is not enabled by default because it’s slower and will make lines in predominantly flat scenes appear strangely. But it’s a useful necessity when drawing many lines that make use of a large 3D space. The parameters to hint() change over time, so please consult the Processing reference for the current options.

    +

    Another drawing surface

    @@ -564,8 +570,8 @@

    Combine surfaces

    In general, blend modes and controlling transparency with tint() are the primarily ways to easily mix the pixels from two PGraphics objects together in the main display window. Try experimenting with this using the last example in the chapter. Keep in mind that the default blend mode is blendMode(BLEND) to reset to the way a program draws. Also, some blend modes don’t work with all background values. For example, if the background is white, then using blendMode(LIGHTEST) will always be a white screen because no pixel will ever be lighter than the background value. Conversely, blendMode(DARKEST) and blendMode(MULTIPLY) don’t have results with a black background.

    -
    - \ No newline at end of file + +

    \ No newline at end of file diff --git a/content/static/tutorials/sound/imgs/56-1.svg b/content/static/tutorials/sound/imgs/56-1.svg new file mode 100644 index 000000000..39cae4cca --- /dev/null +++ b/content/static/tutorials/sound/imgs/56-1.svg @@ -0,0 +1,489 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/sound/imgs/56-2.svg b/content/static/tutorials/sound/imgs/56-2.svg new file mode 100644 index 000000000..f388ef87d --- /dev/null +++ b/content/static/tutorials/sound/imgs/56-2.svg @@ -0,0 +1,387 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/sound/imgs/56-3.svg b/content/static/tutorials/sound/imgs/56-3.svg new file mode 100644 index 000000000..5233f3d6d --- /dev/null +++ b/content/static/tutorials/sound/imgs/56-3.svg @@ -0,0 +1,536 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/sound/imgs/56-4.svg b/content/static/tutorials/sound/imgs/56-4.svg new file mode 100644 index 000000000..d41d0ff53 --- /dev/null +++ b/content/static/tutorials/sound/imgs/56-4.svg @@ -0,0 +1,707 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/static/tutorials/sound/index.html b/content/static/tutorials/sound/index.html new file mode 100644 index 000000000..e1fada6b0 --- /dev/null +++ b/content/static/tutorials/sound/index.html @@ -0,0 +1,796 @@ + + + +
    + +

    + This tutorial is “Extension 3” from Processing: A Programming Handbook for Visual Designers and Artists, Second Edition, published by MIT Press. © 2014 MIT Press. If you see any errors or have comments, please let us know. +

    + + +

    Sound

    +

    R. Luke DuBois and Wilm Thoben

    + + +

    + The history of music is, in many ways, the history of technology. From developments in the writing and transcription of music (notation) to the design of spaces for the performance of music (acoustics) to the creation of musical instruments, composers and musicians have availed themselves of advances in human understanding to perfect and advance their professions. Unsurprisingly, therefore, we find that in the machine age these same people found themselves first in line to take advantage of the new techniques and possibilities offered by electricity, telecommunications, and, in the last century, digital computers to leverage all of these systems to create new and expressive forms of sonic art. Indeed, the development of phonography (the ability to reproduce sound mechanically) has, by itself, had such a transformative effect on aural culture that it seems inconceivable now to step back to an age where sound could emanate only from its original source.1 The ability to create, manipulate, and reproduce lossless sound by digital means is having, at the time of this writing, an equally revolutionary effect on how we listen. As a result, the artist today working with sound has not only a huge array of tools to work with, but also a medium exceptionally well suited to technological experimentation. +

    + +

    Music and sound programming in the arts

    + +

    + Thomas Edison’s 1857 invention of the phonograph and Nikola Tesla’s wireless radio demonstration of 1893 paved the way for what was to be a century of innovation in the electromechanical transmission and reproduction of sound. Emile Berliner’s gramophone record (1887) and the advent of AM radio broadcasting under Guglielmo Marconi (1922) democratized and popularized the consumption of music, initiating a process by which popular music quickly transformed from an art of minstrelsy into a commodified industry worth tens of billions of dollars worldwide.2 New electronic musical instruments, from the large and impractical telharmonium to the simple and elegant theremin multiplied in tandem with recording and broadcast technologies and prefigured the synthesizers, sequencers, and samplers of today. Many composers of the time were, not unreasonably, entranced by the potential of these new mediums of transcription, transmission, and performance. Luigi Russolo, the futurist composer, wrote in his 1913 manifesto The Art of Noises of a futurist orchestra harnessing the power of mechanical noisemaking (and phonographic reproduction) to “liberate” sound from the tyranny of the merely musical. John Cage, in his 1937 monograph Credo: The Future of Music, wrote this elliptical doctrine:

    + +
    + The use of noise to make music will continue and increase until we reach a music produced through the aid of electrical instruments which will make available for musical purposes any and all sounds that can be heard. Photoelectric, film, and mechanical mediums for the synthetic production of music will be explored. Whereas, in the past, the point of disagreement has been between dissonance and consonance, it will be, in the immediate future, between noise and so-called musical sounds.3 +
    + +

    + The invention and wide adoption of magnetic tape as a medium for the recording of audio signals provided a breakthrough for composers waiting to compose purely with sound. In the early postwar period, the first electronic music studios flourished at radio stations in Paris (ORTF) and Cologne (WDR). The composers at the Paris studio, most notably Pierre Henry and Pierre Schaeffer, developed the early compositional technique of musique concrète, working directly with recordings of sound on phonographs and magnetic tape to construct compositions through a process akin to what we would now recognize as sampling. Schaeffer’s Étude aux chemins de fer (1948) and Henry and Schaeffer’s Symphonie pour un homme seul are classics of the genre. Meanwhile, in Cologne, composers such as Herbert Eimart and Karlheinz Stockhausen were investigating the use of electromechanical oscillators to produce pure sound waves that could be mixed and sequenced with a high degree of precision. This classic elektronische music was closely tied to the serial techniques of the contemporary modernist avant-garde, who were particularly well suited aesthetically to become crucial advocates for the formal quantification and automation offered by electronic and, later, computer music.4 The Columbia-Princeton Electronic Music Center, founded by Vladimir Ussachevsky, Otto Luening, Milton Babbitt, and Roger Sessions in New York in 1957, staked its reputation on the massive RCA Mark II Sound Synthesizer, a room-sized machine capable of producing and sequencing electronically generated tones with an unprecedented degree of precision and control. In the realm of popular music, pioneering steps were taken in the field of recording engineering, such as the invention of multitrack tape recording by the guitarist Les Paul in 1954. This technology, enabling a single performer to “overdub” her/himself onto multiple individual “tracks” that could later be mixed into a composite, filled a crucial gap in the technology of recording and would empower the incredible boom in recording-studio experimentation that permanently cemented the commercial viability of the studio recording in popular music. +

    + +

    + Composers adopted digital computers slowly as a creative tool because of their initial lack of real-time responsiveness and intuitive interface. Although the first documented use of the computer to make music occurred in 1951 on the CSIRAC machine in Sydney, Australia, the genesis of most foundational technology in computer music as we know it today came when Max Mathews, a researcher at Bell Labs in the United States, developed a piece of software for the IBM 704 mainframe called MUSIC. In 1957, the MUSIC program rendered a 17-second composition by Newmann Guttmann called “In the Silver Scale”. Originally tasked with the development of human-comprehensible synthesized speech, Mathews developed a system for encoding and decoding sound waves digitally, as well as a system for designing and implementing digital audio processes computationally. His assumptions about these representational schemes are still largely in use and will be described later in this text. The advent of faster machines, computer music programming languages, and digital systems capable of real-time interactivity brought about a rapid transition from analog to computer technology for the creation and manipulation of sound, a process that by the 1990s was largely comprehensive.5 +

    + +

    + Sound programmers (composers, sound artists, etc.) use computers for a variety of tasks in the creative process. Many artists use the computer as a tool for the algorithmic and computer-assisted composition of music that is then realized off-line. For Lejaren Hiller’s Illiac Suite for string quartet (1957), the composer ran an algorithm on the computer to generate notated instructions for live musicians to read and perform, much like any other piece of notated music. This computational approach to composition dovetails nicely with the aesthetic trends of twentieth-century musical modernism, including the controversial notion of the composer as “researcher,” best articulated by serialists such as Milton Babbitt and Pierre Boulez, the founder of IRCAM. This use of the computer to manipulate the symbolic language of music has proven indispensable to many artists, some of whom have successfully adopted techniques from computational research in artificial intelligence to attempt the modeling of preexisting musical styles and forms; for example, David Cope’s 5000 works... and Brad Garton’s Rough Raga Riffs use stochastic techniques from information theory such as Markov chains to simulate the music of J. S. Bach and the styles of Indian Carnatic sitar music, respectively. +

    + +

    + If music can be thought of as a set of informatics to describe an organization of sound, the synthesis and manipulation of sound itself is the second category in which artists can exploit the power of computational systems. The use of the computer as a producer of synthesized sound liberates the artist from preconceived notions of instrumental capabilities and allows her/him to focus directly on the timbre of the sonic artifact, leading to the trope that computers allow us to make any sound we can imagine. Composers such as Jean-Claude Risset (The Bell Labs Catalogue), Iannis Xenakis (GENDYN3), and Barry Truax (Riverrun), have seen the computer as a crucial tool in investigating sound itself for compositional possibilities, be they imitative of real instruments (Risset), or formal studies in the stochastic arrangements of synthesized sound masses (Xenakis) using techniques culminating in the principles of granular synthesis (Truax). The computer also offers extensive possibilities for the assembly and manipulation of preexisting sound along the musique concrète model, though with all the alternatives a digital computer can offer. The compositional process of digital sampling, whether used in pop recordings (Brian Eno and David Byrne’s My Life in the Bush of Ghosts, Public Enemy’s Fear of a Black Planet) or conceptual compositions (John Oswald’s Plunderphonics, Chris Bailey’s Ow, My Head), is aided tremendously by the digital form sound can now take. Computers also enable the transcoding of an audio signal into representations that allow for radical reinvestigation, as in the time-stretching works of Leif Inge (9 Beet Stretch, a 24-hour “stretching” of Beethoven’s Ninth Symphony) and the time-lapse phonography of this text’s author (Messiah, a 5-minute “compression” of Handel’s Messiah). +

    + +

    + Artists working with sound will often combine the two approaches, allowing for the creation of generative works of sound art where the underlying structural system, as well as the sound generation and delivery, are computationally determined. Artists such as Michael Schumacher, Stephen Vitiello, Carl Stone, and Richard James (the Aphex Twin) all use this approach. Most excitingly, computers offer immense possibilities as actors and interactive agents in sonic performance, allowing performers to integrate algorithmic accompaniment (George Lewis), hyperinstrument design (Laetitia Sonami, Interface), and digital effects processing (Pauline Oliveros, Mari Kimura) into their repertoire. +

    + +

    + Now that we’ve talked a bit about the potential for sonic arts on the computer, we’ll investigate some of the specific underlying technologies that enable us to work with sound in the digital domain. +

    + + +

    Sound and musical informatics

    + +

    + Simply put, we define sound as a vibration traveling through a medium (typically air) that we can perceive through our sense of hearing. Sound propagates as a longitudinal wave that alternately compresses and decompresses the molecules in the matter (e.g., air) through which it travels. As a result, we typically represent sound as a plot of pressure over time: +

    + + + + +

    + This time-domain representation of sound provides an accurate portrayal of how sound works in the real world, and, as we shall see shortly, it is the most common representation of sound used in work with digitized audio. When we attempt a technical description of a sound wave, we can easily derive a few metrics to help us better understand what’s going on. In the first instance, by looking at the amount of displacement caused by the sound pressure wave, we can measure the amplitude of the sound. This can be measured on a scientific scale in pascals of pressure, but it is more typically quantified along a logarithmic scale of decibels. If the sound pressure wave repeats in a regular or periodic pattern, we can look at the wavelength of a single iteration of that pattern and from there derive the frequency of that wave. For example, if a sound traveling in a medium at 343 meters per second (the speed of sound in air at room temperature) contains a wave that repeats every half-meter, that sound has a frequency of 686 hertz, or cycles per second. The figure below shows a plot of a cello note sounding at 440 Hz; as a result, the periodic pattern of the waveform (demarcated with vertical lines) repeats every 2.27 ms: +

    + + + + +

    + Typically, sounds occurring in the natural world contain many discrete frequency components. In noisy sounds, these frequencies may be completely unrelated to one another or grouped by a typology of boundaries (e.g., a snare drum may produce frequencies randomly spread between 200 and 800 hertz). In harmonic sounds, however, these frequencies are often spaced in integer ratios, such that a cello playing a note at 200 hertz will produce frequencies not only at the fundamental of 200, but at multiples of 200 up the harmonic series, i.e., at 400, 800, 1200, 1600, 2000, and so on. A male singer producing the same note will have the same frequency components in his voice, though in different proportions to the cello. The presence, absence, and relative strength of these harmonics (also called partials or overtones) provide what we perceive as the timbre of a sound. +

    + +

    + When a sound reaches our ears, an important sensory translation happens that is important to understand when working with audio. Just as light of different wavelengths and brightness excites different retinal receptors in your eyes to produce a color image, the cochlea of your inner ear contains an array of hair cells on the basilar membrane that are tuned to respond to different frequencies of sound. The inner ear contains hair cells that respond to frequencies spaced roughly between 20 and 20,000 hertz, though many of these hairs will gradually become desensitized with age or exposure to loud noise. These cells in turn send electrical signals via your auditory nerve into the auditory cortex of your brain, where they are parsed to create a frequency-domain image of the sound arriving in your ears: +

    + + + + +

    + This representation of sound, as a discrete “frame” of frequencies and amplitudes independent of time, is more akin to the way in which we perceive our sonic environment than the raw pressure wave of the time domain. Jean-Baptiste-Joseph Fourier, a nineteenth-century French mathematician, developed the equations that allow us to translate a sound pressure wave (no matter how complex) into its constituent frequencies and amplitudes. This Fourier transform is an important tool in working with sound in the computer. +

    + +

    + Our auditory system takes these streams of frequency and amplitude information from our two ears and uses them to construct an auditory “scene,” akin to the visual scene derived from the light reaching our retinas.6 Our brain analyzes the acoustic information based on a number of parameters such as onset time, stereo correlation, harmonic ratio, and complexity to parse out a number of acoustic sources that are then placed in a three-dimensional image representing what we hear. Many of the parameters that psychoacousticians believe we use to comprehend our sonic environment are similar to the grouping principles defined in Gestalt psychology. +

    + +

    + If we loosely define music as the organization and performance of sound, a new set of metrics reveals itself. While a comprehensive overview of music theory, Western or otherwise, is well beyond the scope of this text, it’s worth noting that there is a vocabulary for the description of music, akin to how we describe sound. Our system for perceiving loudness and pitch (useful “musical” equivalents to amplitude and frequency) work along a logarithmic scale, such that a tone at 100 hertz and a tone at 200 hertz are considered to be the same distance apart in terms of pitch as tones at 2000 and 4000 hertz. The distance between two sounds of doubling frequency is called the octave, and is a foundational principle upon which most culturally evolved theories of music rely. Most musical cultures then subdivide the octave into a set of pitches (e.g., 12 in the Western chromatic scale, 7 in the Indonesian pelog scale) that are then used in various collections (modes or keys). These pitches typically reflect some system of temperament or tuning, so that multiple musicians can play together; for example, the note A4 (the A above middle C) on the Western scale is usually calibrated to sound at 440 hertz in contemporary music. +

    + + +

    Digital representation of sound and music

    + +

    + Sound typically enters the computer from the outside world (and vice versa) according to the time-domain representation explained earlier. Before it is digitized, the acoustic pressure wave of sound is first converted into an electromagnetic wave of sound that is a direct analog of the acoustic wave. This electrical signal is then fed to a piece of computer hardware called an analog-to-digital converter (ADC or A/D), which then digitizes the sound by sampling the amplitude of the pressure wave at a regular interval and quantifying the pressure readings numerically, passing them upstream in small packets, or vectors, to the main processor, where they can be stored or processed. Similarly, vectors of digital samples can be sent downstream from the computer to a hardware device called a digital-to-analog converter (DAC or D/A), which takes the numeric values and uses them to construct a smoothed-out electromagnetic pressure wave that can then be fed to a speaker or other device for playback: +

    + + + + +

    + Most contemporary digital audio systems (soundcards, etc.) contain both A/D and D/A converters (often more than one of each, for stereo or multichannel sound recording and playback) and can use both simultaneously (so-called full duplex audio). The specific system of encoding and decoding audio using this methodology is called PCM (or pulse-code modulation); developed in 1937 by Alec Reeves, it is by far the most prevalent scheme in use today. +

    + +

    + The speed at which audio signals are digitized is referred to as the sampling rate; it is the resolution that determines the highest frequency of sound that can be measured (equal to half the sampling rate, according to the Nyquist theorem). The numeric resolution of each sample in terms of computer storage space is called the bit depth; this value determines how many discrete levels of amplitude can be described by the digitized signal. The digital audio on a compact disc, for example, is digitized at 44,100 hertz with a 16-bit resolution, allowing for frequencies up to 22,050 hertz (i.e., just above the range of human hearing) with 65,536 (216) different levels of amplitude possible for each sample. Professional audio systems will go higher (96 or 192 kHz at 24- or 32-bit resolution) while industry telephony systems will go lower (e.g., 8,192 Hz at 8-bit). Digitized sound representing multiple acoustic sources (e.g., instruments) or destinations (e.g., speakers) is referred to as multi-channel audio. Monaural sound consists of, naturally, only one stream; stereo (two-stream) audio is standard on all contemporary computer audio hardware, and various types of surround-sound (five or seven streams of audio with one or two special channels for low frequencies) are becoming more and more common. +

    + +

    + Once in the computer, sound is stored using a variety of formats, both as sequences of PCM samples and in other representations. The two most common PCM sound file formats are the Audio Interchange File Format (AIFF) developed by Apple Computer and Electronic Arts and the WAV file format developed by Microsoft and IBM. Both formats are effectively equivalent in terms of quality and interoperability, and both are inherently lossless formats, containing the uncompressed PCM data from the digitized source. In recent years, compressed audio file formats have received a great deal of attention, most notably the MP3 (MPEG-1 Audio Layer 3), the Vorbis codec, and the Advanced Audio Coding (AAC) codec. Many of these “lossy” audio formats translate the sound into the frequency domain (using the Fourier transform or a related technique called Linear Predictive Coding) to package the sound in a way that allows compression choices to be made based on the human hearing model, by discarding perceptually irrelevant frequencies in the sound. Unlike the PCM formats outlined above, MP3 files are much harder to encode, manipulate, and process in real time, due to the extra step required to decompress and compress the audio into and out of the time domain. +

    + + + +

    Synthesis

    + +

    + Digital audio systems typically perform a variety of tasks by running processes in signal processing networks. Each node in the network typically performs a simple task that either generates or processes an audio signal. Most software for generating and manipulating sound on the computer follows this paradigm, originally outlined by Max Mathews as the unit generator model of computer music, where a map or function graph of a signal processing chain is executed for every sample (or vector of samples) passing through the system. A simple algorithm for synthesizing sound with a computer could be implemented using this paradigm with only three unit generators, described as follows. +

    + +

    + First, let’s assume we have a unit generator that generates a repeating sound waveform and has a controllable parameter for the frequency at which it repeats. We refer to this piece of code as an oscillator. Most typical digital oscillators work by playing back small tables or arrays of PCM audio data that outlines a specific waveform. These wavetables can contain incredibly simple patterns (e.g., a sine or square wave) or complex patterns from the outside world (e.g., a professionally recorded segment of a piano playing a single note). +

    + +

    + If we play our oscillator directly (i.e., set its frequency to an audible value and route it directly to the D/A) we will hear a constant tone as the wavetable repeats over and over again. In order to attain a more nuanced and articulate sound, we may want to vary the volume of the oscillator over time so that it remains silent until we want a sound to occur. The oscillator will then increase in volume so that we can hear it. When we want the sound to silence again, we fade the oscillator down. Rather than rewriting the oscillator itself to accommodate instructions for volume control, we could design a second unit generator that takes a list of time and amplitude instructions and uses those to generate a so-called envelope, or ramp that changes over time. Our envelope generator generates an audio signal in the range of 0 to 1, though the sound from it is never experienced directly. Our third unit generator simply multiplies, sample per sample, the output of our oscillator with the output of our envelope generator. This amplifiercode allows us to use our envelope ramp to dynamically change the volume of the oscillator, allowing the sound to fade in and out as we like. +

    + +

    + In a commercial synthesizer, further algorithms could be inserted into the signal network—for example, a filter that could shape the frequency content of the oscillator before it gets to the amplifier. Many synthesis algorithms depend on more than one oscillator, either in parallel (e.g., additive synthesis, in which you create a rich sound by adding many simple waveforms) or through modulation (e.g., frequency modulation, where one oscillator modulates the pitch of another). +

    + + + +

    Sampling

    + +

    + Rather than using a small waveform in computer memory as an oscillator, we could use a longer piece of recorded audio stored as an AIFF or WAV file on our computer’s hard disk. This sample could then be played back at varying rates, affecting its pitch. For example, playing back a sound at twice the speed at which it was recorded will result in its rising in pitch by an octave. Similarly, playing a sound at half speed will cause it to drop in pitch by an octave. +

    + +

    + Most samplers (i.e., musical instruments based on playing back audio recordings as sound sources) work by assuming that a recording has a base frequency that, though often linked to the real pitch of an instrument in the recording, is ultimately arbitrary and simply signifies the frequency at which the sampler will play back the recording at normal speed. For example, if we record a cellist playing a sound at 220 hertz (the musical note A below middle C in the Western scale), we would want that recording to play back normally when we ask our sampler to play us a sound at 220 hertz. If we ask our sampler for a sound at a different frequency, our sampler will divide the requested frequency by the base frequency and use that ratio to determine the playback speed of the sampler. For example, if we want to hear a 440 hertz sound from our cello sample, we play it back at double speed. If we want to hear a sound at middle C (261.62558 hertz), we play back our sample at 1.189207136 times the original speed. +

    + +

    + Many samplers use recordings that have meta-data associated with them to help give the sampler algorithm information that it needs to play back the sound correctly. The base frequency is often one of these pieces of information, as are loop points within the recording that the sampler can safely use to make the sound repeat for longer than the length of the original recording. For example, an orchestral string sample loaded into a commercial sampler may last for only a few seconds, but a record producer or keyboard player may need the sound to last much longer; in this case, the recording is designed so that in the middle of the recording there is a region that can be safely repeated, ad infinitum if need be, to create a sense of a much longer recording. +

    + + + +

    Effects processing

    + +

    + In addition to serving as a generator of sound, computers are used increasingly as machines for processing audio. The field of digital audio processing (DAP) is one of the most extensive areas for research in both the academic computer music communities and the commercial music industry. Faster computing speeds and the increased standardization of digital audio processing systems has allowed most techniques for sound processing to happen in real time, either using software algorithms or audio DSP coprocessors such as the Digidesign TDM and T|C Electronics Powercore cards. +

    + +

    + As we saw with audio representation, audio effects processing is typically done using either time- or frequency-domain algorithms that process a stream of audio vectors. An echo effect, for example, can be easily implemented by creating a buffer of sample memory to delay a sound and play it back later, mixing it in with the original. Extremely short delays (of one or two samples) can be used to implement digital filters, which attenuate or boost different frequency ranges in the sound. Slightly longer delays create resonation points called comb filters that form an important building block in simulating the short echoes in room reverberation. A variable-delay comb filter creates the resonant swooshing effect called flanging. Longer delays are used to create a variety of echo, reverberation, and looping systems and can also be used to create pitch shifters (by varying the playback speed of a slightly delayed sound). +

    + + + +

    Audio analysis

    + +

    + A final important area of research, especially in interactive sound environments, is the derivation of information from audio analysis. Speech recognition is perhaps the most obvious application of this, and a variety of paradigms for recognizing speech exist today, largely divided between “trained” systems (which accept a wide vocabulary from a single user) and “untrained” systems (which attempt to understand a small set of words spoken by anyone). Many of the tools implemented in speech recognition systems can be abstracted to derive a wealth of information from virtually any sound source. +

    + +

    + Interactive systems that “listen” to an audio input typically use a few simple techniques to abstract a complex sound source into a control source that can be mapped as a parameter in interaction design. For example, a plot of average amplitude of an audio signal over time can be used to modulate a variable continuously through a technique called envelope following. Similarly, a threshold of amplitude can be set to trigger an event when the sound reaches a certain level; this technique of attack detection (“attack” is a common term for the onset of a sound) can be used, for example, to create a visual action synchronized with percussive sounds coming into the computer. +

    + +

    + The technique of pitch tracking, which uses a variety of analysis techniques to attempt to discern the fundamental frequency of an input sound that is reasonably harmonic, is often used in interactive computer music to track a musician in real time, comparing her/his notes against a “score” in the computer’s memory. This technology of score-following can be used to sequence interactive events in a computer program without having to rely on absolute timing information, allowing musicians to deviate from a strict tempo, improvise, or otherwise inject a more fluid musicianship into a performance. +

    + +

    + A wide variety of timbral analysis tools also exist to transform an audio signal into data that can be mapped to computer-mediated interactive events. Simple algorithms such as zero-crossing counters, which tabulate the number of times a time-domain audio signal crosses from positive to negative polarity, can be used to derive the amount of noise in an audio signal. Fourier analysis can also be used to find, for example, the five loudest frequency components in a sound, allowing the sound to be examined for harmonicity or timbral brightness. Filter banks and envelope followers can be combined to split a sound into overlapping frequency ranges that can then be used to drive another process. This technique is used in a common piece of effects hardware called the vocoder, in which a harmonic signal (such as a synthesizer) has different frequency ranges boosted or attenuated by a noisy signal (usually speech). The effect is that of one sound “talking” through another sound; it is among a family of techniques called cross-synthesis. +

    + + + +

    Music as information

    + +

    + Digital representations of music, as opposed to sound, vary widely in scope and character. By far the most common system for representing real-time musical performance data is the Musical Instrument Digital Interface (MIDI) specification, released in 1983 by a consortium of synthesizer manufacturers to encourage interoperability between different brands of digital music equipment. Based on a unidirectional, low-speed serial specification, MIDI represents different categories of musical events (notes, continuous changes, tempo and synchronization information) as abstract numerical values, nearly always with a 7-bit (0–127) numeric resolution. +

    + +

    + Over the years, the increasing complexity of synthesizers and computer music systems began to draw attention to the drawbacks of the simple MIDI specification. In particular, the lack of support for the fast transmission of digital audio and high-precision, syntactic synthesizer control specifications along the same cable led to a number of alternative systems. Open Sound Control, developed by a research team at the University of California, Berkeley, makes the interesting assumption that the recording studio (or computer music studio) of the future will use standard network interfaces (Ethernet or wireless TCP/IP communication) as the medium for communication. OSC allows a client-server model of communication between controllers (keyboards, touch screens) and digital audio devices (synthesizers, effects processors, or general-purpose computers), all through UDP packets transmitted on the network. +

    + + + +

    Tools for sound programming

    + +

    + A wide variety of tools are available to the digital artist working with sound. Sound recording, editing, mixing, and playback are typically accomplished through digital sound editors and so-called digital audio workstation (DAW) environments. Sound editors range from open source and free software (Ardour, Audacity) to professional-level studio or live programs (Ableton Live, Logic Pro, Digital Performer, Nuendo, Pro Tools). These programs typically allow you to import and record sounds, edit them with clipboard functionality (copy, paste, etc.), and perform a variety of simple digital sound processing (DSP) tasks nondestructively on the sound file itself, such as signal normalization, fading edits, and sample-rate conversion. Often these programs will act as hosts for software plug-ins originally designed for working inside of DAW software. +

    + +

    + Digital audio workstation suites offer a full range of multitrack recording, playback, processing, and mixing tools, allowing for the production of large-scale, highly layered projects. DAW software is now considered standard in the music recording and production industry. The Avid/Digidesign Pro Tools software, considered the industry standard, allows for the recording and mixing of many tracks of audio in real time along a timeline roughly similar to that in a video NLE (nonlinear editing) environment. Automation curves can be drawn to specify different parameters (volume, pan) of these tracks, which contain clips of audio (“regions” or “soundbites”) that can be assembled and edited nondestructively. Other DAW software applications on the market are Apple’s Logic Audio, Mark of the Unicorn’s Digital Performer or Steinberg’s. All of these platforms also support third-party audio plug-ins written in a variety of formats, such as Apple’s AudioUnits (AU), Steinberg’s Virtual Studio Technology (VST), or Microsoft’s DirectX format. Most DAW programs also include extensive support for MIDI, allowing the package to control and sequence external synthesizers, samplers, and drum machines; as well as software plug-in “instruments” that run inside the DAW itself as sound generators. In 2001, Ableton introduced a revolutionary DAW software called LIVE. This software is not only directed to studio work with the metaphor of tape machines but is directed to live performance and revitalized the cue list idiom. Users can switch to the LIVE view which is a non-linear, modular based view of musical material organized in lists. +

    + +

    + Classic computer music “languages,” most of which are derived from Max Mathews’ MUSIC program, are still in wide use today. Some of these, such as CSound (developed by Barry Vercoe at MIT) have wide followings and are taught in computer music studios as standard tools for electroacoustic composition. The majority of these MUSIC-N programs use text files for input, though they are increasingly available with graphical editors for many tasks. Typically, two text files are used; the first contains a description of the sound to be generated using a specification language that defines one or more “instruments” made by combining simple unit generators. A second file contains the “score,” a list of instructions specifying which instrument in the first file plays what event, when, for how long, and with what variable parameters. Most of these programs go beyond simple task-based synthesis and audio processing to facilitate algorithmic composition, often by building on top of a standard programming language; Bill Schottstaedt ’s CLM package, for example, is built on top of Common LISP. Some of these languages have been retrofitted in recent years to work in real time (as opposed to rendering a sound file to disk); Real-Time Cmix, for example, contains a C-style parser as well as support for connectivity from clients over network sockets and MIDI. +

    + +

    + A number of computer music environments were begun with the premise of real-time interaction as a foundational principle of the system. The Max development environment for real-time media, first developed at IRCAM in the 1980s and currently developed by Cycling’74, is a visual programming system based on a control graph of “objects” that execute and pass messages to one another in real time. The MSP extensions to Max allow for the design of customizable synthesis and signal-processing systems, all of which run in real time. The open-source older sibling to Max called Pure Data was developed by the original author of Max, Miller Puckette. James McCartney’s SuperCollider program, which is open source, and Ge Wang and Perry Cook’s ChucK software are both textual languages designed to execute real-time interactive sound algorithms. +

    + +

    + Finally, standard computer languages have a variety of APIs to choose from when working with sound. Phil Burke’s JSyn (Java Synthesis) provides a unit generator-based API for doing real-time sound synthesis and processing in Java. The CCRMA Synthesis ToolKit (STK) is a C++ library of routines aimed at low-level synthesizer design and centered on physical modeling synthesis technology. +

    + +

    + Sound, a library for Processing that has many features in common with the above-mentioned languages, is used in the examples for this text. +

    + + +
    + +

    Example 1, 2: Synthesizer

    + +

    + These examples show two basic methods for synthesizing sound. In the first, a cluster of sound is created through adding up five sine-waves. To calculate the correct amplitude for each sine wave an array with float numbers corresponding to each oscillator’s amplitude is filled. First, the maximum amplitude of 1.0 is divided by the number of oscillators to avoid exceeding the overall maximum amplitude. The amplitude is then decreased by the factor 1 / (i + 1) which results in higher frequencies being quieter than lower frequencies. The frequency for each oscillator is calculated in the draw() function. Based on a variable fundamental frequency between 150 and 1150 Hz the next harmonic overtones are calculated by multiplying the frequency with a series of integer numbers from 1-5. A detune factor with the range -0.5 to 0.5 is then applied to deviate from a purely harmonic spectrum into an inharmonic cluster. +

    + +

    + In the second example, envelope functions are used to create event based sounds like notes on an instrument. Sound provides ASR (attack / sustain / release) envelopes. An envelope describes the course of the amplitude over time. With an ASR envelope one can define an attack phase, a sustain and a release phase in seconds. After creating the envelope an oscillator can be directly passed to the function. In this case an array of midi notes is translated into frequencies by the midiToFreq() function. To sequence the succession of notes we create a trigger with the current time and a duration between the notes. +

    + + +
    +/**
    + * Processing Sound Library, Example 1
    + * 
    + * Five sine waves are layered to construct a cluster of frequencies. 
    + * This method is called additive synthesis. Use the mouse position 
    + * inside the display window to detune the cluster.
    + */
    +
    +import processing.sound.*;
    +
    +SinOsc[] sineWaves; // Array of sines
    +float[] sineFreq; // Array of frequencies
    +int numSines = 5; // Number of oscillators to use
    +
    +void setup() {  
    +  size(640, 360);
    +  background(255);
    +
    +  sineWaves = new SinOsc[numSines]; // Initialize the oscillators
    +  sineFreq = new float[numSines]; // Initialize array for Frequencies
    +
    +  for (int i = 0; i < numSines; i++) {
    +    // Calculate the amplitude for each oscillator
    +    float sineVolume = (1.0 / numSines) / (i + 1);
    +    // Create the oscillators
    +    sineWaves[i] = new SinOsc(this);
    +    // Start Oscillators
    +    sineWaves[i].play();
    +    // Set the amplitudes for all oscillators
    +    sineWaves[i].amp(sineVolume);
    +  }
    +}
    +
    +void draw() {
    +  //Map mouseY from 0 to 1
    +  float yoffset = map(mouseY, 0, height, 0, 1);
    +  //Map mouseY logarithmically to 150 - 1150 to create a base frequency range
    +  float frequency = pow(1000, yoffset) + 150;
    +  //Use mouseX mapped from -0.5 to 0.5 as a detune argument
    +  float detune = map(mouseX, 0, width, -0.5, 0.5);
    +
    +  for (int i = 0; i < numSines; i++) { 
    +    sineFreq[i] = frequency * (i + 1 * detune);
    +    // Set the frequencies for all oscillators
    +    sineWaves[i].freq(sineFreq[i]);
    +  }
    +}
    +	
    + +
    + +
    +/**
    + * Processing Sound Library, Example 2
    + * 
    + * This sketch shows how to use envelopes and oscillators. 
    + * Envelopes describe to course of amplitude over time. 
    + * The Sound library provides an ASR envelope which stands for 
    + * attack, sustain, release. 
    + * 
    + *       .________
    + *      .          ---
    + *     .              --- 
    + *    .                  ---
    + *    A       S        R 
    + */
    +
    +import processing.sound.*;
    +
    +TriOsc triOsc;
    +Env env; 
    +
    +// Times and levels for the ASR envelope
    +float attackTime = 0.001;
    +float sustainTime = 0.004;
    +float sustainLevel = 0.3;
    +float releaseTime = 0.2;
    +
    +// This is an octave in MIDI notes.
    +int[] midiSequence = { 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72 }; 
    +
    +// Play a new note every 200ms
    +int duration = 200;
    +
    +// This variable stores the point in time when the next note should be triggered
    +int trigger = millis(); 
    +
    +// An index to count up the notes
    +int note = 0; 
    +
    +void setup() {
    +  size(640, 360);
    +  background(255);
    +
    +  // Create triangle wave and start it
    +  triOsc = new TriOsc(this);
    +
    +  // Create the envelope 
    +  env = new Env(this);
    +}
    +
    +void draw() { 
    +
    +  // If the determined trigger moment in time matches up with the computer clock and
    +  // the sequence of notes hasn't been finished yet, the next note gets played.
    +  if ((millis() > trigger) && (note<midiSequence.length)) {
    +
    +    // midiToFreq transforms the MIDI value into a frequency in Hz which we use to
    +    // control the triangle oscillator with an amplitute of 0.5
    +    triOsc.play(midiToFreq(midiSequence[note]), 0.5);
    +
    +    // The envelope gets triggered with the oscillator as input and the times and
    +    // levels we defined earlier
    +    env.play(triOsc, attackTime, sustainTime, sustainLevel, releaseTime);
    +
    +    // Create the new trigger according to predefined duration
    +    trigger = millis() + duration;
    +
    +    // Advance by one note in the midiSequence;
    +    note++; 
    +
    +    // Loop the sequence, notice the jitter
    +    if (note == 12) {
    +      note = 0;
    +    }
    +  }
    +} 
    +
    +// This helper function calculates the respective frequency of a MIDI note
    +float midiToFreq(int note) {
    +  return (pow(2, ((note-69)/12.0))) * 440;
    +}
    +
    +	
    + +
    + + + +

    Example 3, 4: Sample playback

    + +

    + Sound file playback with the Sound library is fairly simple. The Soundfile class just needs to be instantiated with a path to the file. Example three uses an Array of Soundfiles as a basis for a sampler. The files are named by integer numbers which makes it easy to read the files into an array with a loop. The Soundfile class has a method called rate() which lets us change the sample rate of the playback, in short: the speed and therefore pitch. The default value equals to one. If we assign 0.5 the playback speed will be half and the pitch will be an octave below the original. For 2.0 the pitch will be an octave above and double the speed. This is the simplest method for pitch shifting a sample and we can use it to generate a simple algorithmic composition. In this example a trigger is created which represents the current time in milliseconds plus a random integer between 200 and 1000 milliseconds. If that moment has passed up to 5 rectangles are drawn, each of them filled with a random color. Since this statement is in a loop it is simple to play back up to 5 sounds with one line of code. Before doing that, a random octave for each sound is assigned. The number of rectangles and sounds we play is determined by the array playSound. This array gets reassigned at every iteration of the sequencer and when an index equals 1 the corresponding file in the Soundfile array will be played and a rectangle will be drawn. +

    + + +
    +/**
    + * Processing Sound Library, Example 3
    + * 
    + * This example shows how to make a simple sampler and sequencer 
    + * with the Sound library. In this sketch, five different samples are 
    + * loaded and played back at different pitches, in this case five 
    + * different octaves. The sequencer triggers an event every 200-1000 
    + * milliseconds randomly. Each time a sound is played a colored 
    + * rect with a random color is displayed.
    + * 
    + * Load this example with included sound files from the Processing Editor: 
    + * Examples > Libraries > Sound > Soundfile > Sampler 
    + */
    +
    +import processing.sound.*;
    +
    +SoundFile[] file;
    +
    +// Define the number of samples 
    +int numsounds = 5;
    +
    +// Create an array of values which represent the octaves. 
    +// 1.0 is playback at normal speed, 0.5 is half and 
    +// therefore one octave down. 2.0 is double so one octave up.
    +float[] octave = {0.25, 0.5, 1.0, 2.0, 4.0};
    +
    +// The playSound array is defining how many samples will 
    +// be played at each trigger event
    +int[] playSound = {1, 1, 1, 1, 1};
    +
    +// The trigger is an integer number in milliseconds so we 
    +// can schedule new events in the draw loop
    +int trigger;
    +
    +// This array holds the pixel positions of the rectangles 
    +// which are drawn each event
    +int[] posx = {0, 128, 256, 384, 512};
    +
    +
    +void setup() {
    +  size(640, 360);
    +  background(255);
    +
    +  // Create an array of empty soundfiles
    +  file = new SoundFile[numsounds];
    +
    +  // Load 5 soundfiles from a folder in a for loop. 
    +  // By naming the files 1., 2., 3., n.aif it is easy to iterate
    +  // through the folder and load all files in one line of code.
    +  for (int i = 0; i < numsounds; i++) {
    +    file[i] = new SoundFile(this, (i+1) + ".aif");
    +  }
    +
    +  // Create a trigger which will be the basis for our random sequencer. 
    +  trigger = millis();
    +}
    +
    +void draw() {
    +
    +  // If the determined trigger moment in time matches up with the 
    +  // computer clock events get triggered.
    +  if (millis() > trigger) {
    +    // Redraw the background every time to erase old rects
    +    background(255);
    +
    +    // By iterating through the playSound array we check for 1 or 0, 
    +    // 1 plays a sound and draws a rect, for 0 nothing happens.
    +
    +    for (int i = 0; i < numsounds; i++) {      
    +      // Check which indexes are 1 and 0.
    +      if (playSound[i] == 1) {
    +        float rate;
    +        // Choose a random color and get set to noStroke()
    +        fill(int(random(255)), int(random(255)), int(random(255)));
    +        noStroke();
    +        // Draw the rect in the positions we defined earlier in posx
    +        rect(posx[i], 50, 128, 260);
    +        // Choose a random index of the octave array
    +        rate = octave[int(random(0, 5))];
    +        // Play the soundfile from the array with the respective rate and loop set to false
    +        file[i].play(rate, 1.0);
    +      }
    +
    +      // Renew the indexes of playSound so that at the next event the order is different and randomized.
    +      playSound[i] = int(random(0, 2));
    +    }
    +
    +    // Create a new triggertime in the future, with a random offset between 200 and 1000 milliseconds
    +    trigger = millis() + int(random(200, 1000));
    +  }
    +}
    +
    +
    + +
    + +
    +/**
    + * Processing Sound Library, Example 4
    + * 
    + * This example shows how to make a simple keyboard-triggered sampler with the Sound
    + * library. In this sketch 5 different short samples are loaded and played back at
    + * different speeds, which also changes their perceived pitch by one or two octaves.
    + * 
    + * Load this example with included sound files from the Processing Editor:  
    + * Examples > Libraries > Sound > Soundfile > Keyboard 
    + */
    +
    +import processing.sound.*;
    +
    +SoundFile[] file;
    +
    +// Define the number of samples 
    +int numsounds = 5;
    +
    +// Define a variable to store the randomly generated background color in
    +int backgroundColor[] = {255, 255, 255};
    +
    +void setup() {
    +  size(640, 360);
    +
    +  // Create a Sound renderer and an array of empty soundfiles
    +  file = new SoundFile[numsounds];
    +
    +  // Load 5 soundfiles from a folder in a for loop. By naming
    +  // the files 1.aif, 2.aif, 3.aif, ..., n.aif it is easy to iterate
    +  // through the folder and load all files in one line of code.
    +  for (int i = 0; i < numsounds; i++) {
    +    file[i] = new SoundFile(this, (i+1) + ".aif");
    +  }
    +}
    +
    +void draw() {
    +  background(backgroundColor[0], backgroundColor[1], backgroundColor[2]);
    +}
    +
    +void keyPressed() {
    +  // We use a boolean helper variable to determine whether one of the branches
    +  // of the switch-statement was activated or not
    +  boolean validKey = true;
    +
    +  switch(key) {
    +  case 'a':
    +    file[0].play(0.5, 1.0);
    +    break;
    +
    +  case 's':
    +    file[1].play(0.5, 1.0);
    +    break;
    +
    +  case 'd':
    +    file[2].play(0.5, 1.0);
    +    break;
    +
    +  case 'f':
    +    file[3].play(0.5, 1.0);
    +    break;
    +
    +  case 'g':
    +    file[4].play(0.5, 1.0);
    +    break;
    +
    +  case 'h':
    +    file[0].play(1.0, 1.0);
    +    break;
    +
    +  case 'j':
    +    file[1].play(1.0, 1.0);
    +    break;
    +
    +  case 'k':
    +    file[2].play(1.0, 1.0);
    +    break;
    +
    +  case 'l':
    +    file[3].play(1.0, 1.0);
    +    break;
    +
    +  case ';':
    +    file[4].play(1.0, 1.0);
    +    break;
    +
    +  case '\'':
    +    file[0].play(2.0, 1.0);
    +    break;
    +
    +  case 'q':
    +    file[1].play(2.0, 1.0);
    +    break;
    +
    +  case 'w':
    +    file[2].play(2.0, 1.0);
    +    break;    
    +
    +  case 'e':
    +    file[3].play(2.0, 1.0);
    +    break;
    +
    +  case 'r':
    +    file[4].play(2.0, 1.0);
    +    break; 
    +
    +  case 't':
    +    file[0].play(3.0, 1.0);
    +    break;
    +
    +  case 'y':
    +    file[1].play(3.0, 1.0);
    +    break;
    +
    +  case 'u':
    +    file[2].play(3.0, 1.0);
    +    break;    
    +
    +  case 'i':
    +    file[3].play(3.0, 1.0);
    +    break;
    +
    +  case 'o':
    +    file[4].play(3.0, 1.0);
    +    break;
    +
    +  case 'p':
    +    file[0].play(4.0, 1.0);
    +    break;    
    +
    +  case '[':
    +    file[1].play(4.0, 1.0);
    +    break;
    +
    +    // no valid key was pressed, store that information
    +  default:
    +    validKey = false;
    +  }
    +
    +  // If a new sample playback was triggered, change the background color
    +  if (validKey) {
    +    for (int i = 0; i < 3; i++) {
    +      backgroundColor[i] = int(random(255));
    +    }
    +  }
    +}
    +
    +
    + +
    + + + +

    Example 5, 6: Audio analysis

    + +

    + In addition to the classes used for generating and manipulating audio streams, Sound provides two classes for audio analysis: a Fast Fourier Transformation (FFT) and an amplitude follower. The FFT class analyzes an audio stream and fills an array with bins (samples in the frequency domain) of the positive side of the audio spectrum up to half the sample rate. This allows us to use different frequency bands of a particular sound to trigger events or visualize them in the draw() loop. The code draws a normalized spectrogram of a sound file. First, a few variables like scale factor, the number of bands to be retrieved and arrays for the frequency data are declared. The sound file player is then passed to the FFT object with the .input() method. In the visual representation the width of each frequency band is dynamically calculated depending on how many bands are being analyzed. For each frame the method .analyze() needs to be called to retrieve the current analysis frame of the FFT. After smoothing the amplitude values each bin is simply represented by a vertical line. +

    + +

    + Example 6 is very similar to example 5 but instead of an array of values one single value is retrieved. This value represents the root mean square of the last frames of audio meaning the mean amplitude. Important factors for analyzing sound and using the data for visualizations is the smoothing, the number of bands and the scaling factors. +

    + + +
    +/**
    + * Processing Sound Library, Example 5
    + * 
    + * This sketch shows how to use the FFT class to analyze a stream
    + * of sound. Change the number of bands to get more spectral bands
    + * (at the expense of more coarse-grained time resolution of the spectrum).
    + * 
    + * Load this example with included sound files from the Processing Editor: 
    + * Examples > Libraries > Sound > Analysis > FFTSpectrum 
    + */
    +
    +import processing.sound.*;
    +
    +// Declare the sound source and FFT analyzer variables
    +SoundFile sample;
    +FFT fft;
    +
    +// Define how many FFT bands to use (this needs to be a power of two)
    +int bands = 128;
    +
    +// Define a smoothing factor which determines how much the spectrums of consecutive
    +// points in time should be combined to create a smoother visualisation of the spectrum.
    +// A smoothing factor of 1.0 means no smoothing (only the data from the newest analysis
    +// is rendered), decrease the factor down towards 0.0 to have the visualisation update
    +// more slowly, which is easier on the eye.
    +float smoothingFactor = 0.2;
    +
    +// Create a vector to store the smoothed spectrum data in
    +float[] sum = new float[bands];
    +
    +// Variables for drawing the spectrum:
    +// Declare a scaling factor for adjusting the height of the rectangles
    +int scale = 5;
    +// Declare a drawing variable for calculating the width of the 
    +float barWidth;
    +
    +public void setup() {
    +  size(640, 360);
    +  background(255);
    +
    +  // Calculate the width of the rects depending on how many bands we have
    +  barWidth = width/float(bands);
    +
    +  // Load and play a soundfile and loop it.
    +  sample = new SoundFile(this, "beat.aiff");
    +  sample.loop();
    +
    +  // Create the FFT analyzer and connect the playing soundfile to it.
    +  fft = new FFT(this, bands);
    +  fft.input(sample);
    +}
    +
    +public void draw() {
    +  // Set background color, noStroke and fill color
    +  background(125, 255, 125);
    +  fill(255, 0, 150);
    +  noStroke();
    +
    +  // Perform the analysis
    +  fft.analyze();
    +
    +  for (int i = 0; i < bands; i++) {
    +    // Smooth the FFT spectrum data by smoothing factor
    +    sum[i] += (fft.spectrum[i] - sum[i]) * smoothingFactor;
    +
    +    // Draw the rectangles, adjust their height using the scale factor
    +    rect(i*barWidth, height, barWidth, -sum[i]*height*scale);
    +  }
    +}
    +
    +
    + +
    + +
    +/**
    + * Processing Sound Library, Example 6
    + * 
    + * This sketch shows how to use the Amplitude class to analyze the changing
    + * "loudness" of a stream of sound. In this case an audio sample is analyzed.
    + * 
    + * Load this example with included sound files from the Processing Editor: 
    + * Examples > Libraries > Sound > Analysis > PeakAmplitude 
    + */
    +
    +import processing.sound.*;
    +
    +// Declare the processing sound variables 
    +SoundFile sample;
    +Amplitude rms;
    +
    +// Declare a smooth factor to smooth out sudden changes in amplitude.
    +// With a smooth factor of 1, only the last measured amplitude is used for the
    +// visualisation, which can lead to very abrupt changes. As you decrease the
    +// smooth factor towards 0, the measured amplitudes are averaged across frames,
    +// leading to more pleasant gradual changes
    +float smoothingFactor = 0.25;
    +
    +// Used for storing the smoothed amplitude value
    +float sum;
    +
    +public void setup() {
    +  size(640, 360);
    +
    +  //Load and play a soundfile and loop it
    +  sample = new SoundFile(this, "beat.aiff");
    +  sample.loop();
    +
    +  // Create and patch the rms tracker
    +  rms = new Amplitude(this);
    +  rms.input(sample);
    +}      
    +
    +public void draw() {
    +  // Set background color, noStroke and fill color
    +  background(125, 255, 125);
    +  noStroke();
    +  fill(255, 0, 150);
    +
    +  // smooth the rms data by smoothing factor
    +  sum += (rms.analyze() - sum) * smoothingFactor;
    +
    +  // rms.analyze() return a value between 0 and 1. It's
    +  // scaled to height/2 and then multiplied by a fixed scale factor
    +  float rms_scaled = sum * (height/2) * 5;
    +
    +  // We draw a circle whose size is coupled to the audio analysis
    +  ellipse(width/2, height/2, rms_scaled, rms_scaled);
    +}
    +
    +
    + +
    + + + + +

    Notes

    + +

    +

      +
    1. Douglas Kahn, Noise, Water, Meat: A History of Sound in the Arts (MIT Press, 2001), p. 10.
    2. +
    3. Paul Théberge, Any Sound You Can Imagine: Making Music / Consuming Technology (Wesleyan University Press, 1997), p. 105.
    4. +
    5. John Cage, “Credo: The Future of Music (1937),” in John Cage: An Anthology, edited by Richard Kostelanetz (Praeger, 1970), p. 52.
    6. +
    7. Joel Chadabe, Electric Sound: The Past and Promise of Electronic Music (Prentice Hall, 1996), p. 145.
    8. +
    9. Curtis Roads, The Computer Music Tutorial (MIT Press, 1996), p. 43.
    10. +
    11. Albert Bregman, Auditory Scene Analysis (MIT Press, 1994), p. 215.
    12. +
    +

    + + +
    \ No newline at end of file diff --git a/content/static/tutorials/text/index.html b/content/static/tutorials/text/index.html index 691ee0f26..4636aea5d 100644 --- a/content/static/tutorials/text/index.html +++ b/content/static/tutorials/text/index.html @@ -1,186 +1,254 @@ -

    Strings and Drawing Text

    - -

    - - - -

    This tutorial is for Processing version 1.1+. If you see any errors or have comments, please let us know. This tutorial is from the book, Learning Processing, by Daniel Shiffman, published by Morgan Kaufmann Publishers, Copyright © 2008 Elsevier Inc. All rights reserved.

    - -

     

    +
    + + + -
    -

    The String class

    +

    + This tutorial is from the book Learning Processing by Daniel Shiffman, published by Morgan Kaufmann, © 2008 Elsevier Inc. All rights reserved. If you see any errors or have comments, please let us know. +

    -

    If you are looking to display text onscreen with Processing, you've got to first become familiar with the String class. Strings are probably not a totally new concept for you, it's quite likely you've dealt with them before. For example, if you've printed some text to the message window or loaded an image from a file, you've written code like so: +

    Strings and Drawing Text

    +

    Daniel Shiffman

    + +

    + If you are looking to display text onscreen with Processing, you've got to first become familiar with the String class. Strings are probably not a totally new concept for you, it's quite likely you've dealt with them before. For example, if you've printed some text to the message window or loaded an image from a file, you've written code like so: +

     println("printing some text to the message window!");  // Printing a String
     PImage img = loadImage("filename.jpg");                // Using a String for a file name
     
    -

    -Nevertheless, although you may have used a String here and there, it's time to unleash their full potential.

    -

    Where do we find documentation for the String class?

    -

    -Although technically a Java class, because Strings are so commonly used, Processing includes documentation in its reference: http://www.processing.org/reference/String.html. -

    -

    -This page only covers some of the available methods of the String class. The full documentation can be found on java's String page. -

    -

    What is a String?

    -

    -A String, at its core, is really just a fancy way of storing an array of characters. If we didn't have the String class, we'd probably have to write some code like this: -

    +

    + Nevertheless, although you may have used a String here and there, it's time to unleash their full potential. +

    + + + +

    Where do we find documentation for the String class?

    + +

    + Although technically a Java class, because Strings are so commonly used, Processing includes documentation in its reference: http://www.processing.org/reference/String.html. +

    + +

    + This page only covers some of the available methods of the String class. The full documentation can be found on java's String page. +

    + + +

    What is a String?

    + +

    + A String, at its core, is really just a fancy way of storing an array of characters. If we didn't have the String class, we'd probably have to write some code like this: +

    +
     char[] sometext = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'};
     
    -

    -Clearly, this would be a royal pain in the Processing behind. It's much simpler to do the following and make a String object: -

    + +

    + Clearly, this would be a royal pain in the Processing behind. It's much simpler to do the following and make a String object: +

    +
     String sometext = "How do I make String? Type some characters between quotation marks!";
     
    -

    -It appears from the above that a String is nothing more than a list of characters in between quotes. Nevertheless, this is only the data of a String. We must remember that a String is an object with methods (which you can find on the reference page.) This is just like how we learned in the Pixels tutorial that a PImage stores both the data associated with an image as well as the functionality: copy(), loadPixels(), etc. -

    -For example, the method charAt() returns the individual character in the String at a given index. Note that Strings are just like arrays in that the first character is index #0! -

    + +

    + It appears from the above that a String is nothing more than a list of characters in between quotes. Nevertheless, this is only the data of a String. We must remember that a String is an object with methods (which you can find on the reference page.) This is just like how we learned in the Pixels tutorial that a PImage stores both the data associated with an image as well as the functionality: copy(), loadPixels(), etc. +

    + +

    + For example, the method charAt() returns the individual character in the String at a given index. Note that Strings are just like arrays in that the first character is index #0! +

    +
     String message = "some text here.";
     char c = message.charAt(3);
     println(c);                // Results in 'e'
     
    -

    -Another useful method is length(). This is easy to confuse with the length property of an array. However, when we ask for the length of a String object, we must use the parentheses since we are calling a function called length() rather than accessing a property called length. -

    + +

    + Another useful method is length(). This is easy to confuse with the length property of an array. However, when we ask for the length of a String object, we must use the parentheses since we are calling a function called length() rather than accessing a property called length. +

    +
     String message = "This String is 34 characters long.";
     println(message.length());
     
    -

    We can also change a String to all uppercase using the toUpperCase() method (toLowerCase() is also available).

    + +

    + We can also change a String to all uppercase using the toUpperCase() method (toLowerCase() is also available). +

    + +
     String uppercase = message.toUpperCase();
     println(uppercase); 
     
    -

    -You might notice something a bit odd here. Why didn't we simply say "message.toUpperCase()" and then print "message" variable? Instead, we assigned the result of "message.toUpperCase()" to a new variable with a different name -- "uppercase". -

    -This is because a String is a special kind of object. It is immutable. An immutable object is one whose data can never be changed. Once we create a String, it stays the same for life. Anytime we want to change the String, we have to create a new one. So in the case of converting to uppercase, the method toUpperCase() returns a copy of the String object with all caps. -

    -

    Finally, let's look at equals(). Now, Strings can be compared with the "==" operator as follows: -

    + +

    + You might notice something a bit odd here. Why didn't we simply say "message.toUpperCase()" and then print "message" variable? Instead, we assigned the result of "message.toUpperCase()" to a new variable with a different name—"uppercase". +

    + +

    + This is because a String is a special kind of object. It is immutable. An immutable object is one whose data can never be changed. Once we create a String, it stays the same for life. Anytime we want to change the String, we have to create a new one. So in the case of converting to uppercase, the method toUpperCase() returns a copy of the String object with all caps. +

    + +

    + Finally, let's look at equals(). Now, Strings can be compared with the "==" operator as follows: +

    +
     String one = "hello";
     String two = "hello";
     println(one == two);
     
    -

    -However, technically speaking, when "==" is used with objects, it compares the memory addresses for each object. Even though they contain the same data -- "hello"-- if they are different object instances "==" could result in a false comparison. The equals() function ensures that we are checking to see if two String objects contain the exact same sequence of characters, regardless of where that data is stored in the computer's memory. -

    + +

    + However, technically speaking, when "==" is used with objects, it compares the memory addresses for each object. Even though they contain the same data—"hello"-- if they are different object instances "==" could result in a false comparison. The equals() function ensures that we are checking to see if two String objects contain the exact same sequence of characters, regardless of where that data is stored in the computer's memory. +

    +
     String one = "hello";
     String two = "hello";
     println(one.equals(two));
     
    -

    -Although both of the above methods return the correct result, it's safer to use equals(). Depending on how String objects are created in a sketch, "==" will not always work. -

    -One other feature of String objects is concatenation, joining two Strings together. Strings are joined with the "+" operator. Plus, of course, usually means add in the case of numbers. When used with Strings, it means join. -

    + +

    + Although both of the above methods return the correct result, it's safer to use equals(). Depending on how String objects are created in a sketch, "==" will not always work. +

    + +

    + One other feature of String objects is concatenation, joining two Strings together. Strings are joined with the "+" operator. Plus, of course, usually means add in the case of numbers. When used with Strings, it means join. +

    +
     String helloworld = "Hello" + "World";
     
    -

    -Variables can also be brought into a String using concatenation. -

    + +

    + Variables can also be brought into a String using concatenation. +

    +
     int x = 10;
     String message = "The value of x is: " + x;
     
    -

    Displaying Text

    -

    -The easiest way to display a String is to print it in the message window. This is likely something you've done while debugging. For example, if you needed to know the horizontal mouse location, you would write: -

    + + +

    Displaying Text

    + +

    + The easiest way to display a String is to print it in the message window. This is likely something you've done while debugging. For example, if you needed to know the horizontal mouse location, you would write: +

    +
     println(mouseX);
     
    -

    -Or if you needed to determine that a certain part of the code was executed, you might print out a descriptive message. -

    + +

    + Or if you needed to determine that a certain part of the code was executed, you might print out a descriptive message. +

    +
     println("We got here and we're printing out the mouse location!!!");
     
    -

    -While this is valuable for debugging, it's not going to help our goal of displaying text for a user. To place text on screen, we have to follow a series of simple steps. -

    -1. Declare an object of type PFont. -

    + +

    + While this is valuable for debugging, it's not going to help our goal of displaying text for a user. To place text on screen, we have to follow a series of simple steps. +

    + +

    + 1. Declare an object of type PFont. +

    +
     PFont f;
     
    -

    -2. Create the font by referencing the font name and the function createFont_(). This should be done only once, usually in setup(). Just as with loading an image, the process of loading a font into memory is slow and would seriously affect the sketch's performance if placed inside draw(). You can see a list of your available system fonts by via PFont.list(). Because of limitations in Java, not all fonts can be used and some might work with one operating system and not others. When sharing a sketch with other people or posting it on the web, you may need to include a .ttf or .otf version of your font in the data directory of the sketch because other people might not have the font installed on their computer. Only fonts that can legally be distributed should be included with a sketch. In addition to the name of the font, you can specify the size as well as whether the font should be antialiased or not. +

    + 2. Create the font by referencing the font name and the function createFont().
    + This should be done only once, usually in setup(). Just as with loading an image, the process of loading a font into memory is slow and would seriously affect the sketch's performance if placed inside draw(). You can see a list of your available system fonts by via PFont.list(). Because of limitations in Java, not all fonts can be used and some might work with one operating system and not others. When sharing a sketch with other people or posting it on the web, you may need to include a .ttf or .otf version of your font in the data directory of the sketch because other people might not have the font installed on their computer. Only fonts that can legally be distributed should be included with a sketch. In addition to the name of the font, you can specify the size as well as whether the font should be antialiased or not.

    +
     f = createFont("Arial",16,true); // Arial, 16 point, anti-aliasing on
     
    -

    -3. Specify the font using textFont(). textFont() takes one or two arguments, the font variable and the font size, which is optional. If you do not include the font size, the font will be displayed at the size originally loaded. When possible, the text() function will use a native font rather than the bitmapped version created behind the scenes with createFont() so you have the opportunity to scale the font dynamically. When using P2D, the actual native version of the font will be employed by the sketch, improving drawing quality and performance. With the P3D renderer, the bitmapped version will be used and therefore specifying a font size that is different from the font size loaded can result in pixelated text. -

    + +

    + 3. Specify the font using textFont().
    + textFont() takes one or two arguments, the font variable and the font size, which is optional. If you do not include the font size, the font will be displayed at the size originally loaded. When possible, the text() function will use a native font rather than the bitmapped version created behind the scenes with createFont() so you have the opportunity to scale the font dynamically. When using P2D, the actual native version of the font will be employed by the sketch, improving drawing quality and performance. With the P3D renderer, the bitmapped version will be used and therefore specifying a font size that is different from the font size loaded can result in pixelated text. +

    +
     textFont(f,36);
     
    -

    -4. Specify a color using fill(). -

    + +

    + 4. Specify a color using fill(). +

    +
     fill(255);
     
    -

    -5. Call the text() function to display text. (This function is just like shape or image drawing, it takes 3 arguments -- the text to be displayed, and the x & y coordinate to display that text.) -

    + +

    + 5. Call the text() function to display text.
    + This function is just like shape or image drawing, it takes three arguments—the text to be displayed, and the x and y coordinate to display that text. +

    +
     text("Hello Strings!",10,100);
     
    -

    -Here are all the steps together: -

    + +

    + Here are all the steps together: +

    +
    -Example Simple Displaying Text
    -PFont f;                          // STEP 2 Declare PFont variable
    +PFont f;                           // STEP 1 Declare PFont variable
       
     void setup() {
       size(200,200);
    -  f = createFont("Arial",16,true); // STEP 3 Create Font
    +  f = createFont("Arial",16,true); // STEP 2 Create Font
     }
     
     void draw() {
       background(255);
    -  textFont(f,16);                 // STEP 4 Specify font to be used
    -  fill(0);                        // STEP 5 Specify font color 
    -  text("Hello Strings!",10,100);  // STEP 6 Display Text
    +  textFont(f,16);                  // STEP 3 Specify font to be used
    +  fill(0);                         // STEP 4 Specify font color 
    +  text("Hello Strings!",10,100);   // STEP 5 Display Text
     }
     
    -

    -Fonts can also be created using "Tools" --> "Create Font." This will create and place a VLW font file in your data directory which you can load into a PFont object using loadFont(). -

    + + +

    + Fonts can also be created using "Tools" → "Create Font." This will create and place a VLW font file in your data directory which you can load into a PFont object using loadFont(). +

    +
     f = loadFont("ArialMT-16.vlw");
     
    -

    Animating Text

    -

    Let's look at two more useful Processing functions related to displaying text: -

    -textAlign() -- specifies RIGHT, LEFT or CENTER alignment for text. -

    -
     
    -

    +

    Animating Text

    + +

    + Let's look at two more useful Processing functions related to displaying text: +

    + +

    + textAlign()—specifies RIGHT, LEFT or CENTER alignment for text. +

    + + -Example Text Align +Example Text Align + +
     PFont f;
     
     void setup() {
    @@ -207,11 +275,11 @@ 

    Animating Text

    text("This text is right aligned.",width/2,140); }
    -

    -textWidth() -- Calculates and returns the width of any character or text string. -

    +

    +textWidth()—Calculates and returns the width of any character or text string. +

    Let's say we want to create a news ticker, where text scrolls across the bottom of the screen from left to right. When the news headline leaves the window, it reappears on the right hand side and scrolls again. If we know the x location of the beginning of the text and we know the width of that text, we can determine when it is no longer in view. textWidth() gives us that width. -

    +

    To start, we declare headline, font, and x location variables, initializing them in setup().

    @@ -225,7 +293,7 @@ 

    Animating Text

    x = width; // initializing headline off-screen to the right }
    -

    +

    In draw(), we display the text at the appropriate location.

    @@ -234,17 +302,17 @@ 

    Animating Text

    textAlign(LEFT); text(headline,x,180);
    -

    +

    We change x by a speed value (in this case a negative number so that the text moves to the left.)

     // Decrement x
     x = x - 3;
     
    -

    +

    Now comes more difficult part. It was easy to test when a circle reached the left side of the screen. We would simply ask: is x less than 0? With text, however, since it is left-aligned, when x equals zero, it is still viewable on screen. Instead, the text will be invisible when x is less than 0 minus the width of the text (See figure below). When that is the case, we reset x back to the right-hand side of the window, i.e. width. -

    - +

    +

     // If x is less than the negative width, then it is completely off the screen
    @@ -253,12 +321,13 @@ 

    Animating Text

    x = width; }
    -

    +

    Here's the full example that displays a different headline each time the previous headline leaves the screen. The headlines are stored in a String array.

    -Example Scrolling Headlines
    +Example Scrolling Headlines
     // An array of news headlines
    +
     String[] headlines = {
       "Processing downloads break downloading record.", 
       "New study shows computer programming lowers cholesterol.",
    @@ -296,16 +365,16 @@ 

    Animating Text

    } }
    -

    +

    In addition to textAlign() and textWidth(), Processing also offers the functions textLeading(), textMode(), textSize() for additional display functionality.

    Rotating text

    -

    Translation and rotation can also be applied to text. For example, to rotate text around its center, translate to an origin point and use textAlign(CENTER) before displaying the text. +

    Translation and rotation can also be applied to text. For example, to rotate text around its center, translate to an origin point and use textAlign(CENTER) before displaying the text.

    -Example: Rotating Text
    +Example: Rotating Text
     PFont f;
     String message = "this text is spinning";
     float theta;
    @@ -327,19 +396,30 @@ 

    Rotating text

    }
    -

    Displaying text character by character

    -

    -In certain graphics applications, displaying text with each character rendered individually is required. For example, if each character needs to move or be colored independently then simply saying

    + + +

    Displaying text character by character

    + +

    + In certain graphics applications, displaying text with each character rendered individually is required. For example, if each character needs to move or be colored independently then simply saying... +

    +
     text("a bunch of letters",0,0);
     
    -

    -will not do. -

    -The solution is to loop through a String, displaying each character one at a time. -

    -Let's start by looking at an example that displays the text all at once. -

    + +

    + ...will not do. +

    + +

    + The solution is to loop through a String, displaying each character one at a time. +

    + +

    + Let's start by looking at an example that displays the text all at once. +

    +
     PFont f;
     String message = "Each character is not written individually.";
    @@ -353,13 +433,15 @@ 

    Displaying text character by character

    background(255); fill(0); textFont(f); - // Displaying a block of text all at once using text(). + // Displaying a block of text all at once using text(). text(message,10,height/2); }
    -

    -We can rewrite the code to display each character in loop, using the charAt() function. -

    + +

    + We can rewrite the code to display each character in loop, using the charAt() function. +

    +
     String message = "Each character is written individually.";
     
    @@ -372,13 +454,18 @@ 

    Displaying text character by character

    x += 10; }
    -

    -Calling the text() function for each character will allow us more flexibility (for coloring, sizing, and placing characters within one String individually). The above code has a pretty major flaw, however -- the x location is increased by 10 pixels for each character. Although this is approximately correct, because each character is not exactly ten pixels wide, the spacing is off. -

    -The proper spacing can be achieved using the textWidth() function as demonstrated in the code below. Note how this example achieves the proper spacing even with each character being a random size! -

    - -

    + +

    + Calling the text() function for each character will allow us more flexibility (for coloring, sizing, and placing characters within one String individually). The above code has a pretty major flaw, however—the x location is increased by 10 pixels for each character. Although this is approximately correct, because each character is not exactly ten pixels wide, the spacing is off. +

    + +

    + The proper spacing can be achieved using the textWidth() function as demonstrated in the code below. Note how this example achieves the proper spacing even with each character being a random size! +

    + + + +
     PFont f;
     String message = "Each character is written individually.";
    @@ -396,17 +483,20 @@ 

    Displaying text character by character

    for (int i = 0; i < message.length(); i++) { textSize(random(12,36)); text(message.charAt(i),x,height/2); - // textWidth() spaces the characters out properly. + // textWidth() spaces the characters out properly. x += textWidth(message.charAt(i)); } noLoop(); }
    -

    -This "letter by letter" methodology can also be applied to a sketch where characters from a String move independently of one another. The following example uses object-oriented design to make each character from the original String a Letter object, allowing it to both be a displayed in its proper location as well as move about the screen individually. -

    + + +

    + This "letter by letter" methodology can also be applied to a sketch where characters from a String move independently of one another. The following example uses object-oriented design to make each character from the original String a Letter object, allowing it to both be a displayed in its proper location as well as move about the screen individually. +

    +
    -Example Text breaking up
    +Example Text breaking up
     PFont f;
     String message = "click mouse to shake it up";
     // An array of Letter objects
    @@ -478,14 +568,16 @@ 

    Displaying text character by character

    } }
    -

    -The character by character method also allows us to display text along a curve. Before we move on to letters, let's first look at how we would draw a series of boxes along a curve. This example makes heavy use of Trignometry. -

    + +

    + The character by character method also allows us to display text along a curve. Before we move on to letters, let's first look at how we would draw a series of boxes along a curve. This example makes heavy use of Trignometry. +

    + + + +Example Boxes along a curve +
    -

    - -

    -Example Boxes along a curve PFont f; // The radius of a circle float r = 100; @@ -535,13 +627,15 @@

    Displaying text character by character

    } }
    -

    -What we need to do is replace each box with a character from a String that fits inside the box. And since characters all do not have the same width, instead of using a variable "w" that stays constant, each box will have a variable width along the curve according to the textWidth() function. -

    - -

    + +

    + What we need to do is replace each box with a character from a String that fits inside the box. And since characters all do not have the same width, instead of using a variable "w" that stays constant, each box will have a variable width along the curve according to the textWidth() function. +

    + + +
    -Example Characters along a curve
    +Example Characters along a curve
     // The message to be displayed
     String message = "text along a curve";
     
    @@ -597,14 +691,12 @@ 

    Displaying text character by character

    } }
    -

    -Special thanks to Ariel Malka for his advice on this last curved text example. -

    -

     

    -

    This tutorial is for Processing version 1.1+. If you see any errors or have comments, please let us know. This tutorial is from the book, Learning Processing, by Daniel Shiffman, published by Morgan Kaufmann Publishers, Copyright © 2008 Elsevier Inc. All rights reserved.

    +

    + Special thanks to Ariel Malka for his advice on this last curved text example. +

    -
    -

    +
    + diff --git a/content/static/tutorials/transform2d/index.html b/content/static/tutorials/transform2d/index.html index 64ec4272f..5647b937f 100644 --- a/content/static/tutorials/transform2d/index.html +++ b/content/static/tutorials/transform2d/index.html @@ -1,33 +1,27 @@ - - -

    2D Transformations

    - - - +
    + diff --git a/content/static/tutorials/trig/imgs/unit_circle.svg b/content/static/tutorials/trig/imgs/unit_circle.svg index 944ffec49..3f60cb240 100644 --- a/content/static/tutorials/trig/imgs/unit_circle.svg +++ b/content/static/tutorials/trig/imgs/unit_circle.svg @@ -1,566 +1,41 @@ - - - - - - - - - -]> - - - - - - - - - - - θ - - - - - Unit Circle: - - 90° - - 270° - - 180° - - - p(r, - θ - ) - r - (radius) - s - (arc length) - - π - - 2 - - π - 2 - - - origin - - - - - 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 -Gz/wDnylTZ7LrWytBv8BAmPB3w== - - + + + + + + +θ + + + + +Unit Circle: + +90° + +270° + + 180° + + +p(r, +θ +) +r +(radius) +s +(arc length) + +π + +2 + +π +2 + + +origin diff --git a/content/static/tutorials/trig/index.html b/content/static/tutorials/trig/index.html index 80fb29976..188f2b3d9 100644 --- a/content/static/tutorials/trig/index.html +++ b/content/static/tutorials/trig/index.html @@ -1,149 +1,161 @@ -

    Trigonometry Primer I

    -

    -

    - -

    This tutorial is for Processing version 1.1+. If you see any errors or have comments, please let us know. This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

    -

    -Download the files from this tutorial. -

    +

    If you see any errors in this tutorial or have comments, please let us know. This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

    + +

    2D Transformations

    +

    J David Eisenberg

    + + +

    + (Download the files from this tutorial.) +

     

    -

    -Processing has built-in functions that make it easy for you -to have objects in a sketch move, spin, and grow -or shrink. This tutorial will introduce you to the -translate, rotate, and -scale functions so that you can use them -in your sketches. -

    +

    + Processing has built-in functions that make it easy for you to have objects in a sketch move, spin, and grow or shrink. This tutorial will introduce you to the translate, rotate, and scale functions so that you can use them in your sketches. +

    -

    Translation: Moving the Grid

    +

    Translation: Moving the Grid

    -

    -As you know, your Processing window works like a piece of graph paper. When you -want to draw something, you specify its coordinates on the graph. +

    + As you know, your Processing window works like a piece of graph paper. When you want to draw something, you specify its coordinates on the graph. Here is a simple rectangle drawn with the code rect(20, 20, 40, 40). The coordinate system (a fancy word for “graph paper”) is shown in gray. @@ -124,7 +118,7 @@

    What’s the Advantage?

    is a lot more trouble than just adding to coordinates. For a simple example like the rectangle, you are correct. But let’s take an example of where translate() can make life easier. Here is some -code that draws a row of houses. It uses a loop that calls +code that draws a row of houses. It uses a loop that calls a function named house(), which takes the x and y location of the house’s upper-left corner as its parameters.

    @@ -416,7 +410,7 @@

    The Transformation Matrix

    Push and Pop

    -What, about the push and pop part of the names? These come from a computer +What about the push and pop part of the names? These come from a computer concept known as a stack, which works like a spring-loaded tray dispenser in a cafeteria. When someone returns a tray to the stack, its weight pushes the platform down. @@ -869,14 +863,6 @@

    Case Study: Interactive Rotation

    -

    -You can download the files from this tutorial, -including the program that made the grid diagrams. -

    - -

     

    - -

    This tutorial is for Processing version 1.1+. If you see any errors or have comments, please let us know. This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

    - - - + +
    - -

    This tutorial is for Processing version 1.1+. If you see any errors or have comments, please let us know. This tutorial is from the book, Processing: Creative Coding and Computational Art, Ira Greenberg, Friends of ED 2007. This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

    - - -

     

    - -

    -Trigonometry (really just a couple of the trig functions) is central to graphics programming. That being said if you're anything like me you probably have a hazy memory of trig. Perhaps you remember the mnemonic device soh-cah-toa, used to remember the relationships between the trig functions and a right triangle. Here's a diagram to awaken your memory. -

    - - -

      -
    • soh stands for "sine equals opposite over hypotenuse." "Opposite" refers to the side opposite the angle.
    • -
    • cah stands for "cosine equals adjacent over hypotenuse." "Adjacent" is the side next to the angle.
    • -
    • toa refers to "tangent equals opposite over adjacent."
    • -
    -
    -You should also notice in the figure that tangent equals sine(θ) over cosine(θ). You may also remember that sine and cosine are similar when you graph them, both forming periodic waves. Only the cosine wave is shifted a bit (90° or pi/2) on the graph, which is technically called a phase shift. I fully realize that it is difficult to deal with this stuff in the abstract. Fortunately, there is another model, the unit circle (shown below) used to visualize and study the trig functions. -

    - - -

    -The unit circle is a circle with a radius of 1 unit in length—hence its imaginative name. When you work with the unit circle, you don't use the regular and trusted Cartesian coordinate system; instead you use a polar coordinate system. The Cartesian system works great in a rectangular grid space, where a point can be located by a coordinate, such as (x, y). In a polar coordinate system, in contrast, location is specified by (r, θ), where r is the radius and θ (the Greek letter theta) is the angle of rotation. The unit circle has its origin at its center, and you measure angles of rotation beginning at the right-middle edge of the unit circle (facing 3 o'clock) and moving in a counterclockwise direction around it. -

    -In the unit_circle diagram, the point p is at 45° or pi / 4. You can use pi also to measure around the unit circle, as illustrated in the figure. Halfway around the circle (180°) is equal to pi radians, and all the way around the circle is equal to 2pi radians and also 0 radians, since a circle is continuous and ends where it begins. The number pi is a constant that is equal to the circumference of a circle divided by its diameter, and is approximately 3.142. -

    -In the polar system, you use radians to measure angles, instead of degrees. The angle of rotation in radians is commonly referred to as θ (the Greek letter theta). The arc length of this rotation is calculated by r*θ where r is the radius. In a unit circle, with a radius of 1, θ is equal to the arc length of rotation (arc s in unit circle diagram). It's nice to know the arc length, but most of the time (in computer graphics), you really just want to know the location of a point in relation to the unit circle. For example, if I wanted to rotate a point around the unit circle, I'd need to know how to place and move the point in a circle. With the unit circle, this is an incredibly easy task and precisely the kind of thing trig is used for. -

    -There is a really simple relationship between the trig functions and the unit circle. Notice in the unit circle diagram that from point p on the ellipse, a right triangle is formed within the unit circle. This should immediately make you think of good old Pythagoras. Notice also that r (the radius) is the hypotenuse of the right triangle. In addition, you now also know that with the trig functions, you can use theta and any one side (opposite, adjacent, or hypotenuse) to solve the rest of the triangle. The big payoff of these relationships, for our purposes, is that to translate point p in the polar coordinate system to the Cartesian coordinate system (the system used by our monitors), you would use these simple expressions: -

    -  x = cosine(theta) * radius
    -  y = sine(theta) * radius
    -

    -These seemingly humble little expressions are very powerful and can be exploited for all sorts of expressive and organic purposes. -

    -Here's how you actually use the trig functions in Processing:

    -
    -  float x = cos(radians(angle)) * radius;
    -  float y = sin(radians(angle)) * radius;
    -
    -
    -Notice the function call (radians(angle)) inside each of the trig function calls. Remember that theta is measured in radians, in the polar coordinate system. However, in the Cartesian coordinate system, you work in degrees. To convert between radians and degrees and vice versa, you can use the following expressions: -

    -  theta = angle*pi/180
    -  angle = theta*180/pi
    -

    -Or better yet, just use Processing's handy conversion functions:

    -
    -  theta = radians(angle)
    -  angle = degrees(theta)
    -
    -
    -

    -

    -Lastly, I include a Processing sketch that clearly demonstrates how the unit circle and sine function relate. A while back I came across a Java applet on the Web that showed this relationship (sorry, but I don't remember the link), and I thought it was helpful, so I created a version in Processing (screen-shot below): + + + - -
    + +

    + This tutorial is from the book, Processing: Creative Coding and Computational Art, Ira Greenberg, Friends of ED, © 2007. This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. If you see any errors or have comments, please let us know. +

    + + +

    Trigonometry Primer

    +

    Ira Greenberg

    + + +

    + Trigonometry (really just a couple of the trig functions) is central to graphics programming. That being said, if you're anything like me you probably have a hazy memory of trig. Perhaps you remember the mnemonic device soh-cah-toa to remember the relationships between the trig functions and a right triangle. Here's a diagram to awaken your memory. +

    + + + + +
      +
    • soh stands for "sine equals opposite over hypotenuse." "Opposite" refers to the side opposite the angle.
    • +
    • cah stands for "cosine equals adjacent over hypotenuse." "Adjacent" is the side next to the angle.
    • +
    • toa refers to "tangent equals opposite over adjacent."
    • +
    + +

    + You should also notice in the figure that tangent equals sine(θ) over cosine(θ). You may also remember that sine and cosine are similar when you graph them, both forming periodic waves. Only the cosine wave is shifted a bit (90° or pi/2) on the graph, which is technically called a phase shift. I fully realize that it is difficult to deal with this stuff in the abstract. Fortunately, there is another model, the unit circle (shown below) used to visualize and study the trig functions. +

    + + + + +

    + The unit circle is a circle with a radius of 1 unit in length—hence its imaginative name. When you work with the unit circle, you don't use the regular and trusted Cartesian coordinate system; instead you use a polar coordinate system. The Cartesian system works great in a rectangular grid space, where a point can be located by a coordinate, such as (x, y). In a polar coordinate system, in contrast, location is specified by (r, θ), where r is the radius and θ (the Greek letter theta) is the angle of rotation. The unit circle has its origin at its center, and you measure angles of rotation beginning at the right-middle edge of the unit circle (facing 3 o'clock) and moving in a counterclockwise direction around it. +

    + +

    + In the unit circle diagram, the point p is at 45° or pi / 4. You can use pi also to measure around the unit circle, as illustrated in the figure. Halfway around the circle (180°) is equal to pi radians, and all the way around the circle is equal to 2pi radians and also 0 radians, since a circle is continuous and ends where it begins. The number pi is a constant that is equal to the circumference of a circle divided by its diameter, and is approximately 3.142. +

    + +

    + In the polar system, you use radians to measure angles, instead of degrees. The angle of rotation in radians is commonly referred to as θ (the Greek letter theta). The arc length of this rotation is calculated by r*θ where r is the radius. In a unit circle, with a radius of 1, θ is equal to the arc length of rotation (arc s in unit circle diagram). It's nice to know the arc length, but most of the time (in computer graphics), you really just want to know the location of a point in relation to the unit circle. For example, if I wanted to rotate a point around the unit circle, I'd need to know how to place and move the point in a circle. With the unit circle, this is an incredibly easy task and precisely the kind of thing trig is used for. +

    + +

    + There is a really simple relationship between the trig functions and the unit circle. Notice in the unit circle diagram that from point p on the ellipse, a right triangle is formed within the unit circle. This should immediately make you think of good old Pythagoras. Notice also that r (the radius) is the hypotenuse of the right triangle. In addition, you now also know that with the trig functions, you can use theta and any one side (opposite, adjacent, or hypotenuse) to solve the rest of the triangle. The big payoff of these relationships, for our purposes, is that to translate point p in the polar coordinate system to the Cartesian coordinate system (the system used by our monitors), you would use these simple expressions: +

    + +

    + x = cosine(theta) * radius
    + y = sine(theta) * radius +

    + +

    + These seemingly humble little expressions are very powerful and can be exploited for all sorts of expressive and organic purposes. +

    + +

    + Here's how you actually use the trig functions in Processing: +

    + +

    + float x = cos(radians(angle)) * radius;
    + float y = sin(radians(angle)) * radius; +

    + +

    + Notice the function call (radians(angle)) inside each of the trig function calls. Remember that theta is measured in radians, in the polar coordinate system. However, in the Cartesian coordinate system, you work in degrees. To convert between radians and degrees and vice versa, you can use the following expressions: +

    + +

    + theta = angle*pi/180
    + angle = theta*180/pi +

    + +

    + Or better yet, just use Processing's handy conversion functions: +

    + +

    + theta = radians(angle)
    + angle = degrees(theta) +

    + +

    + Lastly, I include a Processing sketch that demonstrates how the unit circle and sine function relate: +

    +
     
    -/** Sine Console
    -* Processing: Creative Coding and
    -* Computational Art
    -* By Ira Greenberg */
    -
    -float px, py, px2, py2;
    -float angle, angle2;
    -float radius = 50;
    -float frequency = 2;
    -float frequency2 = 2;
    -float x, x2;
    -
    -// used to create font
    -PFont myFont;
    -
    -void setup(){
    -  size(600, 200);
    -  background (127);
    -  // generate processing font from system font
    -  myFont = createFont("verdana", 12);
    -  textFont(myFont);
    +float px, py, px2, py2;
    +float angle, angle2;
    +float radius = 50;
    +float frequency = 2;
    +float frequency2 = 2;
    +float x, x2;
    +
    +void setup(){
    +  size(600, 200);
    +  background (127);
     }
     
    -void draw(){
    -  background (127);
    -  noStroke();
    -  fill(255);
    -  ellipse(width/8, 75, radius*2, radius*2);
    -  // rotates rectangle around circle
    -  px = width/8 + cos(radians(angle))*(radius);
    -  py = 75 + sin(radians(angle))*(radius);
    -  rectMode(CENTER);
    -  fill(0);
    -  //draw rectangle
    -  rect (px, py, 5, 5);
    -  stroke(100);
    -  line(width/8, 75, px, py);
    -  stroke(200);
    -
    -  // keep reinitializing to 0, to avoid
    -  // flashing during redrawing
    +void draw(){
    +  background (127);
    +  noStroke();
    +  fill(255);
    +  ellipse(width/8, 75, radius*2, radius*2);
    +  
    +  // Rotates rectangle around circle
    +  px = width/8 + cos(radians(angle))*(radius);
    +  py = 75 + sin(radians(angle))*(radius);
    +  fill(0);
    +
    +  rect (px, py, 5, 5);
    +  stroke(100);
    +  line(width/8, 75, px, py);
    +  stroke(200);
    +
    +  // Keep reinitializing to 0, to avoid
    +  // flashing during redrawing
       angle2 = 0;
     
    -  // draw static curve - y = sin(x)
    -  for (int i = 0; i< width; i++){
    -    px2 = width/8 + cos(radians(angle2))*(radius);
    -    py2 = 75 + sin(radians(angle2))*(radius);
    -    point(width/8+radius+i, py2);
    +  // Draw static curve - y = sin(x)
    +  for (int i = 0; i< width; i++){
    +    px2 = width/8 + cos(radians(angle2))*(radius);
    +    py2 = 75 + sin(radians(angle2))*(radius);
    +    point(width/8+radius+i, py2);
         angle2 -= frequency2;
       }
     
    -  // send small ellipse along sine curve
    -  // to illustrate relationship of circle to wave
    -  noStroke();
    -  ellipse(width/8+radius+x, py, 5, 5);
    +  // Send small ellipse along sine curve
    +  // to illustrate relationship of circle to wave
    +  noStroke();
    +  ellipse(width/8+radius+x, py, 5, 5);
       angle -= frequency;
       x+=1;
     
    -  // when little ellipse reaches end of window
    -  // reinitialize some variables
    -  if (x>= width-60) {
    +  // When little ellipse reaches end of window,
    +  // set the variables back to 0
    +  if (x >= width-60) {
         x = 0;
         angle = 0;
       }
     
    -  // draw dynamic line connecting circular
    -  // path with wave
    -  stroke(50);
    -  line(px, py, width/8+radius+x, py);
    +  // Draw dynamic line connecting circular path with wave
    +  stroke(50);
    +  line(px, py, width/8+radius+x, py);
     
    -  // output some calculations
    -  text("y = sin x", 35, 185);
    -  text("px = " + px, 105, 185);
    -  text("py = " + py, 215, 185);
    +  // Output calculations to screen
    +  text("y = sin x", 35, 185);
    +  text("px = " + px, 105, 185);
    +  text("py = " + py, 215, 185);
     }
     
    -

    -

     

    - -

    This tutorial is for Processing version 1.1+. If you see any errors or have comments, please let us know. This tutorial is from the book, Processing: Creative Coding and Computational Art, Ira Greenberg, Friends of ED 2007. This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

    -
    -

    +
    + diff --git a/content/static/tutorials/tutorials.xml b/content/static/tutorials/tutorials.xml index f51b71ded..9db78bd35 100644 --- a/content/static/tutorials/tutorials.xml +++ b/content/static/tutorials/tutorials.xml @@ -78,7 +78,7 @@ - Trigonometry Primer I + Trigonometry Primer trig true false @@ -119,12 +119,14 @@ true + Electronics @@ -175,4 +177,18 @@ false - \ No newline at end of file + + Sound + sound + true + false + + + + Video + video + true + false + + + diff --git a/content/static/tutorials/typography/index.html b/content/static/tutorials/typography/index.html index a57e42b9d..931690834 100644 --- a/content/static/tutorials/typography/index.html +++ b/content/static/tutorials/typography/index.html @@ -1,76 +1,87 @@ -
    - +
    - - - - - - - - +

    + Another version of text() draws the characters inside a rectangle. In this use, the second and third parameters define the position of the upper-left corner of the box and fourth and fifth parameters define the width and height of the box. If the length of the text exceeds the dimensions of the defined box, the text will not display. +

    - - - + +

    + Before a font is used in a program, it must be converted and set as the current font. Processing has a unique data type called PFont to store font data. Make a new variable of the type PFont and use the createFont() function to convert the font. The first parameter to createFont() is the name of the font to convert and the second parameter defines the base size of the font. (Optional third and fourth parameters are defined in the Reference.) The textFont() function must then be used to set the current font. On our development computer, to work with Ziggurat Black, list option 571 above, the following code is run: +

    + +
    -

    Typography

    -

    This tutorial is the Typography chapter from the second edition of Processing: A Programming Handbook for Visual Designers and Artists, published by MIT Press. Copyright 2013 MIT Press. This tutorial is for Processing version 2.0+. If you see any errors or have comments, please let us know.

    - -
    -

    -The evolution of typographic reproduction and display technologies has and continues to impact human culture. Early printing techniques developed by Johannes Gutenberg in fifteenth-century Germany using letters cast from lead provided a catalyst for increased literacy and the scientific revolution. Automated typesetting machines, such as the Linotype invented in the nineteenth century, changed the way information was produced, distributed, and consumed. In the digital era, the way we consume text has changed drastically since the proliferation of personal computers in the 1980s and the rapid growth of the Internet in the 1990s. Text from emails, websites, and instant messages fill computer screens, and while many of the typographic rules of the past apply, type on screen requires additional considerations for enhanced communication and legibility. -
    -
    -Letters on screen are created by setting the color of pixels. The quality of the typography is constrained by the resolution of the screen. Because, historically, screens have a low resolution in comparison to paper, techniques have been developed to enhance the appearance of type on screen. The fonts on the earliest Apple Macintosh computers comprised small bitmap images created at specific sizes like 10, 12, and 24 points. Using this technology, a variation of each font was designed for each size of a particular typeface. For example, the character A in the San Francisco typeface used a different image to display the character at size 12 and 18. When the LaserWriter printer was introduced in 1985, Postscript technology defined fonts with a mathematical description of each character’s outline. This allowed type on screen to scale to large sizes and still look smooth. Apple and Microsoft later developed TrueType, another outline font format. More recently, these technologies were merged into the OpenType format. In the meantime, methods to smooth text on screen were introduced. These anti-aliasing techniques use gray pixels at the edge of characters to compensate for low screen resolution. -
    -
    -The proliferation of personal computers in the mid-1980s spawned a period of rapid typographic experimentation. Digital typefaces are software, and the old rules of metal and photo type no longer apply. The Dutch typographers known as LettError explain, “The industrial methods of producing typography meant that all letters had to be identical… Typography is now produced with sophisticated equipment that doesn’t impose such rules. The only limitations are in our expectations.”1 LettError expanded the possibilities of typography with their typeface Beowolf (p. 131). It printed every letter differently so that each time an A is printed, for example, it will have a different shape. During this time, typographers such as Zuzana Licko and Barry Deck created innovative typefaces with the assistance of new software tools. The flexibility of software has enabled extensive font revivals and historic homages such as Adobe Garamond from Robert Slimbach and The Proteus Project from Jonathan Hoefler. Typographic nuances such as ligatures—connections between letter pairs such as -fi and æ—made impractical by modern mechanized typography are flourishing again through software font tools. -

    -
    -

    -

    Draw text

    -The text() function is used to draw letters, words, and paragraphs to the screen. In the simplest use, the first parameter can be a String, char, int, or float. The second and third parameters set the position of the text. By default, the second parameter defines the distance from the left edge of the window; the third parameter defines the distance from the text’s baseline to the top of the window. The textSize() function defines the size the letters will draw in units of pixels. The number used to define the text size will not be the precise height of each letter, the difference depends on the design of each font. For instance, the statement textSize(30); won’t necessarily draw a capital H at 30 pixels high. The fill() function controls the color and transparency of text. This function affects text the same way it affects shapes such as rect() and ellipse(), but text is not affected by stroke(). -

    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    -
    -
    -fill(0);
    -text("LAX", 0, 40); // Write "LAX" at coordinate (0,40)
    -text("AMS", 0, 70); // Write "AMS" at coordinate (0,70)
    -text("FRA", 0, 100); // Write "FRA" at coordinate (0,100)
    +    

    This tutorial is the Typography chapter from Processing: A Programming Handbook for Visual Designers and Artists, Second Edition, published by MIT Press. © 2014 MIT Press. If you see any errors or have comments, please let us know.

    + +

    Typography

    +

    Casey Reas and Ben Fry

    + + +

    + The evolution of typographic reproduction and display technologies has and continues to impact human culture. Early printing techniques developed by Johannes Gutenberg in fifteenth-century Germany using letters cast from lead provided a catalyst for increased literacy and the scientific revolution. Automated typesetting machines, such as the Linotype invented in the nineteenth century, changed the way information was produced, distributed, and consumed. In the digital era, the way we consume text has changed drastically since the proliferation of personal computers in the 1980s and the rapid growth of the Internet in the 1990s. Text from emails, websites, and instant messages fill computer screens, and while many of the typographic rules of the past apply, type on screen requires additional considerations for enhanced communication and legibility. +

    +

    + Letters on screen are created by setting the color of pixels. The quality of the typography is constrained by the resolution of the screen. Because, historically, screens have a low resolution in comparison to paper, techniques have been developed to enhance the appearance of type on screen. The fonts on the earliest Apple Macintosh computers comprised small bitmap images created at specific sizes like 10, 12, and 24 points. Using this technology, a variation of each font was designed for each size of a particular typeface. For example, the character A in the San Francisco typeface used a different image to display the character at size 12 and 18. When the LaserWriter printer was introduced in 1985, Postscript technology defined fonts with a mathematical description of each character’s outline. This allowed type on screen to scale to large sizes and still look smooth. Apple and Microsoft later developed TrueType, another outline font format. More recently, these technologies were merged into the OpenType format. In the meantime, methods to smooth text on screen were introduced. These anti-aliasing techniques use gray pixels at the edge of characters to compensate for low screen resolution. +

    +

    + The proliferation of personal computers in the mid-1980s spawned a period of rapid typographic experimentation. Digital typefaces are software, and the old rules of metal and photo type no longer apply. The Dutch typographers known as LettError explain, “The industrial methods of producing typography meant that all letters had to be identical… Typography is now produced with sophisticated equipment that doesn’t impose such rules. The only limitations are in our expectations.”1 LettError expanded the possibilities of typography with their typeface Beowolf (p. 131). It printed every letter differently so that each time an A is printed, for example, it will have a different shape. During this time, typographers such as Zuzana Licko and Barry Deck created innovative typefaces with the assistance of new software tools. The flexibility of software has enabled extensive font revivals and historic homages such as Adobe Garamond from Robert Slimbach and The Proteus Project from Jonathan Hoefler. Typographic nuances such as ligatures—connections between letter pairs such as fi and æ—made impractical by modern mechanized typography are flourishing again through software font tools. +

    +

    Draw text

    +

    + The text() function is used to draw letters, words, and paragraphs to the screen. In the simplest use, the first parameter can be a String, char, int, or float. The second and third parameters set the position of the text. By default, the second parameter defines the distance from the left edge of the window; the third parameter defines the distance from the text’s baseline to the top of the window. The textSize() function defines the size the letters will draw in units of pixels. The number used to define the text size will not be the precise height of each letter, the difference depends on the design of each font. For instance, the statement textSize(30); won’t necessarily draw a capital H at 30 pixels high. The fill() function controls the color and transparency of text. This function affects text the same way it affects shapes such as rect() and ellipse(), but text is not affected by stroke(). +

    + + + + + + +
    +
    +fill(0);
    +text("LAX", 0, 40);  // Write "LAX" at coordinate (0,40)
    +text("AMS", 0, 70);  // Write "AMS" at coordinate (0,70)
    +text("FRA", 0, 100); // Write "FRA" at coordinate (0,100)
    +
    +
    + +
    + + + + + + +
    +
     textSize(32); // Set text size to 32
     fill(0);
     text("LAX", 0, 40);
     text("ORD", 0, 70);
     text("DAY", 0, 100);
    +
    +
    +
    - - -textSize(32); -fill(0); // Fill color black + + + + + +
    textSize(32);
    +fill(0);   // Fill color black
     text("LAX", 0, 40);
     fill(126); // Fill color gray
     text("HKG", 0, 70);
     fill(255); // Fill color white
    -text("PVG", 0, 100);
    +text("PVG", 0, 100);
    +
    +
    + + + + - - - - - - + +
    +
     textSize(64);
     fill(0, 140); // Fill black with low opacity
     text("8", 0, 60);
    @@ -79,83 +90,84 @@ 

    Draw text

    text("8", 45, 75); text("8", 60, 80);
    -
    -

    -Another version of text() draws the characters inside a rectangle. In this use, the second and third parameters define the position of the upper-left corner of the box and fourth and fifth parameters define the width and height of the box. If the length of the text exceeds the dimensions of the defined box, the text will not display. -

    -
    - -
    - -
    -
    + + + + + +
     String s = "Five hexing wizard bots jump quickly.";
     fill(0);
     text(s, 10, 10, 60, 80);
    +
    +
    +
    - - - + + + + - + + - -
    +
     String s = "Five hexing wizard bots jump quickly.";
     fill(0);
     text(s, 10, 10, 60, 55); // Box too small
     
    -
    -

    -The examples in this chapter are the first to load external media into a sketch. Up to now, all examples have used only graphics generated within Processing through drawing functions such as line() and ellipse(). Processing is capable of loading and displaying other media, including fonts, images, vector files, formatted data, and sounds. While this chapter focuses on loading fonts and other chapters discuss specific information about other media types, there are a few things about loading media that apply to all categories. These similarities are discussed here. -
    -
    -Before external media can be used in a Processing sketch, it needs to be loaded each time the program is run. Media can be loaded directly from a sketch’s folder, another location on the computer, or though the Internet. Most typically, the media is loaded directly from the sketch’s folder. Media is usually placed into a folder called data; there are three ways to get media into this folder: -
    -
    -1. Add the file by selecting the “Add File” option in the Sketch menu of the Processing environment. Navigate to the file’s location on your computer, select the file’s icon or name, and click “Open” to add -it to the sketch’s data folder. -
    -
    -2. A file (or group of files) can be dragged and dropped into the Processing text area. If successful, a note will appear in the message area stating, for instance, “One file added to the sketch.” -
    -
    -3. Files can be added manually by opening the sketch folder by selecting the “Show Sketch Folder” option from the Sketch menu. Create a folder inside called data if it doesn’t exist and copy the file (or files) into that folder. -
    -
    -To confirm the file was added correctly, select “Show Sketch Folder” from the Sketch menu. The file will be inside the data folder. With the image file in the right place, it’s ready to load. Be sure to include the file format extension as a part of the name and to put the entire name in quotes (e.g., “pup.gif”, “kat.jpg”, “ignatz.png”). When loading the file, be careful to use the correct capitalization when writing the file name. If the file is arch.jpg, trying to load Arch.jpg or arch.JPG will create an error. Also, avoid the use of spaces in file names, which can cause problems. -
    -
    -To make media files accessible from anywhere in a program, they are typically declared as globally available variables outside of setup() and draw(). Files are usually loaded inside setup() because they need only be loaded once and because it takes time to load them. Loading a file inside draw() reduces the frame rate of a program because it causes the file to reload each frame. Once a file is loaded in setup(), it may be utilized anywhere in the program. In most Processing programs, all files are loaded when the program starts. -

    -
    -
    -

    -

    Vector Fonts

    +
    + +

    + The examples in this chapter are the first to load external media into a sketch. Up to now, all examples have used only graphics generated within Processing through drawing functions such as line() and ellipse(). Processing is capable of loading and displaying other media, including fonts, images, vector files, formatted data, and sounds. While this chapter focuses on loading fonts and other chapters discuss specific information about other media types, there are a few things about loading media that apply to all categories. These similarities are discussed here. +

    + +

    + Before external media can be used in a Processing sketch, it needs to be loaded each time the program is run. Media can be loaded directly from a sketch’s folder, another location on the computer, or though the Internet. Most typically, the media is loaded directly from the sketch’s folder. Media is usually placed into a folder called data; there are three ways to get media into this folder: +

    + +
      +
    1. Add the file by selecting the “Add File” option in the Sketch menu of the Processing environment. Navigate to the file’s location on your computer, select the file’s icon or name, and click “Open” to add it to the sketch’s data folder.
    2. + +
    3. A file (or group of files) can be dragged and dropped into the Processing text area. If successful, a note will appear in the message area stating, for instance, “One file added to the sketch.”
    4. + +
    5. Files can be added manually by opening the sketch folder by selecting the “Show Sketch Folder” option from the Sketch menu. Create a folder inside called data if it doesn’t exist and copy the file (or files) into that folder.
    6. +
    + +

    + To confirm the file was added correctly, select “Show Sketch Folder” from the Sketch menu. The file will be inside the data folder. With the image file in the right place, it’s ready to load. Be sure to include the file format extension as a part of the name and to put the entire name in quotes (e.g., “pup.gif”, “kat.jpg”, “ignatz.png”). When loading the file, be careful to use the correct capitalization when writing the file name. If the file is arch.jpg, trying to load Arch.jpg or arch.JPG will create an error. Also, avoid the use of spaces in file names, which can cause problems. +

    + +

    + To make media files accessible from anywhere in a program, they are typically declared as globally available variables outside of setup() and draw(). Files are usually loaded inside setup() because they need only be loaded once and because it takes time to load them. Loading a file inside draw() reduces the frame rate of a program because it causes the file to reload each frame. Once a file is loaded in setup(), it may be utilized anywhere in the program. In most Processing programs, all files are loaded when the program starts. +

    + + + +

    Vector Fonts

    + +

    + To work with fonts different than the default, more functions are needed to prepare a font to be used with Processing. The createFont() function is used to convert a TrueType font (.ttf) or OpenType font (.otf) so that it can display through text(). The textFont() function is used to define the current font to display. Any compatible font installed on the computer running Processing or stored in the sketch’s data folder may be used. The following short program is used to print the list of the available installed fonts to the console: +

    -To work with fonts different than the default, more functions are needed to prepare -a font to be used with Processing. The createFont() function is used to convert a TrueType font (.ttf) or OpenType font (.otf) so that is can display through text(). The textFont() function is used to define the current font to display. Any compatible font installed on the computer running Processing or stored in the sketch’s data folder may be used. The following short program is used to print the list of the available installed fonts to the console:
     String[] fontList = PFont.list();
     printArray(fontList);
     
    -The printArray() function (p. 420) is used to write each font on a new line. The first few options printed to the console are general typographic classifications such as Serif, SansSerif, and Monospaced. Use these options to define a style, but not a specific font. When the list is generated on the computer used to write this book, a list of 573 font options are printed to the console. Your computer will produce different results depending on the operating system and custom fonts installed. The list starts with general font categories that will work across platforms, then continues with specific font names. A short excerpt from our list follows: -
    -
    + +

    + The printArray() function (p. 420) is used to write each font on a new line. The first few options printed to the console are general typographic classifications such as Serif, SansSerif, and Monospaced. Use these options to define a style, but not a specific font. When the list is generated on the computer used to write this book, a list of 573 font options are printed to the console. Your computer will produce different results depending on the operating system and custom fonts installed. The list starts with general font categories that will work across platforms, then continues with specific font names. A short excerpt from our list follows: +

    +
     [0] "Serif"
     [1] "SansSerif"
    @@ -171,10 +183,12 @@ 

    Vector Fonts

    [571] "Ziggurat-Black" [572] "Ziggurat-BlackItalic"
    -Before a font is used in a program, it must be converted and set as the current font. Processing has a unique data type called PFont to store font data. Make a new variable of the type PFont and use the createFont() function to convert the font. The first parameter to createFont() is the name of the font to convert and the second parameter defines the base size of the font. (Optional third and fourth parameters are defined in the Reference.) The textFont() function must then be used to set the current font. On our development computer, to work with Ziggurat Black, list option 571 above, the following code is run: -

    -
    +
    @@ -204,17 +218,17 @@

    Vector Fonts

    + +

    + To make this program work on your computer, you will likely need to modify line 5 to work with a font on your machine. This program is similar to code 12-01, but notice the differences in the letters in the Ziggurat font in relation to the default font. +

    +

    + To ensure a font will load on all computers, regardless if the font is installed, add the file to the sketch’s data folder. (Fonts in the data folder don’t print in the console list as demonstrated in code 12-07.) Follow the instructions on page 10 to add a font to the data folder. When fonts inside the data folder are used, the complete file name, including the data type extension, needs to be written as the parameter to createFont(). The following example is similar to the prior example, but it uses an OpenType font inside the data folder. It uses Source Code Pro, an open source typeface that can be found online and downloaded through a web browser. +

    -
    -

    -To make this program work on your computer, you will likely need to modify line 5 to work with a font on your machine. This program is similar to code 12-01, but notice the differences in the letters in the Ziggurat font in relation to the default font. -
    -
    -To ensure a font will load on all computers, regardless if the font is installed, add the file to the sketch’s data folder. (Fonts in the data folder don’t print in the console list as demonstrated in code 12-07.) Follow the instructions on page 10 to add a font to the data folder. When fonts inside the data folder are used, the complete file name, including the data type extension, needs to be written as the parameter to createFont(). The following example is similar to the prior example, but it uses an OpenType font inside the data folder. It uses Source Code Pro, an open source typeface that can be found online and downloaded through a web browser. -

    -
    @@ -246,14 +260,14 @@

    Vector Fonts

    - -
    -

    -To use two fonts in one program, create two PFont variables and use the textFont() function to change the current font. Based on the prior two examples, the Ziggurat-Black font loads from its location on the local computer and Source Code Pro loads from the data folder. +

    + +

    + To use two fonts in one program, create two PFont variables and use the textFont() function to change the current font. Based on the prior two examples, the Ziggurat-Black font loads from its location on the local computer and Source Code Pro loads from the data folder.

    -
    @@ -288,22 +302,26 @@

    Vector Fonts

    +
    - -
    -

    -

    Pixel fonts

    -Processing can also work with fonts that it converts into small image textures. These fonts aren’t as flexible and crisp as fonts converted for Processing with createFont() and used with the default renderer, but they are more optimized for use with the P2D and P3D renderers. The difference between renderers is discussed on page 547. The pixel font format used by Processing was developed at the MIT Media Lab in the mid 1990s in the Visual Language Workshop (VLW). The VLW format stores each alphanumeric character as a grid of pixels. It is a quick way to render text and makes it possible to include a font with a sketch without including the vector data. -
    -
    -To convert a font to the VLW format, select the “Create Font” option from the Tools menu. A window opens and displays the names of the fonts installed on your computer that are compatible. Select a font from the list and click “OK.” The font is generated and copied into the current sketch’s data folder. To make sure the font is there, click on the Sketch menu and select “Show Sketch Folder.” The Create Font tool offers the option to set the size of the font and to select whether it will have smooth, antialiased edges. This tool also offers the option to export “All Characters,” which means every character in the font will be included and will therefore increase the file size. -
    -
    -The following example uses the same font as the prior createFont() example. The only difference is the replacement of that function with loadFont(). To run these examples, first use the “Create Font” tool to turn a font into a VLW file. Change the name of the parameter to loadFont() to match the name of the VLW file created. + + +

    Pixel fonts

    + +

    + Processing can also work with fonts that it converts into small image textures. These fonts aren’t as flexible and crisp as fonts converted for Processing with createFont() and used with the default renderer, but they are more optimized for use with the P2D and P3D renderers. The difference between renderers is discussed on page 547. The pixel font format used by Processing was developed at the MIT Media Lab in the mid 1990s in the Visual Language Workshop (VLW). The VLW format stores each alphanumeric character as a grid of pixels. It is a quick way to render text and makes it possible to include a font with a sketch without including the vector data. +

    + +

    + To convert a font to the VLW format, select the “Create Font” option from the Tools menu. A window opens and displays the names of the fonts installed on your computer that are compatible. Select a font from the list and click “OK.” The font is generated and copied into the current sketch’s data folder. To make sure the font is there, click on the Sketch menu and select “Show Sketch Folder.” The Create Font tool offers the option to set the size of the font and to select whether it will have smooth, antialiased edges. This tool also offers the option to export “All Characters,” which means every character in the font will be included and will therefore increase the file size. +

    + +

    + The following example uses the same font as the prior createFont() example. The only difference is the replacement of that function with loadFont(). To run these examples, first use the “Create Font” tool to turn a font into a VLW file. Change the name of the parameter to loadFont() to match the name of the VLW file created.

    -
    @@ -334,14 +352,15 @@

    Pixel fonts

    +
    -
    -

    + +

    When the font is drawn at a different size from the size at which it was created, it is scaled and therefore does not always look as crisp and smooth. For example, if a font is created at 12 pixels and is displayed at 96 pixels, it will appear blurry.

    -
    @@ -374,29 +393,30 @@

    Pixel fonts

    - -
    -

    -For the best results, draw a font at the size at which it was created. If the same font needs to be used at multiple sizes, consider rendering and loading it at these precise sizes. When VLW fonts are used in 3D, letters with different z-coordinates can sometimes occlude other letters. This can be corrected with a hint, see page 547. -

    -
    -

    -

    Text attributes

    -Processing includes functions to control the leading (the spacing between lines of text) and alignment. Processing can also calculate the width of any character or group of characters, a useful technique for arranging shapes and typographic elements. +
    + + +

    + For the best results, draw a font at the size at which it was created. If the same font needs to be used at multiple sizes, consider rendering and loading it at these precise sizes. When VLW fonts are used in 3D, letters with different z-coordinates can sometimes occlude other letters. This can be corrected with a hint, see page 547. +

    + +

    Text attributes

    + +

    + Processing includes functions to control the leading (the spacing between lines of text) and alignment. Processing can also calculate the width of any character or group of characters, a useful technique for arranging shapes and typographic elements. The textLeading() function sets the spacing between lines of text. It has one parameter that defines this space in units of pixels.

    -
    - - + + - - - - +
    - -
    -
    + +
    +
     String lines = "L1 L2 L3";
     textSize(12);
    @@ -411,13 +431,14 @@ 

    Text attributes

    -

    -Letters and words can be drawn from their center, left, and right edges. The textAlign() function sets the alignment for drawing text through its parameter, which can be LEFT, CENTER, or RIGHT. It sets the display characteristics of the letters in relation to the x-coordinate stated in the text() function. -

    -
    + +

    + Letters and words can be drawn from their center, left, and right edges. The textAlign() function sets the alignment for drawing text through its parameter, which can be LEFT, CENTER, or RIGHT. It sets the display characteristics of the letters in relation to the x-coordinate stated in the text() function. +

    + + + - - - +
    @@ -442,26 +463,28 @@

    Text attributes

    -

    -The settings for textSize(), textLeading(), and textAlign() will be used for all subsequent calls to the text() function. However, note that the textSize() function will reset the text leading, and the textFont() function will reset both the size and the leading. -
    -
    -The textWidth() function calculates and returns the pixel width of any character or text string. This number is calculated from the current font and size as defined by the textFont() and textSize() functions. Because the letters of every font are a different size and letters within many fonts have different widths, this function is the only way to know how wide a string or character is when displayed on screen. For this reason, always use textWidth() to position elements relative to text, rather than hard-coding them into your program. -

    -
    + + +

    + The settings for textSize(), textLeading(), and textAlign() will be used for all subsequent calls to the text() function. However, note that the textSize() function will reset the text leading, and the textFont() function will reset both the size and the leading. +

    + +

    + The textWidth() function calculates and returns the pixel width of any character or text string. This number is calculated from the current font and size as defined by the textFont() and textSize() functions. Because the letters of every font are a different size and letters within many fonts have different widths, this function is the only way to know how wide a string or character is when displayed on screen. For this reason, always use textWidth() to position elements relative to text, rather than hard-coding them into your program. +

    + + + - - + + - - - - +
    - -
    -
    + +
    +
     String s = "AEIOU";
     float tw; // Text width
    @@ -478,14 +501,17 @@ 

    Text attributes

    -

    -

    Typing

    -Drawing letters to the screen becomes more engaging when used in combination with the keyboard. The keyPressed() event function introduced on page 97 can be used to record each letter as it is typed. The following two examples use this function to read and analyze input from the keyboard by using the String methods introduced in the Text chapter (p. 143). In both, the String variable letters starts empty. Each key typed is added to the end of the string. The first example displays the string as it grows as keys are pressed and removes letters from the end when backspace is pressed. The second example builds on the first—when the Return or Enter key is pressed, the program checks if the word “gray” or “black” was typed. If one of these words was input, the background changes to that value. -

    -
    + + +

    Typing

    + +

    + Drawing letters to the screen becomes more engaging when used in combination with the keyboard. The keyPressed() event function introduced on page 97 can be used to record each letter as it is typed. The following two examples use this function to read and analyze input from the keyboard by using the String methods introduced in the Text chapter (p. 143). In both, the String variable letters starts empty. Each key typed is added to the end of the string. The first example displays the string as it grows as keys are pressed and removes letters from the end when backspace is pressed. The second example builds on the first—when the Return or Enter key is pressed, the program checks if the word “gray” or “black” was typed. If one of these words was input, the background changes to that value. +

    + + + @@ -529,8 +555,11 @@

    Typing

    - - +
    + +
    + + - - - +
    @@ -575,19 +604,21 @@

    Typing

    -

    -Many people spend hours a day inputting letters into computers, but this action is very constrained. What features could be added to a text editor to make it more responsive to the typist? For example, the speed of typing could decrease the size of the letters, or a long pause in typing could add many spaces, mimicking a person’s pause while speaking. What if the keyboard could register how hard a person is typing (the way a piano plays a soft note when a key is pressed gently) and could automatically assign attributes such as italics for soft presses and bold for forceful presses? These analogies suggest how conservatively current software treats typography and typing. -
    -
    -Many artists and designers are fascinated with type and have created unique ways of exploring letterforms with the mouse, keyboard, and more exotic input devices. A minimal yet engaging example is John Maeda’s Type, Tap, Write software, created in 1998 as homage to manual typewriters. This software uses the keyboard as the input to a black-and-white screen representation of a keyboard. Pressing the number keys cause the software to cycle through different modes, each revealing a playful interpretation of keyboard data. In Jeffrey Shaw and Dirk Groeneveld’s The Legible City (1989–91), buildings are replaced with three-dimensional letters to create a city of typography that conforms to the streets of a real place. In the Manhattan version, for instance, texts from the mayor, a taxi driver, and Frank Lloyd Wright comprise the city. The image is presented on a projection screen, and the user navigates by pedaling and steering a stationary bicycle situated in front of the projected image. Projects such as these demonstrate that software presents an extraordinary opportunity to extend the way we read and write. -
    -
    -Typographic elements can be assigned behaviors that define a personality in relation to the mouse or keyboard. A word can express aggression by moving quickly toward the mouse, or moving away slowly can express timidity. The following examples demonstrate basic applications of this area. In the first, the word avoid stays away from the mouse because its position is set to the inverse of the cursor position. In the second, the word tickle jitters when the cursor hovers over its position. -

    -
    + +

    + Many people spend hours a day inputting letters into computers, but this action is very constrained. What features could be added to a text editor to make it more responsive to the typist? For example, the speed of typing could decrease the size of the letters, or a long pause in typing could add many spaces, mimicking a person’s pause while speaking. What if the keyboard could register how hard a person is typing (the way a piano plays a soft note when a key is pressed gently) and could automatically assign attributes such as italics for soft presses and bold for forceful presses? These analogies suggest how conservatively current software treats typography and typing. +

    + +

    + Many artists and designers are fascinated with type and have created unique ways of exploring letterforms with the mouse, keyboard, and more exotic input devices. A minimal yet engaging example is John Maeda’s Type, Tap, Write software, created in 1998 as homage to manual typewriters. This software uses the keyboard as the input to a black-and-white screen representation of a keyboard. Pressing the number keys cause the software to cycle through different modes, each revealing a playful interpretation of keyboard data. In Jeffrey Shaw and Dirk Groeneveld’s The Legible City (1989–91), buildings are replaced with three-dimensional letters to create a city of typography that conforms to the streets of a real place. In the Manhattan version, for instance, texts from the mayor, a taxi driver, and Frank Lloyd Wright comprise the city. The image is presented on a projection screen, and the user navigates by pedaling and steering a stationary bicycle situated in front of the projected image. Projects such as these demonstrate that software presents an extraordinary opportunity to extend the way we read and write. +

    + +

    + Typographic elements can be assigned behaviors that define a personality in relation to the mouse or keyboard. A word can express aggression by moving quickly toward the mouse, or moving away slowly can express timidity. The following examples demonstrate basic applications of this area. In the first, the word avoid stays away from the mouse because its position is set to the inverse of the cursor position. In the second, the word tickle jitters when the cursor hovers over its position. +

    + + - +
    @@ -613,9 +644,11 @@

    Typing

    -
    - -
    @@ -655,15 +688,17 @@

    Typing

    -

    -
    + +

    + +

    Notes

    -1. Ellen Lupton, Thinking with Type: A Critical Guide for Designers, Writers, Editors, & Students (Princeton Architectural Press, 2004), p. 29. -

    +
      +
    1. Ellen Lupton, Thinking with Type: A Critical Guide for Designers, Writers, Editors, & Students (Princeton Architectural Press, 2004), p. 29.
    2. +
    + +
    - \ No newline at end of file diff --git a/content/static/tutorials/video/imgs/fig_16_01_capture.png b/content/static/tutorials/video/imgs/fig_16_01_capture.png new file mode 100755 index 000000000..09bfc22ce Binary files /dev/null and b/content/static/tutorials/video/imgs/fig_16_01_capture.png differ diff --git a/content/static/tutorials/video/imgs/fig_16_02_tintvideo.png b/content/static/tutorials/video/imgs/fig_16_02_tintvideo.png new file mode 100755 index 000000000..aa8c0cc35 Binary files /dev/null and b/content/static/tutorials/video/imgs/fig_16_02_tintvideo.png differ diff --git a/content/static/tutorials/video/imgs/fig_16_03_flashlight.png b/content/static/tutorials/video/imgs/fig_16_03_flashlight.png new file mode 100755 index 000000000..a395fa12c Binary files /dev/null and b/content/static/tutorials/video/imgs/fig_16_03_flashlight.png differ diff --git a/content/static/tutorials/video/imgs/fig_16_04_blankgrid.png b/content/static/tutorials/video/imgs/fig_16_04_blankgrid.png new file mode 100755 index 000000000..75c47bd1d Binary files /dev/null and b/content/static/tutorials/video/imgs/fig_16_04_blankgrid.png differ diff --git a/content/static/tutorials/video/imgs/fig_16_05_pixelated.png b/content/static/tutorials/video/imgs/fig_16_05_pixelated.png new file mode 100755 index 000000000..6e9c6b356 Binary files /dev/null and b/content/static/tutorials/video/imgs/fig_16_05_pixelated.png differ diff --git a/content/static/tutorials/video/imgs/fig_16_06_mirror.png b/content/static/tutorials/video/imgs/fig_16_06_mirror.png new file mode 100755 index 000000000..3af852ae3 Binary files /dev/null and b/content/static/tutorials/video/imgs/fig_16_06_mirror.png differ diff --git a/content/static/tutorials/video/imgs/fig_16_07_blank_scribble.png b/content/static/tutorials/video/imgs/fig_16_07_blank_scribble.png new file mode 100755 index 000000000..72fc30783 Binary files /dev/null and b/content/static/tutorials/video/imgs/fig_16_07_blank_scribble.png differ diff --git a/content/static/tutorials/video/imgs/fig_16_08_scribblermirror.png b/content/static/tutorials/video/imgs/fig_16_08_scribblermirror.png new file mode 100755 index 000000000..ecc48f703 Binary files /dev/null and b/content/static/tutorials/video/imgs/fig_16_08_scribblermirror.png differ diff --git a/content/static/tutorials/video/index.html b/content/static/tutorials/video/index.html new file mode 100644 index 000000000..22ccf759b --- /dev/null +++ b/content/static/tutorials/video/index.html @@ -0,0 +1,575 @@ + + + + +
    + +

    + This tutorial is from the book Learning Processing, 2nd Edition by Daniel Shiffman, published by Morgan Kaufmann, © 2015 Elsevier Inc. All rights reserved. If you see any errors or have comments, please let us know. +

    + +

    Video

    +

    Daniel Shiffman

    + +

    Live Video

    + +

    +Now that you’ve explored static images in Processing, you are ready to move on to moving images, specifically from a live camera (and later, from a recorded movie). I’ll begin by walking through the basic steps of importing the video library and using the Capture class to display live video. +

    + +Step 1. Import the Processing video library. +

    +Although the video library is developed and maintained by the Processing Foundation, due to its size, it must still be downloaded separately through the contributions manager. The Video and Sound libraries need to be downloaded through the Library Manager. Select "Add Library..." from the "Import Library..." submenu within the Sketch menu. +

    +Once you’ve got the library installed, the next step is to import the library in your code. This is done by selecting the menu option Sketch → Import Library → Video, or by typing the following line of code (which should go at the very top of your sketch): +

    +import processing.video.*;
    +
    +Using the “Import Library” menu option does nothing other than automatically insert that line into your code, so manual typing is entirely equivalent. +

    + +Step 2. Declare a Capture object. +

    +You’ve recently seen how to create objects from classes built into the Processing language such as PShape and PImage. Both of these classes, it should be noted, are part of the processing.core library and, therefore,no import statement were required. The processing.video library has two useful classes inside of it — Capture, for live video, and Movie, for recorded video. In this step, I’ll be declaring a Capture object.
    +
    +Capture video;
    +
    + +Step 3. Initialize the Capture object. +

    +The Capture object “video” is just like any other object — to construct an object, you use the new operator followed by the constructor. With a Capture object, this code typically appears in setup().
    +
    +video = new Capture();
    +
    +The above line of code is missing the appropriate arguments for the constructor. Remember, this is not a class you wrote yourself so there is no way to know what is required between the parentheses without consulting the online reference. +

    +The reference will show there are several ways to call the Capture constructor. A typical way to call the constructor is with three arguments:
    +
    +void setup() {  
    +  video = new Capture(this, 320, 240);
    +}
    +
    +Let’s walk through the arguments used in the Capture constructor. + +
      +
    • this: If you’re confused by what this means, you are not alone. Technically speaking, this refers to the instance of a class in which the word this appears. Unfortunately, such a definition is likely to induce head spinning. A nicer way to think of it is as a self-referential statement. After all, what if you needed to refer to your Processing program within your own code? You might try to say “me” or “I.” Well, these words are not available in Java, so instead you say this. The reason you pass this into the Capture object is you are telling it: “Hey listen, I want to do video capture and when the camera has a new image I want you to alert this sketch.”
    • +
    • 320: Fortunately, the first argument, this, is the only confusing one. 320 refers to the width of the video captured by the camera.
    • +
    • 240: The height of the video.
    • +
    + +There are some cases, however, where the above will not do. For example, what if you have multiple cameras attached to your computer? How do you select the one you want to capture? In addition, in some rare cases, you might also want to specify a frame rate from the camera. For these cases, Processing will give you a list of all possible camera configurations via Capture.list(). You can display these in your message console, for example, by saying:
    +
    +printArray(Capture.list());
    +
    +You can use the text of these configurations to create a Capture object. On a Mac with a built-in camera,for example, this might look like:
    +
    +video = new Capture(this, "name=FaceTime HD Camera (Built-in),size=320x240,fps=30");
    +
    +Capture.list() actually gives you an array so you can also simply refer to the index of the configuration you want.
    +
    +video = new Capture(this, Capture.list()[0]);
    +
    + +Step 4. Start the capture process. +

    +Once the camera is ready, it’s up to you to tell Processing to start capturing images.
    +
    +void setup() {  
    +  video = new Capture(this, 320, 240);  
    +  video.start();
    +}
    +
    +In almost every case you want to begin capturing right in setup(). Nevertheless, start() is its own method, and you do have the option of, say, not starting capturing until some other time (such as when a button is pressed, etc.) +

    + +Step 5. Read the image from the camera. +

    +There are two strategies for reading frames from the camera. I will briefly look at both and choose one forthe remainder of the examples in this chapter. Both strategies, however, operate under the same fundamental principle: I only want to read an image from the camera when a new frame is available to be read. + +

    +In order to check if an image is available, you use the function available(), which returns true or false depending on whether something is there. If it is there, the function read() is called and the frame from the camera is read into memory. You can do this over and over again in the draw() loop, always checking to see if a new image is free to be read.
    +
    +void draw() {  
    +  if (video.available()) {    
    +    video.read();  
    +  }
    +}
    +
    +The second strategy, the “event” approach, requires a function that executes any time a certain event — in this case a camera event — occurs. The function mousePressed() is executed whenever the mouse is pressed. With video, you have the option to implement the function captureEvent(), which is invoked any time a capture event occurs, that is, a new frame is available from the camera. These event functions (mousePressed(), keyPressed(), captureEvent(), etc.) aresometimes referred to as a “callback.” And as a brief aside, if you’re following closely, this is where this fits in. The Capture object, video, knows to notify this sketch by invoking captureEvent() because you passed it a reference to this sketch when creating the Capture object video. +

    +captureEvent() is a function and therefore needs to live in its own block, outside of setup() and draw().
    +
    +void captureEvent(Capture video) {
    +  video.read();
    +}
    +
    +You might notice something odd about captureEvent(). It includes an argument of type Capture in its definition. This might seem redundant to you; after all, in this example I already have a global variable video. Nevertheless in the case where you might have more than one capture device, the same event function can be used for both and the video library will make sure that the correct Capture object is passed in to captureEvent(). +

    +To summarize, I want to call the function read() whenever there is something to read, and I can do so by either checking manually using available() within draw() or allowing a callback to handle it for you — captureEvent(). This allows sketches to operate more efficientlyby separating out the logic for reading from the camera from the main animation loop. +

    +Step 6. Display the video image. +

    +This is, without a doubt, the easiest part. You can think of a Capture object as a PImage that changes over time, and, in fact, a Capture object can be utilized in an identical manner as a PImage object. +

    + +
    +image(video, 0, 0);
    +
    +All of this is put together in the following code:
    +
    +// Step 1. Import the video library.
    +import processing.video.*;
    +
    +//Step 2. Declare a capture object.
    +Capture video;
    +
    +// Step 5. Read from the camera when a new image is available!
    +void captureEvent(Capture video) {
    +  video.read();
    +}
    +
    +void setup() {  
    +  size(320, 240);
    +  
    +  // Step 3. Initialize Capture object.
    +  video = new Capture(this, 320, 240);
    +  
    +  // Step 4. Start the capturing process.
    +  video.start();
    +}
    +
    +// Step 6. Display the image.
    +void draw() {  
    +image(video, 0, 0);
    +}
    +
    +Again, anything you can do with a PImage (resize, tint, move, etc.) you can do with a Capture object. As long as you read() from that object, the video image will update as you manipulate it. See the following example: +

    + +
    +import processing.video.*;
    +
    +Capture video;
    +
    +void setup() {
    +  size(320, 240);  
    +  video = new Capture(this, 320, 240); 
    +  video.start();
    +}
    +
    +void captureEvent(Capture video) {  
    +  video.read();
    +}
    +
    +void draw() {  
    +  background(255);  
    +  tint(mouseX, mouseY, 255);  
    +  translate(width/2, height/2);  
    +  imageMode(CENTER);  
    +  rotate(PI/4);  
    +  image(video, 0, 0, mouseX, mouseY);
    +}
    +
    +Note that a video image can be tinted just like a PImage. It can also be moved, rotated, and sized just like a PImage. Following is the “adjusting brightness” example with a video image: +

    + +
    +// Step 1. Import the video library
    +import processing.video.*;
    +
    +// Step 2. Declare a Capture object
    +Capture video;
    +
    +void setup() {  
    +  size(320, 240);  
    +  
    +  // Step 3. Initialize Capture object via Constructor
    +  video = new Capture(this, 320, 240);  
    +  video.start();
    +}
    +  
    +// An event for when a new frame is available
    +void captureEvent(Capture video) {  
    +  // Step 4. Read the image from the camera.  
    +  video.read();
    +}
    +void draw() {
    +  loadPixels();
    +  video.loadPixels();  
    +
    +  for (int x = 0; x < video.width; x++) {    
    +    for (int y = 0; y < video.height; y++) {      
    +      // Calculate the 1D location from a 2D grid
    +      int loc = x + y * video.width;      
    +    
    +      // Get the red, green, blue values from a pixel      
    +      float r = red  (video.pixels[loc]);      
    +      float g = green(video.pixels[loc]);      
    +      float b = blue (video.pixels[loc]);      
    +      
    +      // Calculate an amount to change brightness based on proximity to the mouse      
    +      float d = dist(x, y, mouseX, mouseY);      
    +      float adjustbrightness = map(d, 0, 100, 4, 0);      
    +      r *= adjustbrightness;      
    +      g *= adjustbrightness;      
    +      b *= adjustbrightness;      
    +      
    +      // Constrain RGB to make sure they are within 0-255 color range      
    +      r = constrain(r, 0, 255);      
    +      g = constrain(g, 0, 255);      
    +      b = constrain(b, 0, 255);      
    +    
    +      // Make a new color and set pixel in the window      
    +      color c = color(r, g, b);      
    +      pixels[loc] = c;    
    +    }  
    +  }  
    +	
    +  updatePixels();
    +}
    +
    +

    + +

    Recorded video

    +

    +Displaying recorded video follows much of the same structure as live video. Processing’s video library accepts most video file formats; for specifics, visit the Movie reference.

    + +Step 1. Instead of a Capture object, declare a Movie object. +

    +Movie movie;
    +
    + +Step 2. Initialize Movie object.
    +
    +movie = new Movie(this, "testmovie.mov");
    +
    +The only necessary arguments are this and the movie’s filename enclosed in quotes. The movie file should be stored in the sketch’s data directory. + +

    +Step 3. Start movie playing. +

    +There are two options, play(), which plays the movie once, or loop(), which loops it continuously.
    +
    +movie.loop();
    +
    + +Step 4. Read frame from movie. +

    +Again, this is identical to capture. You can either check to see if a new frame is available, or use a callback function.
    +
    +void draw() {  
    +  if (movie.available()) {    
    +    movie.read();  
    +  }
    +}
    +
    +Or:
    +
    +void movieEvent(Movie movie) {  
    +  movie.read();
    +}
    +
    + +Step 5. Display the movie.
    +
    +image(movie, 0, 0);
    +
    +The following code shows the program all together:
    +
    +import processing.video.*; 
    +
    +// Step 1. Declare a Movie object.
    +Movie movie; 
    +
    +void setup() {  
    +  size(320, 240);  
    +
    +  // Step 2. Initialize Movie object. The file "testmovie.mov" should live in the data folder.
    +  movie = new Movie(this, "testmovie.mov");  
    +
    +  // Step 3. Start playing movie. To play just once play() can be used instead.
    +  movie.loop();
    +}
    +
    +// Step 4. Read new frames from the movie.
    +void movieEvent(Movie movie) {  
    +  movie.read();
    +}
    +
    +// Step 5. Display movie.
    +void draw() {
    +  image(movie, 0, 0);
    +}
    +
    + +Although Processing is by no means the most sophisticated environment for displaying and manipulating recorded video, there are some more advanced features available in the video library. There are functions for obtaining the duration (length measured in seconds) of a video, for speeding it up and slowing it down, and for jumping to a specific point in the video (among others). If you find that performance is sluggish and the video playback is choppy, I would suggest trying the P2D or P3D renderers. +

    +Following is an example that makes use of jump() (jump to a specific point in the video) and duration() (returns the length of movie in seconds). In this example, if mouseX equals 0, the video jumps to the beginning. If mouseX equals width, it jumps to the end. Any other value is in between. The jump() function allows you to jump immediately to a point of time within the video. duration() returns the total length of the movie in seconds.
    + +
    +import processing.video.*;
    +
    +Movie movie;
    +
    +void setup() {
    +  size(200, 200);  
    +  background(0);  
    +  movie = new Movie(this, "testmovie.mov");
    +}
    +
    +void movieEvent(Movie movie) {  
    +  movie.read();
    +}
    +
    +void draw() {  
    +  // Ratio of mouse X over width  
    +  float ratio = mouseX / (float) width;  
    +  
    +  movie.jump(ratio * movie.duration());   
    +  
    +  image(movie, 0, 0);
    +}
    +
    +

    + +

    Software mirrors

    +

    +With small video cameras attached to more and more personal computers, developing software that manipulates an image in real-time is becoming increasingly popular. These types of applications are sometimes referred to as “mirrors,” as they provide a digital reflection of a viewer’s image. Processing’s extensive library of functions for graphics and its ability to capture from a camera in real-time make it an excellent environment for prototyping and experimenting with software mirrors. +

    +You can apply basic image processing techniques to video images, reading and replacing the pixels one by one. Taking this idea one step further, you can read the pixels and apply the colors to shapes drawn onscreen. +

    +I will begin with an example that captures a video at 80 × 60 pixels and renders it on a 640 × 480 window. For each pixel in the video, I will draw a rectangle eight pixels wide and eight pixels tall. +

    +Let’s first write the program that displays the grid of rectangles. In the following example, the videoScale variable stores the ratio of the window’s pixel size to the grid’s size and for every column and row, a rectangle is drawn at an (x,y) location scaled and sized by videoScale. +

    + +

    +// Size of each cell in the grid, ratio of window size to video size
    +int videoScale = 8; 
    +// Number of columns and rows in the system
    +int cols, rows;
    +
    +void setup() {  
    +  size(640, 480);  
    +  // Initialize columns and rows  
    +  cols = width/videoScale;  
    +  rows = height/videoScale;
    +}
    +
    +void draw() {  
    +  // Begin loop for columns  
    +  for (int i = 0; i < cols; i++) {    
    +    // Begin loop for rows    
    +    for (int j = 0; j < rows; j++) {      
    +      // Scaling up to draw a rectangle at (x,y)      
    +      int x = i*videoScale;      
    +      int y = j*videoScale;      
    +      fill(255);      
    +      stroke(0);      
    +      rect(x, y, videoScale, videoScale);     
    +    }  
    +  }
    +}
    +
    +Knowing that I want to have squares eight pixels wide by eight pixels high, I can calculate the number of columns as the width divided by eight and the number of rows as the height divided by eight. +
      +
    • 640/8 = 80 columns
    • +
    • 480/8 = 60 rows
    • +
    +I can now capture a video image that is 80 × 60. This is useful because capturing a 640 × 480 video from a camera can be slow compared to 80 × 60. I only want to capture the color information at the resolution required for the sketch. +

    + +

    +For every square at column i and row j, I look up the color at pixel (i, j) in the video image and color it accordingly. See the following example with the new parts in bold:
    +
    +import processing.video.*;
    +
    +// Size of each cell in the grid, ratio of window size to video size
    +int videoScale = 8;
    +// Number of columns and rows in the system
    +int cols, rows;
    +// Variable to hold onto Capture object
    +Capture video;
    +
    +void setup() {  
    +  size(640, 480);  
    +  // Initialize columns and rows  
    +  cols = width/videoScale;  
    +  rows = height/videoScale;  
    +  background(0);
    +  video = new Capture(this, cols, rows);
    +  video.start()
    +}
    +
    +// Read image from the camera
    +void captureEvent(Capture video) {  
    +  video.read();
    +}
    +
    +void draw() {
    +  video.loadPixels();  
    +  // Begin loop for columns  
    +  for (int i = 0; i < cols; i++) {    
    +    // Begin loop for rows    
    +    for (int j = 0; j < rows; j++) {      
    +      // Where are you, pixel-wise?      
    +      int x = i*videoScale;      
    +      int y = j*videoScale;
    +      color c = video.pixels[i + j*video.width];
    +      fill(c);   
    +      stroke(0);      
    +      rect(x, y, videoScale, videoScale);    
    +    }  
    +  }
    +}
    +
    +As you can see, expanding the simple grid system to include colors from video only requires a few additions. I have to declare and initialize the Capture object, read from it, and pull colors from the pixel array.

    + +Less literal mappings of pixel colors to shapes in the grid can also be applied. In the following example, only the colors black and white are used. Squares are larger where brighter pixels in the video appear, and smaller for darker pixels.
    +
    +// Each pixel from the video source is drawn as
    +// a rectangle with size based on brightness.
    +
    +import processing.video.*;
    +// Size of each cell in the grid
    +int videoScale = 10;
    +// Number of columns and rows in the system
    +int cols, rows;
    +// Variable for capture device
    +Capture video;
    +
    +void setup() { 
    +  size(640, 480);  
    +  // Initialize columns and rows  
    +  cols = width / videoScale;  
    +  rows = height / videoScale;  
    +  // Construct the Capture object  
    +  video = new Capture(this, cols, rows);  
    +  video.start();
    +}
    +
    +void captureEvent(Capture video) {  
    +  video.read();
    +}
    +
    +void draw() {  
    +  background(0);
    +  video.loadPixels();  
    +  // Begin loop for columns  
    +  for (int i = 0; i < cols; i++) {    
    +    // Begin loop for rows    
    +    for (int j = 0; j < rows; j++) {      
    +      // Where are you, pixel-wise?      
    +      int x = i*videoScale;      
    +      int y = j*videoScale;    
    +      
    +      // Reverse the column to mirro the image.
    +      int loc = (video.width - i - 1) + j * video.width;       
    +      
    +      color c = video.pixels[loc];
    +      // A rectangle's size is calculated as a function of the pixel’s brightness. 
    +      // A bright pixel is a large rectangle, and a dark pixel is a small one.
    +      float sz = (brightness(c)/255) * videoScale;       
    +      
    +      rectMode(CENTER);      
    +      fill(255);      
    +      noStroke();      
    +      rect(x + videoScale/2, y + videoScale/2, sz, sz);    
    +    }  
    +  }
    +}  
    +
    +It’s often useful to think of developing software mirrors in two steps. This will also help you think beyondthe more obvious mapping of pixels to shapes on a grid. +

    +Step 1. Develop an interesting pattern that covers an entire window. +

    +Step 2. Use a video’s pixels as a look-up table for coloring that pattern. +

    +Say for Step 1, I write a program that scribbles a random line around the window. Here is my algorithm, written in pseudocode. +
      +
    • Start with an (x,y) position at the center of the screen.
    • +
    • Repeat forever the following:
      + —Pick a new (x,y), staying within the window.
      + —Draw a line from the old (x,y) to the new (x,y).
      + —Save the new (x,y).
    • +
    +
    + +
    +// Two global variables
    +float x;
    +float y;
    +
    +void setup() {  
    +  size(320, 240);  
    +  background(255);  
    +  // Start x and y in the center  
    +  x = width/2;  
    +  y = height/2;
    +}
    +
    +void draw() {  
    +  float newx = constrain(x + random(-20, 20), 0, width);   
    +  float newy = constrain(y + random(-20, 20), 0, height);  
    +
    +  // Line from (x,y) to the (newx,newy)  
    +  stroke(0);  
    +  strokeWeight(4);  
    +  line(x, y, newx, newy); 
    +
    +  x = newx;   
    +  y = newy;
    +}
    +
    +Now that I have finished the pattern generating sketch, I can change stroke() to set a color according to the video image. Note again the new lines of code added in bold in the following code: +

    + +
    +import processing.video.*;
    +// Two global variables
    +float x;
    +float y;
    +
    +// Variable to hold onto Capture object.
    +Capture video;
    +
    +void setup() {  
    +  size(320, 240);  
    +  background(255);  
    +  // Start x and y in the center  
    +  x = width/2;  
    +  y = height/2;
    +  // Start the capture process
    +  video = new Capture(this, width, height);  
    +  video.start();
    +}
    +
    +void captureEvent(Capture video) {  
    +  // Read image from the camera
    +  video.read();
    +}
    +
    +void draw() {
    +  video.loadPixels();
    +  float newx = constrain(x + random(-20, 20), 0, width);   
    +  float newy = constrain(y + random(-20, 20), 0, height-1);
    +  
    +  // Find the midpoint of the line
    +  int midx = int((newx + x) / 2);
    +  int midy = int((newy + y) / 2);
    +  // Pick the color from the video, reversing x
    +  color c = video.pixels[(width-1-midx) + midy*video.width];
    +  
    +  // Draw a line from (x,y) to (newx,newy)  
    +  stroke(c);  
    +  strokeWeight(4);  
    +  line(x, y, newx, newy);  
    +  
    +  // Save (newx,newy) in (x,y)  
    +  x = newx;  
    +  y = newy;
    +}
    +
    +

    + +
    \ No newline at end of file diff --git a/contrib_generate/README.md b/contrib_generate/README.md index 0f111edc1..a4b6fc811 100644 --- a/contrib_generate/README.md +++ b/contrib_generate/README.md @@ -5,6 +5,16 @@ 1. Add the URL in the right category, prefixed by the next ID number. 1. Increment the value of _Next ID_ at the top. +###`broken.conf` +* Contains IDs of broken contributions. These will still appear in the PDE but will be disabled (greyed out). +* Edited by a human. +* Read by `build_listing.py`. + +###`skipped.conf` +* Contains IDs of contributions to skip. These will not appear in the PDE. This list currently holds 2.x entries that have a 3.x counterpart, so that they are not listed twice. +* Edited by a human. +* Read by `build_listing.py`. + ###`build_listing.py` * Reads `sources.conf` and writes `contribs.txt` * Use it by running the following in the command line: diff --git a/contrib_generate/broken.conf b/contrib_generate/broken.conf new file mode 100644 index 000000000..39f170b32 --- /dev/null +++ b/contrib_generate/broken.conf @@ -0,0 +1,30 @@ +008 +016 +020 +021 +026 +028 +031 +033 +047 +050 +068 +070 +083 +085 +087 +089 +096 +098 +099 +100 +110 +112 +114 +116 +120 +123 +129 +136 +141 +144 diff --git a/contrib_generate/build_listing.py b/contrib_generate/build_listing.py index 0aabd6389..2c4a43b22 100755 --- a/contrib_generate/build_listing.py +++ b/contrib_generate/build_listing.py @@ -139,7 +139,7 @@ def get_lib_locations(f): contents = line.split('\\') if len(contents) != 2: - print 'Lines for contributions must be of the form "[Contribution ID] : [Contribution URL]"' + print 'Lines for contributions must be of the form "[Contribution ID] \ [Contribution URL]"' print contents continue @@ -165,11 +165,11 @@ def missing_key(exports): script = argv conf = 'sources.conf' fileout = 'contribs.txt' - minrev = 0 + minrev = 228 maxrev = 0 elif len(argv) == 3: script, conf, fileout = argv - minrev = 0 + minrev = 228 maxrev = 0 elif len(argv) == 5: script, conf, fileout, minrev, maxrev = argv @@ -184,9 +184,12 @@ def missing_key(exports): print "----- " + strftime("%a %d %b %Y %H:%M:%S", localtime()) + " -----" f = open(conf) - urls_by_category = get_lib_locations(f); + urls_by_category = get_lib_locations(f) f.close() + broken_ids = [line.rstrip('\n') for line in open('broken.conf')] + skipped_ids = [line.rstrip('\n') for line in open('skipped.conf')] + contribs_by_id = {} for cat in urls_by_category: @@ -194,25 +197,38 @@ def missing_key(exports): for contrib in contribs: software_type, contrib_id, prop_url = contrib + + if (contrib_id in skipped_ids): + print "Skipping " + contrib_id + continue + download_url = prop_url[:prop_url.rfind('.')] + '.zip' try: exports = read_exports(urlopen(prop_url)) exports['id'] = contrib_id - # overwrite the category with what was in the .conf file - exports['categories'] = cat - exports['type'] = software_type + # overwrite the category with what was in the .conf file + exports['categories'] = cat + # set default compatible strings if none found if (not 'minRevision' in exports or exports['minRevision'] == ''): exports['minRevision'] = '0' - if (not 'maxRevision' in exports or exports['maxRevision'] == ''): - exports['maxRevision'] = '0' + # if (not 'maxRevision' in exports or exports['maxRevision'] == ''): + # if (contrib_id in broken_ids): + # exports['maxRevision'] = '228' + # else: + # exports['maxRevision'] = '0' + if (contrib_id in broken_ids): + exports['maxRevision'] = '228' + else: + if (not 'maxRevision' in exports or exports['maxRevision'] == ''): + exports['maxRevision'] = '0' key = missing_key(exports) if key: - print 'Error reading', prop_url + print 'Error missing key', prop_url print " No value for '%s'. Maybe it's a 404 page" % key continue # if no download is explicitly provided, use the default download url diff --git a/contrib_generate/skipped.conf b/contrib_generate/skipped.conf new file mode 100644 index 000000000..fb4891e7a --- /dev/null +++ b/contrib_generate/skipped.conf @@ -0,0 +1,7 @@ +007 +039 +050 +051 +052 +142 +143 \ No newline at end of file diff --git a/contrib_generate/sources.conf b/contrib_generate/sources.conf index e62a151f0..8fc82f839 100644 --- a/contrib_generate/sources.conf +++ b/contrib_generate/sources.conf @@ -1,10 +1,10 @@ -# Next ID: 162 +# Next ID: 273 # Increment after assigning ID to new contribution -# Skipped IDs: 039 041 046 056 079 080 084 085 086 [Library : 3D] -001 \ http://otrolado.info/proscene.txt -009 \ http://hemesh.wblut.com/hemesh-latest.txt +001 \ https://github.com/remixlab/proscene/releases/download/latest/proscene.txt +006 \ http://www.die-seite.ch/colladaloader/colladaLoader.txt +# 009 \ http://www.wblut.com/hemesh/hemesh.txt 017 \ http://mrfeinberg.com/peasycam/peasycam.txt # 022 \ http://fluidforms.eu/processing/fluid-forms-libs/download/FluidFormsLibs.txt 032 \ http://n.clavaud.free.fr/processing/library/picking/download/Picking.txt @@ -12,96 +12,174 @@ 037 \ http://mrfeinberg.com/patchy/patchy.txt 043 \ http://saitoobjloader.googlecode.com/files/OBJLoader.txt 050 \ http://www.lagers.org.uk/processing/shapes3d/Shapes3D.txt +079 \ http://www.lagers.org.uk/processing3/shapes3d/Shapes3D.txt # 078 \ http://s373.net/code/marchingcubes/download/marchingcubes.txt #404# 117 \ http://ccl.angusforbes.com/stereo.txt 120 \ https://simple-openni.googlecode.com/svn/trunk/SimpleOpenNI-2.0/dist/all/SimpleOpenNI.txt 123 \ http://igeo.jp/igeo.txt -130 \ http://interfaze.info/libraries/planetarium/download/planetarium.txt +130 \ https://github.com/codeanticode/planetarium/releases/download/latest/planetarium.txt +174 \ https://ixora.io/downloads/camera3D/Camera3D.txt +195 \ http://culebra.technology/culebra.txt +196 \ https://github.com/jrc03c/queasycam/releases/download/latest/queasycam.txt +215 \ http://maxlfarrell.gitlab.io/extruder/extruder.txt +244 \ http://giftedapprentice.com/ewbIK/ewbIK.txt +245 \ https://github.com/VisualComputing/nub/releases/download/latest/nub.txt +252 \ http://www.bdhont.net/lunar.txt [Library : Animation] +001 \ https://github.com/remixlab/proscene/releases/download/latest/proscene.txt 003 \ http://www.looksgood.de/libraries/Ani/Ani-latest.txt 030 \ http://libraries.seltar.org/motion/motion.txt 033 \ http://ekeneijeoma.com/processing/ijeomamotion/download/ijeomamotion.txt 062 \ http://www.lagers.org.uk/processing/sprites/Sprites.txt 083 \ http://rdlester.github.com/hermes/downloads/hermes.txt 095 \ https://dl.dropbox.com/u/87680069/frames.txt +219 \ https://teddavis.org/xyscope/download/XYscope.txt +231 \ http://objectstothinkwith.com/tracer/tracer.txt +244 \ http://giftedapprentice.com/ewbIK/ewbIK.txt +245 \ https://github.com/VisualComputing/nub/releases/download/latest/nub.txt +253 \ https://ztdp.ca/projects/school/Green/Green.txt +272 \ https://fox-gieg.com/patches/processing/libraries/tiltProcessing/tiltProcessing.txt [Library : Compilation] 004 \ http://staff.city.ac.uk/~jwo/giCentre/utils/gicentreUtils.txt -007 \ http://www.generative-gestaltung.de/downloads/GenerativeDesign.txt +007 \ https://github.com/generative-design/GenerativeDesignLibrary2/releases/download/latest/generativedesign.txt 083 \ http://rdlester.github.com/hermes/downloads/hermes.txt +056 \ https://github.com/generative-design/GenerativeDesignLibrary3/releases/download/latest/generativedesign.txt +200 \ http://shiffman.net/p5/libraries/processing3/toxiclibs/toxiclibs.txt [Library : Data] 008 \ http://www.saint-clair.net/download/gml4u/GML4U.txt -011 \ http://www.shiffman.net/p5/libraries/sftp/sftp.txt +011 \ https://github.com/shiffman/SFTP-Processing/releases/download/latest/sftp.txt 012 \ http://www.shiffman.net/p5/libraries/qrcode/qrcodeprocessing.txt 040 \ http://r-s-g.org/carnivore/download/carnivore_p5lib.txt # 042 \ http://wyldco.com/romefeeder/download/romefeeder.txt 044 \ http://www.reades.com/MapThing/MapThing.txt -053 \ http://www.onformative.com/uploads/googleWeather/YahooWeather.txt +#053 \ http://mrzl.net/yahooweather/YahooWeather.txt #404# 065 \ http://blog.stainpixels.com/public/share.txt 072 \ http://sojamo.de/libraries/oscp5/oscP5.txt 073 \ http://ubaa.net/shared/processing/udp/udp.txt +084 \ http://iddi.github.io/oocsi-processing/oocsi.txt 089 \ https://raw.githubusercontent.com/nok/soundcloud-processing/master/download/SoundCloud.txt -#404# 103 \ http://hamzeen.github.io/ShortMessage/ShortMessage.txt +103 \ http://hamzeen.github.io/ShortMessage/ShortMessage.txt 110 \ https://raw.github.com/fjenett/xlsreader-library-processing/latest/release/XlsReader.txt -111 \ https://raw.github.com/fjenett/sql-library-processing/latest/release/BezierSQLib.txt +111 \ https://github.com/benfry/sql-library-processing/raw/master/release/BezierSQLib.txt 115 \ http://s176381904.onlinehome.fr/processing/SignalFilter/download/signalFilter.txt #404# 128 \ http://dasmithii.com/GNet.txt 133 \ https://raw.githubusercontent.com/nok/redis-processing/master/download/Redis.txt 135 \ https://temboo.com/files/temboo-processing.txt -137 \ http://shiffman.net/p5/libraries/httprequests_processing/httprequests_processing.txt +137 \ https://github.com/runemadsen/HTTP-Requests-for-Processing/releases/download/latest/httprequests_processing.txt 144 \ http://unfoldingmaps.org/Unfolding.txt +175 \ https://github.com/alexandrainst/processing_websockets/releases/download/latest/webSockets.txt +183 \ https://github.com/onlylemi/processing-android-capture/releases/download/latest/AndroidCaptureForProcessing.txt +198 \ http://cagewebdev.com/zxing4p/zxing4p3.txt +203 \ https://github.com/OliverColeman/hivis/releases/download/latest/HiVis.txt +206 \ https://ap-sync.github.io/libs/AP_sync_processing/APsync.txt +208 \ https://github.com/gohai/processing-simpletweet/releases/download/latest/processing-simpletweet.txt +229 \ https://github.com/Shinhoo/Wooting-Keyboard-Library/releases/download/lastest/WootingKeyboard.txt +230 \ https://github.com/cansik/artnet4j/releases/download/latest/artnet4j.txt +241 \ http://agathelenclen.fr/downloads/Squarify.txt +248 \ https://github.com/runwayml/processing-library/releases/download/latest/RunwayML.txt +262 \ https://github.com/SamuelAl/SQuelized-for-Processing/releases/latest/download/SQuelized.txt +267 \ https://github.com/cansik/deep-vision-processing/releases/download/contribution/deepvision.txt +270 \ https://ronghaoliang.page/Weka4P/download/Weka4P.txt [Library : Fabrication] # 078 \ http://s373.net/code/marchingcubes/download/marchingcubes.txt [Library : Geometry] +001 \ https://github.com/remixlab/proscene/releases/download/latest/proscene.txt 038 \ http://www.ricardmarxer.com/geomerative/geomerative.txt 083 \ http://rdlester.github.com/hermes/downloads/hermes.txt 106 \ http://www.thecloudlab.org/processing/download/ComputationalGeometry.txt 113 \ http://sixthsensor.dk/code/p5/point2line/download/point2line.txt +195 \ http://culebra.technology/culebra.txt +204 \ https://github.com/thwegene/OCT/releases/download/latest/OCT.txt +214 \ http://www.garciadelcastillo.es/dashedlines/dashedlines.txt +231 \ http://objectstothinkwith.com/tracer/tracer.txt +237 \ http://gicentre.org/handy/handy.txt +241 \ http://agathelenclen.fr/downloads/Squarify.txt [Library : GUI] +001 \ https://github.com/remixlab/proscene/releases/download/latest/proscene.txt +046 \ http://www.lagers.org.uk/processing3/g4p/G4P.txt 051 \ http://www.lagers.org.uk/processing/g4p/G4P.txt 054 \ https://raw.github.com/fjenett/Guido/latest/releases/Guido.txt 058 \ http://www.sojamo.de/libraries/controlP5/controlP5.txt # 061 \ https://dl.dropbox.com/u/87680069/piccolo2d.txt +180 \ http://interfascia.berg.industries/download/interfascia.txt +224 \ https://github.com/BillKujawa/meter/releases/download/latest/meter.txt +237 \ http://gicentre.org/handy/handy.txt +256 \ https://github.com/Milchreis/uibooster-for-processing/releases/latest/download/UiBooster.txt [Library : Hardware] -010 \ http://www.shiffman.net/p5/libraries/mpe/mpe.txt 015 \ http://www.shiffman.net/p5/libraries/sms/sms.txt -024 \ http://playground.arduino.cc/uploads/Interfacing/processing2-arduino.txt +024 \ https://github.com/firmata/processing/releases/download/latest/processing-arduino.txt 028 \ http://projects.formatlos.de/ambientlightsensor/download/AmbientLightSensor.txt # 064 \ http://www.muvium.com/frappuccino/frappuccino.txt -066 \ http://ketailibrary.org/ketai.txt -071 \ http://cloud.github.com/downloads/hdavid/dmxP512/dmxP512.txt +066 \ http://ketai.org/ketai.txt +071 \ http://motscousus.com/stuff/2011-01_dmxP512/dmxP512.txt 090 \ https://dl.dropbox.com/u/87680069/LeapMotion.txt # 102 \ http://s176381904.onlinehome.fr/processing/MoveLib/download/MoveLib.txt 104 \ http://arvydas.github.io/blinkstick-processing/download/BlinkStick.txt 109 \ https://raw.githubusercontent.com/nok/leap-motion-processing/master/download/LeapMotionForProcessing.txt 145 \ http://www.heroicrobotics.com/software/PixelPusher.txt 155 \ https://raw.githubusercontent.com/nok/myo-processing/master/download/MyoForProcessing.txt +164 \ http://jorgecardoso.eu/processing/eyetribeprocessing/download/EyeTribeProcessing.txt +188 \ http://developers.gausstoys.com/processing/GaussSense.txt +189 \ http://ciaron.net/hpglgraphics/download/hpglgraphics.txt +190 \ https://github.com/gohai/processing/releases/download/latest/io.txt +# 197 \ https://github.com/sgeigers/Phidgets-For-Processing/releases/download/latest/PhidgetsForProcessing.txt +211 \ https://github.com/diwi/PS3Eye/releases/download/latest/PS3Eye.txt +218 \ https://github.com/cansik/sweep-processing/releases/download/latest/SweepProcessing.txt +219 \ https://teddavis.org/xyscope/download/XYscope.txt +224 \ https://github.com/BillKujawa/meter/releases/download/latest/meter.txt +225 \ http://web.tecnico.ulisboa.pt/augusto.esteves/GazeTrack/GazeTrack.txt +238 \ https://github.com/cansik/realsense-processing/releases/download/contributed/RealSenseProcessing.txt +239 \ http://skweezee.net/processing/download/SkweezeeForProcessing.txt +266 \ https://github.com/sgeigers/SimplePhidgets/releases/download/latest/SimplePhidgets.txt +268 \ http://github.com/jaysonh/Dmx4Artists/releases/latest/download/Dmx4Artists.txt [Library : I/O] -006 \ http://www.die-seite.ch/colladaLoader.txt +001 \ https://github.com/remixlab/proscene/releases/download/latest/proscene.txt 016 \ http://www.silentlycrashing.net/ezgestures/files/ezgestures.txt 025 \ http://jorgecardoso.eu/processing/NXTComm/NXTComm.txt 026 \ http://jorgecardoso.eu/processing/MindSetProcessing/download/MindsetProcessing.txt +039 \ https://github.com/codeanticode/tablet/releases/download/latestv2/Tablet.txt 060 \ https://dl.dropbox.com/u/87680069/gamepad.txt 067 \ http://www.graffitiresearchlab.de/wp-content/uploads/proJMS.txt +084 \ http://iddi.github.io/oocsi-processing/oocsi.txt 091 \ http://n-e-r-v-o-u-s.com/tools/obj/OBJExport.txt -097 \ http://pif.github.com/android-select-file/download/SelectFile.txt +097 \ https://andrusiv.com/android-select-file/download/SelectFile.txt 098 \ http://vialab.science.uoit.ca/smt/dl/SMT.txt 105 \ http://paulhertz.net/ignocodelib/download/IgnoCodeLib.txt -121 \ http://interfaze.info/libraries/tablet/download/Tablet.txt +121 \ https://github.com/codeanticode/tablet/releases/download/latest/Tablet.txt 136 \ http://www.extrapixel.ch/processing/gifAnimation/gifAnimation.txt -139 \ http://erniejunior.github.io/VSync-for-Processing/download/VSync.txt +139 \ http://ernestum.github.io/VSync-for-Processing/download/VSync.txt 143 \ http://www.lagers.org.uk/processing/gamecontrol/GameControlPlus.txt +167 \ http://www.lagers.org.uk/processing3/gamecontrol/GameControlPlus.txt +168 \ http://transfluxus.github.io/SimpleHTTPServer/download/SimpleHTTPServer.txt +171 \ https://github.com/gohai/processing-simpletouch/releases/download/latest/processing-simpletouch.txt +172 \ http://transfluxus.github.io/drop/download/Drop.txt +173 \ https://github.com/256dpi/processing-mqtt/releases/download/latest/mqtt.txt +175 \ https://github.com/alexandrainst/processing_websockets/releases/download/latest/webSockets.txt +177 \ https://github.com/keshrath/Console/releases/download/latest/Console.txt +178 \ https://github.com/keshrath/ImageLoader/releases/download/latest/ImageLoader.txt +179 \ https://github.com/keshrath/MuKCast/releases/download/latest/MuKCast.txt +187 \ https://funprogramming.org/VideoExport-for-Processing/download/VideoExport.txt +206 \ https://ap-sync.github.io/libs/AP_sync_processing/APsync.txt +209 \ https://github.com/gohai/processing-simplereceiptprinter/releases/download/latest/processing-simplereceiptprinter.txt +217 \ https://pierdr.github.io/Tramontana-for-Processing/tramontana.txt +229 \ https://github.com/Shinhoo/Wooting-Keyboard-Library/releases/download/lastest/WootingKeyboard.txt +232 \ https://github.com/haschdl/pLaunchController/releases/download/latest/pLaunchController.txt +239 \ http://skweezee.net/processing/download/SkweezeeForProcessing.txt +247 \ https://github.com/orgicus/image-sequence-player/releases/download/latest/ImageSequencePlayer.txt +258 \ https://github.com/Transmedia-Gx/grab/releases/latest/download/Grab.txt +269 \ http://augmenta-tech.com/libs/processing/Augmenta.txt [Library : Language] -063 \ http://www.rednoise.org/rita/RiTa.txt -119 \ http://interfaze.info/libraries/eliza/download/Eliza.txt +063 \ http://rednoise.org/rita/rita.txt +119 \ https://github.com/codeanticode/eliza/releases/download/latest/Eliza.txt [Library : Math] 021 \ http://www.gwoptics.org/processing/gwoptics_p5lib/download/gwoptics.txt @@ -111,10 +189,14 @@ 126 \ https://raw.github.com/jagracar/grafica/master/releases/grafica.txt 131 \ http://www.lagers.org.uk/processing/qscript/QScript.txt 156 \ http://www.lagers.org.uk/processing/jasmine/Jasmine.txt +203 \ https://github.com/OliverColeman/hivis/releases/download/latest/HiVis.txt +251 \ https://github.com/pallav12/matrixMath-for-processing/releases/download/latest/MatrixMath.txt [Library : Other] 093 \ http://www.lagers.org.uk/processing/pathfinder/Path_Finder.txt 157 \ http://www.lagers.org.uk/processing/steganos/Steganos.txt +185 \ http://softlab.pt/ptmx/ptmx.txt +253 \ https://ztdp.ca/projects/school/Green/Green.txt [Library : Simulation] 018 \ http://www.ricardmarxer.com/fisica/download/fisica.txt @@ -130,6 +212,11 @@ 107 \ https://dl.dropboxusercontent.com/u/6030446/punktiert/punktiert.txt 108 \ https://dl.dropboxusercontent.com/u/6030446/bRigid/bRigid.txt 127 \ http://www.lagers.org.uk/processing/ai4g/AI_for_2D_Games.txt +195 \ http://culebra.technology/culebra.txt +201 \ https://github.com/diwi/PixelFlow/releases/download/latest/PixelFlow.txt +216 \ https://github.com/diwi/LiquidFunProcessing/releases/download/latest/LiquidFunProcessing.txt +244 \ http://giftedapprentice.com/ewbIK/ewbIK.txt +261 \ https://github.com/dennisppaul/teilchen/releases/latest/download/teilchen.txt [Library : Sound] 153 \ https://github.com/processing/processing-sound/releases/download/latest/sound.txt @@ -139,54 +226,106 @@ 118 \ http://www.abstract-codex.net/tactu5/download/tactu5.txt 138 \ http://beadsproject.net/library/beads.txt 147 \ http://code.compartmental.net/minim/distro/minim_for_processing.txt -151 \ https://chrisjr.github.io/loom/download/loom.txt +151 \ https://corajr.github.io/loom/download/loom.txt +170 \ https://github.com/shlomihod/cassette/releases/download/latest/cassette.txt +219 \ https://teddavis.org/xyscope/download/XYscope.txt +254 \ http://www.kramann.info/ComposingForEveryone.txt +260 \ https://github.com/sphaero/procmod/releases/latest/download/procmod.txt +264 \ https://github.com/dennisppaul/wellen/releases/latest/download/wellen.txt +271 \ https://www.robertesler.com/software/Pd4P3.txt [Library : Utilities] +001 \ https://github.com/remixlab/proscene/releases/download/latest/proscene.txt # 005 \ http://nootropicdesign.com/processing-layers/downloads/layers.txt +010 \ http://shiffman.net/p5/libraries/mpe/mpe.txt 027 \ http://jorgecardoso.eu/processing/ID3/ID3.txt # 029 \ http://libraries.seltar.org/unzipit/unzipit.txt 031 \ http://libraries.seltar.org/postToWeb/postToWeb.txt -034 \ http://keystonep5.sourceforge.net/download/keystone.txt +034 \ http://www.deadpixel.ca/keystone/download/keystone.txt # 045 \ https://dl.dropboxusercontent.com/u/6990683/Processing/papaya.txt 047 \ http://transmote.com/nest/download/Nest.txt 068 \ http://phi.lho.free.fr/programming/Processing/P8gGraphicsSVG/P8gGraphicsSVG.txt 069 \ https://raw.githubusercontent.com/nok/onedollar-unistroke-recognizer/master/download/OneDollarUnistrokeRecognizer.txt +080 \ http://cloud.brendandawes.com/dawesometoolkit/dawesometoolkit.txt 082 \ http://www.multiply.org/processing/TimedEvents.txt +084 \ http://iddi.github.io/oocsi-processing/oocsi.txt +086 \ http://spacebrew.github.io/spacebrewP5/download/spacebrew.txt 094 \ https://dl.dropbox.com/u/87680069/executor.txt 129 \ https://github.com/onar3d/processing-mother/releases/download/latest/Mother.txt 140 \ https://raw.github.com/dhchoi/processing-countdowntimer/master/release/CountdownTimer.txt -152 \ http://www.imaginary-institute.com/resources/AULibrary/AULib.txt +152 \ https://imaginary-institute.com/resources/AULibrary/AULib.txt 158 \ http://josephtaylor.github.io/ColorScheme/ColorScheme.txt 159 \ http://josephtaylor.github.io/sketch-mapper/SketchMapper.txt +180 \ http://interfascia.berg.industries/download/interfascia.txt +192 \ https://github.com/barelief/freeTransform-processing/releases/download/latest/FreeTransform.txt +193 \ http://shiffman.net/p5/libraries/processing3/mpe/mpe.txt +201 \ https://github.com/diwi/PixelFlow/releases/download/latest/PixelFlow.txt +202 \ https://ixora.io/downloads/colorblindness/ColorBlindness.txt +207 \ https://github.com/Lord-of-the-Galaxy/Timing-Utilities/releases/download/latest/timing_utils.txt +210 \ http://cagewebdev.com/colorharmony/colorharmony.txt +212 \ https://github.com/cansik/processing-postfx/releases/download/latest/PostFX.txt +213 \ https://github.com/AlexPoupakis/mouse2DTransformations/releases/download/latest/Mouse2DTransformations.txt +217 \ https://pierdr.github.io/Tramontana-for-Processing/tramontana.txt +229 \ https://github.com/Shinhoo/Wooting-Keyboard-Library/releases/download/lastest/WootingKeyboard.txt +235 \ https://www.barkmin.eu/processing-library-scratch/download/scratch.txt +240 \ https://commonpike.github.io/nl.kw.processing.portmods/dist/PortMods.txt +245 \ https://github.com/VisualComputing/nub/releases/download/latest/nub.txt +246 \ https://github.com/federico-pepe/nice-color-palettes/releases/download/latest/NiceColorPalettes.txt +248 \ https://github.com/runwayml/processing-library/releases/download/latest/RunwayML.txt +255 \ https://bdhont.net/LiveBrush.txt +257 \ https://rect.dev/processing/infinidecimal/GRInfinidecimalCanvas.txt +258 \ https://github.com/Transmedia-Gx/grab/releases/latest/download/Grab.txt [Library : Typography] 038 \ http://www.ricardmarxer.com/geomerative/geomerative.txt 088 \ https://raw.github.com/andreaskoller/Fontastic/master/download/Fontastic.txt -116 \ https://github.com/prisonerjohn/NextText/releases/download/latest/NextText.txt +# 116 \ https://github.com/prisonerjohn/NextText/releases/download/latest/NextText.txt [Library : Video & Vision] 150 \ https://github.com/processing/processing-video/releases/download/latest/video.txt 013 \ http://shiffman.net/p5/libraries/openkinect_processing/openkinect_processing.txt 023 \ http://www.v3ga.net/processing/BlobDetection/blobDetection.txt +041 \ https://github.com/Syphon/Processing/releases/latest/download/Syphon.txt # 059 \ http://thomasdiewald.at/processing/libraries/dLibs_freenect/download/dLibs_freenect.txt # 077 \ http://s373.net/code/flob/download/flob.txt # 081 \ http://ubaa.net/shared/processing/opencv/download/opencv.txt -125 \ http://shiffman.net/p5/libraries/rekognition_processing/rekognition_processing.txt +# 125 \ http://shiffman.net/p5/libraries/rekognition_processing/rekognition_processing.txt 132 \ https://github.com/atduskgreg/opencv-processing/releases/download/latest/opencv_processing.txt -134 \ http://decoder.x10.mx/blobscanner/blobscanner.txt +134 \ http://decoder.x10host.com/blobscanner/blobscanner.txt 146 \ http://boofcv.org/processing/boofcv_processing.txt -148 \ https://github.com/Syphon/Processing/releases/download/latest/Syphon.txt +# 148 \ https://github.com/Syphon/Processing/releases/download/latest/Syphon.txt 149 \ http://www.magicandlove.com/software/Kinect4WinSDK.txt 161 \ http://codigogenerativo.com/KinectPV2.txt +176 \ http://www.stefanobaldan.com/projects/ipcapture/download/IPCapture.txt +184 \ https://github.com/gohai/processing-glvideo/releases/download/latest/processing-glvideo.txt +186 \ https://github.com/leadedge/SpoutProcessing/releases/download/latest/spout.txt +201 \ https://github.com/diwi/PixelFlow/releases/download/latest/PixelFlow.txt +211 \ https://github.com/diwi/PS3Eye/releases/download/latest/PS3Eye.txt +222 \ https://pierdr.github.io/tramontanaCV/download/tramontanaCV.txt +223 \ https://github.com/nyatla/NyARToolkit-for-Processing/releases/download/latest/nyar4psg.txt +227 \ https://github.com/Milchreis/processing-imageprocessing/releases/download/latest/processing-imageprocessing.txt +236 \ http://softlab.pt/VLCJVideo/VLCJVideo.txt [Examples : Books] 154 \ http://shiffman.net/p5/examples/natureofcode.txt +163 \ http://shiffman.net/p5/examples/learningprocessing2.txt +165 \ https://processing.org/handbook/handbook_2e.txt +166 \ https://processing.org/books/gswp_2e.txt +205 \ http://mad4j.github.io/book-mdpc/book-mdpc.txt +265 \ https://codingart-book.github.io/examples/CodingArtBookExamples.txt + +[Examples : ] +194 \ http://damellis.github.io/wovns-processing-examples/WOVNS.txt +226 \ https://github.com/Apress/processing-for-android/releases/download/latest/processing-for-android-examples.txt +243 \ https://coding-creative.dringtech.com/examples/coding-creative-examples.txt +249 \ https://github.com/jeremydouglass/rosetta_examples_p5/releases/latest/download/rosetta_examples_p5.txt [Tool : ] 020 \ https://dl.dropboxusercontent.com/u/69944346/ColorSelectorPlus/ColorSelectorPlusTool.txt 049 \ http://thomasdiewald.com/processing/tools/TabManager/download/TabManager.txt 052 \ http://www.lagers.org.uk/processing/guibuilder/G4PTool.txt -057 \ http://dl.dropbox.com/u/69944346/SketchOutline/SketchOutline.txt +057 \ http://www.lagers.org.uk/processing3/guibuilder/G4PTool.txt +085 \ http://dl.dropbox.com/u/69944346/SketchOutline/SketchOutline.txt 096 \ http://www.lagers.org.uk/processing/appletmaker/AppletMaker.txt 099 \ http://poifox.com/templater/download/Templater.txt 100 \ http://poifox.com/bootstrap/download/Bootstrap.txt @@ -194,11 +333,25 @@ 114 \ http://drifkin.net/processing/beziereditor/download/BezierEditorTool.txt 141 \ http://s3.staticvoidgames.com/JarMatey/JarMateyProcessingTool.txt 160 \ https://github.com/joelmoniz/Git-Manager/releases/download/latest/GitManager.txt +181 \ https://github.com/joelmoniz/Shape-Sketch/releases/download/latest/ShapeSketch.txt +182 \ https://github.com/rzats/font-highlighting-editor/releases/download/latest/FontHighlightingEditor.txt +191 \ https://github.com/gohai/processing-uploadtopi/releases/download/latest/UploadToPiTool.txt +221 \ http://jonathan.dahlberg.media/ecc/ecc.txt +228 \ https://perceptualcolor.org/distribution/PerceptualColorPicker/download/PerceptualColorPicker.txt +233 \ https://github.com/jaewhyun/GettingStarted/releases/download/latest/GettingStarted.txt +234 \ https://github.com/jaewhyun/ReferenceTool/releases/download/latest/ReferenceTool.txt +242 \ https://jwilder4690.github.io/tools/ArtStation/ArtStation.txt +263 \ http://jonathan.dahlberg.media/processing2js/Processing2JSTool.txt [Mode : ] -101 \ https://github.com/processing/processing-android/releases/download/latest/AndroidMode.txt 070 \ http://bezier.de/processing/modes/CoffeeScriptMode.txt 087 \ http://bezier.de/processing/modes/JavaScriptMode.txt +101 \ https://github.com/processing/processing-android/releases/download/latest/AndroidMode.txt # 122 \ http://galsasson.com/tweakmode/tweakmode.txt # 124 \ http://download.processing.org/pdeX.txt -142 \ http://py.processing.org/PythonMode.txt \ No newline at end of file +# 142 \ http://py.processing.org/PythonMode.txt +162 \ https://github.com/joelmoniz/REPLmode/releases/download/latest/REPLMode.txt +169 \ https://py.processing.org/3/PythonMode.txt +199 \ https://github.com/fathominfo/processing-p5js-mode/releases/download/latest/p5jsMode.txt +220 \ https://github.com/processing-r/Processing.R/releases/latest/download/RLangMode.txt +250 \ https://github.com/Izza11/shader-mode/releases/download/latest/ShaderMode.txt diff --git a/css/changes.css b/css/changes.css index 0889836ed..07222aef0 100755 --- a/css/changes.css +++ b/css/changes.css @@ -60,7 +60,7 @@ dl.network dd { margin: 0; } dl.network dd.date { color: #999966; margin-bottom: 1em; } /*** Reference ***/ -.ref-notice { margin: 2.5em 0 2.5em 0; color: #006699} +.ref-notice { margin: 2.5em 0 2.5em 0; color: #006699;} #Language th { width: 100px; font-weight: normal; text-align: left; vertical-align: top; } #Language td { vertical-align: top; padding-bottom: 2em; } diff --git a/css/forms.css b/css/forms.css index d26c72960..b3396a8de 100755 --- a/css/forms.css +++ b/css/forms.css @@ -5,59 +5,42 @@ * */ -table { -} - -td -{ - /*text-align: left; - vertical-align: top;*/ -} form - { +{ margin-bottom : 0px; } input, select, textarea - { +{ font-family : Verdana, Arial, Helvetica, sans-serif; font-size : 10px; - vertical-align : middle; } select - { +{ width : 120px; } input - { +{ margin-right : 5px; } label - { +{ display : block; - /*margin-left : -2px; - margin-bottom : 7px;*/ - /* \*/ - /*margin-bottom : 3px;*/ - /* */ + } -select[multiple] - { - /*margin-left : -3px;*/ - } input[type="text"], input[type="password"], input:not([type]) - { +{ /*border : 2px solid !important;*/ -moz-border-top-colors : #7C7C7C #C3C3C3; @@ -71,7 +54,7 @@ input[type="reset"], input[type="button"], input[type="submit"], select:not([multiple]) - { +{ /*border : 2px solid !important; background-repeat : repeat-x !important; background-position : bottom right !important;*/ @@ -90,7 +73,7 @@ input[type="reset"]:hover:active, input[type="button"]:hover:active, input[type="submit"]:hover:active, select:not([multiple]):hover:active - { +{ /*border : 2px solid !important;*/ -moz-border-top-colors : #999999 #CECECE !important; @@ -100,7 +83,7 @@ select:not([multiple]):hover:active } select > input[type="button"] - { +{ border-top : none !important; border-right : none !important; border-bottom : none !important; @@ -116,7 +99,7 @@ input[type="password"]:focus, input:not([type]):focus, textarea:focus, select[multiple]:focus - { +{ -moz-border-top-colors : -moz-mac-focusring -moz-mac-focusring !important; -moz-border-right-colors : -moz-mac-focusring -moz-mac-focusring !important; -moz-border-bottom-colors : -moz-mac-focusring -moz-mac-focusring !important; @@ -141,7 +124,7 @@ textarea, select[multiple] input[type="radio"]:not([class]):not([id]):not([style]) - { +{ width: 13px !important; height: 13px !important; @@ -161,11 +144,6 @@ input[type="radio"]:not([class]):not([id]):not([style]) } -input[type="radio"]:focus:not([class]):not([id]):not([style]) - { - - } - input[type="radio"]:checked:not([class]):not([id]):not([style]) { diff --git a/css/processing_beta.css b/css/processing_beta.css index c68a5b126..4213e5746 100644 --- a/css/processing_beta.css +++ b/css/processing_beta.css @@ -38,7 +38,7 @@ pre { FONT-FAMILY: "Courier New", Courier, mono; FONT-SIZE: 11px; LINE-HEIGHT: normal; - COLOR: #000000 + COLOR: #000000; } .inputnav { @@ -60,12 +60,12 @@ pre { FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; FONT-SIZE: 19px; FONT-WEIGHT: normal; - COLOR: #5A5A46 + COLOR: #5A5A46; } .caption { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-style: normal; - font-weight: normal + font-weight: normal; } diff --git a/css/style.css b/css/style.css index c917b5803..65fd77ba4 100755 --- a/css/style.css +++ b/css/style.css @@ -7,12 +7,10 @@ Reworked by CR, 23 Sep 2011 Reworked by Jon Gacnik, 19 Feb 2013 Created: 2005.08.29 04:28PM -Last Modified: 2014.11.15 by Scott Murray +Last Modified: 2019.07.26 by Casey Reas to remove Foundation Site CSS "-f" */ - - @font-face { font-family: 'theSerifItalic'; src: url(fonts/TheSerif_B4_Italic.eot), @@ -54,7 +52,6 @@ Last Modified: 2014.11.15 by Scott Murray } - /* ================ GLOBAL ================== */ body { @@ -70,7 +67,7 @@ body { -webkit-text-size-adjust: none; font-size : 100%; - font-size : 0.79em; + font-size : 0.85em; /* 0.79em; */ font-weight : normal; line-height : 1.5em; color : #252525; @@ -79,6 +76,7 @@ body { img { border: 0px solid #000000; } a { + cursor: pointer; text-decoration: none; font-weight: normal; color: #2c7bb5; @@ -102,6 +100,7 @@ a.large-link:before { content: ''; } + /* ================ COVER SLIDESHOW ================== */ #slideshow { @@ -127,7 +126,6 @@ a.large-link:before { } - /* ================ LAYOUT ================== */ #container { @@ -137,7 +135,6 @@ a.large-link:before { } - /* ================ RIBBON ================== */ #ribbon { @@ -179,6 +176,8 @@ a.large-link:before { border-right: 1px solid #1a1a1a; } + + #ribbon ul.right li { float: right; border-left: 1px solid #1a1a1a; @@ -209,12 +208,48 @@ a.large-link:before { font-weight: bold; } +#ribbon-announce { + text-align: center; + width: 900px; + height: auto; + background-color: #d1f94e; + background: linear-gradient(to bottom, #1d517e, #d1f94e); + margin-bottom: 30px; /* added when placed below the header */ +} + +#ribbon-announce ul { + display: inline-block; + margin: 0; + padding: 0; +} + +#ribbon-announce ul.center { + float: center; +} + +#ribbon-announce ul li { + display: inline-block; + margin: 0; + padding: 6px 10px 5px 10px; + list-style: none; +} + +#ribbon-announce ul.center li { + float: center; +} + +#ribbon-announce ul li a { + color: white; + font-weight: bold; +} + /* ================ HEADER ================== */ + #header { width: 900px; height: 106px; - margin-bottom: 30px; + margin-bottom: 30px; /* was 30px, but changed to 0 when ribbon placed below header */ overflow: hidden; background: #0c2033 url(../img/processing-web.png) center center no-repeat; background-position: bottom; @@ -222,16 +257,6 @@ a.large-link:before { position: relative; } -#header-f { - width: 900px; - height: 106px; - margin-bottom: 30px; - overflow: hidden; - background: #0c2033 url(/images/processing-site.png) center center no-repeat; - background-size: 900px 106px; - position: relative; -} - #header .processing-logo { width: 206px; height: 38px; @@ -243,17 +268,6 @@ a.large-link:before { background-image: linear-gradient(transparent, transparent), url(../img/processing-logo.svg); } -#header-f .processing-logo { - width: 370px; - height: 38px; - margin: 20px 0 0 30px; - /* -- NEW FOUNDATION LOGO GOES HERE -- */ - background: transparent url(/images/processing-foundation-logo.svg) center center no-repeat; - background-image: -webkit-linear-gradient(transparent, transparent), url(/images/processing-foundation-logo.svg); - background-image: -moz-linear-gradient(transparent, transparent), url(/images/processing-foundation-logo.svg); - background-image: linear-gradient(transparent, transparent), url(/images/processing-foundation-logo.svg); -} - #header .processing-logo.no-cover:before { position: relative; top: 3px; @@ -262,14 +276,6 @@ a.large-link:before { content: '\2039'; } -#header-f .processing-logo.no-cover:before { - position: relative; - top: 3px; - left: -18px; - font-size: 24px; - content: '\2039'; -} - #Overview2 .processing-logo.no-cover:before { position: relative; top: 3px; @@ -284,23 +290,11 @@ a.large-link:before { color: white; } -#header-f a { - font-family: 'theSerif', 'Enriqueta', georgia, times, sans-serif; - text-decoration: none; - border: none; - color: white; -} - #header h1 { display: none; float: left; } -#header-f h1 { - display: none; - float: left; -} - #header form { position: absolute; top: 20px; @@ -309,14 +303,6 @@ a.large-link:before { color: #959595; } -#header-f form { - position: absolute; - top: 20px; - right: 5px; - width: 176px; - color: #959595; -} - #header form input { float: left; border: 1px solid #136796; @@ -328,29 +314,12 @@ a.large-link:before { color: #959595; } -#header-f form input { - float: left; - border: 1px solid #136796; - outline: none; - height: 18px; - background: #fff; - font-family: 'theSerif', 'Enriqueta', georgia, times, serif; - font-size: 1em; - color: #959595; -} - #header form input[type="text"]{ padding-left: 3px; width: 127px; border-right: none; } -#header-f form input[type="text"]{ - padding-left: 3px; - width: 127px; - border-right: none; -} - #header form input[type="submit"]{ height: 22px; width: 22px; @@ -362,21 +331,8 @@ a.large-link:before { cursor: pointer; } -#header-f form input[type="submit"]{ - height: 22px; - width: 22px; - border-left: none; - background: white url(/images/search-f.svg) center center no-repeat; - background-image: -webkit-linear-gradient(transparent, transparent), url(/images/search-f.svg); - background-image: -moz-linear-gradient(transparent, transparent), url(/images/search-f.svg); - background-image: linear-gradient(transparent, transparent), url(/images/search-f.svg); - cursor: pointer; -} - #header form p { margin: 0; } -#header-f form p { margin: 0; } - /* ================ NAVBAR ================== */ #navigation { @@ -407,6 +363,7 @@ a.large-link:before { position: relative; } + /* ================ FOOTER ================== */ #footer { @@ -428,26 +385,6 @@ a.large-link:before { padding-top: 10px; } -/* === FOUNDATION FOOTER === */ - -#footer-f { - clear: both; - padding: 100px 30px 20px 30px; - line-height: 23px; - color: #959595; -} -#footer-f a { - color: #959595; - border-bottom: 1px solid #CECECE; -} -#footer-f #copyright, -#footer-f #colophon { - -} -#footer-f #copyright { - border-top: 1px solid #A6BCCF; - padding-top: 10px; -} /* ================ TYPOGRAPHY ================== */ @@ -524,13 +461,12 @@ li {margin-bottom: 1em; } .large-header .black { color: #000; } .error { color: #f00; margin: 0; } -/* ================ UI Elements ================== */ - - /* ================== RANDOM CLASSES =============== */ + .clear { clear: both; } + /* ================== PAGE SPECIFIC CSS =============== */ /**************************************************************** Cover ***/ @@ -572,7 +508,8 @@ dd { margin: 0 0 1em 0; } td img { margin: 0; display: block; } -#Cover .video, +#Cover .video { margin-top: 0em; } + #Cover .twitter, #Cover .commits, #Cover .partners, @@ -677,15 +614,8 @@ dl.network dt { font-style: normal; } dl.network dd { margin: 0; } dl.network dd.date { color: #999999; margin-bottom: 1em; } -//p.network { margin: 0 23px 1em 0; width:200px; } -//p.network span.date { color: #999999; } - p.exhibition-nav { margin-top: 20px; margin-bottom: 10px; } -/**************************************************************** Foundation ***/ - -.foundation-p { line-height: 0em; } - /**************************************************************** Reference ***/ @@ -693,8 +623,6 @@ p.exhibition-nav { margin-top: 20px; margin-bottom: 10px; } #Language h5 a { float: left; margin-left: -30px; } - - .skinny { margin-left : 0px; margin-right : 50px; @@ -710,7 +638,7 @@ p.exhibition-nav { margin-top: 20px; margin-bottom: 10px; } margin-bottom: 20px; } -.ref-notice { margin: 0 0 2.5em 0; color: #FF3399; clear: both; margin-right: 40px;} +.ref-notice { margin: 0 0 2.5em 0; color: #666666; clear: both; margin-right: 40px;} .ref-item { margin-bottom: 60px; } .ref-item th { width: 100px; font-weight: bold; text-align: left; vertical-align: top; } @@ -878,8 +806,6 @@ div.ref-col { /**************************************************************** download ***/ -/* download */ - #Download .download ul { list-style: none; margin: 0; padding: 0; } #Download span.version-date { color: #959595; } #Download h5 { @@ -1058,16 +984,13 @@ div.ref-col { /************************************************************** contribute ***/ -/*#Contribute h1 { margin-bottom: 0; }*/ #Contribute .message { margin-top: 0; margin-right: 40px; } #Contribute .threecol { float: left; width: 210px; margin-right: 20px; } #Contribute .threecol p { margin-bottom: 2em; } - /************************************************************** learning ***/ -/*#Learning h1 { margin-bottom: 0; margin-top: 0;}*/ #Learning .message { margin-top: 0; margin-right: 40px; } #Learning .threecol { float: left; width: 200px; margin-right: 30px; margin-top: 0px;} #Learning .threecol p { margin-bottom: 2em; } @@ -1079,13 +1002,10 @@ div.ref-col { .doc-float { margin-right: 40px;} - - h2 { margin-bottom: 0; margin-top: 0;} .example-notice { margin: -1.0em 0 2.5em 0; color: #FF3399; clear: both; margin-right: 40px;} - #Copyright p { margin-right: 20px; } @@ -1096,39 +1016,38 @@ h2 { margin-bottom: 0; margin-top: 0;} #Tutorials .colthree { width: 224px; float: left; margin-right: 20px; } #Tutorials h2 { margin: 0 0 20px 0; font-size: 1em; } -/*#Tutorials h3 { - font-family : Verdana, Geneva, Arial, Helvetica, sans-serif; - font-size : 1.3em; - font-weight : bold; - margin-bottom : 0.4em; - margin-top : 1.8em; -} - -#Tutorials h5 { - font-family : Verdana, Geneva, Arial, Helvetica, sans-serif; - font-weight : bold; - font-size : 1.0em; - margin-bottom : 0.4em; - margin-top : 1.4em; -}*/ - -/*#Tutorials h1 { - font-family : Verdana, Geneva, Arial, Helvetica, sans-serif; - font-size : 2.0em; - font-weight : normal; - font-style : normal; -}*/ - /*--------------------TUTORIAL HEADER SPACING------------------*/ .Tutorials { line-height: 0em; } #Tutorials h2.with-nav { margin-bottom: 0; } #Tutorials .onecol { clear: both; } #Tutorials table { - width: 687px; - margin-top: 35px; + /*width: 687px;*/ + margin-top: 0px; + margin-bottom: 20px; + border-collapse:collapse; +} + +#Tutorials table.ex { + /*width: 687px;*/ + margin-top: 20px; + margin-bottom: 20px; border-collapse:collapse; } + +#Tutorials hr { + display: block; + height: 1px; + border: 0; + border-top: 1px solid #ccc; + margin: 1em 0; + padding: 0; +} + +#Tutorials img.tut { + margin-bottom: 30px; +} + #Tutorials td { width: 224px; padding-right: 5px; @@ -1140,12 +1059,23 @@ h2 { margin-bottom: 0; margin-top: 0;} #Tutorials p.license { border-left: solid 1px #ccc; padding: 10px; + margin-top: 0px; + margin-bottom: 40px; background-color: #eee; } +/* +#Tutorials p.txt { + margin-top: 0em; + margin-bottom: 2em; + font-size: 100%; + font-weight: normal; + line-height: 200%; +} +*/ + /************************************************************** Books ***/ -/*#Books h1 { margin-bottom: 0; margin-top: 0;}*/ #Books td { vertical-align: top; font-size: 1.0em} @@ -1169,9 +1099,6 @@ h2 { margin-bottom: 0; margin-top: 0;} margin-top: 30px; } - - - #Tools-index h5 { margin-bottom: 0; font-size: 1em; } #Tools-index .twocol p { margin-top: 0; } .lib-nav { display: block; @@ -1190,7 +1117,6 @@ h2 { margin-bottom: 0; margin-top: 0;} #Tools h4 { font-size: 1em; margin-bottom: .5em; } #Tools h4 a {float:left; margin-left:-30px; martin-top:-5px; } - #Tools .threecol { float: left; width: 210px; @@ -1200,10 +1126,8 @@ h2 { margin-bottom: 0; margin-top: 0;} .threecol:nth-child(5) { margin: 0 !important; } - /************************************************************** Library Indices ***/ - #Libraries .colone { width: 300px; float: left; @@ -1225,10 +1149,8 @@ h2 { margin-bottom: 0; margin-top: 0;} #Libraries .twocol-alt { width: 330px; float: left; - //background: #cccccc; } - #Libraries .twocol p { margin-top: 0; } #Libraries .full { @@ -1253,19 +1175,16 @@ h2 { margin-bottom: 0; margin-top: 0;} margin-bottom: 2px; } - - #Libraries .lib-nav { display: block; margin-bottom: 10px; margin-left: -30px; padding: 7px 0 3px 30px; - background: url(/img/back_off.gif) no-repeat + background: url(/img/back_off.gif) no-repeat; } #Libraries pre { margin-left: 30px; margin-bottom: 30px; } #Libraries h2 { margin-top: 2em; } -/*#Libraries h3 { clear: both; margin-bottom: 0; }*/ #Libraries h3 { margin-top: 0; margin-bottom: 0;} @@ -1288,13 +1207,13 @@ h2 { margin-bottom: 0; margin-top: 0;} /************************************************************** environment ***/ -/*#Environment h1 { margin-top: 2em; }*/ -#Environment h5 { margin-top: 3em; } + +#Environment h5 { margin-top: 2em; margin-bottom: 1em; } #Environment h6 { margin-bottom: 0em; } #Environment h5 a { float: left; margin-left: -30px; } ul.nostyle { margin: 0; padding: 0; list-style: none outside; } #Environment td { padding-bottom: 1em; } -#Environment .content p, +/*#Environment .content p,*/ #Environment .content ul, #Environment .content table { width: 560px; @@ -1302,31 +1221,22 @@ ul.nostyle { margin: 0; padding: 0; list-style: none outside; } /************************************************************** overview ***/ + #Overview .content p, #Overview .content ul, -#Overview .content table { - width: 560px; -} +#Overview .content table { width: 560px; } #Foundation .content p, #Foundation .content ul, -#Foundation .content table { - width: 560px; -} - +#Foundation .content table { width: 560px; } #People .content p, #People .content ul, -#People .content table { - width: 560px; -} +#People .content table { width: 560px; } #people-f .content p, #people-f .content ul, -#people-f .content table { - width: 680px; -} - +#people-f .content table { width: 680px; } /************************************************************** examples ***/ @@ -1336,16 +1246,12 @@ p.doc-float { margin-left: 250px; } p.doc { margin-right: 40px; margin-top: 30px;} pre.code { clear: both; margin-top: 10px; } -/* #examples-nav { margin-left: -44px; display: relative; } */ //#examples-nav { margin-left: 0px; display: relative; } .examples-nav-div { margin-left: -44px; margin-top: -10px; width: 480px; display: relative; align: left; } #examples-nav img { display: absolute; top: 15px; left: 100px; } -/*#Examples h1 { margin-bottom: 0; }*/ - - div.updateRequired { color:#999; } @@ -1361,7 +1267,9 @@ ul.examples { -webkit-column-count:3; /* Safari and Chrome */ column-count:3; } + ul.examples li { margin: 0; padding: 0; } + ul.examples ul { list-style: none; padding: 0; @@ -1369,58 +1277,80 @@ ul.examples ul { margin-bottom: 17px; width: 100%; } + ul.examples ul li { margin: 0; } + div.examples-nav { margin-left: -41px; margin-bottom: 17px; position: relative; } -div.examples-nav img { position: relative; top: 11px; } - - -/**************************************************************** updates, courses, happenings ***/ -/* -#Courses .content, #Updates .content, #Happenings .content { - width: 595px; - } -#Updates h2 { margin-top: 0 0 20px 0; } - - -.course-desc p { margin: 0; } -.course-desc p.date { margin: 0; } -.course-desc h3 { margin: 0; font-size: 1em; font-weight: bold; line-height: 1em; } -.course-desc { margin-bottom: 2em; } -*/ - -/************************************************************** comparison ***/ -/* - -#Compare h1 { margin-top: 2em; } -#Compare h2 { margin-bottom: 0; } -#Compare .threecol { float: left; width: 210px; margin-right: 20px; } -#Compare .threecol p { margin-top: 0; } - - -#Compare .content { - margin-left : 55px; - margin-right : 0px; - position: relative; -} -*/ - -/************************************************************** troubleshooting ***/ -/* -#Troubleshooting h1 { margin-top: 2em; } -#Troubleshooting h5 a { float: left; margin-left: -30px; } -ul.nostyle { margin: 0; padding: 0; list-style: none outside; } -#Troubleshooting td { padding-bottom: 1em; } -*/ - -/************************************************************** FAQ ***/ -/* -#FAQ h5 a { float: left; margin-left: -30px; } -*/ +div.examples-nav img { position: relative; top: 11px; } + .donate-card-row { + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; + margin-left: -10px; + margin-right: -10px; + } + + .donate-card { + text-align: center; + width: 30%; + border: 1px solid #CBCBCB; + /*background: #FAFAFA;*/ + padding: 20px; + margin: 10px; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + } + + .donate-card h4 { + line-height: 1.3; + margin: 0 0 0 0; + color: #2c7bb5; + } + + a.donate-card { + color: #252525; + } + + a.donate-card:hover { + border-color: #2c7bb5; + } + + .donate-list { + list-style: none; + margin-left: 0; + padding-left: 0; + } + + .donate-list li { + margin-bottom: 0; + } + + .donate-list li:before { + content: '» ' + } + + .donate-content hr { + margin-top: 2em; + margin-bottom: 2em; + background: none; + border: none; + border-top: 1px solid #CBCBCB; + } diff --git a/download/README.md b/download/README.md deleted file mode 100755 index d8599a827..000000000 --- a/download/README.md +++ /dev/null @@ -1,17 +0,0 @@ -## Processing Donation Form - -### Description - -The code here handles the Stripe and PayPal purchasing system for Processing Foundation. - -### Libraries/Classes Used -[Stripe Donation Form](https://github.com/tommymarshall/Stripe-Donation-Form/zipball/master) -[PayPal Express Checkout](https://github.com/maly/paypal) -[PHPMailer](https://github.com/Synchro/PHPMailer) - -### Feature Overview - -- Process donation using Stripe Payments & PayPal Express Checkout -- Send email reciept -- Log purchase -- Forward user to Downloads page \ No newline at end of file diff --git a/download/_downloads.php b/download/_downloads.php deleted file mode 100644 index 380560d2c..000000000 --- a/download/_downloads.php +++ /dev/null @@ -1,328 +0,0 @@ - -
    - -

    Download Processing. Processing is available for Linux, Mac OS X, and Windows. Select your choice to download the software below.

    - -
    Thank you for donating to the Processing Foundation.
    - - - -
    - - - - -
    - 2.2.1 - (19 May 2014) - -
    - - -
    - -
    - The list of revisions covers the differences between releases in detail. Please read the changes if you're new to the 2.0 series. -
    -
    -
    - - -
    -

    Stable Releases

    - -

    Earlier releases have been removed because we can only support the current versions of the software. To update old code, read the changes page. Per-release changes can be found in revisions.txt. If you have problems with the current release, please file a bug so that we can fix it. Older releases can also be built from the source. Read More about the releases and their numbering. Note that Android mode no longer works in Processing 1.5, you'll need to use a Processing 2 release to do Android development.

    -
    - - -
    -

    Pre-Releases

    - -

    The revisions cover incremental changes between releases, and are especially important to read for pre-releases.

    -
    - - -
    - Processing is Open Source Software. The PDE (Processing Development Environment) is released under the GNU GPL (General Public License). The export libraries (also known as 'core') are released under the GNU LGPL (Lesser General Public License). There's more information about Processing and Open Source in the FAQ and more information about the GNU GPL and GNU LGPL at opensource.org. Please contribute to Processing! -
    - -
    - - - - - - - - - diff --git a/download/_emailtest.php b/download/_emailtest.php deleted file mode 100644 index 61c0f87d4..000000000 --- a/download/_emailtest.php +++ /dev/null @@ -1,79 +0,0 @@ -
    - Scott"; -$name = "Scott Murray"; -$email = "shm@alignedleft.com"; - - - -// Build and send the email *using PHPMailer - -$mail = new PHPMailer(); - -$mail->SMTPDebug = 3; //0 is no debug output, 3 is verbose - -$mail->IsSMTP(); -$mail->SMTPAuth = true; -$mail->SMTPSecure = 'tls'; -$mail->Port = 25; -$mail->Host = $mailConfig['host']; -$mail->Username = $mailConfig['user']; -$mail->Password = $mailConfig['pass']; - -$mail->From = 'foundation@processing.org'; -$mail->FromName = 'Processing Foundation'; -$mail->addAddress($email, $name); -$mail->addBCC('foundation@processing.org'); - -$message = str_replace('%name%', $name , $body) . "\n\n"; -$message .= "Email: " . $email . "
    \n"; - -$mail->isHTML(true); -$mail->Subject = "Test message from Processing.org"; -$mail->Body = $message; - -if(!$mail->send()) { - echo 'Message could not be sent.'; - echo 'Mailer Error: ' . $mail->ErrorInfo; -} else { - echo 'Message has been sent'; -} - - -//echo("

    mailed returned " . $result . "

    "); -//echo("

    ErrorInfo is " . $mail->ErrorInfo . "

    "); - - - - - -exit; - -?> \ No newline at end of file diff --git a/download/_helpers.php b/download/_helpers.php deleted file mode 100644 index dc5c90325..000000000 --- a/download/_helpers.php +++ /dev/null @@ -1,24 +0,0 @@ - \ No newline at end of file diff --git a/download/_js/donate.js b/download/_js/donate.js deleted file mode 100644 index bd58eda3c..000000000 --- a/download/_js/donate.js +++ /dev/null @@ -1,54 +0,0 @@ -$(function(){ - - var $donateForm = $('#donateForm') - var $submit = $donateForm.find('input[type="submit"]') - var stripe = true - - // if($('input[name=type]:checked').val() != 'stripe'){ - // stripe = false - // $('.ccInfo').hide() - // } - - $('input[name=type]').on('change', function(){ - if($(this).val()=='stripe'){ - stripe = true - $('.ccInfo').show() - } else if($(this).val()=='paypal'){ - stripe = false - $('.ccInfo').hide() - } - }) - - var stripeResponseHandler = function(status, response) { - if (response.error) { - $('.messages').html(response.error.message) - $submit.prop('disabled', false).val('Complete Donation') - } else { - var token = response['id'] - $donateForm.append('') - $donateForm.get(0).submit() - } - } - - // $donateForm.validate() - $donateForm.on('submit',function(){ - $submit.prop('disabled', true).val('Processing...'); - - if(stripe){ - Stripe.createToken({ - name: $('.first-name').val() + ' ' + $('.last-name').val(), - number: $('.card-number').val(), - cvc: $('.card-cvc').val(), - exp_month: $('.card-expiry-month').val(), - exp_year: $('.card-expiry-year').val() - }, stripeResponseHandler); - - return false; - } - - if(!stripe){ - - } - }) - -}) \ No newline at end of file diff --git a/download/_js/jquery.validate.min.js b/download/_js/jquery.validate.min.js deleted file mode 100755 index cc0414e65..000000000 --- a/download/_js/jquery.validate.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery Validation Plugin - v1.11.0 - 2/4/2013 -* https://github.com/jzaefferer/jquery-validation -* Copyright (c) 2013 Jörn Zaefferer; Licensed MIT */ -(function(e){e.extend(e.fn,{validate:function(t){if(!this.length){t&&t.debug&&window.console&&console.warn("Nothing selected, can't validate, returning nothing.");return}var n=e.data(this[0],"validator");return n?n:(this.attr("novalidate","novalidate"),n=new e.validator(t,this[0]),e.data(this[0],"validator",n),n.settings.onsubmit&&(this.validateDelegate(":submit","click",function(t){n.settings.submitHandler&&(n.submitButton=t.target),e(t.target).hasClass("cancel")&&(n.cancelSubmit=!0)}),this.submit(function(t){function r(){var r;return n.settings.submitHandler?(n.submitButton&&(r=e("").attr("name",n.submitButton.name).val(n.submitButton.value).appendTo(n.currentForm)),n.settings.submitHandler.call(n,n.currentForm,t),n.submitButton&&r.remove(),!1):!0}return n.settings.debug&&t.preventDefault(),n.cancelSubmit?(n.cancelSubmit=!1,r()):n.form()?n.pendingRequest?(n.formSubmitted=!0,!1):r():(n.focusInvalid(),!1)})),n)},valid:function(){if(e(this[0]).is("form"))return this.validate().form();var t=!0,n=e(this[0].form).validate();return this.each(function(){t&=n.element(this)}),t},removeAttrs:function(t){var n={},r=this;return e.each(t.split(/\s/),function(e,t){n[t]=r.attr(t),r.removeAttr(t)}),n},rules:function(t,n){var r=this[0];if(t){var i=e.data(r.form,"validator").settings,s=i.rules,o=e.validator.staticRules(r);switch(t){case"add":e.extend(o,e.validator.normalizeRule(n)),s[r.name]=o,n.messages&&(i.messages[r.name]=e.extend(i.messages[r.name],n.messages));break;case"remove":if(!n)return delete s[r.name],o;var u={};return e.each(n.split(/\s/),function(e,t){u[t]=o[t],delete o[t]}),u}}var a=e.validator.normalizeRules(e.extend({},e.validator.classRules(r),e.validator.attributeRules(r),e.validator.dataRules(r),e.validator.staticRules(r)),r);if(a.required){var f=a.required;delete a.required,a=e.extend({required:f},a)}return a}}),e.extend(e.expr[":"],{blank:function(t){return!e.trim(""+t.value)},filled:function(t){return!!e.trim(""+t.value)},unchecked:function(e){return!e.checked}}),e.validator=function(t,n){this.settings=e.extend(!0,{},e.validator.defaults,t),this.currentForm=n,this.init()},e.validator.format=function(t,n){return arguments.length===1?function(){var n=e.makeArray(arguments);return n.unshift(t),e.validator.format.apply(this,n)}:(arguments.length>2&&n.constructor!==Array&&(n=e.makeArray(arguments).slice(1)),n.constructor!==Array&&(n=[n]),e.each(n,function(e,n){t=t.replace(new RegExp("\\{"+e+"\\}","g"),function(){return n})}),t)},e.extend(e.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",validClass:"valid",errorElement:"label",focusInvalid:!0,errorContainer:e([]),errorLabelContainer:e([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,onfocusin:function(e,t){this.lastActive=e,this.settings.focusCleanup&&!this.blockFocusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,e,this.settings.errorClass,this.settings.validClass),this.addWrapper(this.errorsFor(e)).hide())},onfocusout:function(e,t){!this.checkable(e)&&(e.name in this.submitted||!this.optional(e))&&this.element(e)},onkeyup:function(e,t){if(t.which===9&&this.elementValue(e)==="")return;(e.name in this.submitted||e===this.lastElement)&&this.element(e)},onclick:function(e,t){e.name in this.submitted?this.element(e):e.parentNode.name in this.submitted&&this.element(e.parentNode)},highlight:function(t,n,r){t.type==="radio"?this.findByName(t.name).addClass(n).removeClass(r):e(t).addClass(n).removeClass(r)},unhighlight:function(t,n,r){t.type==="radio"?this.findByName(t.name).removeClass(n).addClass(r):e(t).removeClass(n).addClass(r)}},setDefaults:function(t){e.extend(e.validator.defaults,t)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",creditcard:"Please enter a valid credit card number.",equalTo:"Please enter the same value again.",maxlength:e.validator.format("Please enter no more than {0} characters."),minlength:e.validator.format("Please enter at least {0} characters."),rangelength:e.validator.format("Please enter a value between {0} and {1} characters long."),range:e.validator.format("Please enter a value between {0} and {1}."),max:e.validator.format("Please enter a value less than or equal to {0}."),min:e.validator.format("Please enter a value greater than or equal to {0}.")},autoCreateRanges:!1,prototype:{init:function(){function r(t){var n=e.data(this[0].form,"validator"),r="on"+t.type.replace(/^validate/,"");n.settings[r]&&n.settings[r].call(n,this[0],t)}this.labelContainer=e(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||e(this.currentForm),this.containers=e(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var t=this.groups={};e.each(this.settings.groups,function(n,r){typeof r=="string"&&(r=r.split(/\s/)),e.each(r,function(e,r){t[r]=n})});var n=this.settings.rules;e.each(n,function(t,r){n[t]=e.validator.normalizeRule(r)}),e(this.currentForm).validateDelegate(":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'] ,[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'] ","focusin focusout keyup",r).validateDelegate("[type='radio'], [type='checkbox'], select, option","click",r),this.settings.invalidHandler&&e(this.currentForm).bind("invalid-form.validate",this.settings.invalidHandler)},form:function(){return this.checkForm(),e.extend(this.submitted,this.errorMap),this.invalid=e.extend({},this.errorMap),this.valid()||e(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var e=0,t=this.currentElements=this.elements();t[e];e++)this.check(t[e]);return this.valid()},element:function(t){t=this.validationTargetFor(this.clean(t)),this.lastElement=t,this.prepareElement(t),this.currentElements=e(t);var n=this.check(t)!==!1;return n?delete this.invalid[t.name]:this.invalid[t.name]=!0,this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),n},showErrors:function(t){if(t){e.extend(this.errorMap,t),this.errorList=[];for(var n in t)this.errorList.push({message:t[n],element:this.findByName(n)[0]});this.successList=e.grep(this.successList,function(e){return!(e.name in t)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){e.fn.resetForm&&e(this.currentForm).resetForm(),this.submitted={},this.lastElement=null,this.prepareForm(),this.hideErrors(),this.elements().removeClass(this.settings.errorClass).removeData("previousValue")},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(e){var t=0;for(var n in e)t++;return t},hideErrors:function(){this.addWrapper(this.toHide).hide()},valid:function(){return this.size()===0},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{e(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").focus().trigger("focusin")}catch(t){}},findLastActive:function(){var t=this.lastActive;return t&&e.grep(this.errorList,function(e){return e.element.name===t.name}).length===1&&t},elements:function(){var t=this,n={};return e(this.currentForm).find("input, select, textarea").not(":submit, :reset, :image, [disabled]").not(this.settings.ignore).filter(function(){return!this.name&&t.settings.debug&&window.console&&console.error("%o has no name assigned",this),this.name in n||!t.objectLength(e(this).rules())?!1:(n[this.name]=!0,!0)})},clean:function(t){return e(t)[0]},errors:function(){var t=this.settings.errorClass.replace(" ",".");return e(this.settings.errorElement+"."+t,this.errorContext)},reset:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=e([]),this.toHide=e([]),this.currentElements=e([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(e){this.reset(),this.toHide=this.errorsFor(e)},elementValue:function(t){var n=e(t).attr("type"),r=e(t).val();return n==="radio"||n==="checkbox"?e("input[name='"+e(t).attr("name")+"']:checked").val():typeof r=="string"?r.replace(/\r/g,""):r},check:function(t){t=this.validationTargetFor(this.clean(t));var n=e(t).rules(),r=!1,i=this.elementValue(t),s;for(var o in n){var u={method:o,parameters:n[o]};try{s=e.validator.methods[o].call(this,i,t,u.parameters);if(s==="dependency-mismatch"){r=!0;continue}r=!1;if(s==="pending"){this.toHide=this.toHide.not(this.errorsFor(t));return}if(!s)return this.formatAndAdd(t,u),!1}catch(a){throw this.settings.debug&&window.console&&console.log("Exception occured when checking element "+t.id+", check the '"+u.method+"' method.",a),a}}if(r)return;return this.objectLength(n)&&this.successList.push(t),!0},customDataMessage:function(t,n){return e(t).data("msg-"+n.toLowerCase())||t.attributes&&e(t).attr("data-msg-"+n.toLowerCase())},customMessage:function(e,t){var n=this.settings.messages[e];return n&&(n.constructor===String?n:n[t])},findDefined:function(){for(var e=0;eWarning: No message defined for "+t.name+"")},formatAndAdd:function(t,n){var r=this.defaultMessage(t,n.method),i=/\$?\{(\d+)\}/g;typeof r=="function"?r=r.call(this,n.parameters,t):i.test(r)&&(r=e.validator.format(r.replace(i,"{$1}"),n.parameters)),this.errorList.push({message:r,element:t}),this.errorMap[t.name]=r,this.submitted[t.name]=r},addWrapper:function(e){return this.settings.wrapper&&(e=e.add(e.parent(this.settings.wrapper))),e},defaultShowErrors:function(){var e,t;for(e=0;this.errorList[e];e++){var n=this.errorList[e];this.settings.highlight&&this.settings.highlight.call(this,n.element,this.settings.errorClass,this.settings.validClass),this.showLabel(n.element,n.message)}this.errorList.length&&(this.toShow=this.toShow.add(this.containers));if(this.settings.success)for(e=0;this.successList[e];e++)this.showLabel(this.successList[e]);if(this.settings.unhighlight)for(e=0,t=this.validElements();t[e];e++)this.settings.unhighlight.call(this,t[e],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return e(this.errorList).map(function(){return this.element})},showLabel:function(t,n){var r=this.errorsFor(t);r.length?(r.removeClass(this.settings.validClass).addClass(this.settings.errorClass),r.html(n)):(r=e("<"+this.settings.errorElement+">").attr("for",this.idOrName(t)).addClass(this.settings.errorClass).html(n||""),this.settings.wrapper&&(r=r.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.append(r).length||(this.settings.errorPlacement?this.settings.errorPlacement(r,e(t)):r.insertAfter(t))),!n&&this.settings.success&&(r.text(""),typeof this.settings.success=="string"?r.addClass(this.settings.success):this.settings.success(r,t)),this.toShow=this.toShow.add(r)},errorsFor:function(t){var n=this.idOrName(t);return this.errors().filter(function(){return e(this).attr("for")===n})},idOrName:function(e){return this.groups[e.name]||(this.checkable(e)?e.name:e.id||e.name)},validationTargetFor:function(e){return this.checkable(e)&&(e=this.findByName(e.name).not(this.settings.ignore)[0]),e},checkable:function(e){return/radio|checkbox/i.test(e.type)},findByName:function(t){return e(this.currentForm).find("[name='"+t+"']")},getLength:function(t,n){switch(n.nodeName.toLowerCase()){case"select":return e("option:selected",n).length;case"input":if(this.checkable(n))return this.findByName(n.name).filter(":checked").length}return t.length},depend:function(e,t){return this.dependTypes[typeof e]?this.dependTypes[typeof e](e,t):!0},dependTypes:{"boolean":function(e,t){return e},string:function(t,n){return!!e(t,n.form).length},"function":function(e,t){return e(t)}},optional:function(t){var n=this.elementValue(t);return!e.validator.methods.required.call(this,n,t)&&"dependency-mismatch"},startRequest:function(e){this.pending[e.name]||(this.pendingRequest++,this.pending[e.name]=!0)},stopRequest:function(t,n){this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[t.name],n&&this.pendingRequest===0&&this.formSubmitted&&this.form()?(e(this.currentForm).submit(),this.formSubmitted=!1):!n&&this.pendingRequest===0&&this.formSubmitted&&(e(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},previousValue:function(t){return e.data(t,"previousValue")||e.data(t,"previousValue",{old:null,valid:!0,message:this.defaultMessage(t,"remote")})}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(t,n){t.constructor===String?this.classRuleSettings[t]=n:e.extend(this.classRuleSettings,t)},classRules:function(t){var n={},r=e(t).attr("class");return r&&e.each(r.split(" "),function(){this in e.validator.classRuleSettings&&e.extend(n,e.validator.classRuleSettings[this])}),n},attributeRules:function(t){var n={},r=e(t);for(var i in e.validator.methods){var s;i==="required"?(s=r.get(0).getAttribute(i),s===""&&(s=!0),s=!!s):s=r.attr(i),s?n[i]=s:r[0].getAttribute("type")===i&&(n[i]=!0)}return n.maxlength&&/-1|2147483647|524288/.test(n.maxlength)&&delete n.maxlength,n},dataRules:function(t){var n,r,i={},s=e(t);for(n in e.validator.methods)r=s.data("rule-"+n.toLowerCase()),r!==undefined&&(i[n]=r);return i},staticRules:function(t){var n={},r=e.data(t.form,"validator");return r.settings.rules&&(n=e.validator.normalizeRule(r.settings.rules[t.name])||{}),n},normalizeRules:function(t,n){return e.each(t,function(r,i){if(i===!1){delete t[r];return}if(i.param||i.depends){var s=!0;switch(typeof i.depends){case"string":s=!!e(i.depends,n.form).length;break;case"function":s=i.depends.call(n,n)}s?t[r]=i.param!==undefined?i.param:!0:delete t[r]}}),e.each(t,function(r,i){t[r]=e.isFunction(i)?i(n):i}),e.each(["minlength","maxlength"],function(){t[this]&&(t[this]=Number(t[this]))}),e.each(["rangelength"],function(){var n;t[this]&&(e.isArray(t[this])?t[this]=[Number(t[this][0]),Number(t[this][1])]:typeof t[this]=="string"&&(n=t[this].split(/[\s,]+/),t[this]=[Number(n[0]),Number(n[1])]))}),e.validator.autoCreateRanges&&(t.min&&t.max&&(t.range=[t.min,t.max],delete t.min,delete t.max),t.minlength&&t.maxlength&&(t.rangelength=[t.minlength,t.maxlength],delete t.minlength,delete t.maxlength)),t},normalizeRule:function(t){if(typeof t=="string"){var n={};e.each(t.split(/\s/),function(){n[this]=!0}),t=n}return t},addMethod:function(t,n,r){e.validator.methods[t]=n,e.validator.messages[t]=r!==undefined?r:e.validator.messages[t],n.length<3&&e.validator.addClassRules(t,e.validator.normalizeRule(t))},methods:{required:function(t,n,r){if(!this.depend(r,n))return"dependency-mismatch";if(n.nodeName.toLowerCase()==="select"){var i=e(n).val();return i&&i.length>0}return this.checkable(n)?this.getLength(t,n)>0:e.trim(t).length>0},remote:function(t,n,r){if(this.optional(n))return"dependency-mismatch";var i=this.previousValue(n);this.settings.messages[n.name]||(this.settings.messages[n.name]={}),i.originalMessage=this.settings.messages[n.name].remote,this.settings.messages[n.name].remote=i.message,r=typeof r=="string"&&{url:r}||r;if(i.old===t)return i.valid;i.old=t;var s=this;this.startRequest(n);var o={};return o[n.name]=t,e.ajax(e.extend(!0,{url:r,mode:"abort",port:"validate"+n.name,dataType:"json",data:o,success:function(r){s.settings.messages[n.name].remote=i.originalMessage;var o=r===!0||r==="true";if(o){var u=s.formSubmitted;s.prepareElement(n),s.formSubmitted=u,s.successList.push(n),delete s.invalid[n.name],s.showErrors()}else{var a={},f=r||s.defaultMessage(n,"remote");a[n.name]=i.message=e.isFunction(f)?f(t):f,s.invalid[n.name]=!0,s.showErrors(a)}i.valid=o,s.stopRequest(n,o)}},r)),"pending"},minlength:function(t,n,r){var i=e.isArray(t)?t.length:this.getLength(e.trim(t),n);return this.optional(n)||i>=r},maxlength:function(t,n,r){var i=e.isArray(t)?t.length:this.getLength(e.trim(t),n);return this.optional(n)||i<=r},rangelength:function(t,n,r){var i=e.isArray(t)?t.length:this.getLength(e.trim(t),n);return this.optional(n)||i>=r[0]&&i<=r[1]},min:function(e,t,n){return this.optional(t)||e>=n},max:function(e,t,n){return this.optional(t)||e<=n},range:function(e,t,n){return this.optional(t)||e>=n[0]&&e<=n[1]},email:function(e,t){return this.optional(t)||/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(e)},url:function(e,t){return this.optional(t)||/^(https?|s?ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(e)},date:function(e,t){return this.optional(t)||!/Invalid|NaN/.test((new Date(e)).toString())},dateISO:function(e,t){return this.optional(t)||/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/.test(e)},number:function(e,t){return this.optional(t)||/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(e)},digits:function(e,t){return this.optional(t)||/^\d+$/.test(e)},creditcard:function(e,t){if(this.optional(t))return"dependency-mismatch";if(/[^0-9 \-]+/.test(e))return!1;var n=0,r=0,i=!1;e=e.replace(/\D/g,"");for(var s=e.length-1;s>=0;s--){var o=e.charAt(s);r=parseInt(o,10),i&&(r*=2)>9&&(r-=9),n+=r,i=!i}return n%10===0},equalTo:function(t,n,r){var i=e(r);return this.settings.onfocusout&&i.unbind(".validate-equalTo").bind("blur.validate-equalTo",function(){e(n).valid()}),t===i.val()}}}),e.format=e.validator.format})(jQuery),function(e){var t={};if(e.ajaxPrefilter)e.ajaxPrefilter(function(e,n,r){var i=e.port;e.mode==="abort"&&(t[i]&&t[i].abort(),t[i]=r)});else{var n=e.ajax;e.ajax=function(r){var i=("mode"in r?r:e.ajaxSettings).mode,s=("port"in r?r:e.ajaxSettings).port;return i==="abort"?(t[s]&&t[s].abort(),t[s]=n.apply(this,arguments)):n.apply(this,arguments)}}}(jQuery),function(e){e.extend(e.fn,{validateDelegate:function(t,n,r){return this.bind(n,function(n){var i=e(n.target);if(i.is(t))return r.apply(i,arguments)})}})}(jQuery); \ No newline at end of file diff --git a/download/_js/select.js b/download/_js/select.js deleted file mode 100644 index 7ac3da94b..000000000 --- a/download/_js/select.js +++ /dev/null @@ -1,44 +0,0 @@ -$(function(){ - - var $selectForm = $('#selectForm') - var $radio = $selectForm.find('input[type="radio"]') - var $wildCard = $selectForm.find('input[type="radio"]#wildcard') - var $otherAmount = $selectForm.find('input#otra') - var $radioChecked = $selectForm.find('input[name="radioChecked"]') - var $submit = $selectForm.find('input[type="submit"]') - - if($('input[name=selectAmount]:checked').val() == 0) - $submit.val('Download') - - $radio.on('change', function(){ - $radioChecked.val(1) - if($(this).val()==0) - $submit.val('Download') - else - $submit.val('Donate & Download') - }) - - $otherAmount.on('change', function(){ - $wildCard.val($(this).val()) - }) - - $selectForm.on('submit',function(){ - - if($radioChecked.val() <= 0){ - $('.messages').html('Please select a donation amount') - return false - } - - if($('input[name=selectAmount]:checked').val() == 'other' && $('#otra').val() == ''){ - $('.messages').html('Please enter a donation amount') - return false - } - - if($('input[name=selectAmount]:checked').val() == 0){ - window.location = '/download/?processing' - return false - } - - }) - -}) \ No newline at end of file diff --git a/download/_paymentForm.php b/download/_paymentForm.php deleted file mode 100644 index d3f7808b2..000000000 --- a/download/_paymentForm.php +++ /dev/null @@ -1,62 +0,0 @@ -

    Download Processing. Please consider making a donation to the Processing Foundation before downloading the software.

    - - \ No newline at end of file diff --git a/download/_paypalProcessing.php b/download/_paypalProcessing.php deleted file mode 100644 index 4d0c08ea9..000000000 --- a/download/_paypalProcessing.php +++ /dev/null @@ -1,21 +0,0 @@ -doExpressCheckout($amount, 'Donation to the Processing Foundation')); - -//An error occured. The auxiliary information is in the $ret array - -echo 'Error:'; - -print_r($ret); - -?> \ No newline at end of file diff --git a/download/_ppEmailThanks.php b/download/_ppEmailThanks.php deleted file mode 100644 index d477f43d2..000000000 --- a/download/_ppEmailThanks.php +++ /dev/null @@ -1,74 +0,0 @@ -doPayment(); - -if ($final['ACK'] == 'Success') { - - $payment = $r->getCheckoutDetails($final['TOKEN']); - - //If payment from PayPal is successful, send out our thankyou email - $first_name = $payment['FIRSTNAME']; - $last_name = $payment['LASTNAME']; - $name = $first_name . ' ' . $last_name; - $email = $payment['EMAIL']; - $amount = $payment['CUSTOM']; - $amount = explode("|", $amount, 2); - $amount = $amount[0]; - $date = $payment['TIMESTAMP']; - $date = strtotime($date); - - // Build and send the email *using PHPMailer - $mail = new PHPMailer(); - - $mail->SMTPDebug = 0; //0 is no debug output, 3 is verbose - - $mail->IsSMTP(); - $mail->SMTPAuth = true; - $mail->SMTPSecure = 'tls'; - $mail->Port = 25; - $mail->Host = $mailConfig['host']; - $mail->Username = $mailConfig['user']; - $mail->Password = $mailConfig['pass']; - - $mail->From = 'foundation@processing.org'; - $mail->FromName = 'Processing Foundation'; - $mail->addAddress($email, $name); - $mail->addBCC('foundation@processing.org'); - - // Build message from PayPal values. Find and replace from config email - $message = str_replace('%name%', $name , $config['email-message']) . "\n\n"; - $message .= "Amount: $" . $amount . "
    \n"; - $message .= "Email: " . $email . "
    \n"; - $message .= "Date: " . date('M j, Y', $date) . "

    \n"; - $message .= "Best regards, and thanks again,
    Ben Fry, Casey Reas, and Dan Shiffman"; - - $mail->isHTML(true); - $mail->Subject = $config['email-subject']; - $mail->Body = $message; - - $mail->Send(); - - $log = __DIR__ . '/../../../cred/purchases.log'; - $cleanDate = date('Y-m-d', $date); - $data = $cleanDate."\t".$amount."\t".'paypal'."\t".$name."\t".$email."\t".get_client_ip()."\n"; - file_put_contents($log, $data, FILE_APPEND | LOCK_EX); - - -} - -?> \ No newline at end of file diff --git a/download/_selectForm.php b/download/_selectForm.php deleted file mode 100644 index a3ac30aff..000000000 --- a/download/_selectForm.php +++ /dev/null @@ -1,35 +0,0 @@ -

    Download Processing. Please consider making a donation to the Processing Foundation before downloading the software.

    - - - - \ No newline at end of file diff --git a/download/_stripeProcessing.php b/download/_stripeProcessing.php deleted file mode 100644 index 67dc7876d..000000000 --- a/download/_stripeProcessing.php +++ /dev/null @@ -1,97 +0,0 @@ - $token, - 'description' => 'Donation by ' . $name . ' (' . $email . ')', - 'amount' => $amount * 100, - 'currency' => 'usd') - ); - - // Build and send the email *using PHPMailer - $mail = new PHPMailer(); - - $mail->SMTPDebug = 0; //0 is no debug output, 3 is verbose - - $mail->IsSMTP(); - $mail->SMTPAuth = true; - $mail->SMTPSecure = 'tls'; - $mail->Port = 25; - $mail->Host = $mailConfig['host']; - $mail->Username = $mailConfig['user']; - $mail->Password = $mailConfig['pass']; - - $mail->From = 'foundation@processing.org'; - $mail->FromName = 'Processing Foundation'; - $mail->addAddress($email, $name); - $mail->addBCC('foundation@processing.org'); - - // Build message from Stripe values. Find and replace from config email - $message = str_replace('%name%', $name , $config['email-message']) . "\n\n"; - $message .= "Amount: $" . $amount . "
    \n"; - $message .= "Email: " . $email . "
    \n"; - $message .= "Date: " . date('M j, Y', $donation['created']) . "
    \n"; - $message .= "Transaction ID: " . $donation['id'] . "

    \n\n\n"; - $message .= "Best regards, and thanks again,
    Ben Fry, Casey Reas, and Dan Shiffman"; - - $mail->isHTML(true); - $mail->Subject = $config['email-subject']; - $mail->Body = $message; - - $mail->Send(); - - $log = __DIR__ . '/../../../cred/purchases.log'; - $cleanDate = date('Y-m-d', $donation['created']); - $data = $cleanDate."\t".$amount."\t".'stripe'."\t".$name."\t".$email."\t".get_client_ip()."\n"; - file_put_contents($log, $data, FILE_APPEND | LOCK_EX); - - - // Forward to "Downloads" page - header('Location: ' . $config['download']); - exit; - - } - catch (Stripe_Error $e) { - $showPaymentForm = true; - $dinky = $e->getJsonBody(); - $dinky = $dinky['error']['message']; - } - catch (Exception $e) { - $error = $e->getMessage(); - } -} - -?> \ No newline at end of file diff --git a/download/index.php b/download/index.php deleted file mode 100755 index 9a16b65ea..000000000 --- a/download/index.php +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - Download \ Processing.org - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - -
    - - - - - - - - - -
    - - - - -
    - - - diff --git a/download/install-arm.sh b/download/install-arm.sh new file mode 100755 index 000000000..b70361d77 --- /dev/null +++ b/download/install-arm.sh @@ -0,0 +1,41 @@ +#!/bin/sh + +# This script installs the latest version of Processing for ARM into /usr/local/lib +# Run it like this: "curl https://processing.org/download/install-arm.sh | sudo sh" + +# check if on a 64-bit operating system +case "$(file $(which file))" in + *aarch64*) FLAVOR="arm64"; TAR="$(curl -sL https://api.github.com/repos/processing/processing/releases | grep -oh -m 1 'https.*linux-arm64.tgz')" ;; + *) FLAVOR="armv6hf"; TAR="$(curl -sL https://api.github.com/repos/processing/processing/releases | grep -oh -m 1 'https.*linux-armv6hf.tgz')" ;; +esac + +echo "" +echo "Downloading $TAR..." +curl -L $TAR > processing-linux-$FLAVOR-latest.tgz + +echo "Installing in /usr/local..." +tar fx processing-linux-$FLAVOR-latest.tgz -C /usr/local/lib +rm -f processing-linux-$FLAVOR-latest.tgz + +# this returns the highest version installed +VER="$(basename $(ls -dvr /usr/local/lib/processing-* | head -1))" + +# symlink target might be a directory, replace +rm -rf /usr/local/lib/processing +ln -s $VER /usr/local/lib/processing + +# this assumes that /usr/local/bin is in $PATH +ln -sf ../lib/processing/processing /usr/local/bin/processing +ln -sf ../lib/processing/processing-java /usr/local/bin/processing-java + +# this assumes that the desktop manager picks up .desktop files in /usr/local/share/applications +mkdir -p /usr/local/share/applications +curl -sL https://raw.githubusercontent.com/processing/processing/master/build/linux/processing.desktop > /usr/local/share/applications/processing.desktop +sed -i "s/@version@/$VER/" /usr/local/share/applications/processing.desktop +sed -i 's|/opt/processing|/usr/local/lib/processing|' /usr/local/share/applications/processing.desktop + +# silence validation errors +desktop-file-install /usr/local/share/applications/processing.desktop >/dev/null 2>&1 + +echo "Done! You can start Processing by running processing in the terminal, or through the applications menu (might require a restart)." +echo "" diff --git a/download/latest.txt b/download/latest.txt index 68265ee97..98de25a15 100644 --- a/download/latest.txt +++ b/download/latest.txt @@ -1,2 +1,2 @@ -0227 +1276 diff --git a/download/paypal/httprequest.php b/download/paypal/httprequest.php deleted file mode 100755 index d4ebaa45a..000000000 --- a/download/paypal/httprequest.php +++ /dev/null @@ -1,131 +0,0 @@ -host = $host; - $this->rawhost = $ssl ? ("ssl://".$host) : $host; - $this->path = $path; - $this->method = strtoupper($method); - if ($port) { - $this->port = $port; - } else { - if (!$ssl) $this->port = 80; else $this->port = 443; - } - } - - public function connect( $data = ''){ - $fp = fsockopen($this->rawhost, $this->port); - if (!$fp) return false; - fputs($fp, "$this->method $this->path HTTP/1.1\r\n"); - fputs($fp, "Host: $this->host\r\n"); - //fputs($fp, "Content-type: $contenttype\r\n"); - fputs($fp, "Content-length: ".strlen($data)."\r\n"); - fputs($fp, "Connection: close\r\n"); - fputs($fp, "\r\n"); - fputs($fp, $data); - - $responseHeader = ''; - $responseContent = ''; - - do - { - $responseHeader.= fread($fp, 1); - } - while (!preg_match('/\\r\\n\\r\\n$/', $responseHeader)); - - - if (!strstr($responseHeader, "Transfer-Encoding: chunked")) - { - while (!feof($fp)) - { - $responseContent.= fgets($fp, 128); - } - } - else - { - - while ($chunk_length = hexdec(fgets($fp))) - { - $responseContentChunk = ''; - - $read_length = 0; - - while ($read_length < $chunk_length) - { - $responseContentChunk .= fread($fp, $chunk_length - $read_length); - $read_length = strlen($responseContentChunk); - } - - $responseContent.= $responseContentChunk; - - fgets($fp); - - } - - } - - $this->header = chop($responseHeader); - $this->content = $responseContent; - $this->parsedHeader = $this->headerParse(); - - $code = intval(trim(substr($this->parsedHeader[0], 9))); - - return $code; - } - - function headerParse(){ - $h = $this->header; - $a=explode("\r\n", $h); - $out = array(); - foreach ($a as $v){ - $k = strpos($v, ':'); - if ($k) { - $key = trim(substr($v,0,$k)); - $value = trim(substr($v,$k+1)); - if (!$key) continue; - $out[$key] = $value; - } else - { - if ($v) $out[] = $v; - } - } - return $out; - } - - public function getContent() {return $this->content;} - public function getHeader() {return $this->parsedHeader;} - - -} - - -?> \ No newline at end of file diff --git a/download/paypal/paypal.php b/download/paypal/paypal.php deleted file mode 100755 index 3749018ba..000000000 --- a/download/paypal/paypal.php +++ /dev/null @@ -1,194 +0,0 @@ - nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY MARTIN MALY ''AS IS'' AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL MARTIN MALY BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -class PayPal { - - //these constants you have to obtain from PayPal - //Step-by-step manual is here: https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_api_NVPAPIBasics - - private $endpoint; - private $host; - private $gate; - - function __construct($real = false) { - $this->endpoint = '/nvp'; - if ($real) { - $this->host = "api-3t.paypal.com"; - $this->gate = 'https://www.paypal.com/cgi-bin/webscr?'; - } else { - //sandbox - $this->host = "api-3t.sandbox.paypal.com"; - $this->gate = 'https://www.sandbox.paypal.com/cgi-bin/webscr?'; - } - } - - /** - * @return HTTPRequest - */ - private function response($data){ - $r = new HTTPRequest($this->host, $this->endpoint, 'POST', true); - $result = $r->connect($data); - if ($result<400) return $r; - return false; - } - - private function buildQuery($data = array()){ - $data['USER'] = API_USERNAME; - $data['PWD'] = API_PASSWORD; - $data['SIGNATURE'] = API_SIGNATURE; - $data['VERSION'] = '52.0'; - $query = http_build_query($data); - return $query; - } - - - /** - * Main payment function - * - * If OK, the customer is redirected to PayPal gateway - * If error, the error info is returned - * - * @param float $amount Amount (2 numbers after decimal point) - * @param string $desc Item description - * @param string $invoice Invoice number (can be omitted) - * @param string $currency 3-letter currency code (USD, GBP, CZK etc.) - * - * @return array error info - */ - public function doExpressCheckout($amount, $desc, $invoice='', $currency='USD'){ - $data = array( - 'PAYMENTACTION' =>'Sale', - 'AMT' =>$amount, - 'RETURNURL' => PP_RETURN, - 'CANCELURL' => PP_CANCEL, - 'DESC'=>$desc, - 'NOSHIPPING'=>"1", - 'ALLOWNOTE'=>"1", - 'CURRENCYCODE'=>$currency, - 'METHOD' =>'SetExpressCheckout'); - - $data['CUSTOM'] = $amount.'|'.$currency.'|'.$invoice; - if ($invoice) $data['INVNUM'] = $invoice; - - $query = $this->buildQuery($data); - - $result = $this->response($query); - - if (!$result) return false; - $response = $result->getContent(); - $return = $this->responseParse($response); - - if ($return['ACK'] == 'Success') { - header('Location: '.$this->gate.'cmd=_express-checkout&useraction=commit&token='.$return['TOKEN'].''); - die(); - } - return($return); - } - - public function getCheckoutDetails($token){ - $data = array( - 'TOKEN' => $token, - 'METHOD' =>'GetExpressCheckoutDetails'); - $query = $this->buildQuery($data); - - $result = $this->response($query); - - if (!$result) return false; - $response = $result->getContent(); - $return = $this->responseParse($response); - return($return); - } - public function doPayment(){ - $token = $_GET['token']; - $payer = $_GET['PayerID']; - $details = $this->getCheckoutDetails($token); - if (!$details) return false; - list($amount,$currency,$invoice) = explode('|',$details['CUSTOM']); - $data = array( - 'PAYMENTACTION' => 'Sale', - 'PAYERID' => $payer, - 'TOKEN' =>$token, - 'AMT' => $amount, - 'CURRENCYCODE'=>$currency, - 'METHOD' =>'DoExpressCheckoutPayment'); - $query = $this->buildQuery($data); - - $result = $this->response($query); - - if (!$result) return false; - $response = $result->getContent(); - $return = $this->responseParse($response); - - /* - * [AMT] => 10.00 - * [CURRENCYCODE] => USD - * [PAYMENTSTATUS] => Completed - * [PENDINGREASON] => None - * [REASONCODE] => None - */ - - return($return); - } - - private function getScheme() { - $scheme = 'http'; - if (isset($_SERVER['HTTPS']) and $_SERVER['HTTPS'] == 'on') { - $scheme .= 's'; - } - return $scheme; - } - - private function responseParse($resp){ - $a=explode("&", $resp); - $out = array(); - foreach ($a as $v){ - $k = strpos($v, '='); - if ($k) { - $key = trim(substr($v,0,$k)); - $value = trim(substr($v,$k+1)); - if (!$key) continue; - $out[$key] = urldecode($value); - } else { - $out[] = $v; - } - } - return $out; - } -} - -?> \ No newline at end of file diff --git a/download/phpmailer/class.phpmailer.php b/download/phpmailer/class.phpmailer.php deleted file mode 100755 index 2be4b8e90..000000000 --- a/download/phpmailer/class.phpmailer.php +++ /dev/null @@ -1,2780 +0,0 @@ -UseSendmailOptions) ) { - $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($subject)), $body, $header); - } else { - $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($subject)), $body, $header, $params); - } - return $rt; - } - - /** - * Outputs debugging info via user-defined method - * @param string $str - */ - private function edebug($str) { - if ($this->Debugoutput == "error_log") { - error_log($str); - } else { - echo $str; - } - } - - /** - * Constructor - * @param boolean $exceptions Should we throw external exceptions? - */ - public function __construct($exceptions = false) { - $this->exceptions = ($exceptions == true); - } - - /** - * Sets message type to HTML. - * @param bool $ishtml - * @return void - */ - public function IsHTML($ishtml = true) { - if ($ishtml) { - $this->ContentType = 'text/html'; - } else { - $this->ContentType = 'text/plain'; - } - } - - /** - * Sets Mailer to send message using SMTP. - * @return void - */ - public function IsSMTP() { - $this->Mailer = 'smtp'; - } - - /** - * Sets Mailer to send message using PHP mail() function. - * @return void - */ - public function IsMail() { - $this->Mailer = 'mail'; - } - - /** - * Sets Mailer to send message using the $Sendmail program. - * @return void - */ - public function IsSendmail() { - if (!stristr(ini_get('sendmail_path'), 'sendmail')) { - $this->Sendmail = '/var/qmail/bin/sendmail'; - } - $this->Mailer = 'sendmail'; - } - - /** - * Sets Mailer to send message using the qmail MTA. - * @return void - */ - public function IsQmail() { - if (stristr(ini_get('sendmail_path'), 'qmail')) { - $this->Sendmail = '/var/qmail/bin/sendmail'; - } - $this->Mailer = 'sendmail'; - } - - ///////////////////////////////////////////////// - // METHODS, RECIPIENTS - ///////////////////////////////////////////////// - - /** - * Adds a "To" address. - * @param string $address - * @param string $name - * @return boolean true on success, false if address already used - */ - public function AddAddress($address, $name = '') { - return $this->AddAnAddress('to', $address, $name); - } - - /** - * Adds a "Cc" address. - * Note: this function works with the SMTP mailer on win32, not with the "mail" mailer. - * @param string $address - * @param string $name - * @return boolean true on success, false if address already used - */ - public function AddCC($address, $name = '') { - return $this->AddAnAddress('cc', $address, $name); - } - - /** - * Adds a "Bcc" address. - * Note: this function works with the SMTP mailer on win32, not with the "mail" mailer. - * @param string $address - * @param string $name - * @return boolean true on success, false if address already used - */ - public function AddBCC($address, $name = '') { - return $this->AddAnAddress('bcc', $address, $name); - } - - /** - * Adds a "Reply-to" address. - * @param string $address - * @param string $name - * @return boolean - */ - public function AddReplyTo($address, $name = '') { - return $this->AddAnAddress('Reply-To', $address, $name); - } - - /** - * Adds an address to one of the recipient arrays - * Addresses that have been added already return false, but do not throw exceptions - * @param string $kind One of 'to', 'cc', 'bcc', 'ReplyTo' - * @param string $address The email address to send to - * @param string $name - * @throws phpmailerException - * @return boolean true on success, false if address already used or invalid in some way - * @access protected - */ - protected function AddAnAddress($kind, $address, $name = '') { - if (!preg_match('/^(to|cc|bcc|Reply-To)$/', $kind)) { - $this->SetError($this->Lang('Invalid recipient array').': '.$kind); - if ($this->exceptions) { - throw new phpmailerException('Invalid recipient array: ' . $kind); - } - if ($this->SMTPDebug) { - $this->edebug($this->Lang('Invalid recipient array').': '.$kind); - } - return false; - } - $address = trim($address); - $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim - if (!$this->ValidateAddress($address)) { - $this->SetError($this->Lang('invalid_address').': '. $address); - if ($this->exceptions) { - throw new phpmailerException($this->Lang('invalid_address').': '.$address); - } - if ($this->SMTPDebug) { - $this->edebug($this->Lang('invalid_address').': '.$address); - } - return false; - } - if ($kind != 'Reply-To') { - if (!isset($this->all_recipients[strtolower($address)])) { - array_push($this->$kind, array($address, $name)); - $this->all_recipients[strtolower($address)] = true; - return true; - } - } else { - if (!array_key_exists(strtolower($address), $this->ReplyTo)) { - $this->ReplyTo[strtolower($address)] = array($address, $name); - return true; - } - } - return false; -} - - /** - * Set the From and FromName properties - * @param string $address - * @param string $name - * @param int $auto Also set Reply-To and Sender - * @throws phpmailerException - * @return boolean - */ - public function SetFrom($address, $name = '', $auto = 1) { - $address = trim($address); - $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim - if (!$this->ValidateAddress($address)) { - $this->SetError($this->Lang('invalid_address').': '. $address); - if ($this->exceptions) { - throw new phpmailerException($this->Lang('invalid_address').': '.$address); - } - if ($this->SMTPDebug) { - $this->edebug($this->Lang('invalid_address').': '.$address); - } - return false; - } - $this->From = $address; - $this->FromName = $name; - if ($auto) { - if (empty($this->ReplyTo)) { - $this->AddAnAddress('Reply-To', $address, $name); - } - if (empty($this->Sender)) { - $this->Sender = $address; - } - } - return true; - } - - /** - * Check that a string looks roughly like an email address should - * Static so it can be used without instantiation, public so people can overload - * Conforms to RFC5322: Uses *correct* regex on which FILTER_VALIDATE_EMAIL is - * based; So why not use FILTER_VALIDATE_EMAIL? Because it was broken to - * not allow a@b type valid addresses :( - * @link http://squiloople.com/2009/12/20/email-address-validation/ - * @copyright regex Copyright Michael Rushton 2009-10 | http://squiloople.com/ | Feel free to use and redistribute this code. But please keep this copyright notice. - * @param string $address The email address to check - * @return boolean - * @static - * @access public - */ - public static function ValidateAddress($address) { - if (defined('PCRE_VERSION')) { //Check this instead of extension_loaded so it works when that function is disabled - if (version_compare(PCRE_VERSION, '8.0') >= 0) { - return (boolean)preg_match('/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD', $address); - } else { - //Fall back to an older regex that doesn't need a recent PCRE - return (boolean)preg_match('/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD', $address); - } - } else { - //No PCRE! Do something _very_ approximate! - //Check the address is 3 chars or longer and contains an @ that's not the first or last char - return (strlen($address) >= 3 and strpos($address, '@') >= 1 and strpos($address, '@') != strlen($address) - 1); - } - } - - ///////////////////////////////////////////////// - // METHODS, MAIL SENDING - ///////////////////////////////////////////////// - - /** - * Creates message and assigns Mailer. If the message is - * not sent successfully then it returns false. Use the ErrorInfo - * variable to view description of the error. - * @throws phpmailerException - * @return bool - */ - public function Send() { - try { - if(!$this->PreSend()) return false; - return $this->PostSend(); - } catch (phpmailerException $e) { - $this->mailHeader = ''; - $this->SetError($e->getMessage()); - if ($this->exceptions) { - throw $e; - } - return false; - } - } - - /** - * Prep mail by constructing all message entities - * @throws phpmailerException - * @return bool - */ - public function PreSend() { - try { - $this->mailHeader = ""; - if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) { - throw new phpmailerException($this->Lang('provide_address'), self::STOP_CRITICAL); - } - - // Set whether the message is multipart/alternative - if(!empty($this->AltBody)) { - $this->ContentType = 'multipart/alternative'; - } - - $this->error_count = 0; // reset errors - $this->SetMessageType(); - //Refuse to send an empty message - if (empty($this->Body)) { - throw new phpmailerException($this->Lang('empty_message'), self::STOP_CRITICAL); - } - - $this->MIMEHeader = $this->CreateHeader(); - $this->MIMEBody = $this->CreateBody(); - - // To capture the complete message when using mail(), create - // an extra header list which CreateHeader() doesn't fold in - if ($this->Mailer == 'mail') { - if (count($this->to) > 0) { - $this->mailHeader .= $this->AddrAppend("To", $this->to); - } else { - $this->mailHeader .= $this->HeaderLine("To", "undisclosed-recipients:;"); - } - $this->mailHeader .= $this->HeaderLine('Subject', $this->EncodeHeader($this->SecureHeader(trim($this->Subject)))); - } - - // digitally sign with DKIM if enabled - if (!empty($this->DKIM_domain) && !empty($this->DKIM_private) && !empty($this->DKIM_selector) && !empty($this->DKIM_domain) && file_exists($this->DKIM_private)) { - $header_dkim = $this->DKIM_Add($this->MIMEHeader, $this->EncodeHeader($this->SecureHeader($this->Subject)), $this->MIMEBody); - $this->MIMEHeader = str_replace("\r\n", "\n", $header_dkim) . $this->MIMEHeader; - } - - return true; - - } catch (phpmailerException $e) { - $this->SetError($e->getMessage()); - if ($this->exceptions) { - throw $e; - } - return false; - } - } - - /** - * Actual Email transport function - * Send the email via the selected mechanism - * @throws phpmailerException - * @return bool - */ - public function PostSend() { - try { - // Choose the mailer and send through it - switch($this->Mailer) { - case 'sendmail': - return $this->SendmailSend($this->MIMEHeader, $this->MIMEBody); - case 'smtp': - return $this->SmtpSend($this->MIMEHeader, $this->MIMEBody); - case 'mail': - return $this->MailSend($this->MIMEHeader, $this->MIMEBody); - default: - return $this->MailSend($this->MIMEHeader, $this->MIMEBody); - } - } catch (phpmailerException $e) { - $this->SetError($e->getMessage()); - if ($this->exceptions) { - throw $e; - } - if ($this->SMTPDebug) { - $this->edebug($e->getMessage()."\n"); - } - } - return false; - } - - /** - * Sends mail using the $Sendmail program. - * @param string $header The message headers - * @param string $body The message body - * @throws phpmailerException - * @access protected - * @return bool - */ - protected function SendmailSend($header, $body) { - if ($this->Sender != '') { - $sendmail = sprintf("%s -oi -f%s -t", escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender)); - } else { - $sendmail = sprintf("%s -oi -t", escapeshellcmd($this->Sendmail)); - } - if ($this->SingleTo === true) { - foreach ($this->SingleToArray as $val) { - if(!@$mail = popen($sendmail, 'w')) { - throw new phpmailerException($this->Lang('execute') . $this->Sendmail, self::STOP_CRITICAL); - } - fputs($mail, "To: " . $val . "\n"); - fputs($mail, $header); - fputs($mail, $body); - $result = pclose($mail); - // implement call back function if it exists - $isSent = ($result == 0) ? 1 : 0; - $this->doCallback($isSent, $val, $this->cc, $this->bcc, $this->Subject, $body); - if($result != 0) { - throw new phpmailerException($this->Lang('execute') . $this->Sendmail, self::STOP_CRITICAL); - } - } - } else { - if(!@$mail = popen($sendmail, 'w')) { - throw new phpmailerException($this->Lang('execute') . $this->Sendmail, self::STOP_CRITICAL); - } - fputs($mail, $header); - fputs($mail, $body); - $result = pclose($mail); - // implement call back function if it exists - $isSent = ($result == 0) ? 1 : 0; - $this->doCallback($isSent, $this->to, $this->cc, $this->bcc, $this->Subject, $body); - if($result != 0) { - throw new phpmailerException($this->Lang('execute') . $this->Sendmail, self::STOP_CRITICAL); - } - } - return true; - } - - /** - * Sends mail using the PHP mail() function. - * @param string $header The message headers - * @param string $body The message body - * @throws phpmailerException - * @access protected - * @return bool - */ - protected function MailSend($header, $body) { - $toArr = array(); - foreach($this->to as $t) { - $toArr[] = $this->AddrFormat($t); - } - $to = implode(', ', $toArr); - - if (empty($this->Sender)) { - $params = "-oi "; - } else { - $params = sprintf("-oi -f%s", $this->Sender); - } - if ($this->Sender != '' and !ini_get('safe_mode')) { - $old_from = ini_get('sendmail_from'); - ini_set('sendmail_from', $this->Sender); - } - $rt = false; - if ($this->SingleTo === true && count($toArr) > 1) { - foreach ($toArr as $val) { - $rt = $this->mail_passthru($val, $this->Subject, $body, $header, $params); - // implement call back function if it exists - $isSent = ($rt == 1) ? 1 : 0; - $this->doCallback($isSent, $val, $this->cc, $this->bcc, $this->Subject, $body); - } - } else { - $rt = $this->mail_passthru($to, $this->Subject, $body, $header, $params); - // implement call back function if it exists - $isSent = ($rt == 1) ? 1 : 0; - $this->doCallback($isSent, $to, $this->cc, $this->bcc, $this->Subject, $body); - } - if (isset($old_from)) { - ini_set('sendmail_from', $old_from); - } - if(!$rt) { - throw new phpmailerException($this->Lang('instantiate'), self::STOP_CRITICAL); - } - return true; - } - - /** - * Sends mail via SMTP using PhpSMTP - * Returns false if there is a bad MAIL FROM, RCPT, or DATA input. - * @param string $header The message headers - * @param string $body The message body - * @throws phpmailerException - * @uses SMTP - * @access protected - * @return bool - */ - protected function SmtpSend($header, $body) { - require_once $this->PluginDir . 'class.smtp.php'; - $bad_rcpt = array(); - - if(!$this->SmtpConnect()) { - throw new phpmailerException($this->Lang('smtp_connect_failed'), self::STOP_CRITICAL); - } - $smtp_from = ($this->Sender == '') ? $this->From : $this->Sender; - if(!$this->smtp->Mail($smtp_from)) { - $this->SetError($this->Lang('from_failed') . $smtp_from . ' : ' .implode(',', $this->smtp->getError())); - throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL); - } - - // Attempt to send attach all recipients - foreach($this->to as $to) { - if (!$this->smtp->Recipient($to[0])) { - $bad_rcpt[] = $to[0]; - // implement call back function if it exists - $isSent = 0; - $this->doCallback($isSent, $to[0], '', '', $this->Subject, $body); - } else { - // implement call back function if it exists - $isSent = 1; - $this->doCallback($isSent, $to[0], '', '', $this->Subject, $body); - } - } - foreach($this->cc as $cc) { - if (!$this->smtp->Recipient($cc[0])) { - $bad_rcpt[] = $cc[0]; - // implement call back function if it exists - $isSent = 0; - $this->doCallback($isSent, '', $cc[0], '', $this->Subject, $body); - } else { - // implement call back function if it exists - $isSent = 1; - $this->doCallback($isSent, '', $cc[0], '', $this->Subject, $body); - } - } - foreach($this->bcc as $bcc) { - if (!$this->smtp->Recipient($bcc[0])) { - $bad_rcpt[] = $bcc[0]; - // implement call back function if it exists - $isSent = 0; - $this->doCallback($isSent, '', '', $bcc[0], $this->Subject, $body); - } else { - // implement call back function if it exists - $isSent = 1; - $this->doCallback($isSent, '', '', $bcc[0], $this->Subject, $body); - } - } - - - if (count($bad_rcpt) > 0 ) { //Create error message for any bad addresses - $badaddresses = implode(', ', $bad_rcpt); - throw new phpmailerException($this->Lang('recipients_failed') . $badaddresses); - } - if(!$this->smtp->Data($header . $body)) { - throw new phpmailerException($this->Lang('data_not_accepted'), self::STOP_CRITICAL); - } - if($this->SMTPKeepAlive == true) { - $this->smtp->Reset(); - } else { - $this->smtp->Quit(); - $this->smtp->Close(); - } - return true; - } - - /** - * Initiates a connection to an SMTP server. - * Returns false if the operation failed. - * @uses SMTP - * @access public - * @throws phpmailerException - * @return bool - */ - public function SmtpConnect() { - if(is_null($this->smtp)) { - $this->smtp = new SMTP; - } - - $this->smtp->Timeout = $this->Timeout; - $this->smtp->do_debug = $this->SMTPDebug; - $hosts = explode(';', $this->Host); - $index = 0; - $connection = $this->smtp->Connected(); - - // Retry while there is no connection - try { - while($index < count($hosts) && !$connection) { - $hostinfo = array(); - if (preg_match('/^(.+):([0-9]+)$/', $hosts[$index], $hostinfo)) { - $host = $hostinfo[1]; - $port = $hostinfo[2]; - } else { - $host = $hosts[$index]; - $port = $this->Port; - } - - $tls = ($this->SMTPSecure == 'tls'); - $ssl = ($this->SMTPSecure == 'ssl'); - - if ($this->smtp->Connect(($ssl ? 'ssl://':'').$host, $port, $this->Timeout)) { - - $hello = ($this->Helo != '' ? $this->Helo : $this->ServerHostname()); - $this->smtp->Hello($hello); - - if ($tls) { - if (!$this->smtp->StartTLS()) { - throw new phpmailerException($this->Lang('connect_host')); - } - - //We must resend HELO after tls negotiation - $this->smtp->Hello($hello); - } - - $connection = true; - if ($this->SMTPAuth) { - if (!$this->smtp->Authenticate($this->Username, $this->Password, $this->AuthType, $this->Realm, $this->Workstation)) { - throw new phpmailerException($this->Lang('authenticate')); - } - } - } - $index++; - if (!$connection) { - throw new phpmailerException($this->Lang('connect_host')); - } - } - } catch (phpmailerException $e) { - $this->smtp->Reset(); - if ($this->exceptions) { - throw $e; - } - } - return true; - } - - /** - * Closes the active SMTP session if one exists. - * @return void - */ - public function SmtpClose() { - if ($this->smtp !== null) { - if($this->smtp->Connected()) { - $this->smtp->Quit(); - $this->smtp->Close(); - } - } - } - - /** - * Sets the language for all class error messages. - * Returns false if it cannot load the language file. The default language is English. - * @param string $langcode ISO 639-1 2-character language code (e.g. Portuguese: "br") - * @param string $lang_path Path to the language file directory - * @return bool - * @access public - */ - function SetLanguage($langcode = 'en', $lang_path = 'language/') { - //Define full set of translatable strings - $PHPMAILER_LANG = array( - 'authenticate' => 'SMTP Error: Could not authenticate.', - 'connect_host' => 'SMTP Error: Could not connect to SMTP host.', - 'data_not_accepted' => 'SMTP Error: Data not accepted.', - 'empty_message' => 'Message body empty', - 'encoding' => 'Unknown encoding: ', - 'execute' => 'Could not execute: ', - 'file_access' => 'Could not access file: ', - 'file_open' => 'File Error: Could not open file: ', - 'from_failed' => 'The following From address failed: ', - 'instantiate' => 'Could not instantiate mail function.', - 'invalid_address' => 'Invalid address', - 'mailer_not_supported' => ' mailer is not supported.', - 'provide_address' => 'You must provide at least one recipient email address.', - 'recipients_failed' => 'SMTP Error: The following recipients failed: ', - 'signing' => 'Signing Error: ', - 'smtp_connect_failed' => 'SMTP Connect() failed.', - 'smtp_error' => 'SMTP server error: ', - 'variable_set' => 'Cannot set or reset variable: ' - ); - //Overwrite language-specific strings. This way we'll never have missing translations - no more "language string failed to load"! - $l = true; - if ($langcode != 'en') { //There is no English translation file - $l = @include $lang_path.'phpmailer.lang-'.$langcode.'.php'; - } - $this->language = $PHPMAILER_LANG; - return ($l == true); //Returns false if language not found - } - - /** - * Return the current array of language strings - * @return array - */ - public function GetTranslations() { - return $this->language; - } - - ///////////////////////////////////////////////// - // METHODS, MESSAGE CREATION - ///////////////////////////////////////////////// - - /** - * Creates recipient headers. - * @access public - * @param string $type - * @param array $addr - * @return string - */ - public function AddrAppend($type, $addr) { - $addr_str = $type . ': '; - $addresses = array(); - foreach ($addr as $a) { - $addresses[] = $this->AddrFormat($a); - } - $addr_str .= implode(', ', $addresses); - $addr_str .= $this->LE; - - return $addr_str; - } - - /** - * Formats an address correctly. - * @access public - * @param string $addr - * @return string - */ - public function AddrFormat($addr) { - if (empty($addr[1])) { - return $this->SecureHeader($addr[0]); - } else { - return $this->EncodeHeader($this->SecureHeader($addr[1]), 'phrase') . " <" . $this->SecureHeader($addr[0]) . ">"; - } - } - - /** - * Wraps message for use with mailers that do not - * automatically perform wrapping and for quoted-printable. - * Original written by philippe. - * @param string $message The message to wrap - * @param integer $length The line length to wrap to - * @param boolean $qp_mode Whether to run in Quoted-Printable mode - * @access public - * @return string - */ - public function WrapText($message, $length, $qp_mode = false) { - $soft_break = ($qp_mode) ? sprintf(" =%s", $this->LE) : $this->LE; - // If utf-8 encoding is used, we will need to make sure we don't - // split multibyte characters when we wrap - $is_utf8 = (strtolower($this->CharSet) == "utf-8"); - $lelen = strlen($this->LE); - $crlflen = strlen(self::CRLF); - - $message = $this->FixEOL($message); - if (substr($message, -$lelen) == $this->LE) { - $message = substr($message, 0, -$lelen); - } - - $line = explode($this->LE, $message); // Magic. We know FixEOL uses $LE - $message = ''; - for ($i = 0 ;$i < count($line); $i++) { - $line_part = explode(' ', $line[$i]); - $buf = ''; - for ($e = 0; $e $length)) { - $space_left = $length - strlen($buf) - $crlflen; - if ($e != 0) { - if ($space_left > 20) { - $len = $space_left; - if ($is_utf8) { - $len = $this->UTF8CharBoundary($word, $len); - } elseif (substr($word, $len - 1, 1) == "=") { - $len--; - } elseif (substr($word, $len - 2, 1) == "=") { - $len -= 2; - } - $part = substr($word, 0, $len); - $word = substr($word, $len); - $buf .= ' ' . $part; - $message .= $buf . sprintf("=%s", self::CRLF); - } else { - $message .= $buf . $soft_break; - } - $buf = ''; - } - while (strlen($word) > 0) { - if ($length <= 0) { - break; - } - $len = $length; - if ($is_utf8) { - $len = $this->UTF8CharBoundary($word, $len); - } elseif (substr($word, $len - 1, 1) == "=") { - $len--; - } elseif (substr($word, $len - 2, 1) == "=") { - $len -= 2; - } - $part = substr($word, 0, $len); - $word = substr($word, $len); - - if (strlen($word) > 0) { - $message .= $part . sprintf("=%s", self::CRLF); - } else { - $buf = $part; - } - } - } else { - $buf_o = $buf; - $buf .= ($e == 0) ? $word : (' ' . $word); - - if (strlen($buf) > $length and $buf_o != '') { - $message .= $buf_o . $soft_break; - $buf = $word; - } - } - } - $message .= $buf . self::CRLF; - } - - return $message; - } - - /** - * Finds last character boundary prior to maxLength in a utf-8 - * quoted (printable) encoded string. - * Original written by Colin Brown. - * @access public - * @param string $encodedText utf-8 QP text - * @param int $maxLength find last character boundary prior to this length - * @return int - */ - public function UTF8CharBoundary($encodedText, $maxLength) { - $foundSplitPos = false; - $lookBack = 3; - while (!$foundSplitPos) { - $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack); - $encodedCharPos = strpos($lastChunk, "="); - if ($encodedCharPos !== false) { - // Found start of encoded character byte within $lookBack block. - // Check the encoded byte value (the 2 chars after the '=') - $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2); - $dec = hexdec($hex); - if ($dec < 128) { // Single byte character. - // If the encoded char was found at pos 0, it will fit - // otherwise reduce maxLength to start of the encoded char - $maxLength = ($encodedCharPos == 0) ? $maxLength : - $maxLength - ($lookBack - $encodedCharPos); - $foundSplitPos = true; - } elseif ($dec >= 192) { // First byte of a multi byte character - // Reduce maxLength to split at start of character - $maxLength = $maxLength - ($lookBack - $encodedCharPos); - $foundSplitPos = true; - } elseif ($dec < 192) { // Middle byte of a multi byte character, look further back - $lookBack += 3; - } - } else { - // No encoded character found - $foundSplitPos = true; - } - } - return $maxLength; - } - - - /** - * Set the body wrapping. - * @access public - * @return void - */ - public function SetWordWrap() { - if($this->WordWrap < 1) { - return; - } - - switch($this->message_type) { - case 'alt': - case 'alt_inline': - case 'alt_attach': - case 'alt_inline_attach': - $this->AltBody = $this->WrapText($this->AltBody, $this->WordWrap); - break; - default: - $this->Body = $this->WrapText($this->Body, $this->WordWrap); - break; - } - } - - /** - * Assembles message header. - * @access public - * @return string The assembled header - */ - public function CreateHeader() { - $result = ''; - - // Set the boundaries - $uniq_id = md5(uniqid(time())); - $this->boundary[1] = 'b1_' . $uniq_id; - $this->boundary[2] = 'b2_' . $uniq_id; - $this->boundary[3] = 'b3_' . $uniq_id; - - if ($this->MessageDate == '') { - $result .= $this->HeaderLine('Date', self::RFCDate()); - } else { - $result .= $this->HeaderLine('Date', $this->MessageDate); - } - - if ($this->ReturnPath) { - $result .= $this->HeaderLine('Return-Path', trim($this->ReturnPath)); - } elseif ($this->Sender == '') { - $result .= $this->HeaderLine('Return-Path', trim($this->From)); - } else { - $result .= $this->HeaderLine('Return-Path', trim($this->Sender)); - } - - // To be created automatically by mail() - if($this->Mailer != 'mail') { - if ($this->SingleTo === true) { - foreach($this->to as $t) { - $this->SingleToArray[] = $this->AddrFormat($t); - } - } else { - if(count($this->to) > 0) { - $result .= $this->AddrAppend('To', $this->to); - } elseif (count($this->cc) == 0) { - $result .= $this->HeaderLine('To', 'undisclosed-recipients:;'); - } - } - } - - $from = array(); - $from[0][0] = trim($this->From); - $from[0][1] = $this->FromName; - $result .= $this->AddrAppend('From', $from); - - // sendmail and mail() extract Cc from the header before sending - if(count($this->cc) > 0) { - $result .= $this->AddrAppend('Cc', $this->cc); - } - - // sendmail and mail() extract Bcc from the header before sending - if((($this->Mailer == 'sendmail') || ($this->Mailer == 'mail')) && (count($this->bcc) > 0)) { - $result .= $this->AddrAppend('Bcc', $this->bcc); - } - - if(count($this->ReplyTo) > 0) { - $result .= $this->AddrAppend('Reply-To', $this->ReplyTo); - } - - // mail() sets the subject itself - if($this->Mailer != 'mail') { - $result .= $this->HeaderLine('Subject', $this->EncodeHeader($this->SecureHeader($this->Subject))); - } - - if($this->MessageID != '') { - $result .= $this->HeaderLine('Message-ID', $this->MessageID); - } else { - $result .= sprintf("Message-ID: <%s@%s>%s", $uniq_id, $this->ServerHostname(), $this->LE); - } - $result .= $this->HeaderLine('X-Priority', $this->Priority); - if ($this->XMailer == '') { - $result .= $this->HeaderLine('X-Mailer', 'PHPMailer '.$this->Version.' (http://code.google.com/a/apache-extras.org/p/phpmailer/)'); - } else { - $myXmailer = trim($this->XMailer); - if ($myXmailer) { - $result .= $this->HeaderLine('X-Mailer', $myXmailer); - } - } - - if($this->ConfirmReadingTo != '') { - $result .= $this->HeaderLine('Disposition-Notification-To', '<' . trim($this->ConfirmReadingTo) . '>'); - } - - // Add custom headers - for($index = 0; $index < count($this->CustomHeader); $index++) { - $result .= $this->HeaderLine(trim($this->CustomHeader[$index][0]), $this->EncodeHeader(trim($this->CustomHeader[$index][1]))); - } - if (!$this->sign_key_file) { - $result .= $this->HeaderLine('MIME-Version', '1.0'); - $result .= $this->GetMailMIME(); - } - - return $result; - } - - /** - * Returns the message MIME. - * @access public - * @return string - */ - public function GetMailMIME() { - $result = ''; - switch($this->message_type) { - case 'inline': - $result .= $this->HeaderLine('Content-Type', 'multipart/related;'); - $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"'); - break; - case 'attach': - case 'inline_attach': - case 'alt_attach': - case 'alt_inline_attach': - $result .= $this->HeaderLine('Content-Type', 'multipart/mixed;'); - $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"'); - break; - case 'alt': - case 'alt_inline': - $result .= $this->HeaderLine('Content-Type', 'multipart/alternative;'); - $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"'); - break; - default: - // Catches case 'plain': and case '': - $result .= $this->HeaderLine('Content-Transfer-Encoding', $this->Encoding); - $result .= $this->TextLine('Content-Type: '.$this->ContentType.'; charset='.$this->CharSet); - break; - } - - if($this->Mailer != 'mail') { - $result .= $this->LE; - } - - return $result; - } - - /** - * Returns the MIME message (headers and body). Only really valid post PreSend(). - * @access public - * @return string - */ - public function GetSentMIMEMessage() { - return $this->MIMEHeader . $this->mailHeader . self::CRLF . $this->MIMEBody; - } - - - /** - * Assembles the message body. Returns an empty string on failure. - * @access public - * @throws phpmailerException - * @return string The assembled message body - */ - public function CreateBody() { - $body = ''; - - if ($this->sign_key_file) { - $body .= $this->GetMailMIME().$this->LE; - } - - $this->SetWordWrap(); - - switch($this->message_type) { - case 'inline': - $body .= $this->GetBoundary($this->boundary[1], '', '', ''); - $body .= $this->EncodeString($this->Body, $this->Encoding); - $body .= $this->LE.$this->LE; - $body .= $this->AttachAll('inline', $this->boundary[1]); - break; - case 'attach': - $body .= $this->GetBoundary($this->boundary[1], '', '', ''); - $body .= $this->EncodeString($this->Body, $this->Encoding); - $body .= $this->LE.$this->LE; - $body .= $this->AttachAll('attachment', $this->boundary[1]); - break; - case 'inline_attach': - $body .= $this->TextLine('--' . $this->boundary[1]); - $body .= $this->HeaderLine('Content-Type', 'multipart/related;'); - $body .= $this->TextLine("\tboundary=\"" . $this->boundary[2] . '"'); - $body .= $this->LE; - $body .= $this->GetBoundary($this->boundary[2], '', '', ''); - $body .= $this->EncodeString($this->Body, $this->Encoding); - $body .= $this->LE.$this->LE; - $body .= $this->AttachAll('inline', $this->boundary[2]); - $body .= $this->LE; - $body .= $this->AttachAll('attachment', $this->boundary[1]); - break; - case 'alt': - $body .= $this->GetBoundary($this->boundary[1], '', 'text/plain', ''); - $body .= $this->EncodeString($this->AltBody, $this->Encoding); - $body .= $this->LE.$this->LE; - $body .= $this->GetBoundary($this->boundary[1], '', 'text/html', ''); - $body .= $this->EncodeString($this->Body, $this->Encoding); - $body .= $this->LE.$this->LE; - $body .= $this->EndBoundary($this->boundary[1]); - break; - case 'alt_inline': - $body .= $this->GetBoundary($this->boundary[1], '', 'text/plain', ''); - $body .= $this->EncodeString($this->AltBody, $this->Encoding); - $body .= $this->LE.$this->LE; - $body .= $this->TextLine('--' . $this->boundary[1]); - $body .= $this->HeaderLine('Content-Type', 'multipart/related;'); - $body .= $this->TextLine("\tboundary=\"" . $this->boundary[2] . '"'); - $body .= $this->LE; - $body .= $this->GetBoundary($this->boundary[2], '', 'text/html', ''); - $body .= $this->EncodeString($this->Body, $this->Encoding); - $body .= $this->LE.$this->LE; - $body .= $this->AttachAll('inline', $this->boundary[2]); - $body .= $this->LE; - $body .= $this->EndBoundary($this->boundary[1]); - break; - case 'alt_attach': - $body .= $this->TextLine('--' . $this->boundary[1]); - $body .= $this->HeaderLine('Content-Type', 'multipart/alternative;'); - $body .= $this->TextLine("\tboundary=\"" . $this->boundary[2] . '"'); - $body .= $this->LE; - $body .= $this->GetBoundary($this->boundary[2], '', 'text/plain', ''); - $body .= $this->EncodeString($this->AltBody, $this->Encoding); - $body .= $this->LE.$this->LE; - $body .= $this->GetBoundary($this->boundary[2], '', 'text/html', ''); - $body .= $this->EncodeString($this->Body, $this->Encoding); - $body .= $this->LE.$this->LE; - $body .= $this->EndBoundary($this->boundary[2]); - $body .= $this->LE; - $body .= $this->AttachAll('attachment', $this->boundary[1]); - break; - case 'alt_inline_attach': - $body .= $this->TextLine('--' . $this->boundary[1]); - $body .= $this->HeaderLine('Content-Type', 'multipart/alternative;'); - $body .= $this->TextLine("\tboundary=\"" . $this->boundary[2] . '"'); - $body .= $this->LE; - $body .= $this->GetBoundary($this->boundary[2], '', 'text/plain', ''); - $body .= $this->EncodeString($this->AltBody, $this->Encoding); - $body .= $this->LE.$this->LE; - $body .= $this->TextLine('--' . $this->boundary[2]); - $body .= $this->HeaderLine('Content-Type', 'multipart/related;'); - $body .= $this->TextLine("\tboundary=\"" . $this->boundary[3] . '"'); - $body .= $this->LE; - $body .= $this->GetBoundary($this->boundary[3], '', 'text/html', ''); - $body .= $this->EncodeString($this->Body, $this->Encoding); - $body .= $this->LE.$this->LE; - $body .= $this->AttachAll('inline', $this->boundary[3]); - $body .= $this->LE; - $body .= $this->EndBoundary($this->boundary[2]); - $body .= $this->LE; - $body .= $this->AttachAll('attachment', $this->boundary[1]); - break; - default: - // catch case 'plain' and case '' - $body .= $this->EncodeString($this->Body, $this->Encoding); - break; - } - - if ($this->IsError()) { - $body = ''; - } elseif ($this->sign_key_file) { - try { - if (!defined('PKCS7_TEXT')) { - throw new phpmailerException($this->Lang('signing').' OpenSSL extension missing.'); - } - $file = tempnam(sys_get_temp_dir(), 'mail'); - file_put_contents($file, $body); //TODO check this worked - $signed = tempnam(sys_get_temp_dir(), 'signed'); - if (@openssl_pkcs7_sign($file, $signed, 'file://'.realpath($this->sign_cert_file), array('file://'.realpath($this->sign_key_file), $this->sign_key_pass), null)) { - @unlink($file); - $body = file_get_contents($signed); - @unlink($signed); - } else { - @unlink($file); - @unlink($signed); - throw new phpmailerException($this->Lang('signing').openssl_error_string()); - } - } catch (phpmailerException $e) { - $body = ''; - if ($this->exceptions) { - throw $e; - } - } - } - return $body; - } - - /** - * Returns the start of a message boundary. - * @access protected - * @param string $boundary - * @param string $charSet - * @param string $contentType - * @param string $encoding - * @return string - */ - protected function GetBoundary($boundary, $charSet, $contentType, $encoding) { - $result = ''; - if($charSet == '') { - $charSet = $this->CharSet; - } - if($contentType == '') { - $contentType = $this->ContentType; - } - if($encoding == '') { - $encoding = $this->Encoding; - } - $result .= $this->TextLine('--' . $boundary); - $result .= sprintf("Content-Type: %s; charset=%s", $contentType, $charSet); - $result .= $this->LE; - $result .= $this->HeaderLine('Content-Transfer-Encoding', $encoding); - $result .= $this->LE; - - return $result; - } - - /** - * Returns the end of a message boundary. - * @access protected - * @param string $boundary - * @return string - */ - protected function EndBoundary($boundary) { - return $this->LE . '--' . $boundary . '--' . $this->LE; - } - - /** - * Sets the message type. - * @access protected - * @return void - */ - protected function SetMessageType() { - $this->message_type = array(); - if($this->AlternativeExists()) $this->message_type[] = "alt"; - if($this->InlineImageExists()) $this->message_type[] = "inline"; - if($this->AttachmentExists()) $this->message_type[] = "attach"; - $this->message_type = implode("_", $this->message_type); - if($this->message_type == "") $this->message_type = "plain"; - } - - /** - * Returns a formatted header line. - * @access public - * @param string $name - * @param string $value - * @return string - */ - public function HeaderLine($name, $value) { - return $name . ': ' . $value . $this->LE; - } - - /** - * Returns a formatted mail line. - * @access public - * @param string $value - * @return string - */ - public function TextLine($value) { - return $value . $this->LE; - } - - ///////////////////////////////////////////////// - // CLASS METHODS, ATTACHMENTS - ///////////////////////////////////////////////// - - /** - * Adds an attachment from a path on the filesystem. - * Returns false if the file could not be found - * or accessed. - * @param string $path Path to the attachment. - * @param string $name Overrides the attachment name. - * @param string $encoding File encoding (see $Encoding). - * @param string $type File extension (MIME) type. - * @throws phpmailerException - * @return bool - */ - public function AddAttachment($path, $name = '', $encoding = 'base64', $type = 'application/octet-stream') { - try { - if ( !@is_file($path) ) { - throw new phpmailerException($this->Lang('file_access') . $path, self::STOP_CONTINUE); - } - $filename = basename($path); - if ( $name == '' ) { - $name = $filename; - } - - $this->attachment[] = array( - 0 => $path, - 1 => $filename, - 2 => $name, - 3 => $encoding, - 4 => $type, - 5 => false, // isStringAttachment - 6 => 'attachment', - 7 => 0 - ); - - } catch (phpmailerException $e) { - $this->SetError($e->getMessage()); - if ($this->exceptions) { - throw $e; - } - if ($this->SMTPDebug) { - $this->edebug($e->getMessage()."\n"); - } - if ( $e->getCode() == self::STOP_CRITICAL ) { - return false; - } - } - return true; - } - - /** - * Return the current array of attachments - * @return array - */ - public function GetAttachments() { - return $this->attachment; - } - - /** - * Attaches all fs, string, and binary attachments to the message. - * Returns an empty string on failure. - * @access protected - * @param string $disposition_type - * @param string $boundary - * @return string - */ - protected function AttachAll($disposition_type, $boundary) { - // Return text of body - $mime = array(); - $cidUniq = array(); - $incl = array(); - - // Add all attachments - foreach ($this->attachment as $attachment) { - // CHECK IF IT IS A VALID DISPOSITION_FILTER - if($attachment[6] == $disposition_type) { - // Check for string attachment - $string = ''; - $path = ''; - $bString = $attachment[5]; - if ($bString) { - $string = $attachment[0]; - } else { - $path = $attachment[0]; - } - - $inclhash = md5(serialize($attachment)); - if (in_array($inclhash, $incl)) { continue; } - $incl[] = $inclhash; - $filename = $attachment[1]; - $name = $attachment[2]; - $encoding = $attachment[3]; - $type = $attachment[4]; - $disposition = $attachment[6]; - $cid = $attachment[7]; - if ( $disposition == 'inline' && isset($cidUniq[$cid]) ) { continue; } - $cidUniq[$cid] = true; - - $mime[] = sprintf("--%s%s", $boundary, $this->LE); - $mime[] = sprintf("Content-Type: %s; name=\"%s\"%s", $type, $this->EncodeHeader($this->SecureHeader($name)), $this->LE); - $mime[] = sprintf("Content-Transfer-Encoding: %s%s", $encoding, $this->LE); - - if($disposition == 'inline') { - $mime[] = sprintf("Content-ID: <%s>%s", $cid, $this->LE); - } - - $mime[] = sprintf("Content-Disposition: %s; filename=\"%s\"%s", $disposition, $this->EncodeHeader($this->SecureHeader($name)), $this->LE.$this->LE); - - // Encode as string attachment - if($bString) { - $mime[] = $this->EncodeString($string, $encoding); - if($this->IsError()) { - return ''; - } - $mime[] = $this->LE.$this->LE; - } else { - $mime[] = $this->EncodeFile($path, $encoding); - if($this->IsError()) { - return ''; - } - $mime[] = $this->LE.$this->LE; - } - } - } - - $mime[] = sprintf("--%s--%s", $boundary, $this->LE); - - return implode("", $mime); - } - - /** - * Encodes attachment in requested format. - * Returns an empty string on failure. - * @param string $path The full path to the file - * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable' - * @throws phpmailerException - * @see EncodeFile() - * @access protected - * @return string - */ - protected function EncodeFile($path, $encoding = 'base64') { - try { - if (!is_readable($path)) { - throw new phpmailerException($this->Lang('file_open') . $path, self::STOP_CONTINUE); - } - $magic_quotes = get_magic_quotes_runtime(); - if ($magic_quotes) { - if (version_compare(PHP_VERSION, '5.3.0', '<')) { - set_magic_quotes_runtime(0); - } else { - ini_set('magic_quotes_runtime', 0); - } - } - $file_buffer = file_get_contents($path); - $file_buffer = $this->EncodeString($file_buffer, $encoding); - if ($magic_quotes) { - if (version_compare(PHP_VERSION, '5.3.0', '<')) { - set_magic_quotes_runtime($magic_quotes); - } else { - ini_set('magic_quotes_runtime', $magic_quotes); - } - } - return $file_buffer; - } catch (Exception $e) { - $this->SetError($e->getMessage()); - return ''; - } - } - - /** - * Encodes string to requested format. - * Returns an empty string on failure. - * @param string $str The text to encode - * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable' - * @access public - * @return string - */ - public function EncodeString($str, $encoding = 'base64') { - $encoded = ''; - switch(strtolower($encoding)) { - case 'base64': - $encoded = chunk_split(base64_encode($str), 76, $this->LE); - break; - case '7bit': - case '8bit': - $encoded = $this->FixEOL($str); - //Make sure it ends with a line break - if (substr($encoded, -(strlen($this->LE))) != $this->LE) - $encoded .= $this->LE; - break; - case 'binary': - $encoded = $str; - break; - case 'quoted-printable': - $encoded = $this->EncodeQP($str); - break; - default: - $this->SetError($this->Lang('encoding') . $encoding); - break; - } - return $encoded; - } - - /** - * Encode a header string to best (shortest) of Q, B, quoted or none. - * @access public - * @param string $str - * @param string $position - * @return string - */ - public function EncodeHeader($str, $position = 'text') { - $x = 0; - - switch (strtolower($position)) { - case 'phrase': - if (!preg_match('/[\200-\377]/', $str)) { - // Can't use addslashes as we don't know what value has magic_quotes_sybase - $encoded = addcslashes($str, "\0..\37\177\\\""); - if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) { - return ($encoded); - } else { - return ("\"$encoded\""); - } - } - $x = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches); - break; - case 'comment': - $x = preg_match_all('/[()"]/', $str, $matches); - // Fall-through - case 'text': - default: - $x += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches); - break; - } - - if ($x == 0) { - return ($str); - } - - $maxlen = 75 - 7 - strlen($this->CharSet); - // Try to select the encoding which should produce the shortest output - if (strlen($str)/3 < $x) { - $encoding = 'B'; - if (function_exists('mb_strlen') && $this->HasMultiBytes($str)) { - // Use a custom function which correctly encodes and wraps long - // multibyte strings without breaking lines within a character - $encoded = $this->Base64EncodeWrapMB($str, "\n"); - } else { - $encoded = base64_encode($str); - $maxlen -= $maxlen % 4; - $encoded = trim(chunk_split($encoded, $maxlen, "\n")); - } - } else { - $encoding = 'Q'; - $encoded = $this->EncodeQ($str, $position); - $encoded = $this->WrapText($encoded, $maxlen, true); - $encoded = str_replace('='.self::CRLF, "\n", trim($encoded)); - } - - $encoded = preg_replace('/^(.*)$/m', " =?".$this->CharSet."?$encoding?\\1?=", $encoded); - $encoded = trim(str_replace("\n", $this->LE, $encoded)); - - return $encoded; - } - - /** - * Checks if a string contains multibyte characters. - * @access public - * @param string $str multi-byte text to wrap encode - * @return bool - */ - public function HasMultiBytes($str) { - if (function_exists('mb_strlen')) { - return (strlen($str) > mb_strlen($str, $this->CharSet)); - } else { // Assume no multibytes (we can't handle without mbstring functions anyway) - return false; - } - } - - /** - * Correctly encodes and wraps long multibyte strings for mail headers - * without breaking lines within a character. - * Adapted from a function by paravoid at http://uk.php.net/manual/en/function.mb-encode-mimeheader.php - * @access public - * @param string $str multi-byte text to wrap encode - * @param string $lf string to use as linefeed/end-of-line - * @return string - */ - public function Base64EncodeWrapMB($str, $lf=null) { - $start = "=?".$this->CharSet."?B?"; - $end = "?="; - $encoded = ""; - if ($lf === null) { - $lf = $this->LE; - } - - $mb_length = mb_strlen($str, $this->CharSet); - // Each line must have length <= 75, including $start and $end - $length = 75 - strlen($start) - strlen($end); - // Average multi-byte ratio - $ratio = $mb_length / strlen($str); - // Base64 has a 4:3 ratio - $offset = $avgLength = floor($length * $ratio * .75); - - for ($i = 0; $i < $mb_length; $i += $offset) { - $lookBack = 0; - - do { - $offset = $avgLength - $lookBack; - $chunk = mb_substr($str, $i, $offset, $this->CharSet); - $chunk = base64_encode($chunk); - $lookBack++; - } - while (strlen($chunk) > $length); - - $encoded .= $chunk . $lf; - } - - // Chomp the last linefeed - $encoded = substr($encoded, 0, -strlen($lf)); - return $encoded; - } - - /** - * Encode string to RFC2045 (6.7) quoted-printable format - * @access public - * @param string $string The text to encode - * @param integer $line_max Number of chars allowed on a line before wrapping - * @return string - * @link PHP version adapted from http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 - */ - public function EncodeQP($string, $line_max = 76) { - if (function_exists('quoted_printable_encode')) { //Use native function if it's available (>= PHP5.3) - return quoted_printable_encode($string); - } - //Fall back to a pure PHP implementation - $string = str_replace(array('%20', '%0D%0A.', '%0D%0A', '%'), array(' ', "\r\n=2E", "\r\n", '='), rawurlencode($string)); - $string = preg_replace('/[^\r\n]{'.($line_max - 3).'}[^=\r\n]{2}/', "$0=\r\n", $string); - return $string; - } - - /** - * Wrapper to preserve BC for old QP encoding function that was removed - * @see EncodeQP() - * @access public - * @param string $string - * @param integer $line_max - * @param bool $space_conv - * @return string - */ - public function EncodeQPphp($string, $line_max = 76, $space_conv = false) { - return $this->EncodeQP($string, $line_max); - } - - /** - * Encode string to q encoding. - * @link http://tools.ietf.org/html/rfc2047 - * @param string $str the text to encode - * @param string $position Where the text is going to be used, see the RFC for what that means - * @access public - * @return string - */ - public function EncodeQ($str, $position = 'text') { - //There should not be any EOL in the string - $pattern=""; - $encoded = str_replace(array("\r", "\n"), '', $str); - switch (strtolower($position)) { - case 'phrase': - $pattern = '^A-Za-z0-9!*+\/ -'; - break; - - case 'comment': - $pattern = '\(\)"'; - //note that we don't break here! - //for this reason we build the $pattern without including delimiters and [] - - case 'text': - default: - //Replace every high ascii, control =, ? and _ characters - //We put \075 (=) as first value to make sure it's the first one in being converted, preventing double encode - $pattern = '\075\000-\011\013\014\016-\037\077\137\177-\377' . $pattern; - break; - } - - if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) { - foreach (array_unique($matches[0]) as $char) { - $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded); - } - } - - //Replace every spaces to _ (more readable than =20) - return str_replace(' ', '_', $encoded); -} - - - /** - * Adds a string or binary attachment (non-filesystem) to the list. - * This method can be used to attach ascii or binary data, - * such as a BLOB record from a database. - * @param string $string String attachment data. - * @param string $filename Name of the attachment. - * @param string $encoding File encoding (see $Encoding). - * @param string $type File extension (MIME) type. - * @return void - */ - public function AddStringAttachment($string, $filename, $encoding = 'base64', $type = 'application/octet-stream') { - // Append to $attachment array - $this->attachment[] = array( - 0 => $string, - 1 => $filename, - 2 => basename($filename), - 3 => $encoding, - 4 => $type, - 5 => true, // isStringAttachment - 6 => 'attachment', - 7 => 0 - ); - } - - /** - * Add an embedded attachment from a file. - * This can include images, sounds, and just about any other document type. - * Be sure to set the $type to an image type for images: - * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'. - * @param string $path Path to the attachment. - * @param string $cid Content ID of the attachment; Use this to reference - * the content when using an embedded image in HTML. - * @param string $name Overrides the attachment name. - * @param string $encoding File encoding (see $Encoding). - * @param string $type File MIME type. - * @return bool True on successfully adding an attachment - */ - public function AddEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = 'application/octet-stream') { - - if ( !@is_file($path) ) { - $this->SetError($this->Lang('file_access') . $path); - return false; - } - - $filename = basename($path); - if ( $name == '' ) { - $name = $filename; - } - - // Append to $attachment array - $this->attachment[] = array( - 0 => $path, - 1 => $filename, - 2 => $name, - 3 => $encoding, - 4 => $type, - 5 => false, // isStringAttachment - 6 => 'inline', - 7 => $cid - ); - return true; - } - - - /** - * Add an embedded stringified attachment. - * This can include images, sounds, and just about any other document type. - * Be sure to set the $type to an image type for images: - * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'. - * @param string $string The attachment binary data. - * @param string $cid Content ID of the attachment; Use this to reference - * the content when using an embedded image in HTML. - * @param string $filename A name for the attachment - * @param string $encoding File encoding (see $Encoding). - * @param string $type MIME type. - * @return bool True on successfully adding an attachment - */ - public function AddStringEmbeddedImage($string, $cid, $name = '', $encoding = 'base64', $type = 'application/octet-stream') { - // Append to $attachment array - $this->attachment[] = array( - 0 => $string, - 1 => $name, - 2 => $name, - 3 => $encoding, - 4 => $type, - 5 => true, // isStringAttachment - 6 => 'inline', - 7 => $cid - ); - return true; - } - - /** - * Returns true if an inline attachment is present. - * @access public - * @return bool - */ - public function InlineImageExists() { - foreach($this->attachment as $attachment) { - if ($attachment[6] == 'inline') { - return true; - } - } - return false; - } - - /** - * Returns true if an attachment (non-inline) is present. - * @return bool - */ - public function AttachmentExists() { - foreach($this->attachment as $attachment) { - if ($attachment[6] == 'attachment') { - return true; - } - } - return false; - } - - /** - * Does this message have an alternative body set? - * @return bool - */ - public function AlternativeExists() { - return !empty($this->AltBody); - } - - ///////////////////////////////////////////////// - // CLASS METHODS, MESSAGE RESET - ///////////////////////////////////////////////// - - /** - * Clears all recipients assigned in the TO array. Returns void. - * @return void - */ - public function ClearAddresses() { - foreach($this->to as $to) { - unset($this->all_recipients[strtolower($to[0])]); - } - $this->to = array(); - } - - /** - * Clears all recipients assigned in the CC array. Returns void. - * @return void - */ - public function ClearCCs() { - foreach($this->cc as $cc) { - unset($this->all_recipients[strtolower($cc[0])]); - } - $this->cc = array(); - } - - /** - * Clears all recipients assigned in the BCC array. Returns void. - * @return void - */ - public function ClearBCCs() { - foreach($this->bcc as $bcc) { - unset($this->all_recipients[strtolower($bcc[0])]); - } - $this->bcc = array(); - } - - /** - * Clears all recipients assigned in the ReplyTo array. Returns void. - * @return void - */ - public function ClearReplyTos() { - $this->ReplyTo = array(); - } - - /** - * Clears all recipients assigned in the TO, CC and BCC - * array. Returns void. - * @return void - */ - public function ClearAllRecipients() { - $this->to = array(); - $this->cc = array(); - $this->bcc = array(); - $this->all_recipients = array(); - } - - /** - * Clears all previously set filesystem, string, and binary - * attachments. Returns void. - * @return void - */ - public function ClearAttachments() { - $this->attachment = array(); - } - - /** - * Clears all custom headers. Returns void. - * @return void - */ - public function ClearCustomHeaders() { - $this->CustomHeader = array(); - } - - ///////////////////////////////////////////////// - // CLASS METHODS, MISCELLANEOUS - ///////////////////////////////////////////////// - - /** - * Adds the error message to the error container. - * @access protected - * @param string $msg - * @return void - */ - protected function SetError($msg) { - $this->error_count++; - if ($this->Mailer == 'smtp' and !is_null($this->smtp)) { - $lasterror = $this->smtp->getError(); - if (!empty($lasterror) and array_key_exists('smtp_msg', $lasterror)) { - $msg .= '

    ' . $this->Lang('smtp_error') . $lasterror['smtp_msg'] . "

    \n"; - } - } - $this->ErrorInfo = $msg; - } - - /** - * Returns the proper RFC 822 formatted date. - * @access public - * @return string - * @static - */ - public static function RFCDate() { - $tz = date('Z'); - $tzs = ($tz < 0) ? '-' : '+'; - $tz = abs($tz); - $tz = (int)($tz/3600)*100 + ($tz%3600)/60; - $result = sprintf("%s %s%04d", date('D, j M Y H:i:s'), $tzs, $tz); - - return $result; - } - - /** - * Returns the server hostname or 'localhost.localdomain' if unknown. - * @access protected - * @return string - */ - protected function ServerHostname() { - if (!empty($this->Hostname)) { - $result = $this->Hostname; - } elseif (isset($_SERVER['SERVER_NAME'])) { - $result = $_SERVER['SERVER_NAME']; - } else { - $result = 'localhost.localdomain'; - } - - return $result; - } - - /** - * Returns a message in the appropriate language. - * @access protected - * @param string $key - * @return string - */ - protected function Lang($key) { - if(count($this->language) < 1) { - $this->SetLanguage('en'); // set the default language - } - - if(isset($this->language[$key])) { - return $this->language[$key]; - } else { - return 'Language string failed to load: ' . $key; - } - } - - /** - * Returns true if an error occurred. - * @access public - * @return bool - */ - public function IsError() { - return ($this->error_count > 0); - } - - /** - * Changes every end of line from CRLF, CR or LF to $this->LE. - * @access public - * @param string $str String to FixEOL - * @return string - */ - public function FixEOL($str) { - // condense down to \n - $nstr = str_replace(array("\r\n", "\r"), "\n", $str); - // Now convert LE as needed - if ($this->LE !== "\n") { - $nstr = str_replace("\n", $this->LE, $nstr); - } - return $nstr; - } - - /** - * Adds a custom header. $name value can be overloaded to contain - * both header name and value (name:value) - * @access public - * @param string $name custom header name - * @param string $value header value - * @return void - */ - public function AddCustomHeader($name, $value=null) { - if ($value === null) { - // Value passed in as name:value - $this->CustomHeader[] = explode(':', $name, 2); - } else { - $this->CustomHeader[] = array($name, $value); - } - } - - /** - * Evaluates the message and returns modifications for inline images and backgrounds - * Overwrites any existing values in $this->Body and $this->AltBody - * @access public - * @param string $message Text to be HTML modified - * @param string $basedir baseline directory for path - * @return string $message - */ - public function MsgHTML($message, $basedir = '') { - preg_match_all("/(src|background)=[\"'](.*)[\"']/Ui", $message, $images); - if(isset($images[2])) { - foreach($images[2] as $i => $url) { - // do not change urls for absolute images (thanks to corvuscorax) - if (!preg_match('#^[A-z]+://#', $url)) { - $filename = basename($url); - $directory = dirname($url); - if ($directory == '.') { - $directory = ''; - } - $cid = 'cid:' . md5($url); - $ext = pathinfo($filename, PATHINFO_EXTENSION); - $mimeType = self::_mime_types($ext); - if ( strlen($basedir) > 1 && substr($basedir, -1) != '/') { $basedir .= '/'; } - if ( strlen($directory) > 1 && substr($directory, -1) != '/') { $directory .= '/'; } - if ( $this->AddEmbeddedImage($basedir.$directory.$filename, md5($url), $filename, 'base64', $mimeType) ) { - $message = preg_replace("/".$images[1][$i]."=[\"']".preg_quote($url, '/')."[\"']/Ui", $images[1][$i]."=\"".$cid."\"", $message); - } - } - } - } - $this->IsHTML(true); - $this->Body = $message; - $this->AltBody = $this->html2text($message); - if (empty($this->AltBody)) { - $this->AltBody = 'To view this email message, open it in a program that understands HTML!' . "\n\n"; - } - return $message; - } - - /** - * Convert an HTML string into a plain text version - * @param string $html The HTML text to convert - * @return string - */ - public function html2text($html) { - return html_entity_decode(trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/s', '', $html))), ENT_QUOTES, $this->CharSet); - } - - /** - * Gets the MIME type of the embedded or inline image - * @param string $ext File extension - * @access public - * @return string MIME type of ext - * @static - */ - public static function _mime_types($ext = '') { - $mimes = array( - 'xl' => 'application/excel', - 'hqx' => 'application/mac-binhex40', - 'cpt' => 'application/mac-compactpro', - 'bin' => 'application/macbinary', - 'doc' => 'application/msword', - 'word' => 'application/msword', - 'class' => 'application/octet-stream', - 'dll' => 'application/octet-stream', - 'dms' => 'application/octet-stream', - 'exe' => 'application/octet-stream', - 'lha' => 'application/octet-stream', - 'lzh' => 'application/octet-stream', - 'psd' => 'application/octet-stream', - 'sea' => 'application/octet-stream', - 'so' => 'application/octet-stream', - 'oda' => 'application/oda', - 'pdf' => 'application/pdf', - 'ai' => 'application/postscript', - 'eps' => 'application/postscript', - 'ps' => 'application/postscript', - 'smi' => 'application/smil', - 'smil' => 'application/smil', - 'mif' => 'application/vnd.mif', - 'xls' => 'application/vnd.ms-excel', - 'ppt' => 'application/vnd.ms-powerpoint', - 'wbxml' => 'application/vnd.wap.wbxml', - 'wmlc' => 'application/vnd.wap.wmlc', - 'dcr' => 'application/x-director', - 'dir' => 'application/x-director', - 'dxr' => 'application/x-director', - 'dvi' => 'application/x-dvi', - 'gtar' => 'application/x-gtar', - 'php3' => 'application/x-httpd-php', - 'php4' => 'application/x-httpd-php', - 'php' => 'application/x-httpd-php', - 'phtml' => 'application/x-httpd-php', - 'phps' => 'application/x-httpd-php-source', - 'js' => 'application/x-javascript', - 'swf' => 'application/x-shockwave-flash', - 'sit' => 'application/x-stuffit', - 'tar' => 'application/x-tar', - 'tgz' => 'application/x-tar', - 'xht' => 'application/xhtml+xml', - 'xhtml' => 'application/xhtml+xml', - 'zip' => 'application/zip', - 'mid' => 'audio/midi', - 'midi' => 'audio/midi', - 'mp2' => 'audio/mpeg', - 'mp3' => 'audio/mpeg', - 'mpga' => 'audio/mpeg', - 'aif' => 'audio/x-aiff', - 'aifc' => 'audio/x-aiff', - 'aiff' => 'audio/x-aiff', - 'ram' => 'audio/x-pn-realaudio', - 'rm' => 'audio/x-pn-realaudio', - 'rpm' => 'audio/x-pn-realaudio-plugin', - 'ra' => 'audio/x-realaudio', - 'wav' => 'audio/x-wav', - 'bmp' => 'image/bmp', - 'gif' => 'image/gif', - 'jpeg' => 'image/jpeg', - 'jpe' => 'image/jpeg', - 'jpg' => 'image/jpeg', - 'png' => 'image/png', - 'tiff' => 'image/tiff', - 'tif' => 'image/tiff', - 'eml' => 'message/rfc822', - 'css' => 'text/css', - 'html' => 'text/html', - 'htm' => 'text/html', - 'shtml' => 'text/html', - 'log' => 'text/plain', - 'text' => 'text/plain', - 'txt' => 'text/plain', - 'rtx' => 'text/richtext', - 'rtf' => 'text/rtf', - 'xml' => 'text/xml', - 'xsl' => 'text/xml', - 'mpeg' => 'video/mpeg', - 'mpe' => 'video/mpeg', - 'mpg' => 'video/mpeg', - 'mov' => 'video/quicktime', - 'qt' => 'video/quicktime', - 'rv' => 'video/vnd.rn-realvideo', - 'avi' => 'video/x-msvideo', - 'movie' => 'video/x-sgi-movie' - ); - return (!isset($mimes[strtolower($ext)])) ? 'application/octet-stream' : $mimes[strtolower($ext)]; - } - - /** - * Set (or reset) Class Objects (variables) - * - * Usage Example: - * $page->set('X-Priority', '3'); - * - * @access public - * @param string $name Parameter Name - * @param mixed $value Parameter Value - * NOTE: will not work with arrays, there are no arrays to set/reset - * @throws phpmailerException - * @return bool - * @todo Should this not be using __set() magic function? - */ - public function set($name, $value = '') { - try { - if (isset($this->$name) ) { - $this->$name = $value; - } else { - throw new phpmailerException($this->Lang('variable_set') . $name, self::STOP_CRITICAL); - } - } catch (Exception $e) { - $this->SetError($e->getMessage()); - if ($e->getCode() == self::STOP_CRITICAL) { - return false; - } - } - return true; - } - - /** - * Strips newlines to prevent header injection. - * @access public - * @param string $str String - * @return string - */ - public function SecureHeader($str) { - return trim(str_replace(array("\r", "\n"), '', $str)); - } - - /** - * Set the private key file and password to sign the message. - * - * @access public - * @param $cert_filename - * @param string $key_filename Parameter File Name - * @param string $key_pass Password for private key - */ - public function Sign($cert_filename, $key_filename, $key_pass) { - $this->sign_cert_file = $cert_filename; - $this->sign_key_file = $key_filename; - $this->sign_key_pass = $key_pass; - } - - /** - * Set the private key file and password to sign the message. - * - * @access public - * @param string $txt - * @return string - */ - public function DKIM_QP($txt) { - $line = ''; - for ($i = 0; $i < strlen($txt); $i++) { - $ord = ord($txt[$i]); - if ( ((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E)) ) { - $line .= $txt[$i]; - } else { - $line .= "=".sprintf("%02X", $ord); - } - } - return $line; - } - - /** - * Generate DKIM signature - * - * @access public - * @param string $s Header - * @throws phpmailerException - * @return string - */ - public function DKIM_Sign($s) { - if (!defined('PKCS7_TEXT')) { - if ($this->exceptions) { - throw new phpmailerException($this->Lang("signing").' OpenSSL extension missing.'); - } - return ''; - } - $privKeyStr = file_get_contents($this->DKIM_private); - if ($this->DKIM_passphrase != '') { - $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase); - } else { - $privKey = $privKeyStr; - } - if (openssl_sign($s, $signature, $privKey)) { - return base64_encode($signature); - } - return ''; - } - - /** - * Generate DKIM Canonicalization Header - * - * @access public - * @param string $s Header - * @return string - */ - public function DKIM_HeaderC($s) { - $s = preg_replace("/\r\n\s+/", " ", $s); - $lines = explode("\r\n", $s); - foreach ($lines as $key => $line) { - list($heading, $value) = explode(":", $line, 2); - $heading = strtolower($heading); - $value = preg_replace("/\s+/", " ", $value) ; // Compress useless spaces - $lines[$key] = $heading.":".trim($value) ; // Don't forget to remove WSP around the value - } - $s = implode("\r\n", $lines); - return $s; - } - - /** - * Generate DKIM Canonicalization Body - * - * @access public - * @param string $body Message Body - * @return string - */ - public function DKIM_BodyC($body) { - if ($body == '') return "\r\n"; - // stabilize line endings - $body = str_replace("\r\n", "\n", $body); - $body = str_replace("\n", "\r\n", $body); - // END stabilize line endings - while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") { - $body = substr($body, 0, strlen($body) - 2); - } - return $body; - } - - /** - * Create the DKIM header, body, as new header - * - * @access public - * @param string $headers_line Header lines - * @param string $subject Subject - * @param string $body Body - * @return string - */ - public function DKIM_Add($headers_line, $subject, $body) { - $DKIMsignatureType = 'rsa-sha1'; // Signature & hash algorithms - $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body - $DKIMquery = 'dns/txt'; // Query method - $DKIMtime = time() ; // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone) - $subject_header = "Subject: $subject"; - $headers = explode($this->LE, $headers_line); - $from_header = ""; - $to_header = ""; - foreach($headers as $header) { - if (strpos($header, 'From:') === 0) { - $from_header = $header; - } elseif (strpos($header, 'To:') === 0) { - $to_header = $header; - } - } - $from = str_replace('|', '=7C', $this->DKIM_QP($from_header)); - $to = str_replace('|', '=7C', $this->DKIM_QP($to_header)); - $subject = str_replace('|', '=7C', $this->DKIM_QP($subject_header)) ; // Copied header fields (dkim-quoted-printable - $body = $this->DKIM_BodyC($body); - $DKIMlen = strlen($body) ; // Length of body - $DKIMb64 = base64_encode(pack("H*", sha1($body))) ; // Base64 of packed binary SHA-1 hash of body - $ident = ($this->DKIM_identity == '')? '' : " i=" . $this->DKIM_identity . ";"; - $dkimhdrs = "DKIM-Signature: v=1; a=" . $DKIMsignatureType . "; q=" . $DKIMquery . "; l=" . $DKIMlen . "; s=" . $this->DKIM_selector . ";\r\n". - "\tt=" . $DKIMtime . "; c=" . $DKIMcanonicalization . ";\r\n". - "\th=From:To:Subject;\r\n". - "\td=" . $this->DKIM_domain . ";" . $ident . "\r\n". - "\tz=$from\r\n". - "\t|$to\r\n". - "\t|$subject;\r\n". - "\tbh=" . $DKIMb64 . ";\r\n". - "\tb="; - $toSign = $this->DKIM_HeaderC($from_header . "\r\n" . $to_header . "\r\n" . $subject_header . "\r\n" . $dkimhdrs); - $signed = $this->DKIM_Sign($toSign); - return "X-PHPMAILER-DKIM: code.google.com/a/apache-extras.org/p/phpmailer/\r\n".$dkimhdrs.$signed."\r\n"; - } - - /** - * Perform callback - * @param boolean $isSent - * @param string $to - * @param string $cc - * @param string $bcc - * @param string $subject - * @param string $body - * @param string $from - */ - protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from = null) { - if (!empty($this->action_function) && is_callable($this->action_function)) { - $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from); - call_user_func_array($this->action_function, $params); - } - } -} - -/** - * Exception handler for PHPMailer - * @package PHPMailer - */ -class phpmailerException extends Exception { - /** - * Prettify error message output - * @return string - */ - public function errorMessage() { - $errorMsg = '' . $this->getMessage() . "
    \n"; - return $errorMsg; - } -} diff --git a/download/phpmailer/class.pop3.php b/download/phpmailer/class.pop3.php deleted file mode 100755 index d4082a0d7..000000000 --- a/download/phpmailer/class.pop3.php +++ /dev/null @@ -1,417 +0,0 @@ - - * @author Andy Prevost - * @author Jim Jagielski - */ - -class POP3 { - /** - * Default POP3 port - * @var int - */ - public $POP3_PORT = 110; - - /** - * Default Timeout - * @var int - */ - public $POP3_TIMEOUT = 30; - - /** - * POP3 Carriage Return + Line Feed - * @var string - */ - public $CRLF = "\r\n"; - - /** - * Displaying Debug warnings? (0 = now, 1+ = yes) - * @var int - */ - public $do_debug = 2; - - /** - * POP3 Mail Server - * @var string - */ - public $host; - - /** - * POP3 Port - * @var int - */ - public $port; - - /** - * POP3 Timeout Value - * @var int - */ - public $tval; - - /** - * POP3 Username - * @var string - */ - public $username; - - /** - * POP3 Password - * @var string - */ - public $password; - - /** - * Sets the POP3 PHPMailer Version number - * @var string - */ - public $Version = '5.2.4'; - - ///////////////////////////////////////////////// - // PROPERTIES, PRIVATE AND PROTECTED - ///////////////////////////////////////////////// - - /** - * @var resource Resource handle for the POP connection socket - */ - private $pop_conn; - /** - * @var boolean Are we connected? - */ - private $connected; - /** - * @var array Error container - */ - private $error; // Error log array - - /** - * Constructor, sets the initial values - * @access public - * @return POP3 - */ - public function __construct() { - $this->pop_conn = 0; - $this->connected = false; - $this->error = null; - } - - /** - * Combination of public events - connect, login, disconnect - * @access public - * @param string $host - * @param bool|int $port - * @param bool|int $tval - * @param string $username - * @param string $password - * @param int $debug_level - * @return bool - */ - public function Authorise ($host, $port = false, $tval = false, $username, $password, $debug_level = 0) { - $this->host = $host; - - // If no port value is passed, retrieve it - if ($port == false) { - $this->port = $this->POP3_PORT; - } else { - $this->port = $port; - } - - // If no port value is passed, retrieve it - if ($tval == false) { - $this->tval = $this->POP3_TIMEOUT; - } else { - $this->tval = $tval; - } - - $this->do_debug = $debug_level; - $this->username = $username; - $this->password = $password; - - // Refresh the error log - $this->error = null; - - // Connect - $result = $this->Connect($this->host, $this->port, $this->tval); - - if ($result) { - $login_result = $this->Login($this->username, $this->password); - - if ($login_result) { - $this->Disconnect(); - - return true; - } - - } - - // We need to disconnect regardless if the login succeeded - $this->Disconnect(); - - return false; - } - - /** - * Connect to the POP3 server - * @access public - * @param string $host - * @param bool|int $port - * @param integer $tval - * @return boolean - */ - public function Connect ($host, $port = false, $tval = 30) { - // Are we already connected? - if ($this->connected) { - return true; - } - - /* - On Windows this will raise a PHP Warning error if the hostname doesn't exist. - Rather than supress it with @fsockopen, let's capture it cleanly instead - */ - - set_error_handler(array(&$this, 'catchWarning')); - - // Connect to the POP3 server - $this->pop_conn = fsockopen($host, // POP3 Host - $port, // Port # - $errno, // Error Number - $errstr, // Error Message - $tval); // Timeout (seconds) - - // Restore the error handler - restore_error_handler(); - - // Does the Error Log now contain anything? - if ($this->error && $this->do_debug >= 1) { - $this->displayErrors(); - } - - // Did we connect? - if ($this->pop_conn == false) { - // It would appear not... - $this->error = array( - 'error' => "Failed to connect to server $host on port $port", - 'errno' => $errno, - 'errstr' => $errstr - ); - - if ($this->do_debug >= 1) { - $this->displayErrors(); - } - - return false; - } - - // Increase the stream time-out - - // Check for PHP 4.3.0 or later - if (version_compare(phpversion(), '5.0.0', 'ge')) { - stream_set_timeout($this->pop_conn, $tval, 0); - } else { - // Does not work on Windows - if (substr(PHP_OS, 0, 3) !== 'WIN') { - socket_set_timeout($this->pop_conn, $tval, 0); - } - } - - // Get the POP3 server response - $pop3_response = $this->getResponse(); - - // Check for the +OK - if ($this->checkResponse($pop3_response)) { - // The connection is established and the POP3 server is talking - $this->connected = true; - return true; - } - return false; - } - - /** - * Login to the POP3 server (does not support APOP yet) - * @access public - * @param string $username - * @param string $password - * @return boolean - */ - public function Login ($username = '', $password = '') { - if ($this->connected == false) { - $this->error = 'Not connected to POP3 server'; - - if ($this->do_debug >= 1) { - $this->displayErrors(); - } - } - - if (empty($username)) { - $username = $this->username; - } - - if (empty($password)) { - $password = $this->password; - } - - $pop_username = "USER $username" . $this->CRLF; - $pop_password = "PASS $password" . $this->CRLF; - - // Send the Username - $this->sendString($pop_username); - $pop3_response = $this->getResponse(); - - if ($this->checkResponse($pop3_response)) { - // Send the Password - $this->sendString($pop_password); - $pop3_response = $this->getResponse(); - - if ($this->checkResponse($pop3_response)) { - return true; - } - } - return false; - } - - /** - * Disconnect from the POP3 server - * @access public - */ - public function Disconnect () { - $this->sendString('QUIT'); - - fclose($this->pop_conn); - } - - ///////////////////////////////////////////////// - // Private Methods - ///////////////////////////////////////////////// - - /** - * Get the socket response back. - * $size is the maximum number of bytes to retrieve - * @access private - * @param integer $size - * @return string - */ - private function getResponse ($size = 128) { - $pop3_response = fgets($this->pop_conn, $size); - - return $pop3_response; - } - - /** - * Send a string down the open socket connection to the POP3 server - * @access private - * @param string $string - * @return integer - */ - private function sendString ($string) { - $bytes_sent = fwrite($this->pop_conn, $string, strlen($string)); - - return $bytes_sent; - } - - /** - * Checks the POP3 server response for +OK or -ERR - * @access private - * @param string $string - * @return boolean - */ - private function checkResponse ($string) { - if (substr($string, 0, 3) !== '+OK') { - $this->error = array( - 'error' => "Server reported an error: $string", - 'errno' => 0, - 'errstr' => '' - ); - - if ($this->do_debug >= 1) { - $this->displayErrors(); - } - - return false; - } else { - return true; - } - - } - - /** - * If debug is enabled, display the error message array - * @access private - */ - private function displayErrors () { - echo '
    ';
    -
    -    foreach ($this->error as $single_error) {
    -      print_r($single_error);
    -    }
    -
    -    echo '
    '; - } - - /** - * Takes over from PHP for the socket warning handler - * @access private - * @param integer $errno - * @param string $errstr - * @param string $errfile - * @param integer $errline - */ - private function catchWarning ($errno, $errstr, $errfile, $errline) { - $this->error[] = array( - 'error' => "Connecting to the POP3 server raised a PHP warning: ", - 'errno' => $errno, - 'errstr' => $errstr - ); - } - - // End of class -} diff --git a/download/phpmailer/class.smtp.php b/download/phpmailer/class.smtp.php deleted file mode 100755 index f0e4062ec..000000000 --- a/download/phpmailer/class.smtp.php +++ /dev/null @@ -1,1087 +0,0 @@ -Debugoutput == 'error_log') { - error_log($str); - } else { - echo $str; - } - } - - /** - * Initialize the class so that the data is in a known state. - * @access public - * @return SMTP - */ - public function __construct() { - $this->smtp_conn = 0; - $this->error = null; - $this->helo_rply = null; - - $this->do_debug = 0; - } - - ///////////////////////////////////////////////// - // CONNECTION FUNCTIONS - ///////////////////////////////////////////////// - - /** - * Connect to the server specified on the port specified. - * If the port is not specified use the default SMTP_PORT. - * If tval is specified then a connection will try and be - * established with the server for that number of seconds. - * If tval is not specified the default is 30 seconds to - * try on the connection. - * - * SMTP CODE SUCCESS: 220 - * SMTP CODE FAILURE: 421 - * @access public - * @param string $host - * @param int $port - * @param int $tval - * @return bool - */ - public function Connect($host, $port = 0, $tval = 30) { - // set the error val to null so there is no confusion - $this->error = null; - - // make sure we are __not__ connected - if($this->connected()) { - // already connected, generate error - $this->error = array('error' => 'Already connected to a server'); - return false; - } - - if(empty($port)) { - $port = $this->SMTP_PORT; - } - - // connect to the smtp server - $this->smtp_conn = @fsockopen($host, // the host of the server - $port, // the port to use - $errno, // error number if any - $errstr, // error message if any - $tval); // give up after ? secs - // verify we connected properly - if(empty($this->smtp_conn)) { - $this->error = array('error' => 'Failed to connect to server', - 'errno' => $errno, - 'errstr' => $errstr); - if($this->do_debug >= 1) { - $this->edebug('SMTP -> ERROR: ' . $this->error['error'] . ": $errstr ($errno)" . $this->CRLF . '
    '); - } - return false; - } - - // SMTP server can take longer to respond, give longer timeout for first read - // Windows does not have support for this timeout function - if(substr(PHP_OS, 0, 3) != 'WIN') { - $max = ini_get('max_execution_time'); - if ($max != 0 && $tval > $max) { // don't bother if unlimited - @set_time_limit($tval); - } - stream_set_timeout($this->smtp_conn, $tval, 0); - } - - // get any announcement - $announce = $this->get_lines(); - - if($this->do_debug >= 2) { - $this->edebug('SMTP -> FROM SERVER:' . $announce . $this->CRLF . '
    '); - } - - return true; - } - - /** - * Initiate a TLS communication with the server. - * - * SMTP CODE 220 Ready to start TLS - * SMTP CODE 501 Syntax error (no parameters allowed) - * SMTP CODE 454 TLS not available due to temporary reason - * @access public - * @return bool success - */ - public function StartTLS() { - $this->error = null; # to avoid confusion - - if(!$this->connected()) { - $this->error = array('error' => 'Called StartTLS() without being connected'); - return false; - } - - $this->client_send('STARTTLS' . $this->CRLF); - - $rply = $this->get_lines(); - $code = substr($rply, 0, 3); - - if($this->do_debug >= 2) { - $this->edebug('SMTP -> FROM SERVER:' . $rply . $this->CRLF . '
    '); - } - - if($code != 220) { - $this->error = - array('error' => 'STARTTLS not accepted from server', - 'smtp_code' => $code, - 'smtp_msg' => substr($rply, 4)); - if($this->do_debug >= 1) { - $this->edebug('SMTP -> ERROR: ' . $this->error['error'] . ': ' . $rply . $this->CRLF . '
    '); - } - return false; - } - - // Begin encrypted connection - if(!stream_socket_enable_crypto($this->smtp_conn, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) { - return false; - } - - return true; - } - - /** - * Performs SMTP authentication. Must be run after running the - * Hello() method. Returns true if successfully authenticated. - * @access public - * @param string $username - * @param string $password - * @param string $authtype - * @param string $realm - * @param string $workstation - * @return bool - */ - public function Authenticate($username, $password, $authtype='LOGIN', $realm='', $workstation='') { - if (empty($authtype)) { - $authtype = 'LOGIN'; - } - - switch ($authtype) { - case 'PLAIN': - // Start authentication - $this->client_send('AUTH PLAIN' . $this->CRLF); - - $rply = $this->get_lines(); - $code = substr($rply, 0, 3); - - if($code != 334) { - $this->error = - array('error' => 'AUTH not accepted from server', - 'smtp_code' => $code, - 'smtp_msg' => substr($rply, 4)); - if($this->do_debug >= 1) { - $this->edebug('SMTP -> ERROR: ' . $this->error['error'] . ': ' . $rply . $this->CRLF . '
    '); - } - return false; - } - // Send encoded username and password - $this->client_send(base64_encode("\0".$username."\0".$password) . $this->CRLF); - - $rply = $this->get_lines(); - $code = substr($rply, 0, 3); - - if($code != 235) { - $this->error = - array('error' => 'Authentication not accepted from server', - 'smtp_code' => $code, - 'smtp_msg' => substr($rply, 4)); - if($this->do_debug >= 1) { - $this->edebug('SMTP -> ERROR: ' . $this->error['error'] . ': ' . $rply . $this->CRLF . '
    '); - } - return false; - } - break; - case 'LOGIN': - // Start authentication - $this->client_send('AUTH LOGIN' . $this->CRLF); - - $rply = $this->get_lines(); - $code = substr($rply, 0, 3); - - if($code != 334) { - $this->error = - array('error' => 'AUTH not accepted from server', - 'smtp_code' => $code, - 'smtp_msg' => substr($rply, 4)); - if($this->do_debug >= 1) { - $this->edebug('SMTP -> ERROR: ' . $this->error['error'] . ': ' . $rply . $this->CRLF . '
    '); - } - return false; - } - - // Send encoded username - $this->client_send(base64_encode($username) . $this->CRLF); - - $rply = $this->get_lines(); - $code = substr($rply, 0, 3); - - if($code != 334) { - $this->error = - array('error' => 'Username not accepted from server', - 'smtp_code' => $code, - 'smtp_msg' => substr($rply, 4)); - if($this->do_debug >= 1) { - $this->edebug('SMTP -> ERROR: ' . $this->error['error'] . ': ' . $rply . $this->CRLF . '
    '); - } - return false; - } - - // Send encoded password - $this->client_send(base64_encode($password) . $this->CRLF); - - $rply = $this->get_lines(); - $code = substr($rply, 0, 3); - - if($code != 235) { - $this->error = - array('error' => 'Password not accepted from server', - 'smtp_code' => $code, - 'smtp_msg' => substr($rply, 4)); - if($this->do_debug >= 1) { - $this->edebug('SMTP -> ERROR: ' . $this->error['error'] . ': ' . $rply . $this->CRLF . '
    '); - } - return false; - } - break; - case 'NTLM': - /* - * ntlm_sasl_client.php - ** Bundled with Permission - ** - ** How to telnet in windows: http://technet.microsoft.com/en-us/library/aa995718%28EXCHG.65%29.aspx - ** PROTOCOL Documentation http://curl.haxx.se/rfc/ntlm.html#ntlmSmtpAuthentication - */ - require_once 'extras/ntlm_sasl_client.php'; - $temp = new stdClass(); - $ntlm_client = new ntlm_sasl_client_class; - if(! $ntlm_client->Initialize($temp)){//let's test if every function its available - $this->error = array('error' => $temp->error); - if($this->do_debug >= 1) { - $this->edebug('You need to enable some modules in your php.ini file: ' . $this->error['error'] . $this->CRLF); - } - return false; - } - $msg1 = $ntlm_client->TypeMsg1($realm, $workstation);//msg1 - - $this->client_send('AUTH NTLM ' . base64_encode($msg1) . $this->CRLF); - - $rply = $this->get_lines(); - $code = substr($rply, 0, 3); - - - if($code != 334) { - $this->error = - array('error' => 'AUTH not accepted from server', - 'smtp_code' => $code, - 'smtp_msg' => substr($rply, 4)); - if($this->do_debug >= 1) { - $this->edebug('SMTP -> ERROR: ' . $this->error['error'] . ': ' . $rply . $this->CRLF); - } - return false; - } - - $challenge = substr($rply, 3);//though 0 based, there is a white space after the 3 digit number....//msg2 - $challenge = base64_decode($challenge); - $ntlm_res = $ntlm_client->NTLMResponse(substr($challenge, 24, 8), $password); - $msg3 = $ntlm_client->TypeMsg3($ntlm_res, $username, $realm, $workstation);//msg3 - // Send encoded username - $this->client_send(base64_encode($msg3) . $this->CRLF); - - $rply = $this->get_lines(); - $code = substr($rply, 0, 3); - - if($code != 235) { - $this->error = - array('error' => 'Could not authenticate', - 'smtp_code' => $code, - 'smtp_msg' => substr($rply, 4)); - if($this->do_debug >= 1) { - $this->edebug('SMTP -> ERROR: ' . $this->error['error'] . ': ' . $rply . $this->CRLF); - } - return false; - } - break; - case 'CRAM-MD5': - // Start authentication - $this->client_send('AUTH CRAM-MD5' . $this->CRLF); - - $rply = $this->get_lines(); - $code = substr($rply, 0, 3); - - if($code != 334) { - $this->error = - array('error' => 'AUTH not accepted from server', - 'smtp_code' => $code, - 'smtp_msg' => substr($rply, 4)); - if($this->do_debug >= 1) { - $this->edebug('SMTP -> ERROR: ' . $this->error['error'] . ': ' . $rply . $this->CRLF . '
    '); - } - return false; - } - - // Get the challenge - $challenge = base64_decode(substr($rply, 4)); - - // Build the response - $response = $username . ' ' . $this->hmac($challenge, $password); - - // Send encoded credentials - $this->client_send(base64_encode($response) . $this->CRLF); - - $rply = $this->get_lines(); - $code = substr($rply, 0, 3); - - if($code != 334) { - $this->error = - array('error' => 'Credentials not accepted from server', - 'smtp_code' => $code, - 'smtp_msg' => substr($rply, 4)); - if($this->do_debug >= 1) { - $this->edebug('SMTP -> ERROR: ' . $this->error['error'] . ': ' . $rply . $this->CRLF . '
    '); - } - return false; - } - break; - } - return true; - } - - /** - * Works like hash_hmac('md5', $data, $key) in case that function is not available - * @access private - * @param string $data - * @param string $key - * @return string - */ - private function hmac($data, $key) { - if (function_exists('hash_hmac')) { - return hash_hmac('md5', $data, $key); - } - - // The following borrowed from http://php.net/manual/en/function.mhash.php#27225 - - // RFC 2104 HMAC implementation for php. - // Creates an md5 HMAC. - // Eliminates the need to install mhash to compute a HMAC - // Hacked by Lance Rushing - - $b = 64; // byte length for md5 - if (strlen($key) > $b) { - $key = pack('H*', md5($key)); - } - $key = str_pad($key, $b, chr(0x00)); - $ipad = str_pad('', $b, chr(0x36)); - $opad = str_pad('', $b, chr(0x5c)); - $k_ipad = $key ^ $ipad ; - $k_opad = $key ^ $opad; - - return md5($k_opad . pack('H*', md5($k_ipad . $data))); - } - - /** - * Returns true if connected to a server otherwise false - * @access public - * @return bool - */ - public function Connected() { - if(!empty($this->smtp_conn)) { - $sock_status = stream_get_meta_data($this->smtp_conn); - if($sock_status['eof']) { - // the socket is valid but we are not connected - if($this->do_debug >= 1) { - $this->edebug('SMTP -> NOTICE:' . $this->CRLF . 'EOF caught while checking if connected'); - } - $this->Close(); - return false; - } - return true; // everything looks good - } - return false; - } - - /** - * Closes the socket and cleans up the state of the class. - * It is not considered good to use this function without - * first trying to use QUIT. - * @access public - * @return void - */ - public function Close() { - $this->error = null; // so there is no confusion - $this->helo_rply = null; - if(!empty($this->smtp_conn)) { - // close the connection and cleanup - fclose($this->smtp_conn); - $this->smtp_conn = 0; - } - } - - ///////////////////////////////////////////////// - // SMTP COMMANDS - ///////////////////////////////////////////////// - - /** - * Issues a data command and sends the msg_data to the server - * finializing the mail transaction. $msg_data is the message - * that is to be send with the headers. Each header needs to be - * on a single line followed by a with the message headers - * and the message body being seperated by and additional . - * - * Implements rfc 821: DATA - * - * SMTP CODE INTERMEDIATE: 354 - * [data] - * . - * SMTP CODE SUCCESS: 250 - * SMTP CODE FAILURE: 552, 554, 451, 452 - * SMTP CODE FAILURE: 451, 554 - * SMTP CODE ERROR : 500, 501, 503, 421 - * @access public - * @param string $msg_data - * @return bool - */ - public function Data($msg_data) { - $this->error = null; // so no confusion is caused - - if(!$this->connected()) { - $this->error = array( - 'error' => 'Called Data() without being connected'); - return false; - } - - $this->client_send('DATA' . $this->CRLF); - - $rply = $this->get_lines(); - $code = substr($rply, 0, 3); - - if($this->do_debug >= 2) { - $this->edebug('SMTP -> FROM SERVER:' . $rply . $this->CRLF . '
    '); - } - - if($code != 354) { - $this->error = - array('error' => 'DATA command not accepted from server', - 'smtp_code' => $code, - 'smtp_msg' => substr($rply, 4)); - if($this->do_debug >= 1) { - $this->edebug('SMTP -> ERROR: ' . $this->error['error'] . ': ' . $rply . $this->CRLF . '
    '); - } - return false; - } - - /* the server is ready to accept data! - * according to rfc 821 we should not send more than 1000 - * including the CRLF - * characters on a single line so we will break the data up - * into lines by \r and/or \n then if needed we will break - * each of those into smaller lines to fit within the limit. - * in addition we will be looking for lines that start with - * a period '.' and append and additional period '.' to that - * line. NOTE: this does not count towards limit. - */ - - // normalize the line breaks so we know the explode works - $msg_data = str_replace("\r\n", "\n", $msg_data); - $msg_data = str_replace("\r", "\n", $msg_data); - $lines = explode("\n", $msg_data); - - /* we need to find a good way to determine is headers are - * in the msg_data or if it is a straight msg body - * currently I am assuming rfc 822 definitions of msg headers - * and if the first field of the first line (':' sperated) - * does not contain a space then it _should_ be a header - * and we can process all lines before a blank "" line as - * headers. - */ - - $field = substr($lines[0], 0, strpos($lines[0], ':')); - $in_headers = false; - if(!empty($field) && !strstr($field, ' ')) { - $in_headers = true; - } - - $max_line_length = 998; // used below; set here for ease in change - - while(list(, $line) = @each($lines)) { - $lines_out = null; - if($line == '' && $in_headers) { - $in_headers = false; - } - // ok we need to break this line up into several smaller lines - while(strlen($line) > $max_line_length) { - $pos = strrpos(substr($line, 0, $max_line_length), ' '); - - // Patch to fix DOS attack - if(!$pos) { - $pos = $max_line_length - 1; - $lines_out[] = substr($line, 0, $pos); - $line = substr($line, $pos); - } else { - $lines_out[] = substr($line, 0, $pos); - $line = substr($line, $pos + 1); - } - - /* if processing headers add a LWSP-char to the front of new line - * rfc 822 on long msg headers - */ - if($in_headers) { - $line = "\t" . $line; - } - } - $lines_out[] = $line; - - // send the lines to the server - while(list(, $line_out) = @each($lines_out)) { - if(strlen($line_out) > 0) - { - if(substr($line_out, 0, 1) == '.') { - $line_out = '.' . $line_out; - } - } - $this->client_send($line_out . $this->CRLF); - } - } - - // message data has been sent - $this->client_send($this->CRLF . '.' . $this->CRLF); - - $rply = $this->get_lines(); - $code = substr($rply, 0, 3); - - if($this->do_debug >= 2) { - $this->edebug('SMTP -> FROM SERVER:' . $rply . $this->CRLF . '
    '); - } - - if($code != 250) { - $this->error = - array('error' => 'DATA not accepted from server', - 'smtp_code' => $code, - 'smtp_msg' => substr($rply, 4)); - if($this->do_debug >= 1) { - $this->edebug('SMTP -> ERROR: ' . $this->error['error'] . ': ' . $rply . $this->CRLF . '
    '); - } - return false; - } - return true; - } - - /** - * Sends the HELO command to the smtp server. - * This makes sure that we and the server are in - * the same known state. - * - * Implements from rfc 821: HELO - * - * SMTP CODE SUCCESS: 250 - * SMTP CODE ERROR : 500, 501, 504, 421 - * @access public - * @param string $host - * @return bool - */ - public function Hello($host = '') { - $this->error = null; // so no confusion is caused - - if(!$this->connected()) { - $this->error = array( - 'error' => 'Called Hello() without being connected'); - return false; - } - - // if hostname for HELO was not specified send default - if(empty($host)) { - // determine appropriate default to send to server - $host = 'localhost'; - } - - // Send extended hello first (RFC 2821) - if(!$this->SendHello('EHLO', $host)) { - if(!$this->SendHello('HELO', $host)) { - return false; - } - } - - return true; - } - - /** - * Sends a HELO/EHLO command. - * @access private - * @param string $hello - * @param string $host - * @return bool - */ - private function SendHello($hello, $host) { - $this->client_send($hello . ' ' . $host . $this->CRLF); - - $rply = $this->get_lines(); - $code = substr($rply, 0, 3); - - if($this->do_debug >= 2) { - $this->edebug('SMTP -> FROM SERVER: ' . $rply . $this->CRLF . '
    '); - } - - if($code != 250) { - $this->error = - array('error' => $hello . ' not accepted from server', - 'smtp_code' => $code, - 'smtp_msg' => substr($rply, 4)); - if($this->do_debug >= 1) { - $this->edebug('SMTP -> ERROR: ' . $this->error['error'] . ': ' . $rply . $this->CRLF . '
    '); - } - return false; - } - - $this->helo_rply = $rply; - - return true; - } - - /** - * Starts a mail transaction from the email address specified in - * $from. Returns true if successful or false otherwise. If True - * the mail transaction is started and then one or more Recipient - * commands may be called followed by a Data command. - * - * Implements rfc 821: MAIL FROM: - * - * SMTP CODE SUCCESS: 250 - * SMTP CODE SUCCESS: 552, 451, 452 - * SMTP CODE SUCCESS: 500, 501, 421 - * @access public - * @param string $from - * @return bool - */ - public function Mail($from) { - $this->error = null; // so no confusion is caused - - if(!$this->connected()) { - $this->error = array( - 'error' => 'Called Mail() without being connected'); - return false; - } - - $useVerp = ($this->do_verp ? ' XVERP' : ''); - $this->client_send('MAIL FROM:<' . $from . '>' . $useVerp . $this->CRLF); - - $rply = $this->get_lines(); - $code = substr($rply, 0, 3); - - if($this->do_debug >= 2) { - $this->edebug('SMTP -> FROM SERVER:' . $rply . $this->CRLF . '
    '); - } - - if($code != 250) { - $this->error = - array('error' => 'MAIL not accepted from server', - 'smtp_code' => $code, - 'smtp_msg' => substr($rply, 4)); - if($this->do_debug >= 1) { - $this->edebug('SMTP -> ERROR: ' . $this->error['error'] . ': ' . $rply . $this->CRLF . '
    '); - } - return false; - } - return true; - } - - /** - * Sends the quit command to the server and then closes the socket - * if there is no error or the $close_on_error argument is true. - * - * Implements from rfc 821: QUIT - * - * SMTP CODE SUCCESS: 221 - * SMTP CODE ERROR : 500 - * @access public - * @param bool $close_on_error - * @return bool - */ - public function Quit($close_on_error = true) { - $this->error = null; // so there is no confusion - - if(!$this->connected()) { - $this->error = array( - 'error' => 'Called Quit() without being connected'); - return false; - } - - // send the quit command to the server - $this->client_send('quit' . $this->CRLF); - - // get any good-bye messages - $byemsg = $this->get_lines(); - - if($this->do_debug >= 2) { - $this->edebug('SMTP -> FROM SERVER:' . $byemsg . $this->CRLF . '
    '); - } - - $rval = true; - $e = null; - - $code = substr($byemsg, 0, 3); - if($code != 221) { - // use e as a tmp var cause Close will overwrite $this->error - $e = array('error' => 'SMTP server rejected quit command', - 'smtp_code' => $code, - 'smtp_rply' => substr($byemsg, 4)); - $rval = false; - if($this->do_debug >= 1) { - $this->edebug('SMTP -> ERROR: ' . $e['error'] . ': ' . $byemsg . $this->CRLF . '
    '); - } - } - - if(empty($e) || $close_on_error) { - $this->Close(); - } - - return $rval; - } - - /** - * Sends the command RCPT to the SMTP server with the TO: argument of $to. - * Returns true if the recipient was accepted false if it was rejected. - * - * Implements from rfc 821: RCPT TO: - * - * SMTP CODE SUCCESS: 250, 251 - * SMTP CODE FAILURE: 550, 551, 552, 553, 450, 451, 452 - * SMTP CODE ERROR : 500, 501, 503, 421 - * @access public - * @param string $to - * @return bool - */ - public function Recipient($to) { - $this->error = null; // so no confusion is caused - - if(!$this->connected()) { - $this->error = array( - 'error' => 'Called Recipient() without being connected'); - return false; - } - - $this->client_send('RCPT TO:<' . $to . '>' . $this->CRLF); - - $rply = $this->get_lines(); - $code = substr($rply, 0, 3); - - if($this->do_debug >= 2) { - $this->edebug('SMTP -> FROM SERVER:' . $rply . $this->CRLF . '
    '); - } - - if($code != 250 && $code != 251) { - $this->error = - array('error' => 'RCPT not accepted from server', - 'smtp_code' => $code, - 'smtp_msg' => substr($rply, 4)); - if($this->do_debug >= 1) { - $this->edebug('SMTP -> ERROR: ' . $this->error['error'] . ': ' . $rply . $this->CRLF . '
    '); - } - return false; - } - return true; - } - - /** - * Sends the RSET command to abort and transaction that is - * currently in progress. Returns true if successful false - * otherwise. - * - * Implements rfc 821: RSET - * - * SMTP CODE SUCCESS: 250 - * SMTP CODE ERROR : 500, 501, 504, 421 - * @access public - * @return bool - */ - public function Reset() { - $this->error = null; // so no confusion is caused - - if(!$this->connected()) { - $this->error = array('error' => 'Called Reset() without being connected'); - return false; - } - - $this->client_send('RSET' . $this->CRLF); - - $rply = $this->get_lines(); - $code = substr($rply, 0, 3); - - if($this->do_debug >= 2) { - $this->edebug('SMTP -> FROM SERVER:' . $rply . $this->CRLF . '
    '); - } - - if($code != 250) { - $this->error = - array('error' => 'RSET failed', - 'smtp_code' => $code, - 'smtp_msg' => substr($rply, 4)); - if($this->do_debug >= 1) { - $this->edebug('SMTP -> ERROR: ' . $this->error['error'] . ': ' . $rply . $this->CRLF . '
    '); - } - return false; - } - - return true; - } - - /** - * Starts a mail transaction from the email address specified in - * $from. Returns true if successful or false otherwise. If True - * the mail transaction is started and then one or more Recipient - * commands may be called followed by a Data command. This command - * will send the message to the users terminal if they are logged - * in and send them an email. - * - * Implements rfc 821: SAML FROM: - * - * SMTP CODE SUCCESS: 250 - * SMTP CODE SUCCESS: 552, 451, 452 - * SMTP CODE SUCCESS: 500, 501, 502, 421 - * @access public - * @param string $from - * @return bool - */ - public function SendAndMail($from) { - $this->error = null; // so no confusion is caused - - if(!$this->connected()) { - $this->error = array( - 'error' => 'Called SendAndMail() without being connected'); - return false; - } - - $this->client_send('SAML FROM:' . $from . $this->CRLF); - - $rply = $this->get_lines(); - $code = substr($rply, 0, 3); - - if($this->do_debug >= 2) { - $this->edebug('SMTP -> FROM SERVER:' . $rply . $this->CRLF . '
    '); - } - - if($code != 250) { - $this->error = - array('error' => 'SAML not accepted from server', - 'smtp_code' => $code, - 'smtp_msg' => substr($rply, 4)); - if($this->do_debug >= 1) { - $this->edebug('SMTP -> ERROR: ' . $this->error['error'] . ': ' . $rply . $this->CRLF . '
    '); - } - return false; - } - return true; - } - - /** - * This is an optional command for SMTP that this class does not - * support. This method is here to make the RFC821 Definition - * complete for this class and __may__ be implimented in the future - * - * Implements from rfc 821: TURN - * - * SMTP CODE SUCCESS: 250 - * SMTP CODE FAILURE: 502 - * SMTP CODE ERROR : 500, 503 - * @access public - * @return bool - */ - public function Turn() { - $this->error = array('error' => 'This method, TURN, of the SMTP '. - 'is not implemented'); - if($this->do_debug >= 1) { - $this->edebug('SMTP -> NOTICE: ' . $this->error['error'] . $this->CRLF . '
    '); - } - return false; - } - - /** - * Sends data to the server - * @param string $data - * @access public - * @return Integer number of bytes sent to the server or FALSE on error - */ - public function client_send($data) { - if ($this->do_debug >= 1) { - $this->edebug("CLIENT -> SMTP: $data" . $this->CRLF . '
    '); - } - return fwrite($this->smtp_conn, $data); - } - - /** - * Get the current error - * @access public - * @return array - */ - public function getError() { - return $this->error; - } - - ///////////////////////////////////////////////// - // INTERNAL FUNCTIONS - ///////////////////////////////////////////////// - - /** - * Read in as many lines as possible - * either before eof or socket timeout occurs on the operation. - * With SMTP we can tell if we have more lines to read if the - * 4th character is '-' symbol. If it is a space then we don't - * need to read anything else. - * @access private - * @return string - */ - private function get_lines() { - $data = ''; - $endtime = 0; - /* If for some reason the fp is bad, don't inf loop */ - if (!is_resource($this->smtp_conn)) { - return $data; - } - stream_set_timeout($this->smtp_conn, $this->Timeout); - if ($this->Timelimit > 0) { - $endtime = time() + $this->Timelimit; - } - while(is_resource($this->smtp_conn) && !feof($this->smtp_conn)) { - $str = @fgets($this->smtp_conn, 515); - if($this->do_debug >= 4) { - $this->edebug("SMTP -> get_lines(): \$data was \"$data\"" . $this->CRLF . '
    '); - $this->edebug("SMTP -> get_lines(): \$str is \"$str\"" . $this->CRLF . '
    '); - } - $data .= $str; - if($this->do_debug >= 4) { - $this->edebug("SMTP -> get_lines(): \$data is \"$data\"" . $this->CRLF . '
    '); - } - // if 4th character is a space, we are done reading, break the loop - if(substr($str, 3, 1) == ' ') { break; } - // Timed-out? Log and break - $info = stream_get_meta_data($this->smtp_conn); - if ($info['timed_out']) { - if($this->do_debug >= 4) { - $this->edebug('SMTP -> get_lines(): timed-out (' . $this->Timeout . ' seconds)
    '); - } - break; - } - // Now check if reads took too long - if ($endtime) { - if (time() > $endtime) { - if($this->do_debug >= 4) { - $this->edebug('SMTP -> get_lines(): timelimit reached (' . $this->Timelimit . ' seconds)
    '); - } - break; - } - } - } - return $data; - } - -} diff --git a/download/phpmailer529/.gitignore b/download/phpmailer529/.gitignore deleted file mode 100755 index 989164d65..000000000 --- a/download/phpmailer529/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -docs/phpdoc/ -test/message.txt -test/testbootstrap.php -.idea -build/ diff --git a/download/phpmailer529/.scrutinizer.yml b/download/phpmailer529/.scrutinizer.yml deleted file mode 100755 index be706aeeb..000000000 --- a/download/phpmailer529/.scrutinizer.yml +++ /dev/null @@ -1,143 +0,0 @@ -before_commands: - - "composer install --prefer-source" - -tools: - # Code Coverage - external_code_coverage: - enabled: true - timeout: 300 - filter: - excluded_paths: - - 'docs/*' - - 'examples/*' - - 'extras/*' - - 'test/*' - - 'vendor/*' - - - php_code_coverage: - enabled: false - test_command: phpunit - filter: - excluded_paths: - - 'docs/*' - - 'examples/*' - - 'extras/*' - - 'test/*' - - 'vendor/*' - - - # Code Sniffer - php_code_sniffer: - enabled: true - command: phpcs - config: - standard: PSR2 - sniffs: - generic: - files: - one_class_per_file_sniff: false - filter: - excluded_paths: - - 'docs/*' - - 'examples/*' - - 'extras/*' - - 'test/*' - - 'vendor/*' - - - # Copy/Paste Detector - php_cpd: - enabled: true - command: phpcpd - excluded_dirs: - - docs - - examples - - extras - - test - - vendor - - - # PHP CS Fixer (http://http://cs.sensiolabs.org/). - php_cs_fixer: - enabled: true - command: php-cs-fixer - config: - level: psr2 - filter: - excluded_paths: - - 'docs/*' - - 'examples/*' - - 'extras/*' - - 'test/*' - - 'vendor/*' - - - # Analyzes the size and structure of a PHP project. - php_loc: - enabled: true - command: phploc - excluded_dirs: - - docs - - examples - - extras - - test - - vendor - - - # PHP Mess Detector (http://phpmd.org). - php_mess_detector: - enabled: true - command: phpmd - config: - rulesets: - - codesize - - unusedcode - - naming - - design - naming_rules: - short_variable: { minimum: 2 } - filter: - excluded_paths: - - 'docs/*' - - 'examples/*' - - 'extras/*' - - 'test/*' - - 'vendor/*' - - # Analyzes the size and structure of a PHP project. - php_pdepend: - enabled: true - command: pdepend - excluded_dirs: - - docs - - examples - - extras - - test - - vendor - - # Runs Scrutinizer's PHP Analyzer Tool - # https://scrutinizer-ci.com/docs/tools/php/php-analyzer/config_reference - php_analyzer: - enabled: true - config: - checkstyle: - enabled: true - naming: - enabled: true - property_name: ^[_a-zA-Z][a-zA-Z0-9_]*$ #Allow underscores & caps - method_name: ^(?:[_a-zA-Z]|__)[a-zA-Z0-9_]*$ #Allow underscores & caps - parameter_name: ^[a-z][a-zA-Z0-9_]*$ # Allow underscores - local_variable: ^[a-zA-Z][a-zA-Z0-9_]*$ #Allow underscores & caps - exception_name: ^[a-zA-Z][a-zA-Z0-9]*Exception$ - isser_method_name: ^(?:[_a-zA-Z]|__)[a-zA-Z0-9]*$ #Allow underscores & caps - filter: - excluded_paths: - - 'docs/*' - - 'examples/*' - - 'extras/*' - - 'test/*' - - 'vendor/*' - - # Security Advisory Checker - sensiolabs_security_checker: true diff --git a/download/phpmailer529/.travis.yml b/download/phpmailer529/.travis.yml deleted file mode 100755 index c49dd2182..000000000 --- a/download/phpmailer529/.travis.yml +++ /dev/null @@ -1,33 +0,0 @@ -language: php -php: - - 5.6 - - 5.5 - - 5.4 - - 5.3 - - hhvm - -matrix: - allow_failures: - - php: hhvm - -before_install: - - sudo apt-get update -qq - - sudo apt-get install -y -qq postfix -before_script: - - sudo service postfix stop - - smtp-sink -d "%d.%H.%M.%S" localhost:2500 1000 & - - mkdir -p build/logs - - cd test - - cp testbootstrap-dist.php testbootstrap.php - - chmod +x fakesendmail.sh - - sudo mkdir -p /var/qmail/bin - - sudo cp fakesendmail.sh /var/qmail/bin/sendmail - - sudo cp fakesendmail.sh /usr/sbin/sendmail - - echo 'sendmail_path = "/usr/sbin/sendmail -t -i "' | sudo tee "/home/travis/.phpenv/versions/`php -r 'echo PHP_VERSION;'`/etc/conf.d/sendmail.ini" - - pwd - - ls -al -script: - - phpunit --configuration ../travis.phpunit.xml.dist -after_script: - - wget https://scrutinizer-ci.com/ocular.phar - - php ocular.phar code-coverage:upload --format=php-clover ../build/logs/clover.xml diff --git a/download/phpmailer529/LICENSE b/download/phpmailer529/LICENSE deleted file mode 100755 index 8e0763d1c..000000000 --- a/download/phpmailer529/LICENSE +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/download/phpmailer529/PHPMailerAutoload.php b/download/phpmailer529/PHPMailerAutoload.php deleted file mode 100755 index eaa2e3034..000000000 --- a/download/phpmailer529/PHPMailerAutoload.php +++ /dev/null @@ -1,49 +0,0 @@ - - * @author Jim Jagielski (jimjag) - * @author Andy Prevost (codeworxtech) - * @author Brent R. Matzelle (original founder) - * @copyright 2012 - 2014 Marcus Bointon - * @copyright 2010 - 2012 Jim Jagielski - * @copyright 2004 - 2009 Andy Prevost - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - * @note This program is distributed in the hope that it will be useful - WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. - */ - -/** - * PHPMailer SPL autoloader. - * @param string $classname The name of the class to load - */ -function PHPMailerAutoload($classname) -{ - //Can't use __DIR__ as it's only in PHP 5.3+ - $filename = dirname(__FILE__).DIRECTORY_SEPARATOR.'class.'.strtolower($classname).'.php'; - if (is_readable($filename)) { - require $filename; - } -} - -if (version_compare(PHP_VERSION, '5.1.2', '>=')) { - //SPL autoloading was introduced in PHP 5.1.2 - if (version_compare(PHP_VERSION, '5.3.0', '>=')) { - spl_autoload_register('PHPMailerAutoload', true, true); - } else { - spl_autoload_register('PHPMailerAutoload'); - } -} else { - /** - * Fall back to traditional autoload for old PHP versions - * @param string $classname The name of the class to load - */ - function __autoload($classname) - { - PHPMailerAutoload($classname); - } -} diff --git a/download/phpmailer529/README.md b/download/phpmailer529/README.md deleted file mode 100755 index e952185d3..000000000 --- a/download/phpmailer529/README.md +++ /dev/null @@ -1,165 +0,0 @@ -![PHPMailer](https://raw.github.com/PHPMailer/PHPMailer/master/examples/images/phpmailer.png) - -# PHPMailer - A full-featured email creation and transfer class for PHP - -Build status: [![Build Status](https://travis-ci.org/PHPMailer/PHPMailer.svg)](https://travis-ci.org/PHPMailer/PHPMailer) -[![Scrutinizer Quality Score](https://scrutinizer-ci.com/g/PHPMailer/PHPMailer/badges/quality-score.png?s=3758e21d279becdf847a557a56a3ed16dfec9d5d)](https://scrutinizer-ci.com/g/PHPMailer/PHPMailer/) -[![Code Coverage](https://scrutinizer-ci.com/g/PHPMailer/PHPMailer/badges/coverage.png?s=3fe6ca5fe8cd2cdf96285756e42932f7ca256962)](https://scrutinizer-ci.com/g/PHPMailer/PHPMailer/) - -## Class Features - -- Probably the world's most popular code for sending email from PHP! -- Used by many open-source projects: Wordpress, Drupal, 1CRM, SugarCRM, Yii, Joomla! and many more -- Integrated SMTP support - send without a local mail server -- Send emails with multiple TOs, CCs, BCCs and REPLY-TOs -- Multipart/alternative emails for mail clients that do not read HTML email -- Support for UTF-8 content and 8bit, base64, binary, and quoted-printable encodings -- SMTP authentication with LOGIN, PLAIN, NTLM and CRAM-MD5 mechanisms over SSL and TLS transports -- Native language support -- DKIM and S/MIME signing support -- Compatible with PHP 5.0 and later -- Much more! - -## Why you might need it - -Many PHP developers utilize email in their code. The only PHP function that supports this is the mail() function. However, it does not provide any assistance for making use of popular features such as HTML-based emails and attachments. - -Formatting email correctly is surprisingly difficult. There are myriad overlapping RFCs, requiring tight adherence to horribly complicated formatting and encoding rules - the vast majority of code that you'll find online that uses the mail() function directly is just plain wrong! -*Please* don't be tempted to do it yourself - if you don't use PHPMailer, there are many other excellent libraries that you should look at before rolling your own - try SwiftMailer, Zend_Mail, eZcomponents etc. - -The PHP mail() function usually sends via a local mail server, typically fronted by a `sendmail` binary on Linux, BSD and OS X platforms, however, Windows usually doesn't include a local mail server; PHPMailer's integrated SMTP implementation allows email sending on Windows platforms without a local mail server. - -## License - -This software is licenced under the [LGPL 2.1](http://www.gnu.org/licenses/lgpl-2.1.html). Please read LICENSE for information on the -software availability and distribution. - -## Installation & loading - -PHPMailer is available via [Composer/Packagist](https://packagist.org/packages/phpmailer/phpmailer). Alternatively, just copy the contents of the PHPMailer folder into somewhere that's in your PHP `include_path` setting. If you don't speak git or just want a tarball, click the 'zip' button at the top of the page in GitHub. - -PHPMailer provides an SPL-compatible autoloader, and that is the preferred way of loading the library - just `require '/path/to/PHPMailerAutoload.php';` and everything should work. The autoloader does not throw errors if it can't find classes so it prepends itself to the SPL list, allowing your own (or your framework's) autoloader to catch errors. SPL autoloading was introduced in PHP 5.1.0, so if you are using a version older than that you will need to require/include each class manually. - -PHPMailer does *not* declare a namespace because namespaces were only introduced in PHP 5.3. - -### Minimal installation - -While installing the entire package manually or with composer is simple, convenient and reliable, you may want to include only vital files in your project. At the very least you will need [class.phpmailer.php](class.phpmailer.php). If you're using SMTP, you'll need [class.smtp.php](class.smtp.php), and if you're using POP-before SMTP, you'll need [class.pop3.php](class.pop3.php). For all of these, we recommend you use [the autoloader](PHPMailerAutoload.php) too as otherwise you will either have to `require` all classes manually or use some other autoloader. You can skip the [language](language/) folder if you're not showing errors to users and can make do with English-only errors. You may need the additional classes in the [extras](extras/) folder if you are using those features, including NTLM authentication and ics generation. - -## A Simple Example - -```php -SMTPDebug = 3; // Enable verbose debug output - -$mail->isSMTP(); // Set mailer to use SMTP -$mail->Host = 'smtp1.example.com;smtp2.example.com'; // Specify main and backup SMTP servers -$mail->SMTPAuth = true; // Enable SMTP authentication -$mail->Username = 'user@example.com'; // SMTP username -$mail->Password = 'secret'; // SMTP password -$mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted -$mail->Port = 587; // TCP port to connect to - -$mail->From = 'from@example.com'; -$mail->FromName = 'Mailer'; -$mail->addAddress('joe@example.net', 'Joe User'); // Add a recipient -$mail->addAddress('ellen@example.com'); // Name is optional -$mail->addReplyTo('info@example.com', 'Information'); -$mail->addCC('cc@example.com'); -$mail->addBCC('bcc@example.com'); - -$mail->addAttachment('/var/tmp/file.tar.gz'); // Add attachments -$mail->addAttachment('/tmp/image.jpg', 'new.jpg'); // Optional name -$mail->isHTML(true); // Set email format to HTML - -$mail->Subject = 'Here is the subject'; -$mail->Body = 'This is the HTML message body in bold!'; -$mail->AltBody = 'This is the body in plain text for non-HTML mail clients'; - -if(!$mail->send()) { - echo 'Message could not be sent.'; - echo 'Mailer Error: ' . $mail->ErrorInfo; -} else { - echo 'Message has been sent'; -} -``` - -You'll find plenty more to play with in the [examples](examples/) folder. - -That's it. You should now be ready to use PHPMailer! - -## Localization -PHPMailer defaults to English, but in the [language](language/) folder you'll find numerous (41 at the time of writing!) translations for PHPMailer error messages that you may encounter. Their filenames contain [ISO 639-1](http://en.wikipedia.org/wiki/ISO_639-1) language code for the translations, for example `fr` for French. To specify a language, you need to tell PHPMailer which one to use, like this: - -```php -// To load the French version -$mail->setLanguage('fr', '/optional/path/to/language/directory/'); -``` - -We welcome corrections and new languages - if you're looking for corrections to do, run the [phpmailerLangTest.php](test/phpmailerLangTest.php) script in the tests folder and it will show any missing translations. - -## Documentation - -Examples of how to use PHPMailer for common scenarios can be found in the [examples](examples/) folder. If you're looking for a good starting point, we recommend you start with [the gmail example](examples/gmail.phps). - -There are tips and a troubleshooting guide in the [GitHub wiki](https://github.com/PHPMailer/PHPMailer/wiki). If you're having trouble, this should be the first place you look as it's the most frequently updated. - -Complete generated API documentation is [available online](http://phpmailer.github.io/PHPMailer/). - -You'll find some basic user-level docs in the [docs](docs/) folder, and you can generate complete API-level documentation using the [generatedocs.sh](docs/generatedocs.sh) shell script in the docs folder, though you'll need to install [PHPDocumentor](http://www.phpdoc.org) first. You may find [the unit tests](test/phpmailerTest.php) a good source of how to do various operations such as encryption. - -If the documentation doesn't cover what you need, search the [many questions on StackOverflow](http://stackoverflow.com/questions/tagged/phpmailer), and before you ask a question about "SMTP Error: Could not connect to SMTP host.", [read the troubleshooting guide](https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting). - -## Tests - -There is a PHPUnit test script in the [test](test/) folder. - -Build status: [![Build Status](https://travis-ci.org/PHPMailer/PHPMailer.svg)](https://travis-ci.org/PHPMailer/PHPMailer) - -If this isn't passing, is there something you can do to help? - -## Contributing - -Please submit bug reports, suggestions and pull requests to the [GitHub issue tracker](https://github.com/PHPMailer/PHPMailer/issues). - -We're particularly interested in fixing edge-cases, expanding test coverage and updating translations. - -With the move to the PHPMailer GitHub organisation, you'll need to update any remote URLs referencing the old GitHub location with a command like this from within your clone: - -`git remote set-url upstream https://github.com/PHPMailer/PHPMailer.git` - -Please *don't* use the SourceForge or Google Code projects any more. - -## Sponsorship - -Development time and resources for PHPMailer are provided by [Smartmessages.net](https://info.smartmessages.net/), a powerful email marketing system. - -Smartmessages email marketing - -Other contributions are gladly received, whether in beer 🍺, T-shirts 👕, Amazon wishlist raids, or cold, hard cash 💰. - -## Changelog - -See [changelog](changelog.md). - -## History -- PHPMailer was originally written in 2001 by Brent R. Matzelle as a [SourceForge project](http://sourceforge.net/projects/phpmailer/). -- Marcus Bointon (coolbru on SF) and Andy Prevost (codeworxtech) took over the project in 2004. -- Became an Apache incubator project on Google Code in 2010, managed by Jim Jagielski. -- Marcus created his fork on [GitHub](https://github.com/Synchro/PHPMailer). -- Jim and Marcus decide to join forces and use GitHub as the canonical and official repo for PHPMailer. -- PHPMailer moves to the [PHPMailer organisation](https://github.com/PHPMailer) on GitHub. - -### What's changed since moving from SourceForge? -- Official successor to the SourceForge and Google Code projects. -- Test suite. -- Continuous integration with Travis-CI. -- Composer support. -- Public development. -- Additional languages and language strings. -- CRAM-MD5 authentication support. -- Preserves full repo history of authors, commits and branches from the original SourceForge project. diff --git a/download/phpmailer529/VERSION b/download/phpmailer529/VERSION deleted file mode 100755 index 485d792a3..000000000 --- a/download/phpmailer529/VERSION +++ /dev/null @@ -1 +0,0 @@ -5.2.9 \ No newline at end of file diff --git a/download/phpmailer529/changelog.md b/download/phpmailer529/changelog.md deleted file mode 100755 index 52bc328ad..000000000 --- a/download/phpmailer529/changelog.md +++ /dev/null @@ -1,573 +0,0 @@ -# ChangeLog - -* Use `application/javascript` for .js attachments -* Improve RFC2821 compliance for timelimits, especially for end-of-data -* Add Azerbaijani translations (Thanks to @mirjalal) -* Minor code cleanup for robustness -* Add Indonesian translations (Thanks to @ceceprawiro) -* Avoid `error_log` Debugoutput naming clash -* Add ability to parse server capabilities in response to EHLO (useful for SendGrid etc) -* Amended default values for WordWrap to match RFC -* Remove html2text converter class, provide new mechanism for injecting converters -* Improve pointers to docs and support in README -* Add example file upload script -* Refactor and major cleanup of EasyPeasyICS, now a lot more usable - -## Version 5.2.9 (Sept 25th 2014) -* **Important: The autoloader is no longer autoloaded by the PHPMailer class** -* Update html2text from https://github.com/mtibben/html2text -* Improve Arabic translations (Thanks to @tarekdj) -* Consistent handling of connection variables in SMTP and POP3 -* PHPDoc cleanup -* Update composer to use PHPUnit 4.1 -* Pass consistent params to callbacks -* More consistent handling of error states and debug output -* Use property defaults, remove constructors -* Remove unreachable code -* Use older regex validation pattern for troublesome PCRE library versions -* Improve PCRE detection in older PHP versions -* Handle debug output consistently, and always in UTF-8 -* Allow user-defined debug output method via a callable -* msgHTML now converts data URIs to embedded images -* SMTP::getLastReply() will now always be populated -* Improved example code in README -* Ensure long filenames in Content-Disposition are encoded correctly -* Simplify SMTP debug output mechanism, clarify levels with constants -* Add SMTP connection check example -* Simplify examples, don't use mysql* functions - -## Version 5.2.8 (May 14th 2014) -* Increase timeout to match RFC2821 section 4.5.3.2 and thus not fail greetdelays, fixes #104 -* Add timestamps to default debug output -* Add connection events and new level 3 to debug output options -* Chinese language update (Thanks to @binaryoung) -* Allow custom Mailer types (Thanks to @michield) -* Cope with spaces around SMTP host specs -* Fix processing of multiple hosts in connect string -* Added Galician translation (Thanks to @donatorouco) -* Autoloader now prepends -* Docs updates -* Add Latvian translation (Thanks to @eddsstudio) -* Add Belarusian translation (Thanks to @amaksymiuk) -* Make autoloader work better on older PHP versions -* Avoid double-encoding if mbstring is overloading mail() -* Add Portuguese translation (Thanks to @Jonadabe) -* Make quoted-printable encoder respect line ending setting -* Improve Chinese translation (Thanks to @PeterDaveHello) -* Add Georgian translation (Thanks to @akalongman) -* Add Greek translation (Thanks to @lenasterg) -* Fix serverHostname on PHP < 5.3 -* Improve performance of SMTP class -* Implement automatic 7bit downgrade -* Add Vietnamese translation (Thanks to @vinades) -* Improve example images, switch to PNG -* Add Croatian translation (Thanks to @hrvoj3e) -* Remove setting the Return-Path and deprecate the Return-path property - it's just wrong! -* Fix language file loading if CWD has changed (@stephandesouza) -* Add HTML5 email validation pattern -* Improve Turkish translations (Thanks to @yasinaydin) -* Improve Romanian translations (Thanks to @aflorea) -* Check php.ini for path to sendmail/qmail before using default -* Improve Farsi translation (Thanks to @MHM5000) -* Don't use quoted-printable encoding for multipart types -* Add Serbian translation (Thanks to ajevremovic at gmail.com) -* Remove useless PHP5 check -* Use SVG for build status badges -* Store MessageDate on creation -* Better default behaviour for validateAddress - -## Version 5.2.7 (September 12th 2013) -* Add Ukrainian translation from @Krezalis -* Support for do_verp -* Fix bug in CRAM-MD5 AUTH -* Propagate Debugoutput option to SMTP class (@Reblutus) -* Determine MIME type of attachments automatically -* Add cross-platform, multibyte-safe pathinfo replacement (with tests) and use it -* Add a new 'html' Debugoutput type -* Clean up SMTP debug output, remove embedded HTML -* Some small changes in header formatting to improve IETF msglint test results -* Update test_script to use some recently changed features, rename to code_generator -* Generated code actually works! -* Update SyntaxHighlighter -* Major overhaul and cleanup of example code -* New PHPMailer graphic -* msgHTML now uses RFC2392-compliant content ids -* Add line break normalization function and use it in msgHTML -* Don't set unnecessary reply-to addresses -* Make fakesendmail.sh a bit cleaner and safer -* Set a content-transfer-encoding on multiparts (fixes msglint error) -* Fix cid generation in msgHTML (Thanks to @digitalthought) -* Fix handling of multiple SMTP servers (Thanks to @NanoCaiordo) -* SMTP->connect() now supports stream context options (Thanks to @stanislavdavid) -* Add support for iCal event alternatives (Thanks to @reblutus) -* Update to Polish language file (Thanks to Krzysztof Kowalewski) -* Update to Norwegian language file (Thanks to @datagutten) -* Update to Hungarian language file (Thanks to @dominicus-75) -* Add Persian/Farsi translation from @jaii -* Make SMTPDebug property type match type in SMTP class -* Add unit tests for DKIM -* Major refactor of SMTP class -* Reformat to PSR-2 coding standard -* Introduce autoloader -* Allow overriding of SMTP class -* Overhaul of PHPDocs -* Fix broken Q-encoding -* Czech language update (Thanks to @nemelu) -* Removal of excess blank lines in messages -* Added fake POP server and unit tests for POP-before-SMTP - -## Version 5.2.6 (April 11th 2013) -* Reflect move to PHPMailer GitHub organisation at https://github.com/PHPMailer/PHPMailer -* Fix unbumped version numbers -* Update packagist.org with new location -* Clean up Changelog - -## Version 5.2.5 (April 6th 2013) -* First official release after move from Google Code -* Fixes for qmail when sending via mail() -* Merge in changes from Google code 5.2.4 release -* Minor coding standards cleanup in SMTP class -* Improved unit tests, now tests S/MIME signing -* Travis-CI support on GitHub, runs tests with fake SMTP server - -## Version 5.2.4 (February 19, 2013) -* Fix tag and version bug. -* un-deprecate isSMTP(), isMail(), IsSendmail() and isQmail(). -* Numerous translation updates - -## Version 5.2.3 (February 8, 2013) -* Fix issue with older PCREs and ValidateAddress() (Bugz: 124) -* Add CRAM-MD5 authentication, thanks to Elijah madden, https://github.com/okonomiyaki3000 -* Replacement of obsolete Quoted-Printable encoder with a much better implementation -* Composer package definition -* New language added: Hebrew - -## Version 5.2.2 (December 3, 2012) -* Some fixes and syncs from https://github.com/Synchro/PHPMailer -* Add Slovak translation, thanks to Michal Tinka - -## Version 5.2.2-rc2 (November 6, 2012) -* Fix SMTP server rotation (Bugz: 118) -* Allow override of autogen'ed 'Date' header (for Drupal's - og_mailinglist module) -* No whitespace after '-f' option (Bugz: 116) -* Work around potential warning (Bugz: 114) - -## Version 5.2.2-rc1 (September 28, 2012) -* Header encoding works with long lines (Bugz: 93) -* Turkish language update (Bugz: 94) -* undefined $pattern in EncodeQ bug squashed (Bugz: 98) -* use of mail() in safe_mode now works (Bugz: 96) -* ValidateAddress() now 'public static' so people can override the - default and use their own validation scheme. -* ValidateAddress() no longer uses broken FILTER_VALIDATE_EMAIL -* Added in AUTH PLAIN SMTP authentication - -## Version 5.2.2-beta2 (August 17, 2012) -* Fixed Postfix VERP support (Bugz: 92) -* Allow action_function callbacks to pass/use - the From address (passed as final param) -* Prevent inf look for get_lines() (Bugz: 77) -* New public var ($UseSendmailOptions). Only pass sendmail() - options iff we really are using sendmail or something sendmail - compatible. (Bugz: 75) -* default setting for LE returned to "\n" due to popular demand. - -## Version 5.2.2-beta1 (July 13, 2012) -* Expose PreSend() and PostSend() as public methods to allow - for more control if serializing message sending. -* GetSentMIMEMessage() only constructs the message copy when - needed. Save memory. -* Only pass params to mail() if the underlying MTA is - "sendmail" (as defined as "having the string sendmail - in its pathname") [#69] -* Attachments now work with Amazon SES and others [Bugz#70] -* Debug output now sent to stdout (via echo) or error_log [Bugz#5] -* New var: Debugoutput (for above) [Bugz#5] -* SMTP reads now Timeout aware (new var: Timeout=15) [Bugz#71] -* SMTP reads now can have a Timelimit associated with them - (new var: Timelimit=30)[Bugz#71] -* Fix quoting issue associated with charsets -* default setting for LE is now RFC compliant: "\r\n" -* Return-Path can now be user defined (new var: ReturnPath) - (the default is "" which implies no change from previous - behavior, which was to use either From or Sender) [Bugz#46] -* X-Mailer header can now be disabled (by setting to a - whitespace string, eg " ") [Bugz#66] -* Bugz closed: #68, #60, #42, #43, #59, #55, #66, #48, #49, - #52, #31, #41, #5. #70, #69 - -## Version 5.2.1 (January 16, 2012) -* Closed several bugs #5 -* Performance improvements -* MsgHTML() now returns the message as required. -* New method: GetSentMIMEMessage() (returns full copy of sent message) - -## Version 5.2 (July 19, 2011) -* protected MIME body and header -* better DKIM DNS Resource Record support -* better aly handling -* htmlfilter class added to extras -* moved to Apache Extras - -## Version 5.1 (October 20, 2009) -* fixed filename issue with AddStringAttachment (thanks to Tony) -* fixed "SingleTo" property, now works with Senmail, Qmail, and SMTP in - addition to PHP mail() -* added DKIM digital signing functionality, new properties: - - DKIM_domain (sets the domain name) - - DKIM_private (holds DKIM private key) - - DKIM_passphrase (holds your DKIM passphrase) - - DKIM_selector (holds the DKIM "selector") - - DKIM_identity (holds the identifying email address) -* added callback function support - - callback function parameters include: - result, to, cc, bcc, subject and body - - see the test/test_callback.php file for usage. -* added "auto" identity functionality - - can automatically add: - - Return-path (if Sender not set) - - Reply-To (if ReplyTo not set) - - can be disabled: - - $mail->SetFrom('yourname@yourdomain.com','First Last',false); - - or by adding the $mail->Sender and/or $mail->ReplyTo properties - -Note: "auto" identity added to help with emails ending up in spam or junk boxes because of missing headers - -## Version 5.0.2 (May 24, 2009) -* Fix for missing attachments when inline graphics are present -* Fix for missing Cc in header when using SMTP (mail was sent, - but not displayed in header -- Cc receiver only saw email To: - line and no Cc line, but did get the email (To receiver - saw same) - -## Version 5.0.1 (April 05, 2009) -* Temporary fix for missing attachments - -## Version 5.0.0 (April 02, 2009) -With the release of this version, we are initiating a new version numbering -system to differentiate from the PHP4 version of PHPMailer. -Most notable in this release is fully object oriented code. - -### class.smtp.php: -* Refactored class.smtp.php to support new exception handling -* code size reduced from 29.2 Kb to 25.6 Kb -* Removed unnecessary functions from class.smtp.php: - - public function Expand($name) { - - public function Help($keyword="") { - - public function Noop() { - - public function Send($from) { - - public function SendOrMail($from) { - - public function Verify($name) { - -### class.phpmailer.php: -* Refactored class.phpmailer.php with new exception handling -* Changed processing functionality of Sendmail and Qmail so they cannot be - inadvertently used -* removed getFile() function, just became a simple wrapper for - file_get_contents() -* added check for PHP version (will gracefully exit if not at least PHP 5.0) -* enhanced code to check if an attachment source is the same as an embedded or - inline graphic source to eliminate duplicate attachments - -### New /test_script -We have written a test script you can use to test the script as part of your -installation. Once you press submit, the test script will send a multi-mime -email with either the message you type in or an HTML email with an inline -graphic. Two attachments are included in the email (one of the attachments -is also the inline graphic so you can see that only one copy of the graphic -is sent in the email). The test script will also display the functional -script that you can copy/paste to your editor to duplicate the functionality. - -### New examples -All new examples in both basic and advanced modes. Advanced examples show - Exception handling. - -### PHPDocumentator (phpdocs) documentation for PHPMailer version 5.0.0 -All new documentation - -## Version 2.3 (November 06, 2008) -* added Arabic language (many thanks to Bahjat Al Mostafa) -* removed English language from language files and made it a default within - class.phpmailer.php - if no language is found, it will default to use - the english language translation -* fixed public/private declarations -* corrected line 1728, $basedir to $directory -* added $sign_cert_file to avoid improper duplicate use of $sign_key_file -* corrected $this->Hello on line 612 to $this->Helo -* changed default of $LE to "\r\n" to comply with RFC 2822. Can be set by the user - if default is not acceptable -* removed trim() from return results in EncodeQP -* /test and three files it contained are removed from version 2.3 -* fixed phpunit.php for compliance with PHP5 -* changed $this->AltBody = $textMsg; to $this->AltBody = html_entity_decode($textMsg); -* We have removed the /phpdoc from the downloads. All documentation is now on - the http://phpmailer.codeworxtech.com website. - -## Version 2.2.1 () July 19 2008 -* fixed line 1092 in class.smtp.php (my apologies, error on my part) - -## Version 2.2 () July 15 2008 -* Fixed redirect issue (display of UTF-8 in thank you redirect) -* fixed error in getResponse function declaration (class.pop3.php) -* PHPMailer now PHP6 compliant -* fixed line 1092 in class.smtp.php (endless loop from missing = sign) - -## Version 2.1 (Wed, June 04 2008) -NOTE: WE HAVE A NEW LANGUAGE VARIABLE FOR DIGITALLY SIGNED S/MIME EMAILS. IF YOU CAN HELP WITH LANGUAGES OTHER THAN ENGLISH AND SPANISH, IT WOULD BE APPRECIATED. - -* added S/MIME functionality (ability to digitally sign emails) - BIG THANKS TO "sergiocambra" for posting this patch back in November 2007. - The "Signed Emails" functionality adds the Sign method to pass the private key - filename and the password to read it, and then email will be sent with - content-type multipart/signed and with the digital signature attached. -* fully compatible with E_STRICT error level - - Please note: - In about half the test environments this development version was subjected - to, an error was thrown for the date() functions used (line 1565 and 1569). - This is NOT a PHPMailer error, it is the result of an incorrectly configured - PHP5 installation. The fix is to modify your 'php.ini' file and include the - date.timezone = Etc/UTC (or your own zone) - directive, to your own server timezone - - If you do get this error, and are unable to access your php.ini file: - In your PHP script, add - `date_default_timezone_set('Etc/UTC');` - - do not try to use - `$myVar = date_default_timezone_get();` - as a test, it will throw an error. -* added ability to define path (mainly for embedded images) - function `MsgHTML($message,$basedir='')` ... where: - `$basedir` is the fully qualified path -* fixed `MsgHTML()` function: - - Embedded Images where images are specified by `://` will not be altered or embedded -* fixed the return value of SMTP exit code ( pclose ) -* addressed issue of multibyte characters in subject line and truncating -* added ability to have user specified Message ID - (default is still that PHPMailer create a unique Message ID) -* corrected unidentified message type to 'application/octet-stream' -* fixed chunk_split() multibyte issue (thanks to Colin Brown, et al). -* added check for added attachments -* enhanced conversion of HTML to text in MsgHTML (thanks to "brunny") - -## Version 2.1.0beta2 (Sun, Dec 02 2007) -* implemented updated EncodeQP (thanks to coolbru, aka Marcus Bointon) -* finished all testing, all known bugs corrected, enhancements tested - -Note: will NOT work with PHP4. - -Please note, this is BETA software **DO NOT USE THIS IN PRODUCTION OR LIVE PROJECTS; INTENDED STRICTLY FOR TESTING** - -## Version 2.1.0beta1 -Please note, this is BETA software -** DO NOT USE THIS IN PRODUCTION OR LIVE PROJECTS - INTENDED STRICTLY FOR TESTING - -## Version 2.0.0 rc2 (Fri, Nov 16 2007), interim release -* implements new property to control VERP in class.smtp.php - example (requires instantiating class.smtp.php): - $mail->do_verp = true; -* POP-before-SMTP functionality included, thanks to Richard Davey - (see class.pop3.php & pop3_before_smtp_test.php for examples) -* included example showing how to use PHPMailer with GMAIL -* fixed the missing Cc in SendMail() and Mail() - -## Version 2.0.0 rc1 (Thu, Nov 08 2007), interim release -* dramatically simplified using inline graphics ... it's fully automated and requires no user input -* added automatic document type detection for attachments and pictures -* added MsgHTML() function to replace Body tag for HTML emails -* fixed the SendMail security issues (input validation vulnerability) -* enhanced the AddAddresses functionality so that the "Name" portion is used in the email address -* removed the need to use the AltBody method (set from the HTML, or default text used) -* set the PHP Mail() function as the default (still support SendMail, SMTP Mail) -* removed the need to set the IsHTML property (set automatically) -* added Estonian language file by Indrek Päri -* added header injection patch -* added "set" method to permit users to create their own pseudo-properties like 'X-Headers', etc. -* fixed warning message in SMTP get_lines method -* added TLS/SSL SMTP support. -* PHPMailer has been tested with PHP4 (4.4.7) and PHP5 (5.2.7) -* Works with PHP installed as a module or as CGI-PHP -NOTE: will NOT work with PHP5 in E_STRICT error mode - -## Version 1.73 (Sun, Jun 10 2005) -* Fixed denial of service bug: http://www.cybsec.com/vuln/PHPMailer-DOS.pdf -* Now has a total of 20 translations -* Fixed alt attachments bug: http://tinyurl.com/98u9k - -## Version 1.72 (Wed, May 25 2004) -* Added Dutch, Swedish, Czech, Norwegian, and Turkish translations. -* Received: Removed this method because spam filter programs like - SpamAssassin reject this header. -* Fixed error count bug. -* SetLanguage default is now "language/". -* Fixed magic_quotes_runtime bug. - -## Version 1.71 (Tue, Jul 28 2003) -* Made several speed enhancements -* Added German and Italian translation files -* Fixed HELO/AUTH bugs on keep-alive connects -* Now provides an error message if language file does not load -* Fixed attachment EOL bug -* Updated some unclear documentation -* Added additional tests and improved others - -## Version 1.70 (Mon, Jun 20 2003) -* Added SMTP keep-alive support -* Added IsError method for error detection -* Added error message translation support (SetLanguage) -* Refactored many methods to increase library performance -* Hello now sends the newer EHLO message before HELO as per RFC 2821 -* Removed the boundary class and replaced it with GetBoundary -* Removed queue support methods -* New $Hostname variable -* New Message-ID header -* Received header reformat -* Helo variable default changed to $Hostname -* Removed extra spaces in Content-Type definition (#667182) -* Return-Path should be set to Sender when set -* Adds Q or B encoding to headers when necessary -* quoted-encoding should now encode NULs \000 -* Fixed encoding of body/AltBody (#553370) -* Adds "To: undisclosed-recipients:;" when all recipients are hidden (BCC) -* Multiple bug fixes - -## Version 1.65 (Fri, Aug 09 2002) -* Fixed non-visible attachment bug (#585097) for Outlook -* SMTP connections are now closed after each transaction -* Fixed SMTP::Expand return value -* Converted SMTP class documentation to phpDocumentor format - -## Version 1.62 (Wed, Jun 26 2002) -* Fixed multi-attach bug -* Set proper word wrapping -* Reduced memory use with attachments -* Added more debugging -* Changed documentation to phpDocumentor format - -## Version 1.60 (Sat, Mar 30 2002) -* Sendmail pipe and address patch (Christian Holtje) -* Added embedded image and read confirmation support (A. Ognio) -* Added unit tests -* Added SMTP timeout support (*nix only) -* Added possibly temporary PluginDir variable for SMTP class -* Added LE message line ending variable -* Refactored boundary and attachment code -* Eliminated SMTP class warnings -* Added SendToQueue method for future queuing support - -## Version 1.54 (Wed, Dec 19 2001) -* Add some queuing support code -* Fixed a pesky multi/alt bug -* Messages are no longer forced to have "To" addresses - -## Version 1.50 (Thu, Nov 08 2001) -* Fix extra lines when not using SMTP mailer -* Set WordWrap variable to int with a zero default - -## Version 1.47 (Tue, Oct 16 2001) -* Fixed Received header code format -* Fixed AltBody order error -* Fixed alternate port warning - -## Version 1.45 (Tue, Sep 25 2001) -* Added enhanced SMTP debug support -* Added support for multiple ports on SMTP -* Added Received header for tracing -* Fixed AddStringAttachment encoding -* Fixed possible header name quote bug -* Fixed wordwrap() trim bug -* Couple other small bug fixes - -## Version 1.41 (Wed, Aug 22 2001) -* Fixed AltBody bug w/o attachments -* Fixed rfc_date() for certain mail servers - -## Version 1.40 (Sun, Aug 12 2001) -* Added multipart/alternative support (AltBody) -* Documentation update -* Fixed bug in Mercury MTA - -## Version 1.29 (Fri, Aug 03 2001) -* Added AddStringAttachment() method -* Added SMTP authentication support - -## Version 1.28 (Mon, Jul 30 2001) -* Fixed a typo in SMTP class -* Fixed header issue with Imail (win32) SMTP server -* Made fopen() calls for attachments use "rb" to fix win32 error - -## Version 1.25 (Mon, Jul 02 2001) -* Added RFC 822 date fix (Patrice) -* Added improved error handling by adding a $ErrorInfo variable -* Removed MailerDebug variable (obsolete with new error handler) - -## Version 1.20 (Mon, Jun 25 2001) -* Added quoted-printable encoding (Patrice) -* Set Version as public and removed PrintVersion() -* Changed phpdoc to only display public variables and methods - -## Version 1.19 (Thu, Jun 21 2001) -* Fixed MS Mail header bug -* Added fix for Bcc problem with mail(). *Does not work on Win32* - (See PHP bug report: http://www.php.net/bugs.php?id=11616) -* mail() no longer passes a fifth parameter when not needed - -## Version 1.15 (Fri, Jun 15 2001) -Note: these changes contributed by Patrice Fournier -* Changed all remaining \n to \r\n -* Bcc: header no longer written to message except - when sent directly to sendmail -* Added a small message to non-MIME compliant mail reader -* Added Sender variable to change the Sender email - used in -f for sendmail/mail and in 'MAIL FROM' for smtp mode -* Changed boundary setting to a place it will be set only once -* Removed transfer encoding for whole message when using multipart -* Message body now uses Encoding in multipart messages -* Can set encoding and type to attachments 7bit, 8bit - and binary attachment are sent as is, base64 are encoded -* Can set Encoding to base64 to send 8 bits body - through 7 bits servers - -## Version 1.10 (Tue, Jun 12 2001) -* Fixed win32 mail header bug (printed out headers in message body) - -## Version 1.09 (Fri, Jun 08 2001) -* Changed date header to work with Netscape mail programs -* Altered phpdoc documentation - -## Version 1.08 (Tue, Jun 05 2001) -* Added enhanced error-checking -* Added phpdoc documentation to source - -## Version 1.06 (Fri, Jun 01 2001) -* Added optional name for file attachments - -## Version 1.05 (Tue, May 29 2001) -* Code cleanup -* Eliminated sendmail header warning message -* Fixed possible SMTP error - -## Version 1.03 (Thu, May 24 2001) -* Fixed problem where qmail sends out duplicate messages - -## Version 1.02 (Wed, May 23 2001) -* Added multiple recipient and attachment Clear* methods -* Added Sendmail public variable -* Fixed problem with loading SMTP library multiple times - -## Version 0.98 (Tue, May 22 2001) -* Fixed problem with redundant mail hosts sending out multiple messages -* Added additional error handler code -* Added AddCustomHeader() function -* Added support for Microsoft mail client headers (affects priority) -* Fixed small bug with Mailer variable -* Added PrintVersion() function - -## Version 0.92 (Tue, May 15 2001) -* Changed file names to class.phpmailer.php and class.smtp.php to match - current PHP class trend. -* Fixed problem where body not being printed when a message is attached -* Several small bug fixes - -## Version 0.90 (Tue, April 17 2001) -* Initial public release diff --git a/download/phpmailer529/class.phpmailer.php b/download/phpmailer529/class.phpmailer.php deleted file mode 100755 index bc07d6941..000000000 --- a/download/phpmailer529/class.phpmailer.php +++ /dev/null @@ -1,3471 +0,0 @@ - - * @author Jim Jagielski (jimjag) - * @author Andy Prevost (codeworxtech) - * @author Brent R. Matzelle (original founder) - * @copyright 2012 - 2014 Marcus Bointon - * @copyright 2010 - 2012 Jim Jagielski - * @copyright 2004 - 2009 Andy Prevost - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - * @note This program is distributed in the hope that it will be useful - WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. - */ - -/** - * PHPMailer - PHP email creation and transport class. - * @package PHPMailer - * @author Marcus Bointon (Synchro/coolbru) - * @author Jim Jagielski (jimjag) - * @author Andy Prevost (codeworxtech) - * @author Brent R. Matzelle (original founder) - */ -class PHPMailer -{ - /** - * The PHPMailer Version number. - * @type string - */ - public $Version = '5.2.9'; - - /** - * Email priority. - * Options: 1 = High, 3 = Normal, 5 = low. - * @type integer - */ - public $Priority = 3; - - /** - * The character set of the message. - * @type string - */ - public $CharSet = 'iso-8859-1'; - - /** - * The MIME Content-type of the message. - * @type string - */ - public $ContentType = 'text/plain'; - - /** - * The message encoding. - * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable". - * @type string - */ - public $Encoding = '8bit'; - - /** - * Holds the most recent mailer error message. - * @type string - */ - public $ErrorInfo = ''; - - /** - * The From email address for the message. - * @type string - */ - public $From = 'root@localhost'; - - /** - * The From name of the message. - * @type string - */ - public $FromName = 'Root User'; - - /** - * The Sender email (Return-Path) of the message. - * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode. - * @type string - */ - public $Sender = ''; - - /** - * The Return-Path of the message. - * If empty, it will be set to either From or Sender. - * @type string - * @deprecated Email senders should never set a return-path header; - * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything. - * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference - */ - public $ReturnPath = ''; - - /** - * The Subject of the message. - * @type string - */ - public $Subject = ''; - - /** - * An HTML or plain text message body. - * If HTML then call isHTML(true). - * @type string - */ - public $Body = ''; - - /** - * The plain-text message body. - * This body can be read by mail clients that do not have HTML email - * capability such as mutt & Eudora. - * Clients that can read HTML will view the normal Body. - * @type string - */ - public $AltBody = ''; - - /** - * An iCal message part body. - * Only supported in simple alt or alt_inline message types - * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator - * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/ - * @link http://kigkonsult.se/iCalcreator/ - * @type string - */ - public $Ical = ''; - - /** - * The complete compiled MIME message body. - * @access protected - * @type string - */ - protected $MIMEBody = ''; - - /** - * The complete compiled MIME message headers. - * @type string - * @access protected - */ - protected $MIMEHeader = ''; - - /** - * Extra headers that createHeader() doesn't fold in. - * @type string - * @access protected - */ - protected $mailHeader = ''; - - /** - * Word-wrap the message body to this number of chars. - * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance. - * @type integer - */ - public $WordWrap = 0; - - /** - * Which method to use to send mail. - * Options: "mail", "sendmail", or "smtp". - * @type string - */ - public $Mailer = 'mail'; - - /** - * The path to the sendmail program. - * @type string - */ - public $Sendmail = '/usr/sbin/sendmail'; - - /** - * Whether mail() uses a fully sendmail-compatible MTA. - * One which supports sendmail's "-oi -f" options. - * @type boolean - */ - public $UseSendmailOptions = true; - - /** - * Path to PHPMailer plugins. - * Useful if the SMTP class is not in the PHP include path. - * @type string - * @deprecated Should not be needed now there is an autoloader. - */ - public $PluginDir = ''; - - /** - * The email address that a reading confirmation should be sent to. - * @type string - */ - public $ConfirmReadingTo = ''; - - /** - * The hostname to use in Message-Id and Received headers - * and as default HELO string. - * If empty, the value returned - * by SERVER_NAME is used or 'localhost.localdomain'. - * @type string - */ - public $Hostname = ''; - - /** - * An ID to be used in the Message-Id header. - * If empty, a unique id will be generated. - * @type string - */ - public $MessageID = ''; - - /** - * The message Date to be used in the Date header. - * If empty, the current date will be added. - * @type string - */ - public $MessageDate = ''; - - /** - * SMTP hosts. - * Either a single hostname or multiple semicolon-delimited hostnames. - * You can also specify a different port - * for each host by using this format: [hostname:port] - * (e.g. "smtp1.example.com:25;smtp2.example.com"). - * You can also specify encryption type, for example: - * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465"). - * Hosts will be tried in order. - * @type string - */ - public $Host = 'localhost'; - - /** - * The default SMTP server port. - * @type integer - * @TODO Why is this needed when the SMTP class takes care of it? - */ - public $Port = 25; - - /** - * The SMTP HELO of the message. - * Default is $Hostname. - * @type string - * @see PHPMailer::$Hostname - */ - public $Helo = ''; - - /** - * The secure connection prefix. - * Options: "", "ssl" or "tls" - * @type string - */ - public $SMTPSecure = ''; - - /** - * Whether to use SMTP authentication. - * Uses the Username and Password properties. - * @type boolean - * @see PHPMailer::$Username - * @see PHPMailer::$Password - */ - public $SMTPAuth = false; - - /** - * SMTP username. - * @type string - */ - public $Username = ''; - - /** - * SMTP password. - * @type string - */ - public $Password = ''; - - /** - * SMTP auth type. - * Options are LOGIN (default), PLAIN, NTLM, CRAM-MD5 - * @type string - */ - public $AuthType = ''; - - /** - * SMTP realm. - * Used for NTLM auth - * @type string - */ - public $Realm = ''; - - /** - * SMTP workstation. - * Used for NTLM auth - * @type string - */ - public $Workstation = ''; - - /** - * The SMTP server timeout in seconds. - * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2 - * @type integer - */ - public $Timeout = 300; - - /** - * SMTP class debug output mode. - * Debug output level. - * Options: - * * `0` No output - * * `1` Commands - * * `2` Data and commands - * * `3` As 2 plus connection status - * * `4` Low-level data output - * @type integer - * @see SMTP::$do_debug - */ - public $SMTPDebug = 0; - - /** - * How to handle debug output. - * Options: - * * `echo` Output plain-text as-is, appropriate for CLI - * * `html` Output escaped, line breaks converted to `
    `, appropriate for browser output - * * `error_log` Output to error log as configured in php.ini - * - * Alternatively, you can provide a callable expecting two params: a message string and the debug level: - * - * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";}; - * - * @type string|callable - * @see SMTP::$Debugoutput - */ - public $Debugoutput = 'echo'; - - /** - * Whether to keep SMTP connection open after each message. - * If this is set to true then to close the connection - * requires an explicit call to smtpClose(). - * @type boolean - */ - public $SMTPKeepAlive = false; - - /** - * Whether to split multiple to addresses into multiple messages - * or send them all in one message. - * @type boolean - */ - public $SingleTo = false; - - /** - * Storage for addresses when SingleTo is enabled. - * @type array - * @TODO This should really not be public - */ - public $SingleToArray = array(); - - /** - * Whether to generate VERP addresses on send. - * Only applicable when sending via SMTP. - * @link http://en.wikipedia.org/wiki/Variable_envelope_return_path - * @link http://www.postfix.org/VERP_README.html Postfix VERP info - * @type boolean - */ - public $do_verp = false; - - /** - * Whether to allow sending messages with an empty body. - * @type boolean - */ - public $AllowEmpty = false; - - /** - * The default line ending. - * @note The default remains "\n". We force CRLF where we know - * it must be used via self::CRLF. - * @type string - */ - public $LE = "\n"; - - /** - * DKIM selector. - * @type string - */ - public $DKIM_selector = ''; - - /** - * DKIM Identity. - * Usually the email address used as the source of the email - * @type string - */ - public $DKIM_identity = ''; - - /** - * DKIM passphrase. - * Used if your key is encrypted. - * @type string - */ - public $DKIM_passphrase = ''; - - /** - * DKIM signing domain name. - * @example 'example.com' - * @type string - */ - public $DKIM_domain = ''; - - /** - * DKIM private key file path. - * @type string - */ - public $DKIM_private = ''; - - /** - * Callback Action function name. - * - * The function that handles the result of the send email action. - * It is called out by send() for each email sent. - * - * Value can be any php callable: http://www.php.net/is_callable - * - * Parameters: - * boolean $result result of the send action - * string $to email address of the recipient - * string $cc cc email addresses - * string $bcc bcc email addresses - * string $subject the subject - * string $body the email body - * string $from email address of sender - * @type string - */ - public $action_function = ''; - - /** - * What to use in the X-Mailer header. - * Options: null for default, whitespace for none, or a string to use - * @type string - */ - public $XMailer = ''; - - /** - * An instance of the SMTP sender class. - * @type SMTP - * @access protected - */ - protected $smtp = null; - - /** - * The array of 'to' addresses. - * @type array - * @access protected - */ - protected $to = array(); - - /** - * The array of 'cc' addresses. - * @type array - * @access protected - */ - protected $cc = array(); - - /** - * The array of 'bcc' addresses. - * @type array - * @access protected - */ - protected $bcc = array(); - - /** - * The array of reply-to names and addresses. - * @type array - * @access protected - */ - protected $ReplyTo = array(); - - /** - * An array of all kinds of addresses. - * Includes all of $to, $cc, $bcc, $replyto - * @type array - * @access protected - */ - protected $all_recipients = array(); - - /** - * The array of attachments. - * @type array - * @access protected - */ - protected $attachment = array(); - - /** - * The array of custom headers. - * @type array - * @access protected - */ - protected $CustomHeader = array(); - - /** - * The most recent Message-ID (including angular brackets). - * @type string - * @access protected - */ - protected $lastMessageID = ''; - - /** - * The message's MIME type. - * @type string - * @access protected - */ - protected $message_type = ''; - - /** - * The array of MIME boundary strings. - * @type array - * @access protected - */ - protected $boundary = array(); - - /** - * The array of available languages. - * @type array - * @access protected - */ - protected $language = array(); - - /** - * The number of errors encountered. - * @type integer - * @access protected - */ - protected $error_count = 0; - - /** - * The S/MIME certificate file path. - * @type string - * @access protected - */ - protected $sign_cert_file = ''; - - /** - * The S/MIME key file path. - * @type string - * @access protected - */ - protected $sign_key_file = ''; - - /** - * The S/MIME password for the key. - * Used only if the key is encrypted. - * @type string - * @access protected - */ - protected $sign_key_pass = ''; - - /** - * Whether to throw exceptions for errors. - * @type boolean - * @access protected - */ - protected $exceptions = false; - - /** - * Error severity: message only, continue processing. - */ - const STOP_MESSAGE = 0; - - /** - * Error severity: message, likely ok to continue processing. - */ - const STOP_CONTINUE = 1; - - /** - * Error severity: message, plus full stop, critical error reached. - */ - const STOP_CRITICAL = 2; - - /** - * SMTP RFC standard line ending. - */ - const CRLF = "\r\n"; - - /** - * Constructor. - * @param boolean $exceptions Should we throw external exceptions? - */ - public function __construct($exceptions = false) - { - $this->exceptions = (boolean)$exceptions; - } - - /** - * Destructor. - */ - public function __destruct() - { - if ($this->Mailer == 'smtp') { //close any open SMTP connection nicely - $this->smtpClose(); - } - } - - /** - * Call mail() in a safe_mode-aware fashion. - * Also, unless sendmail_path points to sendmail (or something that - * claims to be sendmail), don't pass params (not a perfect fix, - * but it will do) - * @param string $to To - * @param string $subject Subject - * @param string $body Message Body - * @param string $header Additional Header(s) - * @param string $params Params - * @access private - * @return boolean - */ - private function mailPassthru($to, $subject, $body, $header, $params) - { - //Check overloading of mail function to avoid double-encoding - if (ini_get('mbstring.func_overload') & 1) { - $subject = $this->secureHeader($subject); - } else { - $subject = $this->encodeHeader($this->secureHeader($subject)); - } - if (ini_get('safe_mode') || !($this->UseSendmailOptions)) { - $result = @mail($to, $subject, $body, $header); - } else { - $result = @mail($to, $subject, $body, $header, $params); - } - return $result; - } - - /** - * Output debugging info via user-defined method. - * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug). - * @see PHPMailer::$Debugoutput - * @see PHPMailer::$SMTPDebug - * @param string $str - */ - protected function edebug($str) - { - if ($this->SMTPDebug <= 0) { - return; - } - //Avoid clash with built-in function names - if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) { - call_user_func($this->Debugoutput, $str, $this->SMTPDebug); - return; - } - switch ($this->Debugoutput) { - case 'error_log': - //Don't output, just log - error_log($str); - break; - case 'html': - //Cleans up output a bit for a better looking, HTML-safe output - echo htmlentities( - preg_replace('/[\r\n]+/', '', $str), - ENT_QUOTES, - 'UTF-8' - ) - . "
    \n"; - break; - case 'echo': - default: - //Normalize line breaks - $str = preg_replace('/(\r\n|\r|\n)/ms', "\n", $str); - echo gmdate('Y-m-d H:i:s') . "\t" . str_replace( - "\n", - "\n \t ", - trim($str) - ) . "\n"; - } - } - - /** - * Sets message type to HTML or plain. - * @param boolean $isHtml True for HTML mode. - * @return void - */ - public function isHTML($isHtml = true) - { - if ($isHtml) { - $this->ContentType = 'text/html'; - } else { - $this->ContentType = 'text/plain'; - } - } - - /** - * Send messages using SMTP. - * @return void - */ - public function isSMTP() - { - $this->Mailer = 'smtp'; - } - - /** - * Send messages using PHP's mail() function. - * @return void - */ - public function isMail() - { - $this->Mailer = 'mail'; - } - - /** - * Send messages using $Sendmail. - * @return void - */ - public function isSendmail() - { - $ini_sendmail_path = ini_get('sendmail_path'); - - if (!stristr($ini_sendmail_path, 'sendmail')) { - $this->Sendmail = '/usr/sbin/sendmail'; - } else { - $this->Sendmail = $ini_sendmail_path; - } - $this->Mailer = 'sendmail'; - } - - /** - * Send messages using qmail. - * @return void - */ - public function isQmail() - { - $ini_sendmail_path = ini_get('sendmail_path'); - - if (!stristr($ini_sendmail_path, 'qmail')) { - $this->Sendmail = '/var/qmail/bin/qmail-inject'; - } else { - $this->Sendmail = $ini_sendmail_path; - } - $this->Mailer = 'qmail'; - } - - /** - * Add a "To" address. - * @param string $address - * @param string $name - * @return boolean true on success, false if address already used - */ - public function addAddress($address, $name = '') - { - return $this->addAnAddress('to', $address, $name); - } - - /** - * Add a "CC" address. - * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer. - * @param string $address - * @param string $name - * @return boolean true on success, false if address already used - */ - public function addCC($address, $name = '') - { - return $this->addAnAddress('cc', $address, $name); - } - - /** - * Add a "BCC" address. - * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer. - * @param string $address - * @param string $name - * @return boolean true on success, false if address already used - */ - public function addBCC($address, $name = '') - { - return $this->addAnAddress('bcc', $address, $name); - } - - /** - * Add a "Reply-to" address. - * @param string $address - * @param string $name - * @return boolean - */ - public function addReplyTo($address, $name = '') - { - return $this->addAnAddress('Reply-To', $address, $name); - } - - /** - * Add an address to one of the recipient arrays. - * Addresses that have been added already return false, but do not throw exceptions - * @param string $kind One of 'to', 'cc', 'bcc', 'ReplyTo' - * @param string $address The email address to send to - * @param string $name - * @throws phpmailerException - * @return boolean true on success, false if address already used or invalid in some way - * @access protected - */ - protected function addAnAddress($kind, $address, $name = '') - { - if (!preg_match('/^(to|cc|bcc|Reply-To)$/', $kind)) { - $this->setError($this->lang('Invalid recipient array') . ': ' . $kind); - $this->edebug($this->lang('Invalid recipient array') . ': ' . $kind); - if ($this->exceptions) { - throw new phpmailerException('Invalid recipient array: ' . $kind); - } - return false; - } - $address = trim($address); - $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim - if (!$this->validateAddress($address)) { - $this->setError($this->lang('invalid_address') . ': ' . $address); - $this->edebug($this->lang('invalid_address') . ': ' . $address); - if ($this->exceptions) { - throw new phpmailerException($this->lang('invalid_address') . ': ' . $address); - } - return false; - } - if ($kind != 'Reply-To') { - if (!isset($this->all_recipients[strtolower($address)])) { - array_push($this->$kind, array($address, $name)); - $this->all_recipients[strtolower($address)] = true; - return true; - } - } else { - if (!array_key_exists(strtolower($address), $this->ReplyTo)) { - $this->ReplyTo[strtolower($address)] = array($address, $name); - return true; - } - } - return false; - } - - /** - * Set the From and FromName properties. - * @param string $address - * @param string $name - * @param boolean $auto Whether to also set the Sender address, defaults to true - * @throws phpmailerException - * @return boolean - */ - public function setFrom($address, $name = '', $auto = true) - { - $address = trim($address); - $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim - if (!$this->validateAddress($address)) { - $this->setError($this->lang('invalid_address') . ': ' . $address); - $this->edebug($this->lang('invalid_address') . ': ' . $address); - if ($this->exceptions) { - throw new phpmailerException($this->lang('invalid_address') . ': ' . $address); - } - return false; - } - $this->From = $address; - $this->FromName = $name; - if ($auto) { - if (empty($this->Sender)) { - $this->Sender = $address; - } - } - return true; - } - - /** - * Return the Message-ID header of the last email. - * Technically this is the value from the last time the headers were created, - * but it's also the message ID of the last sent message except in - * pathological cases. - * @return string - */ - public function getLastMessageID() - { - return $this->lastMessageID; - } - - /** - * Check that a string looks like an email address. - * @param string $address The email address to check - * @param string $patternselect A selector for the validation pattern to use : - * * `auto` Pick strictest one automatically; - * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14; - * * `pcre` Use old PCRE implementation; - * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL; same as pcre8 but does not allow 'dotless' domains; - * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements. - * * `noregex` Don't use a regex: super fast, really dumb. - * @return boolean - * @static - * @access public - */ - public static function validateAddress($address, $patternselect = 'auto') - { - if (!$patternselect or $patternselect == 'auto') { - //Check this constant first so it works when extension_loaded() is disabled by safe mode - //Constant was added in PHP 5.2.4 - if (defined('PCRE_VERSION')) { - //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2 - if (version_compare(PCRE_VERSION, '8.0.3') >= 0) { - $patternselect = 'pcre8'; - } else { - $patternselect = 'pcre'; - } - } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) { - //Fall back to older PCRE - $patternselect = 'pcre'; - } else { - //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension - if (version_compare(PHP_VERSION, '5.2.0') >= 0) { - $patternselect = 'php'; - } else { - $patternselect = 'noregex'; - } - } - } - switch ($patternselect) { - case 'pcre8': - /** - * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains. - * @link http://squiloople.com/2009/12/20/email-address-validation/ - * @copyright 2009-2010 Michael Rushton - * Feel free to use and redistribute this code. But please keep this copyright notice. - */ - return (boolean)preg_match( - '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' . - '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' . - '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' . - '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' . - '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' . - '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' . - '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' . - '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' . - '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD', - $address - ); - case 'pcre': - //An older regex that doesn't need a recent PCRE - return (boolean)preg_match( - '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' . - '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' . - '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' . - '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' . - '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' . - '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' . - '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' . - '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' . - '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' . - '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD', - $address - ); - case 'html5': - /** - * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements. - * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email) - */ - return (boolean)preg_match( - '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' . - '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD', - $address - ); - case 'noregex': - //No PCRE! Do something _very_ approximate! - //Check the address is 3 chars or longer and contains an @ that's not the first or last char - return (strlen($address) >= 3 - and strpos($address, '@') >= 1 - and strpos($address, '@') != strlen($address) - 1); - case 'php': - default: - return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL); - } - } - - /** - * Create a message and send it. - * Uses the sending method specified by $Mailer. - * @throws phpmailerException - * @return boolean false on error - See the ErrorInfo property for details of the error. - */ - public function send() - { - try { - if (!$this->preSend()) { - return false; - } - return $this->postSend(); - } catch (phpmailerException $exc) { - $this->mailHeader = ''; - $this->setError($exc->getMessage()); - if ($this->exceptions) { - throw $exc; - } - return false; - } - } - - /** - * Prepare a message for sending. - * @throws phpmailerException - * @return boolean - */ - public function preSend() - { - try { - $this->mailHeader = ''; - if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) { - throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL); - } - - // Set whether the message is multipart/alternative - if (!empty($this->AltBody)) { - $this->ContentType = 'multipart/alternative'; - } - - $this->error_count = 0; // reset errors - $this->setMessageType(); - // Refuse to send an empty message unless we are specifically allowing it - if (!$this->AllowEmpty and empty($this->Body)) { - throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL); - } - - $this->MIMEHeader = $this->createHeader(); - $this->MIMEBody = $this->createBody(); - - // To capture the complete message when using mail(), create - // an extra header list which createHeader() doesn't fold in - if ($this->Mailer == 'mail') { - if (count($this->to) > 0) { - $this->mailHeader .= $this->addrAppend('To', $this->to); - } else { - $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;'); - } - $this->mailHeader .= $this->headerLine( - 'Subject', - $this->encodeHeader($this->secureHeader(trim($this->Subject))) - ); - } - - // Sign with DKIM if enabled - if (!empty($this->DKIM_domain) - && !empty($this->DKIM_private) - && !empty($this->DKIM_selector) - && file_exists($this->DKIM_private)) { - $header_dkim = $this->DKIM_Add( - $this->MIMEHeader . $this->mailHeader, - $this->encodeHeader($this->secureHeader($this->Subject)), - $this->MIMEBody - ); - $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF . - str_replace("\r\n", "\n", $header_dkim) . self::CRLF; - } - return true; - - } catch (phpmailerException $exc) { - $this->setError($exc->getMessage()); - if ($this->exceptions) { - throw $exc; - } - return false; - } - } - - /** - * Actually send a message. - * Send the email via the selected mechanism - * @throws phpmailerException - * @return boolean - */ - public function postSend() - { - try { - // Choose the mailer and send through it - switch ($this->Mailer) { - case 'sendmail': - case 'qmail': - return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody); - case 'smtp': - return $this->smtpSend($this->MIMEHeader, $this->MIMEBody); - case 'mail': - return $this->mailSend($this->MIMEHeader, $this->MIMEBody); - default: - $sendMethod = $this->Mailer.'Send'; - if (method_exists($this, $sendMethod)) { - return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody); - } - - return $this->mailSend($this->MIMEHeader, $this->MIMEBody); - } - } catch (phpmailerException $exc) { - $this->setError($exc->getMessage()); - $this->edebug($exc->getMessage()); - if ($this->exceptions) { - throw $exc; - } - } - return false; - } - - /** - * Send mail using the $Sendmail program. - * @param string $header The message headers - * @param string $body The message body - * @see PHPMailer::$Sendmail - * @throws phpmailerException - * @access protected - * @return boolean - */ - protected function sendmailSend($header, $body) - { - if ($this->Sender != '') { - if ($this->Mailer == 'qmail') { - $sendmail = sprintf('%s -f%s', escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender)); - } else { - $sendmail = sprintf('%s -oi -f%s -t', escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender)); - } - } else { - if ($this->Mailer == 'qmail') { - $sendmail = sprintf('%s', escapeshellcmd($this->Sendmail)); - } else { - $sendmail = sprintf('%s -oi -t', escapeshellcmd($this->Sendmail)); - } - } - if ($this->SingleTo) { - foreach ($this->SingleToArray as $toAddr) { - if (!@$mail = popen($sendmail, 'w')) { - throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); - } - fputs($mail, 'To: ' . $toAddr . "\n"); - fputs($mail, $header); - fputs($mail, $body); - $result = pclose($mail); - $this->doCallback( - ($result == 0), - array($toAddr), - $this->cc, - $this->bcc, - $this->Subject, - $body, - $this->From - ); - if ($result != 0) { - throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); - } - } - } else { - if (!@$mail = popen($sendmail, 'w')) { - throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); - } - fputs($mail, $header); - fputs($mail, $body); - $result = pclose($mail); - $this->doCallback(($result == 0), $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From); - if ($result != 0) { - throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); - } - } - return true; - } - - /** - * Send mail using the PHP mail() function. - * @param string $header The message headers - * @param string $body The message body - * @link http://www.php.net/manual/en/book.mail.php - * @throws phpmailerException - * @access protected - * @return boolean - */ - protected function mailSend($header, $body) - { - $toArr = array(); - foreach ($this->to as $toaddr) { - $toArr[] = $this->addrFormat($toaddr); - } - $to = implode(', ', $toArr); - - if (empty($this->Sender)) { - $params = ' '; - } else { - $params = sprintf('-f%s', $this->Sender); - } - if ($this->Sender != '' and !ini_get('safe_mode')) { - $old_from = ini_get('sendmail_from'); - ini_set('sendmail_from', $this->Sender); - } - $result = false; - if ($this->SingleTo && count($toArr) > 1) { - foreach ($toArr as $toAddr) { - $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params); - $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From); - } - } else { - $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params); - $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From); - } - if (isset($old_from)) { - ini_set('sendmail_from', $old_from); - } - if (!$result) { - throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL); - } - return true; - } - - /** - * Get an instance to use for SMTP operations. - * Override this function to load your own SMTP implementation - * @return SMTP - */ - public function getSMTPInstance() - { - if (!is_object($this->smtp)) { - $this->smtp = new SMTP; - } - return $this->smtp; - } - - /** - * Send mail via SMTP. - * Returns false if there is a bad MAIL FROM, RCPT, or DATA input. - * Uses the PHPMailerSMTP class by default. - * @see PHPMailer::getSMTPInstance() to use a different class. - * @param string $header The message headers - * @param string $body The message body - * @throws phpmailerException - * @uses SMTP - * @access protected - * @return boolean - */ - protected function smtpSend($header, $body) - { - $bad_rcpt = array(); - - if (!$this->smtpConnect()) { - throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL); - } - $smtp_from = ($this->Sender == '') ? $this->From : $this->Sender; - if (!$this->smtp->mail($smtp_from)) { - $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError())); - throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL); - } - - // Attempt to send to all recipients - foreach ($this->to as $to) { - if (!$this->smtp->recipient($to[0])) { - $bad_rcpt[] = $to[0]; - $isSent = false; - } else { - $isSent = true; - } - $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From); - } - foreach ($this->cc as $cc) { - if (!$this->smtp->recipient($cc[0])) { - $bad_rcpt[] = $cc[0]; - $isSent = false; - } else { - $isSent = true; - } - $this->doCallback($isSent, array(), array($cc[0]), array(), $this->Subject, $body, $this->From); - } - foreach ($this->bcc as $bcc) { - if (!$this->smtp->recipient($bcc[0])) { - $bad_rcpt[] = $bcc[0]; - $isSent = false; - } else { - $isSent = true; - } - $this->doCallback($isSent, array(), array(), array($bcc[0]), $this->Subject, $body, $this->From); - } - - // Only send the DATA command if we have viable recipients - if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) { - throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL); - } - if ($this->SMTPKeepAlive) { - $this->smtp->reset(); - } else { - $this->smtp->quit(); - $this->smtp->close(); - } - if (count($bad_rcpt) > 0) { // Create error message for any bad addresses - throw new phpmailerException( - $this->lang('recipients_failed') . implode(', ', $bad_rcpt), - self::STOP_CONTINUE - ); - } - return true; - } - - /** - * Initiate a connection to an SMTP server. - * Returns false if the operation failed. - * @param array $options An array of options compatible with stream_context_create() - * @uses SMTP - * @access public - * @throws phpmailerException - * @return boolean - */ - public function smtpConnect($options = array()) - { - if (is_null($this->smtp)) { - $this->smtp = $this->getSMTPInstance(); - } - - // Already connected? - if ($this->smtp->connected()) { - return true; - } - - $this->smtp->setTimeout($this->Timeout); - $this->smtp->setDebugLevel($this->SMTPDebug); - $this->smtp->setDebugOutput($this->Debugoutput); - $this->smtp->setVerp($this->do_verp); - $hosts = explode(';', $this->Host); - $lastexception = null; - - foreach ($hosts as $hostentry) { - $hostinfo = array(); - if (!preg_match('/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*):?([0-9]*)$/', trim($hostentry), $hostinfo)) { - // Not a valid host entry - continue; - } - // $hostinfo[2]: optional ssl or tls prefix - // $hostinfo[3]: the hostname - // $hostinfo[4]: optional port number - // The host string prefix can temporarily override the current setting for SMTPSecure - // If it's not specified, the default value is used - $prefix = ''; - $tls = ($this->SMTPSecure == 'tls'); - if ($hostinfo[2] == 'ssl' or ($hostinfo[2] == '' and $this->SMTPSecure == 'ssl')) { - $prefix = 'ssl://'; - $tls = false; // Can't have SSL and TLS at once - } elseif ($hostinfo[2] == 'tls') { - $tls = true; - // tls doesn't use a prefix - } - $host = $hostinfo[3]; - $port = $this->Port; - $tport = (integer)$hostinfo[4]; - if ($tport > 0 and $tport < 65536) { - $port = $tport; - } - if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) { - try { - if ($this->Helo) { - $hello = $this->Helo; - } else { - $hello = $this->serverHostname(); - } - $this->smtp->hello($hello); - - if ($tls) { - if (!$this->smtp->startTLS()) { - throw new phpmailerException($this->lang('connect_host')); - } - // We must resend HELO after tls negotiation - $this->smtp->hello($hello); - } - if ($this->SMTPAuth) { - if (!$this->smtp->authenticate( - $this->Username, - $this->Password, - $this->AuthType, - $this->Realm, - $this->Workstation - ) - ) { - throw new phpmailerException($this->lang('authenticate')); - } - } - return true; - } catch (phpmailerException $exc) { - $lastexception = $exc; - // We must have connected, but then failed TLS or Auth, so close connection nicely - $this->smtp->quit(); - } - } - } - // If we get here, all connection attempts have failed, so close connection hard - $this->smtp->close(); - // As we've caught all exceptions, just report whatever the last one was - if ($this->exceptions and !is_null($lastexception)) { - throw $lastexception; - } - return false; - } - - /** - * Close the active SMTP session if one exists. - * @return void - */ - public function smtpClose() - { - if ($this->smtp !== null) { - if ($this->smtp->connected()) { - $this->smtp->quit(); - $this->smtp->close(); - } - } - } - - /** - * Set the language for error messages. - * Returns false if it cannot load the language file. - * The default language is English. - * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr") - * @param string $lang_path Path to the language file directory, with trailing separator (slash) - * @return boolean - * @access public - */ - public function setLanguage($langcode = 'en', $lang_path = '') - { - // Define full set of translatable strings in English - $PHPMAILER_LANG = array( - 'authenticate' => 'SMTP Error: Could not authenticate.', - 'connect_host' => 'SMTP Error: Could not connect to SMTP host.', - 'data_not_accepted' => 'SMTP Error: data not accepted.', - 'empty_message' => 'Message body empty', - 'encoding' => 'Unknown encoding: ', - 'execute' => 'Could not execute: ', - 'file_access' => 'Could not access file: ', - 'file_open' => 'File Error: Could not open file: ', - 'from_failed' => 'The following From address failed: ', - 'instantiate' => 'Could not instantiate mail function.', - 'invalid_address' => 'Invalid address', - 'mailer_not_supported' => ' mailer is not supported.', - 'provide_address' => 'You must provide at least one recipient email address.', - 'recipients_failed' => 'SMTP Error: The following recipients failed: ', - 'signing' => 'Signing Error: ', - 'smtp_connect_failed' => 'SMTP connect() failed.', - 'smtp_error' => 'SMTP server error: ', - 'variable_set' => 'Cannot set or reset variable: ' - ); - if (empty($lang_path)) { - // Calculate an absolute path so it can work if CWD is not here - $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR; - } - $foundlang = true; - $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php'; - if ($langcode != 'en') { // There is no English translation file - // Make sure language file path is readable - if (!is_readable($lang_file)) { - $foundlang = false; - } else { - // Overwrite language-specific strings. - // This way we'll never have missing translations. - $foundlang = include $lang_file; - } - } - $this->language = $PHPMAILER_LANG; - return (boolean)$foundlang; // Returns false if language not found - } - - /** - * Get the array of strings for the current language. - * @return array - */ - public function getTranslations() - { - return $this->language; - } - - /** - * Create recipient headers. - * @access public - * @param string $type - * @param array $addr An array of recipient, - * where each recipient is a 2-element indexed array with element 0 containing an address - * and element 1 containing a name, like: - * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User')) - * @return string - */ - public function addrAppend($type, $addr) - { - $addresses = array(); - foreach ($addr as $address) { - $addresses[] = $this->addrFormat($address); - } - return $type . ': ' . implode(', ', $addresses) . $this->LE; - } - - /** - * Format an address for use in a message header. - * @access public - * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name - * like array('joe@example.com', 'Joe User') - * @return string - */ - public function addrFormat($addr) - { - if (empty($addr[1])) { // No name provided - return $this->secureHeader($addr[0]); - } else { - return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader( - $addr[0] - ) . '>'; - } - } - - /** - * Word-wrap message. - * For use with mailers that do not automatically perform wrapping - * and for quoted-printable encoded messages. - * Original written by philippe. - * @param string $message The message to wrap - * @param integer $length The line length to wrap to - * @param boolean $qp_mode Whether to run in Quoted-Printable mode - * @access public - * @return string - */ - public function wrapText($message, $length, $qp_mode = false) - { - $soft_break = ($qp_mode) ? sprintf(' =%s', $this->LE) : $this->LE; - // If utf-8 encoding is used, we will need to make sure we don't - // split multibyte characters when we wrap - $is_utf8 = (strtolower($this->CharSet) == 'utf-8'); - $lelen = strlen($this->LE); - $crlflen = strlen(self::CRLF); - - $message = $this->fixEOL($message); - if (substr($message, -$lelen) == $this->LE) { - $message = substr($message, 0, -$lelen); - } - - $line = explode($this->LE, $message); // Magic. We know fixEOL uses $LE - $message = ''; - for ($i = 0; $i < count($line); $i++) { - $line_part = explode(' ', $line[$i]); - $buf = ''; - for ($e = 0; $e < count($line_part); $e++) { - $word = $line_part[$e]; - if ($qp_mode and (strlen($word) > $length)) { - $space_left = $length - strlen($buf) - $crlflen; - if ($e != 0) { - if ($space_left > 20) { - $len = $space_left; - if ($is_utf8) { - $len = $this->utf8CharBoundary($word, $len); - } elseif (substr($word, $len - 1, 1) == '=') { - $len--; - } elseif (substr($word, $len - 2, 1) == '=') { - $len -= 2; - } - $part = substr($word, 0, $len); - $word = substr($word, $len); - $buf .= ' ' . $part; - $message .= $buf . sprintf('=%s', self::CRLF); - } else { - $message .= $buf . $soft_break; - } - $buf = ''; - } - while (strlen($word) > 0) { - if ($length <= 0) { - break; - } - $len = $length; - if ($is_utf8) { - $len = $this->utf8CharBoundary($word, $len); - } elseif (substr($word, $len - 1, 1) == '=') { - $len--; - } elseif (substr($word, $len - 2, 1) == '=') { - $len -= 2; - } - $part = substr($word, 0, $len); - $word = substr($word, $len); - - if (strlen($word) > 0) { - $message .= $part . sprintf('=%s', self::CRLF); - } else { - $buf = $part; - } - } - } else { - $buf_o = $buf; - $buf .= ($e == 0) ? $word : (' ' . $word); - - if (strlen($buf) > $length and $buf_o != '') { - $message .= $buf_o . $soft_break; - $buf = $word; - } - } - } - $message .= $buf . self::CRLF; - } - - return $message; - } - - /** - * Find the last character boundary prior to $maxLength in a utf-8 - * quoted (printable) encoded string. - * Original written by Colin Brown. - * @access public - * @param string $encodedText utf-8 QP text - * @param integer $maxLength find last character boundary prior to this length - * @return integer - */ - public function utf8CharBoundary($encodedText, $maxLength) - { - $foundSplitPos = false; - $lookBack = 3; - while (!$foundSplitPos) { - $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack); - $encodedCharPos = strpos($lastChunk, '='); - if (false !== $encodedCharPos) { - // Found start of encoded character byte within $lookBack block. - // Check the encoded byte value (the 2 chars after the '=') - $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2); - $dec = hexdec($hex); - if ($dec < 128) { // Single byte character. - // If the encoded char was found at pos 0, it will fit - // otherwise reduce maxLength to start of the encoded char - $maxLength = ($encodedCharPos == 0) ? $maxLength : - $maxLength - ($lookBack - $encodedCharPos); - $foundSplitPos = true; - } elseif ($dec >= 192) { // First byte of a multi byte character - // Reduce maxLength to split at start of character - $maxLength = $maxLength - ($lookBack - $encodedCharPos); - $foundSplitPos = true; - } elseif ($dec < 192) { // Middle byte of a multi byte character, look further back - $lookBack += 3; - } - } else { - // No encoded character found - $foundSplitPos = true; - } - } - return $maxLength; - } - - /** - * Set the body wrapping. - * @access public - * @return void - */ - public function setWordWrap() - { - if ($this->WordWrap < 1) { - return; - } - - switch ($this->message_type) { - case 'alt': - case 'alt_inline': - case 'alt_attach': - case 'alt_inline_attach': - $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap); - break; - default: - $this->Body = $this->wrapText($this->Body, $this->WordWrap); - break; - } - } - - /** - * Assemble message headers. - * @access public - * @return string The assembled headers - */ - public function createHeader() - { - $result = ''; - - // Set the boundaries - $uniq_id = md5(uniqid(time())); - $this->boundary[1] = 'b1_' . $uniq_id; - $this->boundary[2] = 'b2_' . $uniq_id; - $this->boundary[3] = 'b3_' . $uniq_id; - - if ($this->MessageDate == '') { - $this->MessageDate = self::rfcDate(); - } - $result .= $this->headerLine('Date', $this->MessageDate); - - - // To be created automatically by mail() - if ($this->SingleTo) { - if ($this->Mailer != 'mail') { - foreach ($this->to as $toaddr) { - $this->SingleToArray[] = $this->addrFormat($toaddr); - } - } - } else { - if (count($this->to) > 0) { - if ($this->Mailer != 'mail') { - $result .= $this->addrAppend('To', $this->to); - } - } elseif (count($this->cc) == 0) { - $result .= $this->headerLine('To', 'undisclosed-recipients:;'); - } - } - - $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName))); - - // sendmail and mail() extract Cc from the header before sending - if (count($this->cc) > 0) { - $result .= $this->addrAppend('Cc', $this->cc); - } - - // sendmail and mail() extract Bcc from the header before sending - if (( - $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail' - ) - and count($this->bcc) > 0 - ) { - $result .= $this->addrAppend('Bcc', $this->bcc); - } - - if (count($this->ReplyTo) > 0) { - $result .= $this->addrAppend('Reply-To', $this->ReplyTo); - } - - // mail() sets the subject itself - if ($this->Mailer != 'mail') { - $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject))); - } - - if ($this->MessageID != '') { - $this->lastMessageID = $this->MessageID; - } else { - $this->lastMessageID = sprintf('<%s@%s>', $uniq_id, $this->ServerHostname()); - } - $result .= $this->HeaderLine('Message-ID', $this->lastMessageID); - $result .= $this->headerLine('X-Priority', $this->Priority); - if ($this->XMailer == '') { - $result .= $this->headerLine( - 'X-Mailer', - 'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer/)' - ); - } else { - $myXmailer = trim($this->XMailer); - if ($myXmailer) { - $result .= $this->headerLine('X-Mailer', $myXmailer); - } - } - - if ($this->ConfirmReadingTo != '') { - $result .= $this->headerLine('Disposition-Notification-To', '<' . trim($this->ConfirmReadingTo) . '>'); - } - - // Add custom headers - for ($index = 0; $index < count($this->CustomHeader); $index++) { - $result .= $this->headerLine( - trim($this->CustomHeader[$index][0]), - $this->encodeHeader(trim($this->CustomHeader[$index][1])) - ); - } - if (!$this->sign_key_file) { - $result .= $this->headerLine('MIME-Version', '1.0'); - $result .= $this->getMailMIME(); - } - - return $result; - } - - /** - * Get the message MIME type headers. - * @access public - * @return string - */ - public function getMailMIME() - { - $result = ''; - $ismultipart = true; - switch ($this->message_type) { - case 'inline': - $result .= $this->headerLine('Content-Type', 'multipart/related;'); - $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"'); - break; - case 'attach': - case 'inline_attach': - case 'alt_attach': - case 'alt_inline_attach': - $result .= $this->headerLine('Content-Type', 'multipart/mixed;'); - $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"'); - break; - case 'alt': - case 'alt_inline': - $result .= $this->headerLine('Content-Type', 'multipart/alternative;'); - $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"'); - break; - default: - // Catches case 'plain': and case '': - $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet); - $ismultipart = false; - break; - } - // RFC1341 part 5 says 7bit is assumed if not specified - if ($this->Encoding != '7bit') { - // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE - if ($ismultipart) { - if ($this->Encoding == '8bit') { - $result .= $this->headerLine('Content-Transfer-Encoding', '8bit'); - } - // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible - } else { - $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding); - } - } - - if ($this->Mailer != 'mail') { - $result .= $this->LE; - } - - return $result; - } - - /** - * Returns the whole MIME message. - * Includes complete headers and body. - * Only valid post preSend(). - * @see PHPMailer::preSend() - * @access public - * @return string - */ - public function getSentMIMEMessage() - { - return $this->MIMEHeader . $this->mailHeader . self::CRLF . $this->MIMEBody; - } - - - /** - * Assemble the message body. - * Returns an empty string on failure. - * @access public - * @throws phpmailerException - * @return string The assembled message body - */ - public function createBody() - { - $body = ''; - - if ($this->sign_key_file) { - $body .= $this->getMailMIME() . $this->LE; - } - - $this->setWordWrap(); - - $bodyEncoding = $this->Encoding; - $bodyCharSet = $this->CharSet; - if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) { - $bodyEncoding = '7bit'; - $bodyCharSet = 'us-ascii'; - } - $altBodyEncoding = $this->Encoding; - $altBodyCharSet = $this->CharSet; - if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) { - $altBodyEncoding = '7bit'; - $altBodyCharSet = 'us-ascii'; - } - switch ($this->message_type) { - case 'inline': - $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding); - $body .= $this->encodeString($this->Body, $bodyEncoding); - $body .= $this->LE . $this->LE; - $body .= $this->attachAll('inline', $this->boundary[1]); - break; - case 'attach': - $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding); - $body .= $this->encodeString($this->Body, $bodyEncoding); - $body .= $this->LE . $this->LE; - $body .= $this->attachAll('attachment', $this->boundary[1]); - break; - case 'inline_attach': - $body .= $this->textLine('--' . $this->boundary[1]); - $body .= $this->headerLine('Content-Type', 'multipart/related;'); - $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"'); - $body .= $this->LE; - $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding); - $body .= $this->encodeString($this->Body, $bodyEncoding); - $body .= $this->LE . $this->LE; - $body .= $this->attachAll('inline', $this->boundary[2]); - $body .= $this->LE; - $body .= $this->attachAll('attachment', $this->boundary[1]); - break; - case 'alt': - $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding); - $body .= $this->encodeString($this->AltBody, $altBodyEncoding); - $body .= $this->LE . $this->LE; - $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding); - $body .= $this->encodeString($this->Body, $bodyEncoding); - $body .= $this->LE . $this->LE; - if (!empty($this->Ical)) { - $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', ''); - $body .= $this->encodeString($this->Ical, $this->Encoding); - $body .= $this->LE . $this->LE; - } - $body .= $this->endBoundary($this->boundary[1]); - break; - case 'alt_inline': - $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding); - $body .= $this->encodeString($this->AltBody, $altBodyEncoding); - $body .= $this->LE . $this->LE; - $body .= $this->textLine('--' . $this->boundary[1]); - $body .= $this->headerLine('Content-Type', 'multipart/related;'); - $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"'); - $body .= $this->LE; - $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding); - $body .= $this->encodeString($this->Body, $bodyEncoding); - $body .= $this->LE . $this->LE; - $body .= $this->attachAll('inline', $this->boundary[2]); - $body .= $this->LE; - $body .= $this->endBoundary($this->boundary[1]); - break; - case 'alt_attach': - $body .= $this->textLine('--' . $this->boundary[1]); - $body .= $this->headerLine('Content-Type', 'multipart/alternative;'); - $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"'); - $body .= $this->LE; - $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding); - $body .= $this->encodeString($this->AltBody, $altBodyEncoding); - $body .= $this->LE . $this->LE; - $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding); - $body .= $this->encodeString($this->Body, $bodyEncoding); - $body .= $this->LE . $this->LE; - $body .= $this->endBoundary($this->boundary[2]); - $body .= $this->LE; - $body .= $this->attachAll('attachment', $this->boundary[1]); - break; - case 'alt_inline_attach': - $body .= $this->textLine('--' . $this->boundary[1]); - $body .= $this->headerLine('Content-Type', 'multipart/alternative;'); - $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"'); - $body .= $this->LE; - $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding); - $body .= $this->encodeString($this->AltBody, $altBodyEncoding); - $body .= $this->LE . $this->LE; - $body .= $this->textLine('--' . $this->boundary[2]); - $body .= $this->headerLine('Content-Type', 'multipart/related;'); - $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"'); - $body .= $this->LE; - $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding); - $body .= $this->encodeString($this->Body, $bodyEncoding); - $body .= $this->LE . $this->LE; - $body .= $this->attachAll('inline', $this->boundary[3]); - $body .= $this->LE; - $body .= $this->endBoundary($this->boundary[2]); - $body .= $this->LE; - $body .= $this->attachAll('attachment', $this->boundary[1]); - break; - default: - // catch case 'plain' and case '' - $body .= $this->encodeString($this->Body, $bodyEncoding); - break; - } - - if ($this->isError()) { - $body = ''; - } elseif ($this->sign_key_file) { - try { - if (!defined('PKCS7_TEXT')) { - throw new phpmailerException($this->lang('signing') . ' OpenSSL extension missing.'); - } - // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1 - $file = tempnam(sys_get_temp_dir(), 'mail'); - if (false === file_put_contents($file, $body)) { - throw new phpmailerException($this->lang('signing') . ' Could not write temp file'); - } - $signed = tempnam(sys_get_temp_dir(), 'signed'); - if (@openssl_pkcs7_sign( - $file, - $signed, - 'file://' . realpath($this->sign_cert_file), - array('file://' . realpath($this->sign_key_file), $this->sign_key_pass), - null - ) - ) { - @unlink($file); - $body = file_get_contents($signed); - @unlink($signed); - } else { - @unlink($file); - @unlink($signed); - throw new phpmailerException($this->lang('signing') . openssl_error_string()); - } - } catch (phpmailerException $exc) { - $body = ''; - if ($this->exceptions) { - throw $exc; - } - } - } - return $body; - } - - /** - * Return the start of a message boundary. - * @access protected - * @param string $boundary - * @param string $charSet - * @param string $contentType - * @param string $encoding - * @return string - */ - protected function getBoundary($boundary, $charSet, $contentType, $encoding) - { - $result = ''; - if ($charSet == '') { - $charSet = $this->CharSet; - } - if ($contentType == '') { - $contentType = $this->ContentType; - } - if ($encoding == '') { - $encoding = $this->Encoding; - } - $result .= $this->textLine('--' . $boundary); - $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet); - $result .= $this->LE; - // RFC1341 part 5 says 7bit is assumed if not specified - if ($encoding != '7bit') { - $result .= $this->headerLine('Content-Transfer-Encoding', $encoding); - } - $result .= $this->LE; - - return $result; - } - - /** - * Return the end of a message boundary. - * @access protected - * @param string $boundary - * @return string - */ - protected function endBoundary($boundary) - { - return $this->LE . '--' . $boundary . '--' . $this->LE; - } - - /** - * Set the message type. - * PHPMailer only supports some preset message types, - * not arbitrary MIME structures. - * @access protected - * @return void - */ - protected function setMessageType() - { - $type = array(); - if ($this->alternativeExists()) { - $type[] = 'alt'; - } - if ($this->inlineImageExists()) { - $type[] = 'inline'; - } - if ($this->attachmentExists()) { - $type[] = 'attach'; - } - $this->message_type = implode('_', $type); - if ($this->message_type == '') { - $this->message_type = 'plain'; - } - } - - /** - * Format a header line. - * @access public - * @param string $name - * @param string $value - * @return string - */ - public function headerLine($name, $value) - { - return $name . ': ' . $value . $this->LE; - } - - /** - * Return a formatted mail line. - * @access public - * @param string $value - * @return string - */ - public function textLine($value) - { - return $value . $this->LE; - } - - /** - * Add an attachment from a path on the filesystem. - * Returns false if the file could not be found or read. - * @param string $path Path to the attachment. - * @param string $name Overrides the attachment name. - * @param string $encoding File encoding (see $Encoding). - * @param string $type File extension (MIME) type. - * @param string $disposition Disposition to use - * @throws phpmailerException - * @return boolean - */ - public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment') - { - try { - if (!@is_file($path)) { - throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE); - } - - // If a MIME type is not specified, try to work it out from the file name - if ($type == '') { - $type = self::filenameToType($path); - } - - $filename = basename($path); - if ($name == '') { - $name = $filename; - } - - $this->attachment[] = array( - 0 => $path, - 1 => $filename, - 2 => $name, - 3 => $encoding, - 4 => $type, - 5 => false, // isStringAttachment - 6 => $disposition, - 7 => 0 - ); - - } catch (phpmailerException $exc) { - $this->setError($exc->getMessage()); - $this->edebug($exc->getMessage()); - if ($this->exceptions) { - throw $exc; - } - return false; - } - return true; - } - - /** - * Return the array of attachments. - * @return array - */ - public function getAttachments() - { - return $this->attachment; - } - - /** - * Attach all file, string, and binary attachments to the message. - * Returns an empty string on failure. - * @access protected - * @param string $disposition_type - * @param string $boundary - * @return string - */ - protected function attachAll($disposition_type, $boundary) - { - // Return text of body - $mime = array(); - $cidUniq = array(); - $incl = array(); - - // Add all attachments - foreach ($this->attachment as $attachment) { - // Check if it is a valid disposition_filter - if ($attachment[6] == $disposition_type) { - // Check for string attachment - $string = ''; - $path = ''; - $bString = $attachment[5]; - if ($bString) { - $string = $attachment[0]; - } else { - $path = $attachment[0]; - } - - $inclhash = md5(serialize($attachment)); - if (in_array($inclhash, $incl)) { - continue; - } - $incl[] = $inclhash; - $name = $attachment[2]; - $encoding = $attachment[3]; - $type = $attachment[4]; - $disposition = $attachment[6]; - $cid = $attachment[7]; - if ($disposition == 'inline' && isset($cidUniq[$cid])) { - continue; - } - $cidUniq[$cid] = true; - - $mime[] = sprintf('--%s%s', $boundary, $this->LE); - $mime[] = sprintf( - 'Content-Type: %s; name="%s"%s', - $type, - $this->encodeHeader($this->secureHeader($name)), - $this->LE - ); - // RFC1341 part 5 says 7bit is assumed if not specified - if ($encoding != '7bit') { - $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE); - } - - if ($disposition == 'inline') { - $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE); - } - - // If a filename contains any of these chars, it should be quoted, - // but not otherwise: RFC2183 & RFC2045 5.1 - // Fixes a warning in IETF's msglint MIME checker - // Allow for bypassing the Content-Disposition header totally - if (!(empty($disposition))) { - $encoded_name = $this->encodeHeader($this->secureHeader($name)); - if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) { - $mime[] = sprintf( - 'Content-Disposition: %s; filename="%s"%s', - $disposition, - $encoded_name, - $this->LE . $this->LE - ); - } else { - $mime[] = sprintf( - 'Content-Disposition: %s; filename=%s%s', - $disposition, - $encoded_name, - $this->LE . $this->LE - ); - } - } else { - $mime[] = $this->LE; - } - - // Encode as string attachment - if ($bString) { - $mime[] = $this->encodeString($string, $encoding); - if ($this->isError()) { - return ''; - } - $mime[] = $this->LE . $this->LE; - } else { - $mime[] = $this->encodeFile($path, $encoding); - if ($this->isError()) { - return ''; - } - $mime[] = $this->LE . $this->LE; - } - } - } - - $mime[] = sprintf('--%s--%s', $boundary, $this->LE); - - return implode('', $mime); - } - - /** - * Encode a file attachment in requested format. - * Returns an empty string on failure. - * @param string $path The full path to the file - * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable' - * @throws phpmailerException - * @see EncodeFile(encodeFile - * @access protected - * @return string - */ - protected function encodeFile($path, $encoding = 'base64') - { - try { - if (!is_readable($path)) { - throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE); - } - $magic_quotes = get_magic_quotes_runtime(); - if ($magic_quotes) { - if (version_compare(PHP_VERSION, '5.3.0', '<')) { - set_magic_quotes_runtime(false); - } else { - //Doesn't exist in PHP 5.4, but we don't need to check because - //get_magic_quotes_runtime always returns false in 5.4+ - //so it will never get here - ini_set('magic_quotes_runtime', 0); - } - } - $file_buffer = file_get_contents($path); - $file_buffer = $this->encodeString($file_buffer, $encoding); - if ($magic_quotes) { - if (version_compare(PHP_VERSION, '5.3.0', '<')) { - set_magic_quotes_runtime($magic_quotes); - } else { - ini_set('magic_quotes_runtime', ($magic_quotes?'1':'0')); - } - } - return $file_buffer; - } catch (Exception $exc) { - $this->setError($exc->getMessage()); - return ''; - } - } - - /** - * Encode a string in requested format. - * Returns an empty string on failure. - * @param string $str The text to encode - * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable' - * @access public - * @return string - */ - public function encodeString($str, $encoding = 'base64') - { - $encoded = ''; - switch (strtolower($encoding)) { - case 'base64': - $encoded = chunk_split(base64_encode($str), 76, $this->LE); - break; - case '7bit': - case '8bit': - $encoded = $this->fixEOL($str); - // Make sure it ends with a line break - if (substr($encoded, -(strlen($this->LE))) != $this->LE) { - $encoded .= $this->LE; - } - break; - case 'binary': - $encoded = $str; - break; - case 'quoted-printable': - $encoded = $this->encodeQP($str); - break; - default: - $this->setError($this->lang('encoding') . $encoding); - break; - } - return $encoded; - } - - /** - * Encode a header string optimally. - * Picks shortest of Q, B, quoted-printable or none. - * @access public - * @param string $str - * @param string $position - * @return string - */ - public function encodeHeader($str, $position = 'text') - { - $matchcount = 0; - switch (strtolower($position)) { - case 'phrase': - if (!preg_match('/[\200-\377]/', $str)) { - // Can't use addslashes as we don't know the value of magic_quotes_sybase - $encoded = addcslashes($str, "\0..\37\177\\\""); - if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) { - return ($encoded); - } else { - return ("\"$encoded\""); - } - } - $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches); - break; - /** @noinspection PhpMissingBreakStatementInspection */ - case 'comment': - $matchcount = preg_match_all('/[()"]/', $str, $matches); - // Intentional fall-through - case 'text': - default: - $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches); - break; - } - - if ($matchcount == 0) { // There are no chars that need encoding - return ($str); - } - - $maxlen = 75 - 7 - strlen($this->CharSet); - // Try to select the encoding which should produce the shortest output - if ($matchcount > strlen($str) / 3) { - // More than a third of the content will need encoding, so B encoding will be most efficient - $encoding = 'B'; - if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) { - // Use a custom function which correctly encodes and wraps long - // multibyte strings without breaking lines within a character - $encoded = $this->base64EncodeWrapMB($str, "\n"); - } else { - $encoded = base64_encode($str); - $maxlen -= $maxlen % 4; - $encoded = trim(chunk_split($encoded, $maxlen, "\n")); - } - } else { - $encoding = 'Q'; - $encoded = $this->encodeQ($str, $position); - $encoded = $this->wrapText($encoded, $maxlen, true); - $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded)); - } - - $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded); - $encoded = trim(str_replace("\n", $this->LE, $encoded)); - - return $encoded; - } - - /** - * Check if a string contains multi-byte characters. - * @access public - * @param string $str multi-byte text to wrap encode - * @return boolean - */ - public function hasMultiBytes($str) - { - if (function_exists('mb_strlen')) { - return (strlen($str) > mb_strlen($str, $this->CharSet)); - } else { // Assume no multibytes (we can't handle without mbstring functions anyway) - return false; - } - } - - /** - * Does a string contain any 8-bit chars (in any charset)? - * @param string $text - * @return boolean - */ - public function has8bitChars($text) - { - return (boolean)preg_match('/[\x80-\xFF]/', $text); - } - - /** - * Encode and wrap long multibyte strings for mail headers - * without breaking lines within a character. - * Adapted from a function by paravoid - * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283 - * @access public - * @param string $str multi-byte text to wrap encode - * @param string $linebreak string to use as linefeed/end-of-line - * @return string - */ - public function base64EncodeWrapMB($str, $linebreak = null) - { - $start = '=?' . $this->CharSet . '?B?'; - $end = '?='; - $encoded = ''; - if ($linebreak === null) { - $linebreak = $this->LE; - } - - $mb_length = mb_strlen($str, $this->CharSet); - // Each line must have length <= 75, including $start and $end - $length = 75 - strlen($start) - strlen($end); - // Average multi-byte ratio - $ratio = $mb_length / strlen($str); - // Base64 has a 4:3 ratio - $avgLength = floor($length * $ratio * .75); - - for ($i = 0; $i < $mb_length; $i += $offset) { - $lookBack = 0; - do { - $offset = $avgLength - $lookBack; - $chunk = mb_substr($str, $i, $offset, $this->CharSet); - $chunk = base64_encode($chunk); - $lookBack++; - } while (strlen($chunk) > $length); - $encoded .= $chunk . $linebreak; - } - - // Chomp the last linefeed - $encoded = substr($encoded, 0, -strlen($linebreak)); - return $encoded; - } - - /** - * Encode a string in quoted-printable format. - * According to RFC2045 section 6.7. - * @access public - * @param string $string The text to encode - * @param integer $line_max Number of chars allowed on a line before wrapping - * @return string - * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment - */ - public function encodeQP($string, $line_max = 76) - { - if (function_exists('quoted_printable_encode')) { // Use native function if it's available (>= PHP5.3) - return $this->fixEOL(quoted_printable_encode($string)); - } - // Fall back to a pure PHP implementation - $string = str_replace( - array('%20', '%0D%0A.', '%0D%0A', '%'), - array(' ', "\r\n=2E", "\r\n", '='), - rawurlencode($string) - ); - $string = preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string); - return $this->fixEOL($string); - } - - /** - * Backward compatibility wrapper for an old QP encoding function that was removed. - * @see PHPMailer::encodeQP() - * @access public - * @param string $string - * @param integer $line_max - * @param boolean $space_conv - * @return string - * @deprecated Use encodeQP instead. - */ - public function encodeQPphp( - $string, - $line_max = 76, - /** @noinspection PhpUnusedParameterInspection */ $space_conv = false - ) { - return $this->encodeQP($string, $line_max); - } - - /** - * Encode a string using Q encoding. - * @link http://tools.ietf.org/html/rfc2047 - * @param string $str the text to encode - * @param string $position Where the text is going to be used, see the RFC for what that means - * @access public - * @return string - */ - public function encodeQ($str, $position = 'text') - { - // There should not be any EOL in the string - $pattern = ''; - $encoded = str_replace(array("\r", "\n"), '', $str); - switch (strtolower($position)) { - case 'phrase': - // RFC 2047 section 5.3 - $pattern = '^A-Za-z0-9!*+\/ -'; - break; - /** @noinspection PhpMissingBreakStatementInspection */ - case 'comment': - // RFC 2047 section 5.2 - $pattern = '\(\)"'; - // intentional fall-through - // for this reason we build the $pattern without including delimiters and [] - case 'text': - default: - // RFC 2047 section 5.1 - // Replace every high ascii, control, =, ? and _ characters - $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern; - break; - } - $matches = array(); - if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) { - // If the string contains an '=', make sure it's the first thing we replace - // so as to avoid double-encoding - $eqkey = array_search('=', $matches[0]); - if (false !== $eqkey) { - unset($matches[0][$eqkey]); - array_unshift($matches[0], '='); - } - foreach (array_unique($matches[0]) as $char) { - $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded); - } - } - // Replace every spaces to _ (more readable than =20) - return str_replace(' ', '_', $encoded); - } - - - /** - * Add a string or binary attachment (non-filesystem). - * This method can be used to attach ascii or binary data, - * such as a BLOB record from a database. - * @param string $string String attachment data. - * @param string $filename Name of the attachment. - * @param string $encoding File encoding (see $Encoding). - * @param string $type File extension (MIME) type. - * @param string $disposition Disposition to use - * @return void - */ - public function addStringAttachment( - $string, - $filename, - $encoding = 'base64', - $type = '', - $disposition = 'attachment' - ) { - // If a MIME type is not specified, try to work it out from the file name - if ($type == '') { - $type = self::filenameToType($filename); - } - // Append to $attachment array - $this->attachment[] = array( - 0 => $string, - 1 => $filename, - 2 => basename($filename), - 3 => $encoding, - 4 => $type, - 5 => true, // isStringAttachment - 6 => $disposition, - 7 => 0 - ); - } - - /** - * Add an embedded (inline) attachment from a file. - * This can include images, sounds, and just about any other document type. - * These differ from 'regular' attachments in that they are intended to be - * displayed inline with the message, not just attached for download. - * This is used in HTML messages that embed the images - * the HTML refers to using the $cid value. - * @param string $path Path to the attachment. - * @param string $cid Content ID of the attachment; Use this to reference - * the content when using an embedded image in HTML. - * @param string $name Overrides the attachment name. - * @param string $encoding File encoding (see $Encoding). - * @param string $type File MIME type. - * @param string $disposition Disposition to use - * @return boolean True on successfully adding an attachment - */ - public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline') - { - if (!@is_file($path)) { - $this->setError($this->lang('file_access') . $path); - return false; - } - - // If a MIME type is not specified, try to work it out from the file name - if ($type == '') { - $type = self::filenameToType($path); - } - - $filename = basename($path); - if ($name == '') { - $name = $filename; - } - - // Append to $attachment array - $this->attachment[] = array( - 0 => $path, - 1 => $filename, - 2 => $name, - 3 => $encoding, - 4 => $type, - 5 => false, // isStringAttachment - 6 => $disposition, - 7 => $cid - ); - return true; - } - - /** - * Add an embedded stringified attachment. - * This can include images, sounds, and just about any other document type. - * Be sure to set the $type to an image type for images: - * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'. - * @param string $string The attachment binary data. - * @param string $cid Content ID of the attachment; Use this to reference - * the content when using an embedded image in HTML. - * @param string $name - * @param string $encoding File encoding (see $Encoding). - * @param string $type MIME type. - * @param string $disposition Disposition to use - * @return boolean True on successfully adding an attachment - */ - public function addStringEmbeddedImage( - $string, - $cid, - $name = '', - $encoding = 'base64', - $type = '', - $disposition = 'inline' - ) { - // If a MIME type is not specified, try to work it out from the name - if ($type == '') { - $type = self::filenameToType($name); - } - - // Append to $attachment array - $this->attachment[] = array( - 0 => $string, - 1 => $name, - 2 => $name, - 3 => $encoding, - 4 => $type, - 5 => true, // isStringAttachment - 6 => $disposition, - 7 => $cid - ); - return true; - } - - /** - * Check if an inline attachment is present. - * @access public - * @return boolean - */ - public function inlineImageExists() - { - foreach ($this->attachment as $attachment) { - if ($attachment[6] == 'inline') { - return true; - } - } - return false; - } - - /** - * Check if an attachment (non-inline) is present. - * @return boolean - */ - public function attachmentExists() - { - foreach ($this->attachment as $attachment) { - if ($attachment[6] == 'attachment') { - return true; - } - } - return false; - } - - /** - * Check if this message has an alternative body set. - * @return boolean - */ - public function alternativeExists() - { - return !empty($this->AltBody); - } - - /** - * Clear all To recipients. - * @return void - */ - public function clearAddresses() - { - foreach ($this->to as $to) { - unset($this->all_recipients[strtolower($to[0])]); - } - $this->to = array(); - } - - /** - * Clear all CC recipients. - * @return void - */ - public function clearCCs() - { - foreach ($this->cc as $cc) { - unset($this->all_recipients[strtolower($cc[0])]); - } - $this->cc = array(); - } - - /** - * Clear all BCC recipients. - * @return void - */ - public function clearBCCs() - { - foreach ($this->bcc as $bcc) { - unset($this->all_recipients[strtolower($bcc[0])]); - } - $this->bcc = array(); - } - - /** - * Clear all ReplyTo recipients. - * @return void - */ - public function clearReplyTos() - { - $this->ReplyTo = array(); - } - - /** - * Clear all recipient types. - * @return void - */ - public function clearAllRecipients() - { - $this->to = array(); - $this->cc = array(); - $this->bcc = array(); - $this->all_recipients = array(); - } - - /** - * Clear all filesystem, string, and binary attachments. - * @return void - */ - public function clearAttachments() - { - $this->attachment = array(); - } - - /** - * Clear all custom headers. - * @return void - */ - public function clearCustomHeaders() - { - $this->CustomHeader = array(); - } - - /** - * Add an error message to the error container. - * @access protected - * @param string $msg - * @return void - */ - protected function setError($msg) - { - $this->error_count++; - if ($this->Mailer == 'smtp' and !is_null($this->smtp)) { - $lasterror = $this->smtp->getError(); - if (!empty($lasterror) and array_key_exists('smtp_msg', $lasterror)) { - $msg .= '

    ' . $this->lang('smtp_error') . $lasterror['smtp_msg'] . "

    \n"; - } - } - $this->ErrorInfo = $msg; - } - - /** - * Return an RFC 822 formatted date. - * @access public - * @return string - * @static - */ - public static function rfcDate() - { - // Set the time zone to whatever the default is to avoid 500 errors - // Will default to UTC if it's not set properly in php.ini - date_default_timezone_set(@date_default_timezone_get()); - return date('D, j M Y H:i:s O'); - } - - /** - * Get the server hostname. - * Returns 'localhost.localdomain' if unknown. - * @access protected - * @return string - */ - protected function serverHostname() - { - $result = 'localhost.localdomain'; - if (!empty($this->Hostname)) { - $result = $this->Hostname; - } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) { - $result = $_SERVER['SERVER_NAME']; - } elseif (function_exists('gethostname') && gethostname() !== false) { - $result = gethostname(); - } elseif (php_uname('n') !== false) { - $result = php_uname('n'); - } - return $result; - } - - /** - * Get an error message in the current language. - * @access protected - * @param string $key - * @return string - */ - protected function lang($key) - { - if (count($this->language) < 1) { - $this->setLanguage('en'); // set the default language - } - - if (isset($this->language[$key])) { - return $this->language[$key]; - } else { - return 'Language string failed to load: ' . $key; - } - } - - /** - * Check if an error occurred. - * @access public - * @return boolean True if an error did occur. - */ - public function isError() - { - return ($this->error_count > 0); - } - - /** - * Ensure consistent line endings in a string. - * Changes every end of line from CRLF, CR or LF to $this->LE. - * @access public - * @param string $str String to fixEOL - * @return string - */ - public function fixEOL($str) - { - // Normalise to \n - $nstr = str_replace(array("\r\n", "\r"), "\n", $str); - // Now convert LE as needed - if ($this->LE !== "\n") { - $nstr = str_replace("\n", $this->LE, $nstr); - } - return $nstr; - } - - /** - * Add a custom header. - * $name value can be overloaded to contain - * both header name and value (name:value) - * @access public - * @param string $name Custom header name - * @param string $value Header value - * @return void - */ - public function addCustomHeader($name, $value = null) - { - if ($value === null) { - // Value passed in as name:value - $this->CustomHeader[] = explode(':', $name, 2); - } else { - $this->CustomHeader[] = array($name, $value); - } - } - - /** - * Create a message from an HTML string. - * Automatically makes modifications for inline images and backgrounds - * and creates a plain-text version by converting the HTML. - * Overwrites any existing values in $this->Body and $this->AltBody - * @access public - * @param string $message HTML message string - * @param string $basedir baseline directory for path - * @param boolean|callable $advanced Whether to use the internal HTML to text converter - * or your own custom converter @see html2text() - * @return string $message - */ - public function msgHTML($message, $basedir = '', $advanced = false) - { - preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images); - if (isset($images[2])) { - foreach ($images[2] as $imgindex => $url) { - // Convert data URIs into embedded images - if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) { - $data = substr($url, strpos($url, ',')); - if ($match[2]) { - $data = base64_decode($data); - } else { - $data = rawurldecode($data); - } - $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2 - if ($this->addStringEmbeddedImage($data, $cid, '', 'base64', $match[1])) { - $message = str_replace( - $images[0][$imgindex], - $images[1][$imgindex] . '="cid:' . $cid . '"', - $message - ); - } - } elseif (!preg_match('#^[A-z]+://#', $url)) { - // Do not change urls for absolute images (thanks to corvuscorax) - $filename = basename($url); - $directory = dirname($url); - if ($directory == '.') { - $directory = ''; - } - $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2 - if (strlen($basedir) > 1 && substr($basedir, -1) != '/') { - $basedir .= '/'; - } - if (strlen($directory) > 1 && substr($directory, -1) != '/') { - $directory .= '/'; - } - if ($this->addEmbeddedImage( - $basedir . $directory . $filename, - $cid, - $filename, - 'base64', - self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION)) - ) - ) { - $message = preg_replace( - '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui', - $images[1][$imgindex] . '="cid:' . $cid . '"', - $message - ); - } - } - } - } - $this->isHTML(true); - // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better - $this->Body = $this->normalizeBreaks($message); - $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced)); - if (empty($this->AltBody)) { - $this->AltBody = 'To view this email message, open it in a program that understands HTML!' . - self::CRLF . self::CRLF; - } - return $this->Body; - } - - /** - * Convert an HTML string into plain text. - * This is used by msgHTML(). - * Note - older versions of this function used a bundled advanced converter - * which was been removed for license reasons in #232 - * Example usage: - * - * // Use default conversion - * $plain = $mail->html2text($html); - * // Use your own custom converter - * $plain = $mail->html2text($html, function($html) { - * $converter = new MyHtml2text($html); - * return $converter->get_text(); - * }); - * - * @param string $html The HTML text to convert - * @param boolean|callable $advanced Any boolean value to use the internal converter, - * or provide your own callable for custom conversion. - * @return string - */ - public function html2text($html, $advanced = false) - { - if (is_callable($advanced)) { - return call_user_func($advanced, $html); - } - return html_entity_decode( - trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))), - ENT_QUOTES, - $this->CharSet - ); - } - - /** - * Get the MIME type for a file extension. - * @param string $ext File extension - * @access public - * @return string MIME type of file. - * @static - */ - public static function _mime_types($ext = '') - { - $mimes = array( - 'xl' => 'application/excel', - 'js' => 'application/javascript', - 'hqx' => 'application/mac-binhex40', - 'cpt' => 'application/mac-compactpro', - 'bin' => 'application/macbinary', - 'doc' => 'application/msword', - 'word' => 'application/msword', - 'class' => 'application/octet-stream', - 'dll' => 'application/octet-stream', - 'dms' => 'application/octet-stream', - 'exe' => 'application/octet-stream', - 'lha' => 'application/octet-stream', - 'lzh' => 'application/octet-stream', - 'psd' => 'application/octet-stream', - 'sea' => 'application/octet-stream', - 'so' => 'application/octet-stream', - 'oda' => 'application/oda', - 'pdf' => 'application/pdf', - 'ai' => 'application/postscript', - 'eps' => 'application/postscript', - 'ps' => 'application/postscript', - 'smi' => 'application/smil', - 'smil' => 'application/smil', - 'mif' => 'application/vnd.mif', - 'xls' => 'application/vnd.ms-excel', - 'ppt' => 'application/vnd.ms-powerpoint', - 'wbxml' => 'application/vnd.wap.wbxml', - 'wmlc' => 'application/vnd.wap.wmlc', - 'dcr' => 'application/x-director', - 'dir' => 'application/x-director', - 'dxr' => 'application/x-director', - 'dvi' => 'application/x-dvi', - 'gtar' => 'application/x-gtar', - 'php3' => 'application/x-httpd-php', - 'php4' => 'application/x-httpd-php', - 'php' => 'application/x-httpd-php', - 'phtml' => 'application/x-httpd-php', - 'phps' => 'application/x-httpd-php-source', - 'swf' => 'application/x-shockwave-flash', - 'sit' => 'application/x-stuffit', - 'tar' => 'application/x-tar', - 'tgz' => 'application/x-tar', - 'xht' => 'application/xhtml+xml', - 'xhtml' => 'application/xhtml+xml', - 'zip' => 'application/zip', - 'mid' => 'audio/midi', - 'midi' => 'audio/midi', - 'mp2' => 'audio/mpeg', - 'mp3' => 'audio/mpeg', - 'mpga' => 'audio/mpeg', - 'aif' => 'audio/x-aiff', - 'aifc' => 'audio/x-aiff', - 'aiff' => 'audio/x-aiff', - 'ram' => 'audio/x-pn-realaudio', - 'rm' => 'audio/x-pn-realaudio', - 'rpm' => 'audio/x-pn-realaudio-plugin', - 'ra' => 'audio/x-realaudio', - 'wav' => 'audio/x-wav', - 'bmp' => 'image/bmp', - 'gif' => 'image/gif', - 'jpeg' => 'image/jpeg', - 'jpe' => 'image/jpeg', - 'jpg' => 'image/jpeg', - 'png' => 'image/png', - 'tiff' => 'image/tiff', - 'tif' => 'image/tiff', - 'eml' => 'message/rfc822', - 'css' => 'text/css', - 'html' => 'text/html', - 'htm' => 'text/html', - 'shtml' => 'text/html', - 'log' => 'text/plain', - 'text' => 'text/plain', - 'txt' => 'text/plain', - 'rtx' => 'text/richtext', - 'rtf' => 'text/rtf', - 'vcf' => 'text/vcard', - 'vcard' => 'text/vcard', - 'xml' => 'text/xml', - 'xsl' => 'text/xml', - 'mpeg' => 'video/mpeg', - 'mpe' => 'video/mpeg', - 'mpg' => 'video/mpeg', - 'mov' => 'video/quicktime', - 'qt' => 'video/quicktime', - 'rv' => 'video/vnd.rn-realvideo', - 'avi' => 'video/x-msvideo', - 'movie' => 'video/x-sgi-movie' - ); - return (array_key_exists(strtolower($ext), $mimes) ? $mimes[strtolower($ext)]: 'application/octet-stream'); - } - - /** - * Map a file name to a MIME type. - * Defaults to 'application/octet-stream', i.e.. arbitrary binary data. - * @param string $filename A file name or full path, does not need to exist as a file - * @return string - * @static - */ - public static function filenameToType($filename) - { - // In case the path is a URL, strip any query string before getting extension - $qpos = strpos($filename, '?'); - if (false !== $qpos) { - $filename = substr($filename, 0, $qpos); - } - $pathinfo = self::mb_pathinfo($filename); - return self::_mime_types($pathinfo['extension']); - } - - /** - * Multi-byte-safe pathinfo replacement. - * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe. - * Works similarly to the one in PHP >= 5.2.0 - * @link http://www.php.net/manual/en/function.pathinfo.php#107461 - * @param string $path A filename or path, does not need to exist as a file - * @param integer|string $options Either a PATHINFO_* constant, - * or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2 - * @return string|array - * @static - */ - public static function mb_pathinfo($path, $options = null) - { - $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => ''); - $pathinfo = array(); - if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) { - if (array_key_exists(1, $pathinfo)) { - $ret['dirname'] = $pathinfo[1]; - } - if (array_key_exists(2, $pathinfo)) { - $ret['basename'] = $pathinfo[2]; - } - if (array_key_exists(5, $pathinfo)) { - $ret['extension'] = $pathinfo[5]; - } - if (array_key_exists(3, $pathinfo)) { - $ret['filename'] = $pathinfo[3]; - } - } - switch ($options) { - case PATHINFO_DIRNAME: - case 'dirname': - return $ret['dirname']; - case PATHINFO_BASENAME: - case 'basename': - return $ret['basename']; - case PATHINFO_EXTENSION: - case 'extension': - return $ret['extension']; - case PATHINFO_FILENAME: - case 'filename': - return $ret['filename']; - default: - return $ret; - } - } - - /** - * Set or reset instance properties. - * - * Usage Example: - * $page->set('X-Priority', '3'); - * - * @access public - * @param string $name - * @param mixed $value - * NOTE: will not work with arrays, there are no arrays to set/reset - * @throws phpmailerException - * @return boolean - * @TODO Should this not be using __set() magic function? - */ - public function set($name, $value = '') - { - try { - if (isset($this->$name)) { - $this->$name = $value; - } else { - throw new phpmailerException($this->lang('variable_set') . $name, self::STOP_CRITICAL); - } - } catch (Exception $exc) { - $this->setError($exc->getMessage()); - if ($exc->getCode() == self::STOP_CRITICAL) { - return false; - } - } - return true; - } - - /** - * Strip newlines to prevent header injection. - * @access public - * @param string $str - * @return string - */ - public function secureHeader($str) - { - return trim(str_replace(array("\r", "\n"), '', $str)); - } - - /** - * Normalize line breaks in a string. - * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format. - * Defaults to CRLF (for message bodies) and preserves consecutive breaks. - * @param string $text - * @param string $breaktype What kind of line break to use, defaults to CRLF - * @return string - * @access public - * @static - */ - public static function normalizeBreaks($text, $breaktype = "\r\n") - { - return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text); - } - - - /** - * Set the public and private key files and password for S/MIME signing. - * @access public - * @param string $cert_filename - * @param string $key_filename - * @param string $key_pass Password for private key - */ - public function sign($cert_filename, $key_filename, $key_pass) - { - $this->sign_cert_file = $cert_filename; - $this->sign_key_file = $key_filename; - $this->sign_key_pass = $key_pass; - } - - /** - * Quoted-Printable-encode a DKIM header. - * @access public - * @param string $txt - * @return string - */ - public function DKIM_QP($txt) - { - $line = ''; - for ($i = 0; $i < strlen($txt); $i++) { - $ord = ord($txt[$i]); - if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) { - $line .= $txt[$i]; - } else { - $line .= '=' . sprintf('%02X', $ord); - } - } - return $line; - } - - /** - * Generate a DKIM signature. - * @access public - * @param string $signHeader - * @throws phpmailerException - * @return string - */ - public function DKIM_Sign($signHeader) - { - if (!defined('PKCS7_TEXT')) { - if ($this->exceptions) { - throw new phpmailerException($this->lang('signing') . ' OpenSSL extension missing.'); - } - return ''; - } - $privKeyStr = file_get_contents($this->DKIM_private); - if ($this->DKIM_passphrase != '') { - $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase); - } else { - $privKey = $privKeyStr; - } - if (openssl_sign($signHeader, $signature, $privKey)) { - return base64_encode($signature); - } - return ''; - } - - /** - * Generate a DKIM canonicalization header. - * @access public - * @param string $signHeader Header - * @return string - */ - public function DKIM_HeaderC($signHeader) - { - $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader); - $lines = explode("\r\n", $signHeader); - foreach ($lines as $key => $line) { - list($heading, $value) = explode(':', $line, 2); - $heading = strtolower($heading); - $value = preg_replace('/\s+/', ' ', $value); // Compress useless spaces - $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value - } - $signHeader = implode("\r\n", $lines); - return $signHeader; - } - - /** - * Generate a DKIM canonicalization body. - * @access public - * @param string $body Message Body - * @return string - */ - public function DKIM_BodyC($body) - { - if ($body == '') { - return "\r\n"; - } - // stabilize line endings - $body = str_replace("\r\n", "\n", $body); - $body = str_replace("\n", "\r\n", $body); - // END stabilize line endings - while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") { - $body = substr($body, 0, strlen($body) - 2); - } - return $body; - } - - /** - * Create the DKIM header and body in a new message header. - * @access public - * @param string $headers_line Header lines - * @param string $subject Subject - * @param string $body Body - * @return string - */ - public function DKIM_Add($headers_line, $subject, $body) - { - $DKIMsignatureType = 'rsa-sha1'; // Signature & hash algorithms - $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body - $DKIMquery = 'dns/txt'; // Query method - $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone) - $subject_header = "Subject: $subject"; - $headers = explode($this->LE, $headers_line); - $from_header = ''; - $to_header = ''; - $current = ''; - foreach ($headers as $header) { - if (strpos($header, 'From:') === 0) { - $from_header = $header; - $current = 'from_header'; - } elseif (strpos($header, 'To:') === 0) { - $to_header = $header; - $current = 'to_header'; - } else { - if ($current && strpos($header, ' =?') === 0) { - $current .= $header; - } else { - $current = ''; - } - } - } - $from = str_replace('|', '=7C', $this->DKIM_QP($from_header)); - $to = str_replace('|', '=7C', $this->DKIM_QP($to_header)); - $subject = str_replace( - '|', - '=7C', - $this->DKIM_QP($subject_header) - ); // Copied header fields (dkim-quoted-printable) - $body = $this->DKIM_BodyC($body); - $DKIMlen = strlen($body); // Length of body - $DKIMb64 = base64_encode(pack('H*', sha1($body))); // Base64 of packed binary SHA-1 hash of body - $ident = ($this->DKIM_identity == '') ? '' : ' i=' . $this->DKIM_identity . ';'; - $dkimhdrs = 'DKIM-Signature: v=1; a=' . - $DKIMsignatureType . '; q=' . - $DKIMquery . '; l=' . - $DKIMlen . '; s=' . - $this->DKIM_selector . - ";\r\n" . - "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" . - "\th=From:To:Subject;\r\n" . - "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" . - "\tz=$from\r\n" . - "\t|$to\r\n" . - "\t|$subject;\r\n" . - "\tbh=" . $DKIMb64 . ";\r\n" . - "\tb="; - $toSign = $this->DKIM_HeaderC( - $from_header . "\r\n" . $to_header . "\r\n" . $subject_header . "\r\n" . $dkimhdrs - ); - $signed = $this->DKIM_Sign($toSign); - return $dkimhdrs . $signed . "\r\n"; - } - - /** - * Allows for public read access to 'to' property. - * @access public - * @return array - */ - public function getToAddresses() - { - return $this->to; - } - - /** - * Allows for public read access to 'cc' property. - * @access public - * @return array - */ - public function getCcAddresses() - { - return $this->cc; - } - - /** - * Allows for public read access to 'bcc' property. - * @access public - * @return array - */ - public function getBccAddresses() - { - return $this->bcc; - } - - /** - * Allows for public read access to 'ReplyTo' property. - * @access public - * @return array - */ - public function getReplyToAddresses() - { - return $this->ReplyTo; - } - - /** - * Allows for public read access to 'all_recipients' property. - * @access public - * @return array - */ - public function getAllRecipientAddresses() - { - return $this->all_recipients; - } - - /** - * Perform a callback. - * @param boolean $isSent - * @param array $to - * @param array $cc - * @param array $bcc - * @param string $subject - * @param string $body - * @param string $from - */ - protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from) - { - if (!empty($this->action_function) && is_callable($this->action_function)) { - $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from); - call_user_func_array($this->action_function, $params); - } - } -} - -/** - * PHPMailer exception handler - * @package PHPMailer - */ -class phpmailerException extends Exception -{ - /** - * Prettify error message output - * @return string - */ - public function errorMessage() - { - $errorMsg = '' . $this->getMessage() . "
    \n"; - return $errorMsg; - } -} diff --git a/download/phpmailer529/class.pop3.php b/download/phpmailer529/class.pop3.php deleted file mode 100755 index 984885ff0..000000000 --- a/download/phpmailer529/class.pop3.php +++ /dev/null @@ -1,397 +0,0 @@ - - * @author Jim Jagielski (jimjag) - * @author Andy Prevost (codeworxtech) - * @author Brent R. Matzelle (original founder) - * @copyright 2012 - 2014 Marcus Bointon - * @copyright 2010 - 2012 Jim Jagielski - * @copyright 2004 - 2009 Andy Prevost - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - * @note This program is distributed in the hope that it will be useful - WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. - */ - -/** - * PHPMailer POP-Before-SMTP Authentication Class. - * Specifically for PHPMailer to use for RFC1939 POP-before-SMTP authentication. - * Does not support APOP. - * @package PHPMailer - * @author Richard Davey (original author) - * @author Marcus Bointon (Synchro/coolbru) - * @author Jim Jagielski (jimjag) - * @author Andy Prevost (codeworxtech) - */ -class POP3 -{ - /** - * The POP3 PHPMailer Version number. - * @type string - * @access public - */ - public $Version = '5.2.9'; - - /** - * Default POP3 port number. - * @type integer - * @access public - */ - public $POP3_PORT = 110; - - /** - * Default timeout in seconds. - * @type integer - * @access public - */ - public $POP3_TIMEOUT = 30; - - /** - * POP3 Carriage Return + Line Feed. - * @type string - * @access public - * @deprecated Use the constant instead - */ - public $CRLF = "\r\n"; - - /** - * Debug display level. - * Options: 0 = no, 1+ = yes - * @type integer - * @access public - */ - public $do_debug = 0; - - /** - * POP3 mail server hostname. - * @type string - * @access public - */ - public $host; - - /** - * POP3 port number. - * @type integer - * @access public - */ - public $port; - - /** - * POP3 Timeout Value in seconds. - * @type integer - * @access public - */ - public $tval; - - /** - * POP3 username - * @type string - * @access public - */ - public $username; - - /** - * POP3 password. - * @type string - * @access public - */ - public $password; - - /** - * Resource handle for the POP3 connection socket. - * @type resource - * @access private - */ - private $pop_conn; - - /** - * Are we connected? - * @type boolean - * @access private - */ - private $connected = false; - - /** - * Error container. - * @type array - * @access private - */ - private $errors = array(); - - /** - * Line break constant - */ - const CRLF = "\r\n"; - - /** - * Simple static wrapper for all-in-one POP before SMTP - * @param $host - * @param boolean $port - * @param boolean $tval - * @param string $username - * @param string $password - * @param integer $debug_level - * @return boolean - */ - public static function popBeforeSmtp( - $host, - $port = false, - $tval = false, - $username = '', - $password = '', - $debug_level = 0 - ) { - $pop = new POP3; - return $pop->authorise($host, $port, $tval, $username, $password, $debug_level); - } - - /** - * Authenticate with a POP3 server. - * A connect, login, disconnect sequence - * appropriate for POP-before SMTP authorisation. - * @access public - * @param string $host The hostname to connect to - * @param integer|boolean $port The port number to connect to - * @param integer|boolean $timeout The timeout value - * @param string $username - * @param string $password - * @param integer $debug_level - * @return boolean - */ - public function authorise($host, $port = false, $timeout = false, $username = '', $password = '', $debug_level = 0) - { - $this->host = $host; - // If no port value provided, use default - if (false === $port) { - $this->port = $this->POP3_PORT; - } else { - $this->port = (integer)$port; - } - // If no timeout value provided, use default - if (false === $timeout) { - $this->tval = $this->POP3_TIMEOUT; - } else { - $this->tval = (integer)$timeout; - } - $this->do_debug = $debug_level; - $this->username = $username; - $this->password = $password; - // Reset the error log - $this->errors = array(); - // connect - $result = $this->connect($this->host, $this->port, $this->tval); - if ($result) { - $login_result = $this->login($this->username, $this->password); - if ($login_result) { - $this->disconnect(); - return true; - } - } - // We need to disconnect regardless of whether the login succeeded - $this->disconnect(); - return false; - } - - /** - * Connect to a POP3 server. - * @access public - * @param string $host - * @param integer|boolean $port - * @param integer $tval - * @return boolean - */ - public function connect($host, $port = false, $tval = 30) - { - // Are we already connected? - if ($this->connected) { - return true; - } - - //On Windows this will raise a PHP Warning error if the hostname doesn't exist. - //Rather than suppress it with @fsockopen, capture it cleanly instead - set_error_handler(array($this, 'catchWarning')); - - if (false === $port) { - $port = $this->POP3_PORT; - } - - // connect to the POP3 server - $this->pop_conn = fsockopen( - $host, // POP3 Host - $port, // Port # - $errno, // Error Number - $errstr, // Error Message - $tval - ); // Timeout (seconds) - // Restore the error handler - restore_error_handler(); - - // Did we connect? - if (false === $this->pop_conn) { - // It would appear not... - $this->setError(array( - 'error' => "Failed to connect to server $host on port $port", - 'errno' => $errno, - 'errstr' => $errstr - )); - return false; - } - - // Increase the stream time-out - stream_set_timeout($this->pop_conn, $tval, 0); - - // Get the POP3 server response - $pop3_response = $this->getResponse(); - // Check for the +OK - if ($this->checkResponse($pop3_response)) { - // The connection is established and the POP3 server is talking - $this->connected = true; - return true; - } - return false; - } - - /** - * Log in to the POP3 server. - * Does not support APOP (RFC 2828, 4949). - * @access public - * @param string $username - * @param string $password - * @return boolean - */ - public function login($username = '', $password = '') - { - if (!$this->connected) { - $this->setError('Not connected to POP3 server'); - } - if (empty($username)) { - $username = $this->username; - } - if (empty($password)) { - $password = $this->password; - } - - // Send the Username - $this->sendString("USER $username" . self::CRLF); - $pop3_response = $this->getResponse(); - if ($this->checkResponse($pop3_response)) { - // Send the Password - $this->sendString("PASS $password" . self::CRLF); - $pop3_response = $this->getResponse(); - if ($this->checkResponse($pop3_response)) { - return true; - } - } - return false; - } - - /** - * Disconnect from the POP3 server. - * @access public - */ - public function disconnect() - { - $this->sendString('QUIT'); - //The QUIT command may cause the daemon to exit, which will kill our connection - //So ignore errors here - try { - @fclose($this->pop_conn); - } catch (Exception $e) { - //Do nothing - }; - } - - /** - * Get a response from the POP3 server. - * $size is the maximum number of bytes to retrieve - * @param integer $size - * @return string - * @access private - */ - private function getResponse($size = 128) - { - $response = fgets($this->pop_conn, $size); - if ($this->do_debug >= 1) { - echo "Server -> Client: $response"; - } - return $response; - } - - /** - * Send raw data to the POP3 server. - * @param string $string - * @return integer - * @access private - */ - private function sendString($string) - { - if ($this->pop_conn) { - if ($this->do_debug >= 2) { //Show client messages when debug >= 2 - echo "Client -> Server: $string"; - } - return fwrite($this->pop_conn, $string, strlen($string)); - } - return 0; - } - - /** - * Checks the POP3 server response. - * Looks for for +OK or -ERR. - * @param string $string - * @return boolean - * @access private - */ - private function checkResponse($string) - { - if (substr($string, 0, 3) !== '+OK') { - $this->setError(array( - 'error' => "Server reported an error: $string", - 'errno' => 0, - 'errstr' => '' - )); - return false; - } else { - return true; - } - } - - /** - * Add an error to the internal error store. - * Also display debug output if it's enabled. - * @param $error - */ - private function setError($error) - { - $this->errors[] = $error; - if ($this->do_debug >= 1) { - echo '
    ';
    -            foreach ($this->errors as $error) {
    -                print_r($error);
    -            }
    -            echo '
    '; - } - } - - /** - * POP3 connection error handler. - * @param integer $errno - * @param string $errstr - * @param string $errfile - * @param integer $errline - * @access private - */ - private function catchWarning($errno, $errstr, $errfile, $errline) - { - $this->setError(array( - 'error' => "Connecting to the POP3 server raised a PHP warning: ", - 'errno' => $errno, - 'errstr' => $errstr, - 'errfile' => $errfile, - 'errline' => $errline - )); - } -} diff --git a/download/phpmailer529/class.smtp.php b/download/phpmailer529/class.smtp.php deleted file mode 100755 index d6991970f..000000000 --- a/download/phpmailer529/class.smtp.php +++ /dev/null @@ -1,1132 +0,0 @@ - - * @author Jim Jagielski (jimjag) - * @author Andy Prevost (codeworxtech) - * @author Brent R. Matzelle (original founder) - * @copyright 2014 Marcus Bointon - * @copyright 2010 - 2012 Jim Jagielski - * @copyright 2004 - 2009 Andy Prevost - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - * @note This program is distributed in the hope that it will be useful - WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. - */ - -/** - * PHPMailer RFC821 SMTP email transport class. - * Implements RFC 821 SMTP commands and provides some utility methods for sending mail to an SMTP server. - * @package PHPMailer - * @author Chris Ryan - * @author Marcus Bointon - */ -class SMTP -{ - /** - * The PHPMailer SMTP version number. - * @type string - */ - const VERSION = '5.2.9'; - - /** - * SMTP line break constant. - * @type string - */ - const CRLF = "\r\n"; - - /** - * The SMTP port to use if one is not specified. - * @type integer - */ - const DEFAULT_SMTP_PORT = 25; - - /** - * The maximum line length allowed by RFC 2822 section 2.1.1 - * @type integer - */ - const MAX_LINE_LENGTH = 998; - - /** - * Debug level for no output - */ - const DEBUG_OFF = 0; - - /** - * Debug level to show client -> server messages - */ - const DEBUG_CLIENT = 1; - - /** - * Debug level to show client -> server and server -> client messages - */ - const DEBUG_SERVER = 2; - - /** - * Debug level to show connection status, client -> server and server -> client messages - */ - const DEBUG_CONNECTION = 3; - - /** - * Debug level to show all messages - */ - const DEBUG_LOWLEVEL = 4; - - /** - * The PHPMailer SMTP Version number. - * @type string - * @deprecated Use the `VERSION` constant instead - * @see SMTP::VERSION - */ - public $Version = '5.2.9'; - - /** - * SMTP server port number. - * @type integer - * @deprecated This is only ever used as a default value, so use the `DEFAULT_SMTP_PORT` constant instead - * @see SMTP::DEFAULT_SMTP_PORT - */ - public $SMTP_PORT = 25; - - /** - * SMTP reply line ending. - * @type string - * @deprecated Use the `CRLF` constant instead - * @see SMTP::CRLF - */ - public $CRLF = "\r\n"; - - /** - * Debug output level. - * Options: - * * self::DEBUG_OFF (`0`) No debug output, default - * * self::DEBUG_CLIENT (`1`) Client commands - * * self::DEBUG_SERVER (`2`) Client commands and server responses - * * self::DEBUG_CONNECTION (`3`) As DEBUG_SERVER plus connection status - * * self::DEBUG_LOWLEVEL (`4`) Low-level data output, all messages - * @type integer - */ - public $do_debug = self::DEBUG_OFF; - - /** - * How to handle debug output. - * Options: - * * `echo` Output plain-text as-is, appropriate for CLI - * * `html` Output escaped, line breaks converted to `
    `, appropriate for browser output - * * `error_log` Output to error log as configured in php.ini - * - * Alternatively, you can provide a callable expecting two params: a message string and the debug level: - * - * $smtp->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";}; - * - * @type string|callable - */ - public $Debugoutput = 'echo'; - - /** - * Whether to use VERP. - * @link http://en.wikipedia.org/wiki/Variable_envelope_return_path - * @link http://www.postfix.org/VERP_README.html Info on VERP - * @type boolean - */ - public $do_verp = false; - - /** - * The timeout value for connection, in seconds. - * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2 - * This needs to be quite high to function correctly with hosts using greetdelay as an anti-spam measure. - * @link http://tools.ietf.org/html/rfc2821#section-4.5.3.2 - * @type integer - */ - public $Timeout = 300; - - /** - * How long to wait for commands to complete, in seconds. - * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2 - * @type integer - */ - public $Timelimit = 300; - - /** - * The socket for the server connection. - * @type resource - */ - protected $smtp_conn; - - /** - * Error message, if any, for the last call. - * @type array - */ - protected $error = array(); - - /** - * The reply the server sent to us for HELO. - * If null, no HELO string has yet been received. - * @type string|null - */ - protected $helo_rply = null; - - /** - * The set of SMTP extensions sent in reply to EHLO command. - * Indexes of the array are extension names. - * Value at index 'HELO' or 'EHLO' (according to command that was sent) - * represents the server name. In case of HELO it is the only element of the array. - * Other values can be boolean TRUE or an array containing extension options. - * If null, no HELO/EHLO string has yet been received. - * @type array|null - */ - protected $server_caps = null; - - /** - * The most recent reply received from the server. - * @type string - */ - protected $last_reply = ''; - - /** - * Output debugging info via a user-selected method. - * @see SMTP::$Debugoutput - * @see SMTP::$do_debug - * @param string $str Debug string to output - * @param integer $level The debug level of this message; see DEBUG_* constants - * @return void - */ - protected function edebug($str, $level = 0) - { - if ($level > $this->do_debug) { - return; - } - //Avoid clash with built-in function names - if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) { - call_user_func($this->Debugoutput, $str, $this->do_debug); - return; - } - switch ($this->Debugoutput) { - case 'error_log': - //Don't output, just log - error_log($str); - break; - case 'html': - //Cleans up output a bit for a better looking, HTML-safe output - echo htmlentities( - preg_replace('/[\r\n]+/', '', $str), - ENT_QUOTES, - 'UTF-8' - ) - . "
    \n"; - break; - case 'echo': - default: - //Normalize line breaks - $str = preg_replace('/(\r\n|\r|\n)/ms', "\n", $str); - echo gmdate('Y-m-d H:i:s') . "\t" . str_replace( - "\n", - "\n \t ", - trim($str) - )."\n"; - } - } - - /** - * Connect to an SMTP server. - * @param string $host SMTP server IP or host name - * @param integer $port The port number to connect to - * @param integer $timeout How long to wait for the connection to open - * @param array $options An array of options for stream_context_create() - * @access public - * @return boolean - */ - public function connect($host, $port = null, $timeout = 30, $options = array()) - { - static $streamok; - //This is enabled by default since 5.0.0 but some providers disable it - //Check this once and cache the result - if (is_null($streamok)) { - $streamok = function_exists('stream_socket_client'); - } - // Clear errors to avoid confusion - $this->error = array(); - // Make sure we are __not__ connected - if ($this->connected()) { - // Already connected, generate error - $this->error = array('error' => 'Already connected to a server'); - return false; - } - if (empty($port)) { - $port = self::DEFAULT_SMTP_PORT; - } - // Connect to the SMTP server - $this->edebug( - "Connection: opening to $host:$port, t=$timeout, opt=".var_export($options, true), - self::DEBUG_CONNECTION - ); - $errno = 0; - $errstr = ''; - if ($streamok) { - $socket_context = stream_context_create($options); - //Suppress errors; connection failures are handled at a higher level - $this->smtp_conn = @stream_socket_client( - $host . ":" . $port, - $errno, - $errstr, - $timeout, - STREAM_CLIENT_CONNECT, - $socket_context - ); - } else { - //Fall back to fsockopen which should work in more places, but is missing some features - $this->edebug( - "Connection: stream_socket_client not available, falling back to fsockopen", - self::DEBUG_CONNECTION - ); - $this->smtp_conn = fsockopen( - $host, - $port, - $errno, - $errstr, - $timeout - ); - } - // Verify we connected properly - if (!is_resource($this->smtp_conn)) { - $this->error = array( - 'error' => 'Failed to connect to server', - 'errno' => $errno, - 'errstr' => $errstr - ); - $this->edebug( - 'SMTP ERROR: ' . $this->error['error'] - . ": $errstr ($errno)", - self::DEBUG_CLIENT - ); - return false; - } - $this->edebug('Connection: opened', self::DEBUG_CONNECTION); - // SMTP server can take longer to respond, give longer timeout for first read - // Windows does not have support for this timeout function - if (substr(PHP_OS, 0, 3) != 'WIN') { - $max = ini_get('max_execution_time'); - if ($max != 0 && $timeout > $max) { // Don't bother if unlimited - @set_time_limit($timeout); - } - stream_set_timeout($this->smtp_conn, $timeout, 0); - } - // Get any announcement - $announce = $this->get_lines(); - $this->edebug('SERVER -> CLIENT: ' . $announce, self::DEBUG_SERVER); - return true; - } - - /** - * Initiate a TLS (encrypted) session. - * @access public - * @return boolean - */ - public function startTLS() - { - if (!$this->sendCommand('STARTTLS', 'STARTTLS', 220)) { - return false; - } - // Begin encrypted connection - if (!stream_socket_enable_crypto( - $this->smtp_conn, - true, - STREAM_CRYPTO_METHOD_TLS_CLIENT - )) { - return false; - } - return true; - } - - /** - * Perform SMTP authentication. - * Must be run after hello(). - * @see hello() - * @param string $username The user name - * @param string $password The password - * @param string $authtype The auth type (PLAIN, LOGIN, NTLM, CRAM-MD5) - * @param string $realm The auth realm for NTLM - * @param string $workstation The auth workstation for NTLM - * @access public - * @return boolean True if successfully authenticated. - */ - public function authenticate( - $username, - $password, - $authtype = null, - $realm = '', - $workstation = '' - ) { - if (!$this->server_caps) { - $this->error = array('error' => 'Authentication is not allowed before HELO/EHLO'); - return false; - } - - if (array_key_exists('EHLO', $this->server_caps)) { - // SMTP extensions are available. Let's try to find a proper authentication method - - if (!array_key_exists('AUTH', $this->server_caps)) { - $this->error = array( 'error' => 'Authentication is not allowed at this stage' ); - // 'at this stage' means that auth may be allowed after the stage changes - // e.g. after STARTTLS - return false; - } - - self::edebug('Auth method requested: ' . ($authtype ? $authtype : 'UNKNOWN'), self::DEBUG_LOWLEVEL); - self::edebug( - 'Auth methods available on the server: ' . implode(',', $this->server_caps['AUTH']), - self::DEBUG_LOWLEVEL - ); - - if (empty($authtype)) { - foreach (array('LOGIN', 'CRAM-MD5', 'NTLM', 'PLAIN') as $method) { - if (in_array($method, $this->server_caps['AUTH'])) { - $authtype = $method; - break; - } - } - if (empty($authtype)) { - $this->error = array( 'error' => 'No supported authentication methods found' ); - return false; - } - self::edebug('Auth method selected: '.$authtype, self::DEBUG_LOWLEVEL); - } - - if (!in_array($authtype, $this->server_caps['AUTH'])) { - $this->error = array( 'error' => 'The requested authentication method "' - . $authtype . '" is not supported by the server' ); - return false; - } - } elseif (empty($authtype)) { - $authtype = 'LOGIN'; - } - switch ($authtype) { - case 'PLAIN': - // Start authentication - if (!$this->sendCommand('AUTH', 'AUTH PLAIN', 334)) { - return false; - } - // Send encoded username and password - if (!$this->sendCommand( - 'User & Password', - base64_encode("\0" . $username . "\0" . $password), - 235 - ) - ) { - return false; - } - break; - case 'LOGIN': - // Start authentication - if (!$this->sendCommand('AUTH', 'AUTH LOGIN', 334)) { - return false; - } - if (!$this->sendCommand("Username", base64_encode($username), 334)) { - return false; - } - if (!$this->sendCommand("Password", base64_encode($password), 235)) { - return false; - } - break; - case 'NTLM': - /* - * ntlm_sasl_client.php - * Bundled with Permission - * - * How to telnet in windows: - * http://technet.microsoft.com/en-us/library/aa995718%28EXCHG.65%29.aspx - * PROTOCOL Docs http://curl.haxx.se/rfc/ntlm.html#ntlmSmtpAuthentication - */ - require_once 'extras/ntlm_sasl_client.php'; - $temp = new stdClass(); - $ntlm_client = new ntlm_sasl_client_class; - //Check that functions are available - if (!$ntlm_client->Initialize($temp)) { - $this->error = array('error' => $temp->error); - $this->edebug( - 'You need to enable some modules in your php.ini file: ' - . $this->error['error'], - self::DEBUG_CLIENT - ); - return false; - } - //msg1 - $msg1 = $ntlm_client->TypeMsg1($realm, $workstation); //msg1 - - if (!$this->sendCommand( - 'AUTH NTLM', - 'AUTH NTLM ' . base64_encode($msg1), - 334 - ) - ) { - return false; - } - //Though 0 based, there is a white space after the 3 digit number - //msg2 - $challenge = substr($this->last_reply, 3); - $challenge = base64_decode($challenge); - $ntlm_res = $ntlm_client->NTLMResponse( - substr($challenge, 24, 8), - $password - ); - //msg3 - $msg3 = $ntlm_client->TypeMsg3( - $ntlm_res, - $username, - $realm, - $workstation - ); - // send encoded username - return $this->sendCommand('Username', base64_encode($msg3), 235); - case 'CRAM-MD5': - // Start authentication - if (!$this->sendCommand('AUTH CRAM-MD5', 'AUTH CRAM-MD5', 334)) { - return false; - } - // Get the challenge - $challenge = base64_decode(substr($this->last_reply, 4)); - - // Build the response - $response = $username . ' ' . $this->hmac($challenge, $password); - - // send encoded credentials - return $this->sendCommand('Username', base64_encode($response), 235); - default: - $this->error = array( 'error' => 'Authentication method "' . $authtype . '" is not supported' ); - return false; - } - return true; - } - - /** - * Calculate an MD5 HMAC hash. - * Works like hash_hmac('md5', $data, $key) - * in case that function is not available - * @param string $data The data to hash - * @param string $key The key to hash with - * @access protected - * @return string - */ - protected function hmac($data, $key) - { - if (function_exists('hash_hmac')) { - return hash_hmac('md5', $data, $key); - } - - // The following borrowed from - // http://php.net/manual/en/function.mhash.php#27225 - - // RFC 2104 HMAC implementation for php. - // Creates an md5 HMAC. - // Eliminates the need to install mhash to compute a HMAC - // by Lance Rushing - - $bytelen = 64; // byte length for md5 - if (strlen($key) > $bytelen) { - $key = pack('H*', md5($key)); - } - $key = str_pad($key, $bytelen, chr(0x00)); - $ipad = str_pad('', $bytelen, chr(0x36)); - $opad = str_pad('', $bytelen, chr(0x5c)); - $k_ipad = $key ^ $ipad; - $k_opad = $key ^ $opad; - - return md5($k_opad . pack('H*', md5($k_ipad . $data))); - } - - /** - * Check connection state. - * @access public - * @return boolean True if connected. - */ - public function connected() - { - if (is_resource($this->smtp_conn)) { - $sock_status = stream_get_meta_data($this->smtp_conn); - if ($sock_status['eof']) { - // The socket is valid but we are not connected - $this->edebug( - 'SMTP NOTICE: EOF caught while checking if connected', - self::DEBUG_CLIENT - ); - $this->close(); - return false; - } - return true; // everything looks good - } - return false; - } - - /** - * Close the socket and clean up the state of the class. - * Don't use this function without first trying to use QUIT. - * @see quit() - * @access public - * @return void - */ - public function close() - { - $this->error = array(); - $this->server_caps = null; - $this->helo_rply = null; - if (is_resource($this->smtp_conn)) { - // close the connection and cleanup - fclose($this->smtp_conn); - $this->smtp_conn = null; //Makes for cleaner serialization - $this->edebug('Connection: closed', self::DEBUG_CONNECTION); - } - } - - /** - * Send an SMTP DATA command. - * Issues a data command and sends the msg_data to the server, - * finializing the mail transaction. $msg_data is the message - * that is to be send with the headers. Each header needs to be - * on a single line followed by a with the message headers - * and the message body being separated by and additional . - * Implements rfc 821: DATA - * @param string $msg_data Message data to send - * @access public - * @return boolean - */ - public function data($msg_data) - { - //This will use the standard timelimit - if (!$this->sendCommand('DATA', 'DATA', 354)) { - return false; - } - - /* The server is ready to accept data! - * According to rfc821 we should not send more than 1000 characters on a single line (including the CRLF) - * so we will break the data up into lines by \r and/or \n then if needed we will break each of those into - * smaller lines to fit within the limit. - * We will also look for lines that start with a '.' and prepend an additional '.'. - * NOTE: this does not count towards line-length limit. - */ - - // Normalize line breaks before exploding - $lines = explode("\n", str_replace(array("\r\n", "\r"), "\n", $msg_data)); - - /* To distinguish between a complete RFC822 message and a plain message body, we check if the first field - * of the first line (':' separated) does not contain a space then it _should_ be a header and we will - * process all lines before a blank line as headers. - */ - - $field = substr($lines[0], 0, strpos($lines[0], ':')); - $in_headers = false; - if (!empty($field) && strpos($field, ' ') === false) { - $in_headers = true; - } - - foreach ($lines as $line) { - $lines_out = array(); - if ($in_headers and $line == '') { - $in_headers = false; - } - //We need to break this line up into several smaller lines - //This is a small micro-optimisation: isset($str[$len]) is equivalent to (strlen($str) > $len) - while (isset($line[self::MAX_LINE_LENGTH])) { - //Working backwards, try to find a space within the last MAX_LINE_LENGTH chars of the line to break on - //so as to avoid breaking in the middle of a word - $pos = strrpos(substr($line, 0, self::MAX_LINE_LENGTH), ' '); - if (!$pos) { //Deliberately matches both false and 0 - //No nice break found, add a hard break - $pos = self::MAX_LINE_LENGTH - 1; - $lines_out[] = substr($line, 0, $pos); - $line = substr($line, $pos); - } else { - //Break at the found point - $lines_out[] = substr($line, 0, $pos); - //Move along by the amount we dealt with - $line = substr($line, $pos + 1); - } - //If processing headers add a LWSP-char to the front of new line RFC822 section 3.1.1 - if ($in_headers) { - $line = "\t" . $line; - } - } - $lines_out[] = $line; - - //Send the lines to the server - foreach ($lines_out as $line_out) { - //RFC2821 section 4.5.2 - if (!empty($line_out) and $line_out[0] == '.') { - $line_out = '.' . $line_out; - } - $this->client_send($line_out . self::CRLF); - } - } - - //Message data has been sent, complete the command - //Increase timelimit for end of DATA command - $savetimelimit = $this->Timelimit; - $this->Timelimit = $this->Timelimit * 2; - $result = $this->sendCommand('DATA END', '.', 250); - //Restore timelimit - $this->Timelimit = $savetimelimit; - return $result; - } - - /** - * Send an SMTP HELO or EHLO command. - * Used to identify the sending server to the receiving server. - * This makes sure that client and server are in a known state. - * Implements RFC 821: HELO - * and RFC 2821 EHLO. - * @param string $host The host name or IP to connect to - * @access public - * @return boolean - */ - public function hello($host = '') - { - //Try extended hello first (RFC 2821) - return (boolean)($this->sendHello('EHLO', $host) or $this->sendHello('HELO', $host)); - } - - /** - * Send an SMTP HELO or EHLO command. - * Low-level implementation used by hello() - * @see hello() - * @param string $hello The HELO string - * @param string $host The hostname to say we are - * @access protected - * @return boolean - */ - protected function sendHello($hello, $host) - { - $noerror = $this->sendCommand($hello, $hello . ' ' . $host, 250); - $this->helo_rply = $this->last_reply; - if ($noerror) { - $this->parseHelloFields($hello); - } else { - $this->server_caps = null; - } - return $noerror; - } - - /** - * Parse a reply to HELO/EHLO command to discover server extensions. - * In case of HELO, the only parameter that can be discovered is a server name. - * @access protected - * @param string $type - 'HELO' or 'EHLO' - */ - protected function parseHelloFields($type) - { - $this->server_caps = array(); - $lines = explode("\n", $this->last_reply); - foreach ($lines as $n => $s) { - $s = trim(substr($s, 4)); - if (!$s) { - continue; - } - $fields = explode(' ', $s); - if ($fields) { - if (!$n) { - $name = $type; - $fields = $fields[0]; - } else { - $name = array_shift($fields); - if ($name == 'SIZE') { - $fields = ($fields) ? $fields[0] : 0; - } - } - $this->server_caps[$name] = ($fields ? $fields : true); - } - } - } - - /** - * Send an SMTP MAIL command. - * Starts a mail transaction from the email address specified in - * $from. Returns true if successful or false otherwise. If True - * the mail transaction is started and then one or more recipient - * commands may be called followed by a data command. - * Implements rfc 821: MAIL FROM: - * @param string $from Source address of this message - * @access public - * @return boolean - */ - public function mail($from) - { - $useVerp = ($this->do_verp ? ' XVERP' : ''); - return $this->sendCommand( - 'MAIL FROM', - 'MAIL FROM:<' . $from . '>' . $useVerp, - 250 - ); - } - - /** - * Send an SMTP QUIT command. - * Closes the socket if there is no error or the $close_on_error argument is true. - * Implements from rfc 821: QUIT - * @param boolean $close_on_error Should the connection close if an error occurs? - * @access public - * @return boolean - */ - public function quit($close_on_error = true) - { - $noerror = $this->sendCommand('QUIT', 'QUIT', 221); - $err = $this->error; //Save any error - if ($noerror or $close_on_error) { - $this->close(); - $this->error = $err; //Restore any error from the quit command - } - return $noerror; - } - - /** - * Send an SMTP RCPT command. - * Sets the TO argument to $toaddr. - * Returns true if the recipient was accepted false if it was rejected. - * Implements from rfc 821: RCPT TO: - * @param string $toaddr The address the message is being sent to - * @access public - * @return boolean - */ - public function recipient($toaddr) - { - return $this->sendCommand( - 'RCPT TO', - 'RCPT TO:<' . $toaddr . '>', - array(250, 251) - ); - } - - /** - * Send an SMTP RSET command. - * Abort any transaction that is currently in progress. - * Implements rfc 821: RSET - * @access public - * @return boolean True on success. - */ - public function reset() - { - return $this->sendCommand('RSET', 'RSET', 250); - } - - /** - * Send a command to an SMTP server and check its return code. - * @param string $command The command name - not sent to the server - * @param string $commandstring The actual command to send - * @param integer|array $expect One or more expected integer success codes - * @access protected - * @return boolean True on success. - */ - protected function sendCommand($command, $commandstring, $expect) - { - if (!$this->connected()) { - $this->error = array( - 'error' => "Called $command without being connected" - ); - return false; - } - $this->client_send($commandstring . self::CRLF); - - $this->last_reply = $this->get_lines(); - // Fetch SMTP code and possible error code explanation - $matches = array(); - if (preg_match("/^([0-9]{3})[ -](?:([0-9]\\.[0-9]\\.[0-9]) )?/", $this->last_reply, $matches)) { - $code = $matches[1]; - $code_ex = (count($matches) > 2 ? $matches[2] : null); - // Cut off error code from each response line - $detail = preg_replace( - "/{$code}[ -]".($code_ex ? str_replace('.', '\\.', $code_ex).' ' : '')."/m", - '', - $this->last_reply - ); - } else { // Fall back to simple parsing if regex fails - $code = substr($this->last_reply, 0, 3); - $code_ex = null; - $detail = substr($this->last_reply, 4); - } - - $this->edebug('SERVER -> CLIENT: ' . $this->last_reply, self::DEBUG_SERVER); - - if (!in_array($code, (array)$expect)) { - $this->error = array( - 'error' => "$command command failed", - 'smtp_code' => $code, - 'smtp_code_ex' => $code_ex, - 'detail' => $detail - ); - $this->edebug( - 'SMTP ERROR: ' . $this->error['error'] . ': ' . $this->last_reply, - self::DEBUG_CLIENT - ); - return false; - } - - $this->error = array(); - return true; - } - - /** - * Send an SMTP SAML command. - * Starts a mail transaction from the email address specified in $from. - * Returns true if successful or false otherwise. If True - * the mail transaction is started and then one or more recipient - * commands may be called followed by a data command. This command - * will send the message to the users terminal if they are logged - * in and send them an email. - * Implements rfc 821: SAML FROM: - * @param string $from The address the message is from - * @access public - * @return boolean - */ - public function sendAndMail($from) - { - return $this->sendCommand('SAML', "SAML FROM:$from", 250); - } - - /** - * Send an SMTP VRFY command. - * @param string $name The name to verify - * @access public - * @return boolean - */ - public function verify($name) - { - return $this->sendCommand('VRFY', "VRFY $name", array(250, 251)); - } - - /** - * Send an SMTP NOOP command. - * Used to keep keep-alives alive, doesn't actually do anything - * @access public - * @return boolean - */ - public function noop() - { - return $this->sendCommand('NOOP', 'NOOP', 250); - } - - /** - * Send an SMTP TURN command. - * This is an optional command for SMTP that this class does not support. - * This method is here to make the RFC821 Definition complete for this class - * and _may_ be implemented in future - * Implements from rfc 821: TURN - * @access public - * @return boolean - */ - public function turn() - { - $this->error = array( - 'error' => 'The SMTP TURN command is not implemented' - ); - $this->edebug('SMTP NOTICE: ' . $this->error['error'], self::DEBUG_CLIENT); - return false; - } - - /** - * Send raw data to the server. - * @param string $data The data to send - * @access public - * @return integer|boolean The number of bytes sent to the server or false on error - */ - public function client_send($data) - { - $this->edebug("CLIENT -> SERVER: $data", self::DEBUG_CLIENT); - return fwrite($this->smtp_conn, $data); - } - - /** - * Get the latest error. - * @access public - * @return array - */ - public function getError() - { - return $this->error; - } - - /** - * Get SMTP extensions available on the server - * @access public - * @return array|null - */ - public function getServerExtList() - { - return $this->server_caps; - } - - /** - * A multipurpose method - * The method works in three ways, dependent on argument value and current state - * 1. HELO/EHLO was not sent - returns null and set up $this->error - * 2. HELO was sent - * $name = 'HELO': returns server name - * $name = 'EHLO': returns boolean false - * $name = any string: returns null and set up $this->error - * 3. EHLO was sent - * $name = 'HELO'|'EHLO': returns server name - * $name = any string: if extension $name exists, returns boolean True - * or its options. Otherwise returns boolean False - * In other words, one can use this method to detect 3 conditions: - * - null returned: handshake was not or we don't know about ext (refer to $this->error) - * - false returned: the requested feature exactly not exists - * - positive value returned: the requested feature exists - * @param string $name Name of SMTP extension or 'HELO'|'EHLO' - * @return mixed - */ - public function getServerExt($name) - { - if (!$this->server_caps) { - $this->error = array('No HELO/EHLO was sent'); - return null; - } - - // the tight logic knot ;) - if (!array_key_exists($name, $this->server_caps)) { - if ($name == 'HELO') { - return $this->server_caps['EHLO']; - } - if ($name == 'EHLO' || array_key_exists('EHLO', $this->server_caps)) { - return false; - } - $this->error = array('HELO handshake was used. Client knows nothing about server extensions'); - return null; - } - - return $this->server_caps[$name]; - } - - /** - * Get the last reply from the server. - * @access public - * @return string - */ - public function getLastReply() - { - return $this->last_reply; - } - - /** - * Read the SMTP server's response. - * Either before eof or socket timeout occurs on the operation. - * With SMTP we can tell if we have more lines to read if the - * 4th character is '-' symbol. If it is a space then we don't - * need to read anything else. - * @access protected - * @return string - */ - protected function get_lines() - { - // If the connection is bad, give up straight away - if (!is_resource($this->smtp_conn)) { - return ''; - } - $data = ''; - $endtime = 0; - stream_set_timeout($this->smtp_conn, $this->Timeout); - if ($this->Timelimit > 0) { - $endtime = time() + $this->Timelimit; - } - while (is_resource($this->smtp_conn) && !feof($this->smtp_conn)) { - $str = @fgets($this->smtp_conn, 515); - $this->edebug("SMTP -> get_lines(): \$data was \"$data\"", self::DEBUG_LOWLEVEL); - $this->edebug("SMTP -> get_lines(): \$str is \"$str\"", self::DEBUG_LOWLEVEL); - $data .= $str; - $this->edebug("SMTP -> get_lines(): \$data is \"$data\"", self::DEBUG_LOWLEVEL); - // If 4th character is a space, we are done reading, break the loop, micro-optimisation over strlen - if ((isset($str[3]) and $str[3] == ' ')) { - break; - } - // Timed-out? Log and break - $info = stream_get_meta_data($this->smtp_conn); - if ($info['timed_out']) { - $this->edebug( - 'SMTP -> get_lines(): timed-out (' . $this->Timeout . ' sec)', - self::DEBUG_LOWLEVEL - ); - break; - } - // Now check if reads took too long - if ($endtime and time() > $endtime) { - $this->edebug( - 'SMTP -> get_lines(): timelimit reached ('. - $this->Timelimit . ' sec)', - self::DEBUG_LOWLEVEL - ); - break; - } - } - return $data; - } - - /** - * Enable or disable VERP address generation. - * @param boolean $enabled - */ - public function setVerp($enabled = false) - { - $this->do_verp = $enabled; - } - - /** - * Get VERP address generation mode. - * @return boolean - */ - public function getVerp() - { - return $this->do_verp; - } - - /** - * Set debug output method. - * @param string|callable $method The name of the mechanism to use for debugging output, or a callable to handle it. - */ - public function setDebugOutput($method = 'echo') - { - $this->Debugoutput = $method; - } - - /** - * Get debug output method. - * @return string - */ - public function getDebugOutput() - { - return $this->Debugoutput; - } - - /** - * Set debug output level. - * @param integer $level - */ - public function setDebugLevel($level = 0) - { - $this->do_debug = $level; - } - - /** - * Get debug output level. - * @return integer - */ - public function getDebugLevel() - { - return $this->do_debug; - } - - /** - * Set SMTP timeout. - * @param integer $timeout - */ - public function setTimeout($timeout = 0) - { - $this->Timeout = $timeout; - } - - /** - * Get SMTP timeout. - * @return integer - */ - public function getTimeout() - { - return $this->Timeout; - } -} diff --git a/download/phpmailer529/composer.json b/download/phpmailer529/composer.json deleted file mode 100755 index 53d4eb117..000000000 --- a/download/phpmailer529/composer.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "phpmailer/phpmailer", - "type": "library", - "description": "PHPMailer is a full-featured email creation and transfer class for PHP", - "authors": [ - { - "name": "Marcus Bointon", - "email": "phpmailer@synchromedia.co.uk" - }, - { - "name": "Jim Jagielski", - "email": "jimjag@gmail.com" - }, - { - "name": "Andy Prevost", - "email": "codeworxtech@users.sourceforge.net" - }, - { - "name": "Brent R. Matzelle" - } - ], - "require": { - "php": ">=5.0.0" - }, - "require-dev": { - "phpdocumentor/phpdocumentor": "*", - "phpunit/phpunit": "4.1.*" - }, - "autoload": { - "classmap": ["class.phpmailer.php", "class.pop3.php", "class.smtp.php"] - }, - "license": "LGPL-2.1" -} \ No newline at end of file diff --git a/download/phpmailer529/docs/Callback_function_notes.txt b/download/phpmailer529/docs/Callback_function_notes.txt deleted file mode 100755 index 461ea508e..000000000 --- a/download/phpmailer529/docs/Callback_function_notes.txt +++ /dev/null @@ -1,17 +0,0 @@ -NEW CALLBACK FUNCTION: -====================== - -We have had requests for a method to process the results of sending emails -through PHPMailer. In this new release, we have implemented a callback -function that passes the results of each email sent (to, cc, and/or bcc). -We have provided an example that echos the results back to the screen. The -callback function can be used for any purpose. With minor modifications, the -callback function can be used to create CSV logs, post results to databases, -etc. - -Please review the test.php script for the example. - -It's pretty straight forward. - -Enjoy! -Andy diff --git a/download/phpmailer529/docs/DomainKeys_notes.txt b/download/phpmailer529/docs/DomainKeys_notes.txt deleted file mode 100755 index 2ad10f159..000000000 --- a/download/phpmailer529/docs/DomainKeys_notes.txt +++ /dev/null @@ -1,55 +0,0 @@ -CREATE DKIM KEYS and DNS Resource Record: -========================================= - -To create DomainKeys Identified Mail keys, visit: -http://dkim.worxware.com/ -... read the information, fill in the form, and download the ZIP file -containing the public key, private key, DNS Resource Record and instructions -to add to your DNS Zone Record, and the PHPMailer code to enable DKIM -digital signing. - -/*** PROTECT YOUR PRIVATE & PUBLIC KEYS ***/ - -You need to protect your DKIM private and public keys from being viewed or -accessed. Add protection to your .htaccess file as in this example: - -# secure htkeyprivate file - - order allow,deny - deny from all - - -# secure htkeypublic file - - order allow,deny - deny from all - - -(the actual .htaccess additions are in the ZIP file sent back to you from -http://dkim.worxware.com/ - -A few notes on using DomainKey Identified Mail (DKIM): - -You do not need to use PHPMailer to DKIM sign emails IF: -- you enable DomainKey support and add the DNS resource record -- you use your outbound mail server - -If you are a third-party emailer that works on behalf of domain owners to -send their emails from your own server: -- you absolutely have to DKIM sign outbound emails -- the domain owner has to add the DNS resource record to match the - private key, public key, selector, identity, and domain that you create -- use caution with the "selector" ... at least one "selector" will already - exist in the DNS Zone Record of the domain at the domain owner's server - you need to ensure that the "selector" you use is unique -Note: since the IP address will not match the domain owner's DNS Zone record -you can be certain that email providers that validate based on DomainKey will -check the domain owner's DNS Zone record for your DNS resource record. Before -sending out emails on behalf of domain owners, ensure they have entered the -DNS resource record you provided them. - -Enjoy! -Andy - -PS. if you need additional information about DKIM, please see: -http://www.dkim.org/info/dkim-faq.html diff --git a/download/phpmailer529/docs/Note_for_SMTP_debugging.txt b/download/phpmailer529/docs/Note_for_SMTP_debugging.txt deleted file mode 100755 index 128b2d9d8..000000000 --- a/download/phpmailer529/docs/Note_for_SMTP_debugging.txt +++ /dev/null @@ -1,17 +0,0 @@ -If you are having problems connecting or sending emails through your SMTP server, the SMTP class can provide more information about the processing/errors taking place. -Use the debug functionality of the class to see what's going on in your connections. To do that, set the debug level in your script. For example: - -$mail->SMTPDebug = 1; -$mail->isSMTP(); // telling the class to use SMTP -$mail->SMTPAuth = true; // enable SMTP authentication -$mail->Port = 26; // set the SMTP port -$mail->Host = "mail.yourhost.com"; // SMTP server -$mail->Username = "name@yourhost.com"; // SMTP account username -$mail->Password = "your password"; // SMTP account password - -Notes on this: -$mail->SMTPDebug = 0; ... will disable debugging (you can also leave this out completely, 0 is the default) -$mail->SMTPDebug = 1; ... will echo errors and server responses -$mail->SMTPDebug = 2; ... will echo errors, server responses and client messages - -And finally, don't forget to disable debugging before going into production. diff --git a/download/phpmailer529/docs/extending.html b/download/phpmailer529/docs/extending.html deleted file mode 100755 index ec2b85108..000000000 --- a/download/phpmailer529/docs/extending.html +++ /dev/null @@ -1,129 +0,0 @@ - - -Examples using phpmailer - - - - -

    Examples using PHPMailer

    - -

    1. Advanced Example

    -

    - -This demonstrates sending multiple email messages with binary attachments -from a MySQL database using multipart/alternative messages.

    - -

    -require 'PHPMailerAutoload.php';
    -
    -$mail = new PHPMailer();
    -
    -$mail->From     = 'list@example.com';
    -$mail->FromName = 'List manager';
    -$mail->Host     = 'smtp1.example.com;smtp2.example.com';
    -$mail->Mailer   = 'smtp';
    -
    -@mysqli_connect('localhost','root','password');
    -@mysqli_select_db("my_company");
    -$query = "SELECT full_name, email, photo FROM employee";
    -$result = @mysqli_query($query);
    -
    -while ($row = mysqli_fetch_assoc($result))
    -{
    -    // HTML body
    -    $body  = "Hello <font size=\"4\">" . $row['full_name'] . "</font>, <p>";
    -    $body .= "<i>Your</i> personal photograph to this message.<p>";
    -    $body .= "Sincerely, <br>";
    -    $body .= "phpmailer List manager";
    -
    -    // Plain text body (for mail clients that cannot read HTML)
    -    $text_body  = 'Hello ' . $row['full_name'] . ", \n\n";
    -    $text_body .= "Your personal photograph to this message.\n\n";
    -    $text_body .= "Sincerely, \n";
    -    $text_body .= 'phpmailer List manager';
    -
    -    $mail->Body    = $body;
    -    $mail->AltBody = $text_body;
    -    $mail->addAddress($row['email'], $row['full_name']);
    -    $mail->addStringAttachment($row['photo'], 'YourPhoto.jpg');
    -
    -    if(!$mail->send())
    -        echo "There has been a mail error sending to " . $row['email'] . "<br>";
    -
    -    // Clear all addresses and attachments for next loop
    -    $mail->clearAddresses();
    -    $mail->clearAttachments();
    -}
    -
    -

    - -

    2. Extending PHPMailer

    -

    - -Extending classes with inheritance is one of the most -powerful features of object-oriented programming. It allows you to make changes to the -original class for your own personal use without hacking the original -classes, and it's very easy to do: - -

    -Here's a class that extends the phpmailer class and sets the defaults -for the particular site:
    -PHP include file: my_phpmailer.php -

    - -

    -require 'PHPMailerAutoload.php';
    -
    -class my_phpmailer extends PHPMailer {
    -    // Set default variables for all new objects
    -    public $From     = 'from@example.com';
    -    public $FromName = 'Mailer';
    -    public $Host     = 'smtp1.example.com;smtp2.example.com';
    -    public $Mailer   = 'smtp';                         // Alternative to isSMTP()
    -    public $WordWrap = 75;
    -
    -    // Replace the default debug output function
    -    protected function edebug($msg) {
    -        print('My Site Error');
    -        print('Description:');
    -        printf('%s', $msg);
    -        exit;
    -    }
    -
    -    //Extend the send function
    -    public function send() {
    -        $this->Subject = '[Yay for me!] '.$this->Subject;
    -        return parent::send()
    -    }
    -
    -    // Create an additional function
    -    public function do_something($something) {
    -        // Place your new code here
    -    }
    -}
    -
    -
    -Now here's a normal PHP page in the site, which will have all the defaults set above:
    - -
    -require 'my_phpmailer.php';
    -
    -// Instantiate your new class
    -$mail = new my_phpmailer;
    -
    -// Now you only need to add the necessary stuff
    -$mail->addAddress('josh@example.com', 'Josh Adams');
    -$mail->Subject = 'Here is the subject';
    -$mail->Body    = 'This is the message body';
    -$mail->addAttachment('c:/temp/11-10-00.zip', 'new_name.zip');  // optional name
    -
    -if(!$mail->send())
    -{
    -   echo 'There was an error sending the message';
    -   exit;
    -}
    -
    -echo 'Message was sent successfully';
    -
    - - diff --git a/download/phpmailer529/docs/faq.html b/download/phpmailer529/docs/faq.html deleted file mode 100755 index 7033a142e..000000000 --- a/download/phpmailer529/docs/faq.html +++ /dev/null @@ -1,28 +0,0 @@ - - -PHPMailer FAQ - - -

    PHPMailer FAQ

    -
      -
    • Q: I am concerned that using include files will take up too much - processing time on my computer. How can I make it run faster?
      - A: PHP by itself is fairly fast, but it recompiles scripts every time they are run, which takes up valuable - computer resources. You can bypass this by using an opcode cache which compiles - PHP code and store it in memory to reduce overhead immensely. APC - (Alternative PHP Cache) is a free opcode cache extension in the PECL library.
    • -
    • Q: Which mailer gives me the best performance?
      - A: On a single machine the sendmail (or Qmail) is fastest overall. - Next fastest is mail() to give you the best performance. Both do not have the overhead of SMTP. - If you do not have a local mail server (as is typical on Windows), SMTP is your only option.
    • -
    • Q: When I try to attach a file with on my server I get a - "Could not find {file} on filesystem error". Why is this?
      - A: If you are using a Unix machine this is probably because the user - running your web server does not have read access to the directory in question. If you are using Windows, - then the problem is probably that you have used single backslashes to denote directories (\). - A single backslash has a special meaning to PHP so these are not - valid. Instead use double backslashes ("\\") or a single forward - slash ("/").
    • -
    - - diff --git a/download/phpmailer529/docs/generatedocs.sh b/download/phpmailer529/docs/generatedocs.sh deleted file mode 100755 index 9da1ddfe7..000000000 --- a/download/phpmailer529/docs/generatedocs.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -# Regenerate PHPMailer documentation -# Run from within the docs folder -rm -rf phpdoc/* -phpdoc --directory .. --target ./phpdoc --ignore test/,examples/,extras/,test_script/,vendor/,language/ --sourcecode --force --title PHPMailer --template="clean" -# You can merge regenerated docs into a separate docs working copy without messing up the git status like so: -# rsync -a --delete --exclude ".git" --exclude "phpdoc-cache-*/" --exclude "README.md" phpdoc/ ../../phpmailer-docs -# After updating docs, push/PR them to the phpmailer gh-pages branch: https://github.com/PHPMailer/PHPMailer/tree/gh-pages diff --git a/download/phpmailer529/docs/pop3_article.txt b/download/phpmailer529/docs/pop3_article.txt deleted file mode 100755 index fb90b9c76..000000000 --- a/download/phpmailer529/docs/pop3_article.txt +++ /dev/null @@ -1,50 +0,0 @@ -This is built for PHP Mailer 1.72 and was not tested with any previous version. It was developed under PHP 4.3.11 (E_ALL). It works under PHP 5 and 5.1 with E_ALL, but not in Strict mode due to var deprecation (but then neither does PHP Mailer either!). It follows the RFC 1939 standard explicitly and is fully commented. - -With that noted, here is how to implement it: - -I didn't want to modify the PHP Mailer classes at all, so you will have to include/require this class along with the base one. It can sit quite happily in the phpmailer directory. - -When you need it, create your POP3 object - -Right before I invoke PHP Mailer I activate the POP3 authorisation. POP3 before SMTP is a process whereby you login to your web hosts POP3 mail server BEFORE sending out any emails via SMTP. The POP3 logon 'verifies' your ability to send email by SMTP, which typically otherwise blocks you. On my web host (Pair Networks) a single POP3 logon is enough to 'verify' you for 90 minutes. Here is some sample PHP code that activates the POP3 logon and then sends an email via PHP Mailer: - -authorise('pop3.example.com', 110, 30, 'mailer', 'password', 1); -$mail = new PHPMailer(); $mail->SMTPDebug = 2; $mail->isSMTP(); -$mail->isHTML(false); $mail->Host = 'relay.example.com'; -$mail->From = 'mailer@example.com'; -$mail->FromName = 'Example Mailer'; -$mail->Subject = 'My subject'; -$mail->Body = 'Hello world'; -$mail->addAddress('rich@corephp.co.uk', 'Richard Davey'); -if (!$mail->send()) { - echo $mail->ErrorInfo; -} -?> - -The PHP Mailer parts of this code should be obvious to anyone who has used PHP Mailer before. One thing to note - you almost certainly will not need to use SMTP Authentication *and* POP3 before SMTP together. The Authorisation method is a proxy method to all of the others within that class. There are connect, Logon and disconnect methods available, but I wrapped them in the single Authorisation one to make things easier. -The Parameters - -The authorise parameters are as follows: - -$pop->authorise('pop3.example.com', 110, 30, 'mailer', 'password', 1); - - 1. pop3.example.com - The POP3 Mail Server Name (hostname or IP address) - 2. 110 - The POP3 Port on which to connect (default is usually 110, but check with your host) - 3. 30 - A connection time-out value (in seconds) - 4. mailer - The POP3 Username required to logon - 5. password - The POP3 Password required to logon - 6. 1 - The class debug level (0 = off, 1+ = debug output is echoed to the browser) - -Final Comments + the Download - -1) This class does not support APOP connections. This is only because I did not have an APOP server to test with, but if you'd like to see that added just contact me. - -2) Opening and closing lots of POP3 connections can be quite a resource/network drain. If you need to send a whole batch of emails then just perform the authentication once at the start, and then loop through your mail sending script. Providing this process doesn't take longer than the verification period lasts on your POP3 server, you should be fine. With my host that period is 90 minutes, i.e. plenty of time. - -3) If you have heavy requirements for this script (i.e. send a LOT of email on a frequent basis) then I would advise seeking out an alternative sending method (direct SMTP ideally). If this isn't possible then you could modify this class so the 'last authorised' date is recorded somewhere (MySQL, Flat file, etc) meaning you only open a new connection if the old one has expired, saving you precious overhead. - -4) There are lots of other POP3 classes for PHP available. However most of them implement the full POP3 command set, where-as this one is purely for authentication, and much lighter as a result. However using any of the other POP3 classes to just logon to your server would have the same net result. At the end of the day, use whatever method you feel most comfortable with. -Download - -My thanks to Chris Ryan for the inspiration (even if indirectly, via his SMTP class) diff --git a/download/phpmailer529/examples/code_generator.phps b/download/phpmailer529/examples/code_generator.phps deleted file mode 100755 index 341a7d674..000000000 --- a/download/phpmailer529/examples/code_generator.phps +++ /dev/null @@ -1,597 +0,0 @@ -CharSet = 'utf-8'; -$mail->Debugoutput = $CFG['smtp_debugoutput']; -$example_code .= "\n\n\$mail = new PHPMailer(true);"; -$example_code .= "\n\$mail->CharSet = 'utf-8';"; - -class phpmailerAppException extends phpmailerException -{ -} - -$example_code .= "\n\nclass phpmailerAppException extends phpmailerException {}"; -$example_code .= "\n\ntry {"; - -try { - if (isset($_POST["submit"]) && $_POST['submit'] == "Submit") { - $to = $_POST['To_Email']; - if (!PHPMailer::validateAddress($to)) { - throw new phpmailerAppException("Email address " . $to . " is invalid -- aborting!"); - } - - $example_code .= "\n\$to = '{$_POST['To_Email']}';"; - $example_code .= "\nif(!PHPMailer::validateAddress(\$to)) {"; - $example_code .= "\n throw new phpmailerAppException(\"Email address \" . " . - "\$to . \" is invalid -- aborting!\");"; - $example_code .= "\n}"; - - switch ($_POST['test_type']) { - case 'smtp': - $mail->isSMTP(); // telling the class to use SMTP - $mail->SMTPDebug = (integer)$_POST['smtp_debug']; - $mail->Host = $_POST['smtp_server']; // SMTP server - $mail->Port = (integer)$_POST['smtp_port']; // set the SMTP port - if ($_POST['smtp_secure']) { - $mail->SMTPSecure = strtolower($_POST['smtp_secure']); - } - $mail->SMTPAuth = array_key_exists('smtp_authenticate', $_POST); // enable SMTP authentication? - if (array_key_exists('smtp_authenticate', $_POST)) { - $mail->Username = $_POST['authenticate_username']; // SMTP account username - $mail->Password = $_POST['authenticate_password']; // SMTP account password - } - - $example_code .= "\n\$mail->isSMTP();"; - $example_code .= "\n\$mail->SMTPDebug = " . $_POST['smtp_debug'] . ";"; - $example_code .= "\n\$mail->Host = \"" . $_POST['smtp_server'] . "\";"; - $example_code .= "\n\$mail->Port = \"" . $_POST['smtp_port'] . "\";"; - $example_code .= "\n\$mail->SMTPSecure = \"" . strtolower($_POST['smtp_secure']) . "\";"; - $example_code .= "\n\$mail->SMTPAuth = " . (array_key_exists( - 'smtp_authenticate', - $_POST - ) ? 'true' : 'false') . ";"; - if (array_key_exists('smtp_authenticate', $_POST)) { - $example_code .= "\n\$mail->Username = \"" . $_POST['authenticate_username'] . "\";"; - $example_code .= "\n\$mail->Password = \"" . $_POST['authenticate_password'] . "\";"; - } - break; - case 'mail': - $mail->isMail(); // telling the class to use PHP's mail() - $example_code .= "\n\$mail->isMail();"; - break; - case 'sendmail': - $mail->isSendmail(); // telling the class to use Sendmail - $example_code .= "\n\$mail->isSendmail();"; - break; - case 'qmail': - $mail->isQmail(); // telling the class to use Qmail - $example_code .= "\n\$mail->isQmail();"; - break; - default: - throw new phpmailerAppException('Invalid test_type provided'); - } - - try { - if ($_POST['From_Name'] != '') { - $mail->addReplyTo($_POST['From_Email'], $_POST['From_Name']); - $mail->From = $_POST['From_Email']; - $mail->FromName = $_POST['From_Name']; - - $example_code .= "\n\$mail->addReplyTo(\"" . - $_POST['From_Email'] . "\", \"" . $_POST['From_Name'] . "\");"; - $example_code .= "\n\$mail->From = \"" . $_POST['From_Email'] . "\";"; - $example_code .= "\n\$mail->FromName = \"" . $_POST['From_Name'] . "\";"; - } else { - $mail->addReplyTo($_POST['From_Email']); - $mail->From = $_POST['From_Email']; - $mail->FromName = $_POST['From_Email']; - - $example_code .= "\n\$mail->addReplyTo(\"" . $_POST['From_Email'] . "\");"; - $example_code .= "\n\$mail->From = \"" . $_POST['From_Email'] . "\";"; - $example_code .= "\n\$mail->FromName = \"" . $_POST['From_Email'] . "\";"; - } - - if ($_POST['To_Name'] != '') { - $mail->addAddress($to, $_POST['To_Name']); - $example_code .= "\n\$mail->addAddress(\"$to\", \"" . $_POST['To_Name'] . "\");"; - } else { - $mail->addAddress($to); - $example_code .= "\n\$mail->addAddress(\"$to\");"; - } - - if ($_POST['bcc_Email'] != '') { - $indiBCC = explode(" ", $_POST['bcc_Email']); - foreach ($indiBCC as $key => $value) { - $mail->addBCC($value); - $example_code .= "\n\$mail->addBCC(\"$value\");"; - } - } - - if ($_POST['cc_Email'] != '') { - $indiCC = explode(" ", $_POST['cc_Email']); - foreach ($indiCC as $key => $value) { - $mail->addCC($value); - $example_code .= "\n\$mail->addCC(\"$value\");"; - } - } - } catch (phpmailerException $e) { //Catch all kinds of bad addressing - throw new phpmailerAppException($e->getMessage()); - } - $mail->Subject = $_POST['Subject'] . ' (PHPMailer test using ' . strtoupper($_POST['test_type']) . ')'; - $example_code .= "\n\$mail->Subject = \"" . $_POST['Subject'] . - '(PHPMailer test using ' . strtoupper($_POST['test_type']) . ')";'; - - if ($_POST['Message'] == '') { - $body = file_get_contents('contents.html'); - } else { - $body = $_POST['Message']; - } - - $example_code .= "\n\$body = <<<'EOT'\n" . htmlentities($body) . "\nEOT;"; - - $mail->WordWrap = 78; // set word wrap to the RFC2822 limit - $mail->msgHTML($body, dirname(__FILE__), true); //Create message bodies and embed images - - $example_code .= "\n\$mail->WordWrap = 78;"; - $example_code .= "\n\$mail->msgHTML(\$body, dirname(__FILE__), true); //Create message bodies and embed images"; - - $mail->addAttachment('images/phpmailer_mini.png', 'phpmailer_mini.png'); // optional name - $mail->addAttachment('images/phpmailer.png', 'phpmailer.png'); // optional name - $example_code .= "\n\$mail->addAttachment('images/phpmailer_mini.png'," . - "'phpmailer_mini.png'); // optional name"; - $example_code .= "\n\$mail->addAttachment('images/phpmailer.png', 'phpmailer.png'); // optional name"; - - $example_code .= "\n\ntry {"; - $example_code .= "\n \$mail->send();"; - $example_code .= "\n \$results_messages[] = \"Message has been sent using " . - strtoupper($_POST['test_type']) . "\";"; - $example_code .= "\n}"; - $example_code .= "\ncatch (phpmailerException \$e) {"; - $example_code .= "\n throw new phpmailerAppException('Unable to send to: ' . \$to. ': '.\$e->getMessage());"; - $example_code .= "\n}"; - - try { - $mail->send(); - $results_messages[] = "Message has been sent using " . strtoupper($_POST["test_type"]); - } catch (phpmailerException $e) { - throw new phpmailerAppException("Unable to send to: " . $to . ': ' . $e->getMessage()); - } - } -} catch (phpmailerAppException $e) { - $results_messages[] = $e->errorMessage(); -} -$example_code .= "\n}"; -$example_code .= "\ncatch (phpmailerAppException \$e) {"; -$example_code .= "\n \$results_messages[] = \$e->errorMessage();"; -$example_code .= "\n}"; -$example_code .= "\n\nif (count(\$results_messages) > 0) {"; -$example_code .= "\n echo \"

    Run results

    \\n\";"; -$example_code .= "\n echo \"
      \\n\";"; -$example_code .= "\nforeach (\$results_messages as \$result) {"; -$example_code .= "\n echo \"
    • \$result
    • \\n\";"; -$example_code .= "\n}"; -$example_code .= "\necho \"
    \\n\";"; -$example_code .= "\n}"; -?> - - - - PHPMailer Test Page - - - - - - - - -"; - echo exit("ERROR: Wrong PHP version. Must be PHP 5 or above."); -} - -if (count($results_messages) > 0) { - echo '

    Run results

    '; - echo '
      '; - foreach ($results_messages as $result) { - echo "
    • $result
    • "; - } - echo '
    '; -} - -if (isset($_POST["submit"]) && $_POST["submit"] == "Submit") { - echo "
    \n"; - echo "
    Script:\n"; - echo "
    \n";
    -    echo $example_code;
    -    echo "\n
    \n"; - echo "\n
    \n"; -} -?> -
    -
    -
    -
    - Mail Details - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - -
    - - - -
    - - - -
    - - - -
    - - - -
    - - - -
    - - - -
    - - - -
    -
    Test will include two attachments.
    -
    -
    -
    -
    - Mail Test Specs - - - - - -
    Test Type -
    - - - required> -
    -
    - - - required> -
    -
    - - - required> -
    -
    - - - required> -
    -
    -
    "> - SMTP Specific Options: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - -
    - -
    - -
    - -
    - - value=""> -
    - -
    - -
    -
    -
    -
    -
    - -
    -
    - -
    - -
    -
    -
    - - \ No newline at end of file diff --git a/download/phpmailer529/examples/contents.html b/download/phpmailer529/examples/contents.html deleted file mode 100755 index 9257f6dd9..000000000 --- a/download/phpmailer529/examples/contents.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - PHPMailer Test - - -
    -

    This is a test of PHPMailer.

    -
    - PHPMailer rocks -
    -

    This example uses HTML.

    -

    The PHPMailer image at the top has been embedded automatically.

    -
    - - diff --git a/download/phpmailer529/examples/exceptions.phps b/download/phpmailer529/examples/exceptions.phps deleted file mode 100755 index 0e941e733..000000000 --- a/download/phpmailer529/examples/exceptions.phps +++ /dev/null @@ -1,35 +0,0 @@ -setFrom('from@example.com', 'First Last'); - //Set an alternative reply-to address - $mail->addReplyTo('replyto@example.com', 'First Last'); - //Set who the message is to be sent to - $mail->addAddress('whoto@example.com', 'John Doe'); - //Set the subject line - $mail->Subject = 'PHPMailer Exceptions test'; - //Read an HTML message body from an external file, convert referenced images to embedded, - //and convert the HTML into a basic plain-text alternative body - $mail->msgHTML(file_get_contents('contents.html'), dirname(__FILE__)); - //Replace the plain text body with one created manually - $mail->AltBody = 'This is a plain-text message body'; - //Attach an image file - $mail->addAttachment('images/phpmailer_mini.png'); - //send the message - //Note that we don't need check the response from this because it will throw an exception if it has trouble - $mail->send(); - echo "Message sent!"; -} catch (phpmailerException $e) { - echo $e->errorMessage(); //Pretty error messages from PHPMailer -} catch (Exception $e) { - echo $e->getMessage(); //Boring error messages from anything else! -} diff --git a/download/phpmailer529/examples/gmail.phps b/download/phpmailer529/examples/gmail.phps deleted file mode 100755 index b020f3380..000000000 --- a/download/phpmailer529/examples/gmail.phps +++ /dev/null @@ -1,72 +0,0 @@ -isSMTP(); - -//Enable SMTP debugging -// 0 = off (for production use) -// 1 = client messages -// 2 = client and server messages -$mail->SMTPDebug = 2; - -//Ask for HTML-friendly debug output -$mail->Debugoutput = 'html'; - -//Set the hostname of the mail server -$mail->Host = 'smtp.gmail.com'; - -//Set the SMTP port number - 587 for authenticated TLS, a.k.a. RFC4409 SMTP submission -$mail->Port = 587; - -//Set the encryption system to use - ssl (deprecated) or tls -$mail->SMTPSecure = 'tls'; - -//Whether to use SMTP authentication -$mail->SMTPAuth = true; - -//Username to use for SMTP authentication - use full email address for gmail -$mail->Username = "username@gmail.com"; - -//Password to use for SMTP authentication -$mail->Password = "yourpassword"; - -//Set who the message is to be sent from -$mail->setFrom('from@example.com', 'First Last'); - -//Set an alternative reply-to address -$mail->addReplyTo('replyto@example.com', 'First Last'); - -//Set who the message is to be sent to -$mail->addAddress('whoto@example.com', 'John Doe'); - -//Set the subject line -$mail->Subject = 'PHPMailer GMail SMTP test'; - -//Read an HTML message body from an external file, convert referenced images to embedded, -//convert HTML into a basic plain-text alternative body -$mail->msgHTML(file_get_contents('contents.html'), dirname(__FILE__)); - -//Replace the plain text body with one created manually -$mail->AltBody = 'This is a plain-text message body'; - -//Attach an image file -$mail->addAttachment('images/phpmailer_mini.png'); - -//send the message, check for errors -if (!$mail->send()) { - echo "Mailer Error: " . $mail->ErrorInfo; -} else { - echo "Message sent!"; -} diff --git a/download/phpmailer529/examples/images/phpmailer.png b/download/phpmailer529/examples/images/phpmailer.png deleted file mode 100755 index 9bdd83c8d..000000000 Binary files a/download/phpmailer529/examples/images/phpmailer.png and /dev/null differ diff --git a/download/phpmailer529/examples/images/phpmailer_mini.png b/download/phpmailer529/examples/images/phpmailer_mini.png deleted file mode 100755 index e6915f431..000000000 Binary files a/download/phpmailer529/examples/images/phpmailer_mini.png and /dev/null differ diff --git a/download/phpmailer529/examples/index.html b/download/phpmailer529/examples/index.html deleted file mode 100755 index bbb830d19..000000000 --- a/download/phpmailer529/examples/index.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - PHPMailer Examples - - -

    PHPMailer code examplesPHPMailer logo

    -

    This folder contains a collection of examples of using PHPMailer.

    -

    About testing email sending

    -

    When working on email sending code you'll find yourself worrying about what might happen if all these test emails got sent to your mailing list. The solution is to use a fake mail server, one that acts just like the real thing, but just doesn't actually send anything out. Some offer web interfaces, feedback, logging, the ability to return specific error codes, all things that are useful for testing error handling, authentication etc. Here's a selection of mail testing tools you might like to try:

    -
      -
    • FakeSMTP, a Java desktop app with the ability to show an SMTP log and save messages to a folder.
    • -
    • FakeEmail, a Python-based fake mail server with a web interface.
    • -
    • smtp-sink, part of the Postfix mail server, so you probably already have this installed. This is used in the Travis-CI configuration to run PHPMailer's unit tests.
    • -
    • smtp4dev, a dummy SMTP server for Windows.
    • -
    • fakesendmail.sh, part of PHPMailer's test setup, this is a shell script that emulates sendmail for testing 'mail' or 'sendmail' methods in PHPMailer.
    • -
    • msglint, not a mail server, the IETF's MIME structure analyser checks the formatting of your messages.
    • -
    -
    -

    Security note

    -

    Before running these examples you'll need to rename them with '.php' extensions. They are supplied as '.phps' files which will usually be displayed with syntax highlighting by PHP instead of running them. This prevents potential security issues with running potential spam-gateway code if you happen to deploy these code examples on a live site - please don't do that! Similarly, don't leave your passwords in these files as they will be visible to the world!

    -
    -

    code_generator.phps

    -

    This script is a simple code generator - fill in the form and hit submit, and it will use when you entered to email you a message, and will also generate PHP code using your settings that you can copy and paste to use in your own apps. If you need to get going quickly, this is probably the best place to start.

    -

    mail.phps

    -

    This script is a basic example which creates an email message from an external HTML file, creates a plain text body, sets various addresses, adds an attachment and sends the message. It uses PHP's built-in mail() function which is the simplest to use, but relies on the presence of a local mail server, something which is not usually available on Windows. If you find yourself in that situation, either install a local mail server, or use a remote one and send using SMTP instead.

    -

    exceptions.phps

    -

    The same as the mail example, but shows how to use PHPMailer's optional exceptions for error handling.

    -

    smtp.phps

    -

    A simple example sending using SMTP with authentication.

    -

    smtp_no_auth.phps

    -

    A simple example sending using SMTP without authentication.

    -

    sendmail.phps

    -

    A simple example using sendmail. Sendmail is a program (usually found on Linux/BSD, OS X and other UNIX-alikes) that can be used to submit messages to a local mail server without a lengthy SMTP conversation. It's probably the fastest sending mechanism, but lacks some error reporting features. There are sendmail emulators for most popular mail servers including postfix, qmail, exim etc.

    -

    gmail.phps

    -

    Submitting email via Google's Gmail service is a popular use of PHPMailer. It's much the same as normal SMTP sending, just with some specific settings, namely using TLS encryption, authentication is enabled, and it connects to the SMTP submission port 587 on the smtp.gmail.com host. This example does all that.

    -

    pop_before_smtp.phps

    -

    Before effective SMTP authentication mechanisms were available, it was common for ISPs to use POP-before-SMTP authentication. As it implies, you authenticate using the POP3 protocol (an older protocol now mostly replaced by the far superior IMAP), and then the SMTP server will allow send access from your IP address for a short while, usually 5-15 minutes. PHPMailer includes a POP3 protocol client, so it can carry out this sequence - it's just like a normal SMTP conversation (without authentication), but connects via POP first.

    -

    mailing_list.phps

    -

    This is a somewhat naïve example of sending similar emails to a list of different addresses. It sets up a PHPMailer instance using SMTP, then connects to a MySQL database to retrieve a list of recipients. The code loops over this list, sending email to each person using their info and marks them as sent in the database. It makes use of SMTP keepalive which saves reconnecting and re-authenticating between each message.

    -
    -

    smtp_check.phps

    -

    This is an example showing how to use the SMTP class by itself (without PHPMailer) to check an SMTP connection.

    -
    -

    Most of these examples use the 'example.com' domain. This domain is reserved by IANA for illustrative purposes, as documented in RFC 2606. Don't use made-up domains like 'mydomain.com' or 'somedomain.com' in examples as someone, somewhere, probably owns them!

    - - diff --git a/download/phpmailer529/examples/mail.phps b/download/phpmailer529/examples/mail.phps deleted file mode 100755 index 8e129f47d..000000000 --- a/download/phpmailer529/examples/mail.phps +++ /dev/null @@ -1,31 +0,0 @@ -setFrom('from@example.com', 'First Last'); -//Set an alternative reply-to address -$mail->addReplyTo('replyto@example.com', 'First Last'); -//Set who the message is to be sent to -$mail->addAddress('whoto@example.com', 'John Doe'); -//Set the subject line -$mail->Subject = 'PHPMailer mail() test'; -//Read an HTML message body from an external file, convert referenced images to embedded, -//convert HTML into a basic plain-text alternative body -$mail->msgHTML(file_get_contents('contents.html'), dirname(__FILE__)); -//Replace the plain text body with one created manually -$mail->AltBody = 'This is a plain-text message body'; -//Attach an image file -$mail->addAttachment('images/phpmailer_mini.png'); - -//send the message, check for errors -if (!$mail->send()) { - echo "Mailer Error: " . $mail->ErrorInfo; -} else { - echo "Message sent!"; -} diff --git a/download/phpmailer529/examples/mailing_list.phps b/download/phpmailer529/examples/mailing_list.phps deleted file mode 100755 index 8644bb596..000000000 --- a/download/phpmailer529/examples/mailing_list.phps +++ /dev/null @@ -1,59 +0,0 @@ -isSMTP(); -$mail->Host = 'smtp.example.com'; -$mail->SMTPAuth = true; -$mail->SMTPKeepAlive = true; // SMTP connection will not close after each email sent, reduces SMTP overhead -$mail->Port = 25; -$mail->Username = 'yourname@example.com'; -$mail->Password = 'yourpassword'; -$mail->setFrom('list@example.com', 'List manager'); -$mail->addReplyTo('list@example.com', 'List manager'); - -$mail->Subject = "PHPMailer Simple database mailing list test"; - -//Same body for all messages, so set this before the sending loop -//If you generate a different body for each recipient (e.g. you're using a templating system), -//set it inside the loop -$mail->msgHTML($body); -//msgHTML also sets AltBody, but if you want a custom one, set it afterwards -$mail->AltBody = 'To view the message, please use an HTML compatible email viewer!'; - -//Connect to the database and select the recipients from your mailing list that have not yet been sent to -//You'll need to alter this to match your database -$mysql = mysqli_connect('localhost', 'username', 'password'); -mysqli_select_db($mysql, 'mydb'); -$result = mysqli_query($mysql, 'SELECT full_name, email, photo FROM mailinglist WHERE sent = false'); - -foreach ($result as $row) { //This iterator syntax only works in PHP 5.4+ - $mail->addAddress($row['email'], $row['full_name']); - if (!empty($row['photo'])) { - $mail->addStringAttachment($row['photo'], 'YourPhoto.jpg'); //Assumes the image data is stored in the DB - } - - if (!$mail->send()) { - echo "Mailer Error (" . str_replace("@", "@", $row["email"]) . ') ' . $mail->ErrorInfo . '
    '; - break; //Abandon sending - } else { - echo "Message sent to :" . $row['full_name'] . ' (' . str_replace("@", "@", $row['email']) . ')
    '; - //Mark it as sent in the DB - mysqli_query( - $mysql, - "UPDATE mailinglist SET sent = true WHERE email = '" . - mysqli_real_escape_string($mysql, $row['email']) . "'" - ); - } - // Clear all addresses and attachments for next loop - $mail->clearAddresses(); - $mail->clearAttachments(); -} diff --git a/download/phpmailer529/examples/pop_before_smtp.phps b/download/phpmailer529/examples/pop_before_smtp.phps deleted file mode 100755 index 164dfe8dd..000000000 --- a/download/phpmailer529/examples/pop_before_smtp.phps +++ /dev/null @@ -1,54 +0,0 @@ -isSMTP(); - //Enable SMTP debugging - // 0 = off (for production use) - // 1 = client messages - // 2 = client and server messages - $mail->SMTPDebug = 2; - //Ask for HTML-friendly debug output - $mail->Debugoutput = 'html'; - //Set the hostname of the mail server - $mail->Host = "mail.example.com"; - //Set the SMTP port number - likely to be 25, 465 or 587 - $mail->Port = 25; - //Whether to use SMTP authentication - $mail->SMTPAuth = false; - //Set who the message is to be sent from - $mail->setFrom('from@example.com', 'First Last'); - //Set an alternative reply-to address - $mail->addReplyTo('replyto@example.com', 'First Last'); - //Set who the message is to be sent to - $mail->addAddress('whoto@example.com', 'John Doe'); - //Set the subject line - $mail->Subject = 'PHPMailer POP-before-SMTP test'; - //Read an HTML message body from an external file, convert referenced images to embedded, - //and convert the HTML into a basic plain-text alternative body - $mail->msgHTML(file_get_contents('contents.html'), dirname(__FILE__)); - //Replace the plain text body with one created manually - $mail->AltBody = 'This is a plain-text message body'; - //Attach an image file - $mail->addAttachment('images/phpmailer_mini.png'); - //send the message - //Note that we don't need check the response from this because it will throw an exception if it has trouble - $mail->send(); - echo "Message sent!"; -} catch (phpmailerException $e) { - echo $e->errorMessage(); //Pretty error messages from PHPMailer -} catch (Exception $e) { - echo $e->getMessage(); //Boring error messages from anything else! -} diff --git a/download/phpmailer529/examples/scripts/XRegExp.js b/download/phpmailer529/examples/scripts/XRegExp.js deleted file mode 100755 index ebdb9c948..000000000 --- a/download/phpmailer529/examples/scripts/XRegExp.js +++ /dev/null @@ -1,664 +0,0 @@ -// XRegExp 1.5.1 -// (c) 2007-2012 Steven Levithan -// MIT License -// -// Provides an augmented, extensible, cross-browser implementation of regular expressions, -// including support for additional syntax, flags, and methods - -var XRegExp; - -if (XRegExp) { - // Avoid running twice, since that would break references to native globals - throw Error("can't load XRegExp twice in the same frame"); -} - -// Run within an anonymous function to protect variables and avoid new globals -(function (undefined) { - - //--------------------------------- - // Constructor - //--------------------------------- - - // Accepts a pattern and flags; returns a new, extended `RegExp` object. Differs from a native - // regular expression in that additional syntax and flags are supported and cross-browser - // syntax inconsistencies are ameliorated. `XRegExp(/regex/)` clones an existing regex and - // converts to type XRegExp - XRegExp = function (pattern, flags) { - var output = [], - currScope = XRegExp.OUTSIDE_CLASS, - pos = 0, - context, tokenResult, match, chr, regex; - - if (XRegExp.isRegExp(pattern)) { - if (flags !== undefined) - throw TypeError("can't supply flags when constructing one RegExp from another"); - return clone(pattern); - } - // Tokens become part of the regex construction process, so protect against infinite - // recursion when an XRegExp is constructed within a token handler or trigger - if (isInsideConstructor) - throw Error("can't call the XRegExp constructor within token definition functions"); - - flags = flags || ""; - context = { // `this` object for custom tokens - hasNamedCapture: false, - captureNames: [], - hasFlag: function (flag) {return flags.indexOf(flag) > -1;}, - setFlag: function (flag) {flags += flag;} - }; - - while (pos < pattern.length) { - // Check for custom tokens at the current position - tokenResult = runTokens(pattern, pos, currScope, context); - - if (tokenResult) { - output.push(tokenResult.output); - pos += (tokenResult.match[0].length || 1); - } else { - // Check for native multicharacter metasequences (excluding character classes) at - // the current position - if (match = nativ.exec.call(nativeTokens[currScope], pattern.slice(pos))) { - output.push(match[0]); - pos += match[0].length; - } else { - chr = pattern.charAt(pos); - if (chr === "[") - currScope = XRegExp.INSIDE_CLASS; - else if (chr === "]") - currScope = XRegExp.OUTSIDE_CLASS; - // Advance position one character - output.push(chr); - pos++; - } - } - } - - regex = RegExp(output.join(""), nativ.replace.call(flags, flagClip, "")); - regex._xregexp = { - source: pattern, - captureNames: context.hasNamedCapture ? context.captureNames : null - }; - return regex; - }; - - - //--------------------------------- - // Public properties - //--------------------------------- - - XRegExp.version = "1.5.1"; - - // Token scope bitflags - XRegExp.INSIDE_CLASS = 1; - XRegExp.OUTSIDE_CLASS = 2; - - - //--------------------------------- - // Private variables - //--------------------------------- - - var replacementToken = /\$(?:(\d\d?|[$&`'])|{([$\w]+)})/g, - flagClip = /[^gimy]+|([\s\S])(?=[\s\S]*\1)/g, // Nonnative and duplicate flags - quantifier = /^(?:[?*+]|{\d+(?:,\d*)?})\??/, - isInsideConstructor = false, - tokens = [], - // Copy native globals for reference ("native" is an ES3 reserved keyword) - nativ = { - exec: RegExp.prototype.exec, - test: RegExp.prototype.test, - match: String.prototype.match, - replace: String.prototype.replace, - split: String.prototype.split - }, - compliantExecNpcg = nativ.exec.call(/()??/, "")[1] === undefined, // check `exec` handling of nonparticipating capturing groups - compliantLastIndexIncrement = function () { - var x = /^/g; - nativ.test.call(x, ""); - return !x.lastIndex; - }(), - hasNativeY = RegExp.prototype.sticky !== undefined, - nativeTokens = {}; - - // `nativeTokens` match native multicharacter metasequences only (including deprecated octals, - // excluding character classes) - nativeTokens[XRegExp.INSIDE_CLASS] = /^(?:\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|c[A-Za-z]|[\s\S]))/; - nativeTokens[XRegExp.OUTSIDE_CLASS] = /^(?:\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|c[A-Za-z]|[\s\S])|\(\?[:=!]|[?*+]\?|{\d+(?:,\d*)?}\??)/; - - - //--------------------------------- - // Public methods - //--------------------------------- - - // Lets you extend or change XRegExp syntax and create custom flags. This is used internally by - // the XRegExp library and can be used to create XRegExp plugins. This function is intended for - // users with advanced knowledge of JavaScript's regular expression syntax and behavior. It can - // be disabled by `XRegExp.freezeTokens` - XRegExp.addToken = function (regex, handler, scope, trigger) { - tokens.push({ - pattern: clone(regex, "g" + (hasNativeY ? "y" : "")), - handler: handler, - scope: scope || XRegExp.OUTSIDE_CLASS, - trigger: trigger || null - }); - }; - - // Accepts a pattern and flags; returns an extended `RegExp` object. If the pattern and flag - // combination has previously been cached, the cached copy is returned; otherwise the newly - // created regex is cached - XRegExp.cache = function (pattern, flags) { - var key = pattern + "/" + (flags || ""); - return XRegExp.cache[key] || (XRegExp.cache[key] = XRegExp(pattern, flags)); - }; - - // Accepts a `RegExp` instance; returns a copy with the `/g` flag set. The copy has a fresh - // `lastIndex` (set to zero). If you want to copy a regex without forcing the `global` - // property, use `XRegExp(regex)`. Do not use `RegExp(regex)` because it will not preserve - // special properties required for named capture - XRegExp.copyAsGlobal = function (regex) { - return clone(regex, "g"); - }; - - // Accepts a string; returns the string with regex metacharacters escaped. The returned string - // can safely be used at any point within a regex to match the provided literal string. Escaped - // characters are [ ] { } ( ) * + ? - . , \ ^ $ | # and whitespace - XRegExp.escape = function (str) { - return str.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); - }; - - // Accepts a string to search, regex to search with, position to start the search within the - // string (default: 0), and an optional Boolean indicating whether matches must start at-or- - // after the position or at the specified position only. This function ignores the `lastIndex` - // of the provided regex in its own handling, but updates the property for compatibility - XRegExp.execAt = function (str, regex, pos, anchored) { - var r2 = clone(regex, "g" + ((anchored && hasNativeY) ? "y" : "")), - match; - r2.lastIndex = pos = pos || 0; - match = r2.exec(str); // Run the altered `exec` (required for `lastIndex` fix, etc.) - if (anchored && match && match.index !== pos) - match = null; - if (regex.global) - regex.lastIndex = match ? r2.lastIndex : 0; - return match; - }; - - // Breaks the unrestorable link to XRegExp's private list of tokens, thereby preventing - // syntax and flag changes. Should be run after XRegExp and any plugins are loaded - XRegExp.freezeTokens = function () { - XRegExp.addToken = function () { - throw Error("can't run addToken after freezeTokens"); - }; - }; - - // Accepts any value; returns a Boolean indicating whether the argument is a `RegExp` object. - // Note that this is also `true` for regex literals and regexes created by the `XRegExp` - // constructor. This works correctly for variables created in another frame, when `instanceof` - // and `constructor` checks would fail to work as intended - XRegExp.isRegExp = function (o) { - return Object.prototype.toString.call(o) === "[object RegExp]"; - }; - - // Executes `callback` once per match within `str`. Provides a simpler and cleaner way to - // iterate over regex matches compared to the traditional approaches of subverting - // `String.prototype.replace` or repeatedly calling `exec` within a `while` loop - XRegExp.iterate = function (str, regex, callback, context) { - var r2 = clone(regex, "g"), - i = -1, match; - while (match = r2.exec(str)) { // Run the altered `exec` (required for `lastIndex` fix, etc.) - if (regex.global) - regex.lastIndex = r2.lastIndex; // Doing this to follow expectations if `lastIndex` is checked within `callback` - callback.call(context, match, ++i, str, regex); - if (r2.lastIndex === match.index) - r2.lastIndex++; - } - if (regex.global) - regex.lastIndex = 0; - }; - - // Accepts a string and an array of regexes; returns the result of using each successive regex - // to search within the matches of the previous regex. The array of regexes can also contain - // objects with `regex` and `backref` properties, in which case the named or numbered back- - // references specified are passed forward to the next regex or returned. E.g.: - // var xregexpImgFileNames = XRegExp.matchChain(html, [ - // {regex: /]+)>/i, backref: 1}, // tag attributes - // {regex: XRegExp('(?ix) \\s src=" (? [^"]+ )'), backref: "src"}, // src attribute values - // {regex: XRegExp("^http://xregexp\\.com(/[^#?]+)", "i"), backref: 1}, // xregexp.com paths - // /[^\/]+$/ // filenames (strip directory paths) - // ]); - XRegExp.matchChain = function (str, chain) { - return function recurseChain (values, level) { - var item = chain[level].regex ? chain[level] : {regex: chain[level]}, - regex = clone(item.regex, "g"), - matches = [], i; - for (i = 0; i < values.length; i++) { - XRegExp.iterate(values[i], regex, function (match) { - matches.push(item.backref ? (match[item.backref] || "") : match[0]); - }); - } - return ((level === chain.length - 1) || !matches.length) ? - matches : recurseChain(matches, level + 1); - }([str], 0); - }; - - - //--------------------------------- - // New RegExp prototype methods - //--------------------------------- - - // Accepts a context object and arguments array; returns the result of calling `exec` with the - // first value in the arguments array. the context is ignored but is accepted for congruity - // with `Function.prototype.apply` - RegExp.prototype.apply = function (context, args) { - return this.exec(args[0]); - }; - - // Accepts a context object and string; returns the result of calling `exec` with the provided - // string. the context is ignored but is accepted for congruity with `Function.prototype.call` - RegExp.prototype.call = function (context, str) { - return this.exec(str); - }; - - - //--------------------------------- - // Overriden native methods - //--------------------------------- - - // Adds named capture support (with backreferences returned as `result.name`), and fixes two - // cross-browser issues per ES3: - // - Captured values for nonparticipating capturing groups should be returned as `undefined`, - // rather than the empty string. - // - `lastIndex` should not be incremented after zero-length matches. - RegExp.prototype.exec = function (str) { - var match, name, r2, origLastIndex; - if (!this.global) - origLastIndex = this.lastIndex; - match = nativ.exec.apply(this, arguments); - if (match) { - // Fix browsers whose `exec` methods don't consistently return `undefined` for - // nonparticipating capturing groups - if (!compliantExecNpcg && match.length > 1 && indexOf(match, "") > -1) { - r2 = RegExp(this.source, nativ.replace.call(getNativeFlags(this), "g", "")); - // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed - // matching due to characters outside the match - nativ.replace.call((str + "").slice(match.index), r2, function () { - for (var i = 1; i < arguments.length - 2; i++) { - if (arguments[i] === undefined) - match[i] = undefined; - } - }); - } - // Attach named capture properties - if (this._xregexp && this._xregexp.captureNames) { - for (var i = 1; i < match.length; i++) { - name = this._xregexp.captureNames[i - 1]; - if (name) - match[name] = match[i]; - } - } - // Fix browsers that increment `lastIndex` after zero-length matches - if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index)) - this.lastIndex--; - } - if (!this.global) - this.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows) - return match; - }; - - // Fix browser bugs in native method - RegExp.prototype.test = function (str) { - // Use the native `exec` to skip some processing overhead, even though the altered - // `exec` would take care of the `lastIndex` fixes - var match, origLastIndex; - if (!this.global) - origLastIndex = this.lastIndex; - match = nativ.exec.call(this, str); - // Fix browsers that increment `lastIndex` after zero-length matches - if (match && !compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index)) - this.lastIndex--; - if (!this.global) - this.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows) - return !!match; - }; - - // Adds named capture support and fixes browser bugs in native method - String.prototype.match = function (regex) { - if (!XRegExp.isRegExp(regex)) - regex = RegExp(regex); // Native `RegExp` - if (regex.global) { - var result = nativ.match.apply(this, arguments); - regex.lastIndex = 0; // Fix IE bug - return result; - } - return regex.exec(this); // Run the altered `exec` - }; - - // Adds support for `${n}` tokens for named and numbered backreferences in replacement text, - // and provides named backreferences to replacement functions as `arguments[0].name`. Also - // fixes cross-browser differences in replacement text syntax when performing a replacement - // using a nonregex search value, and the value of replacement regexes' `lastIndex` property - // during replacement iterations. Note that this doesn't support SpiderMonkey's proprietary - // third (`flags`) parameter - String.prototype.replace = function (search, replacement) { - var isRegex = XRegExp.isRegExp(search), - captureNames, result, str, origLastIndex; - - // There are too many combinations of search/replacement types/values and browser bugs that - // preclude passing to native `replace`, so don't try - //if (...) - // return nativ.replace.apply(this, arguments); - - if (isRegex) { - if (search._xregexp) - captureNames = search._xregexp.captureNames; // Array or `null` - if (!search.global) - origLastIndex = search.lastIndex; - } else { - search = search + ""; // Type conversion - } - - if (Object.prototype.toString.call(replacement) === "[object Function]") { - result = nativ.replace.call(this + "", search, function () { - if (captureNames) { - // Change the `arguments[0]` string primitive to a String object which can store properties - arguments[0] = new String(arguments[0]); - // Store named backreferences on `arguments[0]` - for (var i = 0; i < captureNames.length; i++) { - if (captureNames[i]) - arguments[0][captureNames[i]] = arguments[i + 1]; - } - } - // Update `lastIndex` before calling `replacement` (fix browsers) - if (isRegex && search.global) - search.lastIndex = arguments[arguments.length - 2] + arguments[0].length; - return replacement.apply(null, arguments); - }); - } else { - str = this + ""; // Type conversion, so `args[args.length - 1]` will be a string (given nonstring `this`) - result = nativ.replace.call(str, search, function () { - var args = arguments; // Keep this function's `arguments` available through closure - return nativ.replace.call(replacement + "", replacementToken, function ($0, $1, $2) { - // Numbered backreference (without delimiters) or special variable - if ($1) { - switch ($1) { - case "$": return "$"; - case "&": return args[0]; - case "`": return args[args.length - 1].slice(0, args[args.length - 2]); - case "'": return args[args.length - 1].slice(args[args.length - 2] + args[0].length); - // Numbered backreference - default: - // What does "$10" mean? - // - Backreference 10, if 10 or more capturing groups exist - // - Backreference 1 followed by "0", if 1-9 capturing groups exist - // - Otherwise, it's the string "$10" - // Also note: - // - Backreferences cannot be more than two digits (enforced by `replacementToken`) - // - "$01" is equivalent to "$1" if a capturing group exists, otherwise it's the string "$01" - // - There is no "$0" token ("$&" is the entire match) - var literalNumbers = ""; - $1 = +$1; // Type conversion; drop leading zero - if (!$1) // `$1` was "0" or "00" - return $0; - while ($1 > args.length - 3) { - literalNumbers = String.prototype.slice.call($1, -1) + literalNumbers; - $1 = Math.floor($1 / 10); // Drop the last digit - } - return ($1 ? args[$1] || "" : "$") + literalNumbers; - } - // Named backreference or delimited numbered backreference - } else { - // What does "${n}" mean? - // - Backreference to numbered capture n. Two differences from "$n": - // - n can be more than two digits - // - Backreference 0 is allowed, and is the entire match - // - Backreference to named capture n, if it exists and is not a number overridden by numbered capture - // - Otherwise, it's the string "${n}" - var n = +$2; // Type conversion; drop leading zeros - if (n <= args.length - 3) - return args[n]; - n = captureNames ? indexOf(captureNames, $2) : -1; - return n > -1 ? args[n + 1] : $0; - } - }); - }); - } - - if (isRegex) { - if (search.global) - search.lastIndex = 0; // Fix IE, Safari bug (last tested IE 9.0.5, Safari 5.1.2 on Windows) - else - search.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows) - } - - return result; - }; - - // A consistent cross-browser, ES3 compliant `split` - String.prototype.split = function (s /* separator */, limit) { - // If separator `s` is not a regex, use the native `split` - if (!XRegExp.isRegExp(s)) - return nativ.split.apply(this, arguments); - - var str = this + "", // Type conversion - output = [], - lastLastIndex = 0, - match, lastLength; - - // Behavior for `limit`: if it's... - // - `undefined`: No limit - // - `NaN` or zero: Return an empty array - // - A positive number: Use `Math.floor(limit)` - // - A negative number: No limit - // - Other: Type-convert, then use the above rules - if (limit === undefined || +limit < 0) { - limit = Infinity; - } else { - limit = Math.floor(+limit); - if (!limit) - return []; - } - - // This is required if not `s.global`, and it avoids needing to set `s.lastIndex` to zero - // and restore it to its original value when we're done using the regex - s = XRegExp.copyAsGlobal(s); - - while (match = s.exec(str)) { // Run the altered `exec` (required for `lastIndex` fix, etc.) - if (s.lastIndex > lastLastIndex) { - output.push(str.slice(lastLastIndex, match.index)); - - if (match.length > 1 && match.index < str.length) - Array.prototype.push.apply(output, match.slice(1)); - - lastLength = match[0].length; - lastLastIndex = s.lastIndex; - - if (output.length >= limit) - break; - } - - if (s.lastIndex === match.index) - s.lastIndex++; - } - - if (lastLastIndex === str.length) { - if (!nativ.test.call(s, "") || lastLength) - output.push(""); - } else { - output.push(str.slice(lastLastIndex)); - } - - return output.length > limit ? output.slice(0, limit) : output; - }; - - - //--------------------------------- - // Private helper functions - //--------------------------------- - - // Supporting function for `XRegExp`, `XRegExp.copyAsGlobal`, etc. Returns a copy of a `RegExp` - // instance with a fresh `lastIndex` (set to zero), preserving properties required for named - // capture. Also allows adding new flags in the process of copying the regex - function clone (regex, additionalFlags) { - if (!XRegExp.isRegExp(regex)) - throw TypeError("type RegExp expected"); - var x = regex._xregexp; - regex = XRegExp(regex.source, getNativeFlags(regex) + (additionalFlags || "")); - if (x) { - regex._xregexp = { - source: x.source, - captureNames: x.captureNames ? x.captureNames.slice(0) : null - }; - } - return regex; - } - - function getNativeFlags (regex) { - return (regex.global ? "g" : "") + - (regex.ignoreCase ? "i" : "") + - (regex.multiline ? "m" : "") + - (regex.extended ? "x" : "") + // Proposed for ES4; included in AS3 - (regex.sticky ? "y" : ""); - } - - function runTokens (pattern, index, scope, context) { - var i = tokens.length, - result, match, t; - // Protect against constructing XRegExps within token handler and trigger functions - isInsideConstructor = true; - // Must reset `isInsideConstructor`, even if a `trigger` or `handler` throws - try { - while (i--) { // Run in reverse order - t = tokens[i]; - if ((scope & t.scope) && (!t.trigger || t.trigger.call(context))) { - t.pattern.lastIndex = index; - match = t.pattern.exec(pattern); // Running the altered `exec` here allows use of named backreferences, etc. - if (match && match.index === index) { - result = { - output: t.handler.call(context, match, scope), - match: match - }; - break; - } - } - } - } catch (err) { - throw err; - } finally { - isInsideConstructor = false; - } - return result; - } - - function indexOf (array, item, from) { - if (Array.prototype.indexOf) // Use the native array method if available - return array.indexOf(item, from); - for (var i = from || 0; i < array.length; i++) { - if (array[i] === item) - return i; - } - return -1; - } - - - //--------------------------------- - // Built-in tokens - //--------------------------------- - - // Augment XRegExp's regular expression syntax and flags. Note that when adding tokens, the - // third (`scope`) argument defaults to `XRegExp.OUTSIDE_CLASS` - - // Comment pattern: (?# ) - XRegExp.addToken( - /\(\?#[^)]*\)/, - function (match) { - // Keep tokens separated unless the following token is a quantifier - return nativ.test.call(quantifier, match.input.slice(match.index + match[0].length)) ? "" : "(?:)"; - } - ); - - // Capturing group (match the opening parenthesis only). - // Required for support of named capturing groups - XRegExp.addToken( - /\((?!\?)/, - function () { - this.captureNames.push(null); - return "("; - } - ); - - // Named capturing group (match the opening delimiter only): (? - XRegExp.addToken( - /\(\?<([$\w]+)>/, - function (match) { - this.captureNames.push(match[1]); - this.hasNamedCapture = true; - return "("; - } - ); - - // Named backreference: \k - XRegExp.addToken( - /\\k<([\w$]+)>/, - function (match) { - var index = indexOf(this.captureNames, match[1]); - // Keep backreferences separate from subsequent literal numbers. Preserve back- - // references to named groups that are undefined at this point as literal strings - return index > -1 ? - "\\" + (index + 1) + (isNaN(match.input.charAt(match.index + match[0].length)) ? "" : "(?:)") : - match[0]; - } - ); - - // Empty character class: [] or [^] - XRegExp.addToken( - /\[\^?]/, - function (match) { - // For cross-browser compatibility with ES3, convert [] to \b\B and [^] to [\s\S]. - // (?!) should work like \b\B, but is unreliable in Firefox - return match[0] === "[]" ? "\\b\\B" : "[\\s\\S]"; - } - ); - - // Mode modifier at the start of the pattern only, with any combination of flags imsx: (?imsx) - // Does not support x(?i), (?-i), (?i-m), (?i: ), (?i)(?m), etc. - XRegExp.addToken( - /^\(\?([imsx]+)\)/, - function (match) { - this.setFlag(match[1]); - return ""; - } - ); - - // Whitespace and comments, in free-spacing (aka extended) mode only - XRegExp.addToken( - /(?:\s+|#.*)+/, - function (match) { - // Keep tokens separated unless the following token is a quantifier - return nativ.test.call(quantifier, match.input.slice(match.index + match[0].length)) ? "" : "(?:)"; - }, - XRegExp.OUTSIDE_CLASS, - function () {return this.hasFlag("x");} - ); - - // Dot, in dotall (aka singleline) mode only - XRegExp.addToken( - /\./, - function () {return "[\\s\\S]";}, - XRegExp.OUTSIDE_CLASS, - function () {return this.hasFlag("s");} - ); - - - //--------------------------------- - // Backward compatibility - //--------------------------------- - - // Uncomment the following block for compatibility with XRegExp 1.0-1.2: - /* - XRegExp.matchWithinChain = XRegExp.matchChain; - RegExp.prototype.addFlags = function (s) {return clone(this, s);}; - RegExp.prototype.execAll = function (s) {var r = []; XRegExp.iterate(s, this, function (m) {r.push(m);}); return r;}; - RegExp.prototype.forEachExec = function (s, f, c) {return XRegExp.iterate(s, this, f, c);}; - RegExp.prototype.validate = function (s) {var r = RegExp("^(?:" + this.source + ")$(?!\\s)", getNativeFlags(this)); if (this.global) this.lastIndex = 0; return s.search(r) === 0;}; - */ - -})(); - diff --git a/download/phpmailer529/examples/scripts/shAutoloader.js b/download/phpmailer529/examples/scripts/shAutoloader.js deleted file mode 100755 index 9f5942ee2..000000000 --- a/download/phpmailer529/examples/scripts/shAutoloader.js +++ /dev/null @@ -1,122 +0,0 @@ -(function() { - -var sh = SyntaxHighlighter; - -/** - * Provides functionality to dynamically load only the brushes that a needed to render the current page. - * - * There are two syntaxes that autoload understands. For example: - * - * SyntaxHighlighter.autoloader( - * [ 'applescript', 'Scripts/shBrushAppleScript.js' ], - * [ 'actionscript3', 'as3', 'Scripts/shBrushAS3.js' ] - * ); - * - * or a more easily comprehendable one: - * - * SyntaxHighlighter.autoloader( - * 'applescript Scripts/shBrushAppleScript.js', - * 'actionscript3 as3 Scripts/shBrushAS3.js' - * ); - */ -sh.autoloader = function() -{ - var list = arguments, - elements = sh.findElements(), - brushes = {}, - scripts = {}, - all = SyntaxHighlighter.all, - allCalled = false, - allParams = null, - i - ; - - SyntaxHighlighter.all = function(params) - { - allParams = params; - allCalled = true; - }; - - function addBrush(aliases, url) - { - for (var i = 0; i < aliases.length; i++) - brushes[aliases[i]] = url; - }; - - function getAliases(item) - { - return item.pop - ? item - : item.split(/\s+/) - ; - } - - // create table of aliases and script urls - for (i = 0; i < list.length; i++) - { - var aliases = getAliases(list[i]), - url = aliases.pop() - ; - - addBrush(aliases, url); - } - - // dynamically add '; - + // Insert the p5 version of the example into the page + + //Container for example + $html .= "\n
    "; + //$html = "\n
    "; // CR -- Change 8 Dec 2015 + //Script tag for example + $html .= ''; + + //Description $html .= "\n

    "; $html .= nl2br($this->doc); #$html .= $this->doc; $html .= "

    \n"; + //Raw code from Processing (not p5) version $html .= "\n
    \n";
    -      	$html .= $this->code;
    +      	$html .= $this->pde_code;
           	$html .= "
    \n\n"; $html .= "\n
    \n"; // END example div diff --git a/generate/lib/functions.inc.php b/generate/lib/functions.inc.php index 6f3d5543a..59e0f4923 100755 --- a/generate/lib/functions.inc.php +++ b/generate/lib/functions.inc.php @@ -81,10 +81,16 @@ function innerHTML(&$xml, $nodeName) $nodes = $xml->getElementsByTagName($nodeName); if ($nodes->getLength() > 0) { $node = $nodes->item(0); - eregi("<$nodeName>(.*)<\/$nodeName>", $node->toString(), $matches); - // replace invalid with - $string = str_replace(array('', ''), array('', ''), $matches[1]); - if (substr($string, 0, 1) == "\n") { $string = substr($string, 1); } + // The following line with eregi() stopped working PHP 7+ + // there are multiple instanced of eregi() in this document, + // replace all -- CR 5 July 2017 + //eregi("<$nodeName>(.*)<\/$nodeName>", $node->toString(), $matches); + preg_match_all("'<$nodeName>(.*?)'si", $node->toString(), $matches); + // replace invalid with + $string = str_replace(array('', ''), array('', ''), $matches[1]); + if (substr($string, 0, 1) == "\n") { + $string = substr($string, 1); + } return trim(chars($string)); } else { return false; @@ -429,7 +435,9 @@ function category_index($array) *****************************************************************/ function category_image($cat) { - return strtolower(eregi_replace("[^A-Za-z0-9]", '', eregi_replace("\&(.+);", '', $cat))) . ".gif"; + // Replaced 5 July 2017, CR + //return strtolower(eregi_replace("[^A-Za-z0-9]", '', eregi_replace("\&(.+);", '', $cat))) . ".gif"; + return strtolower(preg_match("/[^A-Za-z0-9]/", '', preg_match("/\&(.+);/", '', $cat))) . ".gif"; } /**************************************************************** @@ -440,12 +448,16 @@ function alpha_index($array) $per_col = ceil(count($array)/3); $firstchar = key($array); - $firstchar = eregi_replace("[^A-Za-z0-9]", '', $firstchar{0}); + // Replaced 5 July 2017, CR + //$firstchar = eregi_replace("[^A-Za-z0-9]", '', $firstchar{0}); + $firstchar = preg_match("/[^A-Za-z0-9]/", '', $firstchar{0}); $count = 0; $html = "
    \n"; foreach ($array as $key => $ref) { - if (eregi_replace("[^A-Za-z0-9]", '', $key{0}) != $firstchar) { + // Replaced 5 July 2017, CR + //if (eregi_replace("[^A-Za-z0-9]", '', $key{0}) != $firstchar) { + if (preg_match("/[^A-Za-z0-9]/", '', $key{0}) != $firstchar) { $firstchar = $key{0}; $html .= "
    \n\n"; if ($count >= $per_col) { diff --git a/generate/libraries.php b/generate/libraries.php index 8f4afcce2..d34c53ba2 100755 --- a/generate/libraries.php +++ b/generate/libraries.php @@ -19,7 +19,7 @@ //`cd $path && /usr/bin/git pull https://github.com/processing/processing-docs/`; -$libraries = array('net', 'serial', 'video', 'dxf', 'pdf', 'sound'); +$libraries = array('net', 'serial', 'video', 'dxf', 'pdf', 'sound', 'io', 'svg'); $lib_dir = REFERENCEDIR.'libraries/'; // Create Index @@ -47,7 +47,7 @@ // template and copy index $index = CONTENTDIR.$source.'/index.html'; - if($lib == 'pdf' || $lib == 'dxf') { + if($lib == 'pdf' || $lib == 'dxf' || $lib == 'svg') { //$page = new Page(strtoupper($lib) . ' \\ Libraries', 'Libraries', 'Library-index'); $page = new Page(strtoupper($lib) . ' \\ Libraries', 'Libraries'); } else { diff --git a/generate/libraries_local.php b/generate/libraries_local.php index 76a64fb9a..ddaeaff96 100755 --- a/generate/libraries_local.php +++ b/generate/libraries_local.php @@ -8,7 +8,7 @@ $benchmark_start = microtime_float(); -$libraries = array('net', 'serial', 'video', 'dxf', 'pdf', 'sound'); +$libraries = array('net', 'serial', 'video', 'dxf', 'pdf', 'sound', 'io', 'svg'); $lib_dir = DISTDIR.'libraries'; diff --git a/generate/reference.php b/generate/reference.php index fd6ecc0f8..5e2a7532c 100644 --- a/generate/reference.php +++ b/generate/reference.php @@ -38,7 +38,9 @@ function out($output) { out("Pulling in latest changes from processing/processing-sound/..."); $soundRepoPath = "{$path}../processing-sound"; -$shell_output = shell_exec("cd $soundRepoPath && /usr/bin/git pull https://github.com/processing/processing-sound/ 2>&1"); +//$shell_output = shell_exec("cd $soundRepoPath && /usr/bin/git pull https://github.com/processing/processing-sound/ 2>&1"); +// clone new processing-sound library from work-in-progress repository instead +$shell_output = shell_exec("rm -rf $soundRepoPath && mkdir $soundRepoPath && cd $soundRepoPath && /usr/bin/git clone https://github.com/processing/processing-sound.git . 2>&1"); out($shell_output); out("---------------"); @@ -64,20 +66,24 @@ function out($output) { // Compress distribution into a ZIP, so it can be rolled into an IDE build. +// processing/processing/java/ out("Compressing distribution directory..."); shell_exec("rm $mainRepoPath/build/shared/reference.zip 2>&1"); +//shell_exec("rm $mainRepoPath/java/reference.zip 2>&1"); // Add 10 Nov 2016 - CR $docsRepoPath = "{$path}../processing-docs"; $shell_output = shell_exec("cd $docsRepoPath && cp -r distribution/ $mainRepoPath/build/shared/reference/ 2>&1"); +//$shell_output = shell_exec("cd $docsRepoPath && cp -r distribution/ $mainRepoPath/java/reference/ 2>&1"); // Add 10 Nov 2016 - CR out($shell_output); $shell_output = shell_exec("cd $mainRepoPath/build/shared/ && zip -r reference.zip reference/ 2>&1"); +//$shell_output = shell_exec("cd $mainRepoPath/java/ && zip -r reference.zip reference/ 2>&1"); // Add 10 Nov 2016 - CR out($shell_output); shell_exec("rm -r $mainRepoPath/build/shared/reference/ 2>&1"); +//shell_exec("rm -r $mainRepoPath/java/reference/ 2>&1"); // Add 10 Nov 2016 - CR out("Done compressing!"); - $benchmark_end = microtime_float(); $execution_time = round($benchmark_end - $benchmark_start, 4); out("Generated files in $execution_time seconds."); -?> \ No newline at end of file +?> diff --git a/generate/staticpages.php b/generate/staticpages.php index 307199396..1a60b6291 100755 --- a/generate/staticpages.php +++ b/generate/staticpages.php @@ -28,9 +28,9 @@ writeFile('overview/index.html', $page->out()); #copydirr($source.'/images', $path.'/images'); -$page = new Page("Foundation", "Foundation"); -$page->content(file_get_contents($source."foundation.html")); -writeFile('foundation/index.html', $page->out()); +#$page = new Page("Foundation", "Foundation"); +#$page->content(file_get_contents($source."foundation.html")); +#writeFile('foundation/index.html', $page->out()); $page = new Page("People", "People"); $page->content(file_get_contents($source."people.html")); @@ -44,6 +44,17 @@ $page->content(file_get_contents($source."handbook.html")); writeFile('handbook/index.html', $page->out()); +// Added 4 April 2017 for Membership Initiative +$page = new Page("Support", "Donate"); +$page->content(file_get_contents($source."support.html")); +writeFile('download/support.html', $page->out()); + +// Added 6 April 2017 for Membership Initiative +$page = new Page("Download", "Download"); +$page->content(file_get_contents($source."download.html")); +writeFile('download/index.html', $page->out()); + + // Copy over the errata file for Processing: A Programming Handbook... // copy($source.'processing-errata.txt', $path.'books/processing-errata.txt'); // Copy over the media.zip file for Getting Started with Processing... @@ -54,21 +65,21 @@ writeFile('copyright.html', $page->out()); // Copy over the images for the shop index -if (!is_dir($path.'shop')) { - mkdir($path.'shop', 0757); -} +#if (!is_dir($path.'shop')) { +# mkdir($path.'shop', 0757); +#} -if (!is_dir($path.'shop/imgs')) { - mkdir($path.'shop/imgs', 0757); -} +#if (!is_dir($path.'shop/imgs')) { +# mkdir($path.'shop/imgs', 0757); +#} -if (is_dir($path.'shop/imgs')) { - copydirr($source.'shop/imgs', $path.'shop/imgs', null, 0757, false); -} +#if (is_dir($path.'shop/imgs')) { +# copydirr($source.'shop/imgs', $path.'shop/imgs', null, 0757, false); +#} -$page = new Page("Shop", "Shop"); -$page->content(file_get_contents($source.'shop/'."index.html")); -writeFile('shop/index.html', $page->out()); +#$page = new Page("Shop", "Shop"); +#$page->content(file_get_contents($source.'shop/'."index.html")); +#writeFile('shop/index.html', $page->out()); $benchmark_end = microtime_float(); $execution_time = round($benchmark_end - $benchmark_start, 4); diff --git a/img/cc.png b/img/cc.png new file mode 100644 index 000000000..4acf8c4ec Binary files /dev/null and b/img/cc.png differ diff --git a/img/learning/books/coding-art.jpg b/img/learning/books/coding-art.jpg new file mode 100644 index 000000000..79fa91e5a Binary files /dev/null and b/img/learning/books/coding-art.jpg differ diff --git a/img/learning/books/creating-procedural-artworks.jpg b/img/learning/books/creating-procedural-artworks.jpg new file mode 100644 index 000000000..2724174b5 Binary files /dev/null and b/img/learning/books/creating-procedural-artworks.jpg differ diff --git a/img/learning/books/data-driven-graphic-design.jpg b/img/learning/books/data-driven-graphic-design.jpg new file mode 100644 index 000000000..d04fcb2cd Binary files /dev/null and b/img/learning/books/data-driven-graphic-design.jpg differ diff --git a/img/learning/books/getting-started-with-processing-2e.png b/img/learning/books/getting-started-with-processing-2e.png new file mode 100644 index 000000000..9323a23ed Binary files /dev/null and b/img/learning/books/getting-started-with-processing-2e.png differ diff --git a/img/learning/books/getting-started-with-processing-sm-2e.png b/img/learning/books/getting-started-with-processing-sm-2e.png new file mode 100644 index 000000000..6420f3532 Binary files /dev/null and b/img/learning/books/getting-started-with-processing-sm-2e.png differ diff --git a/img/learning/books/il-codice-dei-cibernetici-sm.jpg b/img/learning/books/il-codice-dei-cibernetici-sm.jpg new file mode 100644 index 000000000..6c1033a16 Binary files /dev/null and b/img/learning/books/il-codice-dei-cibernetici-sm.jpg differ diff --git a/img/learning/books/il-codice-dei-cibernetici.jpg b/img/learning/books/il-codice-dei-cibernetici.jpg new file mode 100644 index 000000000..725940450 Binary files /dev/null and b/img/learning/books/il-codice-dei-cibernetici.jpg differ diff --git a/img/learning/books/learning-processing-2-sm.jpg b/img/learning/books/learning-processing-2-sm.jpg new file mode 100644 index 000000000..8149596d7 Binary files /dev/null and b/img/learning/books/learning-processing-2-sm.jpg differ diff --git a/img/learning/books/learning-processing-2.jpg b/img/learning/books/learning-processing-2.jpg new file mode 100644 index 000000000..2faf28307 Binary files /dev/null and b/img/learning/books/learning-processing-2.jpg differ diff --git a/img/learning/books/o-codigo.jpg b/img/learning/books/o-codigo.jpg new file mode 100644 index 000000000..e70fad0e9 Binary files /dev/null and b/img/learning/books/o-codigo.jpg differ diff --git a/img/learning/books/opencv.jpg b/img/learning/books/opencv.jpg new file mode 100644 index 000000000..826db6e99 Binary files /dev/null and b/img/learning/books/opencv.jpg differ diff --git a/img/learning/books/pro-processing.jpg b/img/learning/books/pro-processing.jpg new file mode 100644 index 000000000..25e7f6863 Binary files /dev/null and b/img/learning/books/pro-processing.jpg differ diff --git a/img/learning/books/processing-an-introduction-to-programming.png b/img/learning/books/processing-an-introduction-to-programming.png new file mode 100644 index 000000000..e92a39b12 Binary files /dev/null and b/img/learning/books/processing-an-introduction-to-programming.png differ diff --git a/img/learning/books/processing-android-sm.jpg b/img/learning/books/processing-android-sm.jpg new file mode 100644 index 000000000..a6b81a2a0 Binary files /dev/null and b/img/learning/books/processing-android-sm.jpg differ diff --git a/img/learning/books/processing-android.jpg b/img/learning/books/processing-android.jpg new file mode 100644 index 000000000..e66bc832f Binary files /dev/null and b/img/learning/books/processing-android.jpg differ diff --git a/img/learning/books/processing-second-edition.png b/img/learning/books/processing-second-edition.png new file mode 100644 index 000000000..bd6d3a2e7 Binary files /dev/null and b/img/learning/books/processing-second-edition.png differ diff --git a/img/learning/books/programming-101.jpg b/img/learning/books/programming-101.jpg new file mode 100644 index 000000000..3749c36a2 Binary files /dev/null and b/img/learning/books/programming-101.jpg differ diff --git a/img/learning/books/programming-for-artists.jpg b/img/learning/books/programming-for-artists.jpg new file mode 100644 index 000000000..dce698ddf Binary files /dev/null and b/img/learning/books/programming-for-artists.jpg differ diff --git a/img/learning/books/sparkfun.png b/img/learning/books/sparkfun.png new file mode 100644 index 000000000..20adc0b5a Binary files /dev/null and b/img/learning/books/sparkfun.png differ diff --git a/img/learning/books/sparkfun_sm.png b/img/learning/books/sparkfun_sm.png new file mode 100644 index 000000000..d9e7d913f Binary files /dev/null and b/img/learning/books/sparkfun_sm.png differ diff --git a/img/membership/membership-diy.jpg b/img/membership/membership-diy.jpg new file mode 100644 index 000000000..475f57512 Binary files /dev/null and b/img/membership/membership-diy.jpg differ diff --git a/img/membership/membership-learntoteach.jpg b/img/membership/membership-learntoteach.jpg new file mode 100644 index 000000000..f6f8e206a Binary files /dev/null and b/img/membership/membership-learntoteach.jpg differ diff --git a/img/membership/membership-miami.jpg b/img/membership/membership-miami.jpg new file mode 100644 index 000000000..13ce0d278 Binary files /dev/null and b/img/membership/membership-miami.jpg differ diff --git a/img/membership/membership-p5.jpg b/img/membership/membership-p5.jpg new file mode 100644 index 000000000..0a218af0d Binary files /dev/null and b/img/membership/membership-p5.jpg differ diff --git a/img/pcd17.png b/img/pcd17.png new file mode 100644 index 000000000..cb5f2b18c Binary files /dev/null and b/img/pcd17.png differ diff --git a/img/processing3-logo.png b/img/processing3-logo.png new file mode 100644 index 000000000..b38779496 Binary files /dev/null and b/img/processing3-logo.png differ diff --git a/java_generate/ReferenceGenerator/processingrefBuild.sh b/java_generate/ReferenceGenerator/processingrefBuild.sh index befd9cad2..8a02f0367 100755 --- a/java_generate/ReferenceGenerator/processingrefBuild.sh +++ b/java_generate/ReferenceGenerator/processingrefBuild.sh @@ -36,6 +36,7 @@ javadoc -doclet ProcessingWeblet \ $PROCESSING_SRC_PATH/processing/data/*.java \ $PROCESSING_SRC_PATH/processing/event/*.java \ $PROCESSING_SRC_PATH/processing/opengl/*.java \ + $PROCESSING_LIB_PATH/io/src/processing/io/*.java \ $PROCESSING_LIB_PATH/net/src/processing/net/*.java \ $PROCESSING_LIB_PATH/serial/src/processing/serial/*.java \ $PROCESSING_LIB_PATH/../../../processing-video/src/processing/video/*.java \ diff --git a/java_generate/templates/class.template.html b/java_generate/templates/class.template.html index 9d6f086f8..96634b4c1 100644 --- a/java_generate/templates/class.template.html +++ b/java_generate/templates/class.template.html @@ -1,7 +1,7 @@ - <!-- classname --> \ Language (API) \ Processing 2+ + <!-- classname --> \ Language (API) \ Processing 3+ @@ -23,25 +23,34 @@ -
    + + '); -define('REL_HEADER', ''); -define('HEADER_LINK', ''); - -class Page -{ - var $xhtml; - var $lang; - var $subtemplate = false; - var $section; - - function Page($title = '', $section = '', $bodyid = '', $rel_path = '/') - { - $this->xhtml = new xhtml_page(TEMPLATEDIR.'foundation-template.html'); - $this->set('relpath', $rel_path); - if (strcmp($rel_path, '/')) { - $this->xhtml->set('header', REL_HEADER); - } else { - $this->xhtml->set('header', $section == 'Cover' ? HEADER : HEADER_LINK); - $this->xhtml->set('header', $section == 'Overview2' ? HEADER : HEADER_LINK); - } - $this->section = $section; - $this->xhtml->set('bodyid', ($bodyid == '') ? $section : $bodyid); - $title = ($title == '') ? 'Processing Foundation' : $title . ' \ Processing Foundation'; - $this->xhtml->set('title', $title); - $this->xhtml->set('navigation', navigation($section)); - } - - function set($key, $value) - { - $this->xhtml->set($key, $value); - } - - function set_array($array) - { - foreach ($array as $key => $value) { - $this->xhtml->set($key, $value); - } - } - - function subtemplate($file) - { - $piece = new xhtml_piece(TEMPLATEDIR.$file); - $this->xhtml->set('content_for_layout', $piece->out()); - $this->subtemplate = true; - } - - function content($content) - { - if (!$this->subtemplate) { - $this->xhtml->set('content_for_layout', $content); - } else { - $this->xhtml->set('content', $content); - } - } - - function language($lang) - { - global $LANGUAGES; - $this->lang = $lang; - $this->xhtml->set('charset', $LANGUAGES[$lang][1]); - $this->xhtml->set('lang', $lang); - if ($lang != 'en') { - #$this->xhtml->set('navigation', navigation_tr($this->section)); - $this->xhtml->set('navigation', navigation($this->section)); - } - } - - function out() - { - if (!$this->lang) { $this->language('en'); } - return $this->xhtml->out(); - } - - function set_rel_path($path = '') - { - $this->xhtml->set('relpath', $path); - } -} - -class ReferencePage -{ - var $xhtml; - var $lang; - var $filepath; - - function ReferencePage(&$ref, $translation, $lang = 'en') - { - global $LANGUAGES; - - $this->filepath = 'reference/' . ($lang == 'en' ? '' : "$lang/") . $ref->name(); - $title = $ref->title() . ($lang == 'en' ? '' : " \ {$LANGUAGES[$lang][0]}") .' \ Language (API) \ Processing 2+'; - - $xhtml = new xhtml_page(TEMPLATEDIR.'foundation-template.translation.html'); - $xhtml->set('header', HEADER_LINK); - $xhtml->set('title', $title); - $xhtml->set('bodyid', 'Langauge-'.$lang); - - $xhtml->set('navigation', ($lang == 'en') ? navigation('Language') : navigation('Language')); - - $piece = new xhtml_piece(TEMPLATEDIR.'foundation-template.reference.item.html'); - $xhtml->set('content_for_layout', $piece->out()); - - $xhtml->set('reference_nav', reference_nav()); - $xhtml->set('language_nav', language_nav($lang)); - - $xhtml->set('content', $ref->display()); - foreach ($translation->attributes as $key => $value) { - $xhtml->set($key, $value); - } - - foreach ($translation->meta as $key => $value) { - $xhtml->set($key, $value); - } - - $xhtml->set('updated', date('F d, Y h:i:sa T', filemtime(CONTENTDIR.'/'.$ref->filepath))); - - $this->xhtml = $xhtml; - $this->language($lang); - } - - function language($lang) - { - global $LANGUAGES; - $this->lang = $lang; - $this->xhtml->set('charset', $LANGUAGES[$lang][1]); - $this->xhtml->set('lang', $lang); - } - - function out() - { - return $this->xhtml->out(); - } - - function write() - { - writeFile($this->filepath, $this->xhtml->out()); - } -} - -class LibReferencePage extends ReferencePage -{ - function LibReferencePage(&$ref, $lib, $translation, $lang = 'en') - { - global $LANGUAGES; - - $this->langdir = 'reference/' . ($lang == 'en' ? '' : "$lang"); - $this->libsdir = $this->langdir . '/libraries'; - $this->libdir = $this->libsdir . "/$lib"; - $this->filepath = $this->libdir . '/' . $ref->name(); - - $title = $ref->title() . ($lang == 'en' ? '' : " \ {$LANGUAGES[$lang][0]}") .' \ Language (API) \ Processing 2+'; - - $xhtml = new xhtml_page(TEMPLATEDIR.'foundation-template.translation.html'); - $xhtml->set('header', HEADER_LINK); - $xhtml->set('title', $title); - $xhtml->set('bodyid', 'Library-ref'); - if ($lang == 'en') { - $xhtml->set('navigation', navigation('Libraries')); - } else { - $xhtml->set('navigation', navigation_tr('Libraries')); - } - - $piece = new xhtml_piece(TEMPLATEDIR.'foundation-template.reference.item.html'); - $xhtml->set('content_for_layout', $piece->out()); - - $xhtml->set('reference_nav', library_nav($lib)); - $xhtml->set('language_nav', language_nav($lang)); - - $xhtml->set('content', $ref->display()); - - foreach ($translation->attributes as $key => $value) { - $xhtml->set($key, $value); - } - - foreach ($translation->meta as $key => $value) { - $xhtml->set($key, $value); - } - - //$xhtml->set('updated', date('F d, Y h:i:sa T', filemtime(CONTENTDIR.'/'.$ref->filepath))); - - $this->xhtml = $xhtml; - $this->language($lang); - } -} - -class LocalPage extends Page -{ - var $xhtml; - var $lang = 'en'; - var $subtemplate = false; - - function LocalPage($title = '', $section = '', $bodyid = '', $rel_path = '') - { - $this->xhtml = new xhtml_page(TEMPLATEDIR.'foundation-template.local.html'); - $this->xhtml->set('header', ''); - $title = ($title == '') ? 'Processing 2+' : $title . ' \ Processing 2+'; - $this->xhtml->set('title', $title); - $this->xhtml->set('navigation', local_nav($section, $rel_path)); - $this->set('relpath', $rel_path); - $this->language('en'); - $this->xhtml->set('bodyid', ($bodyid == '') ? $section : $bodyid); - } -} - -class LocalReferencePage extends ReferencePage -{ - var $xhtml; - var $lang = 'en'; - var $filepath; - - function LocalReferencePage(&$ref, $translation, $lang = 'en', $rel_path = '') - { - $this->filepath = 'distribution/' . $ref->name(); - $title = $ref->title() .' \ Language (API) \ Processing 2+'; - - $xhtml = new xhtml_page(TEMPLATEDIR.'foundation-template.local.html'); - $xhtml->set('header', ''); - $xhtml->set('title', $title); - $xhtml->set('bodyid', 'Langauge'); - $xhtml->set('navigation', local_nav('Language')); - - $piece = new xhtml_piece(TEMPLATEDIR.'foundation-template.reference.item.html'); - $xhtml->set('content_for_layout', $piece->out()); - - $xhtml->set('reference_nav', reference_nav()); - $xhtml->set('language_nav', language_nav($lang)); - - $xhtml->set('content', $ref->display()); - foreach ($translation->attributes as $key => $value) { - $xhtml->set($key, $value); - } - - foreach ($translation->meta as $key => $value) { - $xhtml->set($key, $value); - } - - $xhtml->set('relpath', $rel_path); - $xhtml->set('updated', date('F d, Y h:i:sa T', filemtime(CONTENTDIR.'/'.$ref->filepath))); - - $this->xhtml = $xhtml; - $this->language($lang); - } -} - -class LocalLibReferencePage extends ReferencePage -{ - function LocalLibReferencePage(&$ref, $lib, $translation, $rel_path = '../../') - { - global $LANGUAGES; - $lang = 'en'; - - $this->filepath = "distribution/libraries/$lib/" . $ref->name(); - - $title = $ref->title() . "\\ $lib \\ Language (API) \\ Processing 2+"; - - $xhtml = new xhtml_page(TEMPLATEDIR.'foundation-template.local.html'); - $xhtml->set('header', ''); - $xhtml->set('title', $title); - $xhtml->set('bodyid', 'Library-ref'); - - $xhtml->set('navigation', local_nav('Libraries', $rel_path)); - - $piece = new xhtml_piece(TEMPLATEDIR.'foundation-template.reference.item.html'); - $xhtml->set('content_for_layout', $piece->out()); - - $xhtml->set('reference_nav', library_nav($lib)); - $xhtml->set('language_nav', language_nav($lang)); - - foreach ($translation->attributes as $key => $value) { - $xhtml->set($key, $value); - } - - foreach ($translation->meta as $key => $value) { - $xhtml->set($key, $value); - } - - $xhtml->set('content', $ref->display()); - - $xhtml->set('updated', date('F d, Y h:i:sa T', filemtime(CONTENTDIR.'/'.$ref->filepath))); - $xhtml->set('relpath', $rel_path); - $this->xhtml = $xhtml; - } -} - -?> diff --git a/templates/foundation-template.reference.item.html b/templates/foundation-template.reference.item.html deleted file mode 100644 index 63f94d9f5..000000000 --- a/templates/foundation-template.reference.item.html +++ /dev/null @@ -1,43 +0,0 @@ -

    disclaimer contact

    - -content - -Updated on updated

    - - - -
    - Creative Commons License -
    - \ No newline at end of file diff --git a/templates/foundation-template.translation.html b/templates/foundation-template.translation.html deleted file mode 100644 index 0b5a3fa63..000000000 --- a/templates/foundation-template.translation.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - <!--*-->title<!--*--> - - - - - - - - - - - - - - - - - - -
    - - - - navigation - - - - -
    - - content_for_layout - -
    - - - - -
    - - diff --git a/templates/template.cover.html b/templates/template.cover.html index d7c359cf1..4e776eb87 100755 --- a/templates/template.cover.html +++ b/templates/template.cover.html @@ -1,53 +1,40 @@
    + + +

    + Welcome to Processing 3! Dan explains the new features and changes; the links Dan mentions are on the Vimeo page.

    + Download Processing
    - Play With Examples
    Browse Tutorials
    - + Visit the Reference
    +
    -

    - Processing is a flexible software sketchbook and a language for learning how to code within the context of the visual arts. Since 2001, Processing has promoted software literacy within the visual arts and visual literacy within technology. There are tens of thousands of students, artists, designers, researchers, and hobbyists who use Processing for learning and prototyping. - -

      -
    • » Free to download and open source
    • -
    • » Interactive programs with 2D, 3D or PDF output
    • -
    • » OpenGL integration for accelerated 3D
    • -
    • » For GNU/Linux, Mac OS X, and Windows
    • -
    • » Over 100 libraries extend the core software
    • -
    • » Well documented, - with many books available
    • -
    -
    -

    +

    + Processing is a flexible software sketchbook and a language for learning how to code within the context of the visual arts. Since 2001, Processing has promoted software literacy within the visual arts and visual literacy within technology. There are tens of thousands of students, artists, designers, researchers, and hobbyists who use Processing for learning and prototyping. +

      +
    • » Free to download and open source
    • +
    • » Interactive programs with 2D, 3D, PDF, or SVG output
    • +
    • » OpenGL integration for accelerated 2D and 3D
    • +
    • » For GNU/Linux, Mac OS X, Windows, Android, and ARM
    • +
    • » Over 100 libraries extend the core software
    • +
    • » Well documented, with many books available
    • +
    +

    - -

    - Processing Handbook, 2nd Edition
    -
    - The second edition of the Processing textbook was released in December 2014. It has been thoroughly updated, influenced by the seven years of Processing being taught in classrooms, computer labs, universities, and art schools, since the first edition. Every chapter has been revised, and new chapters introduce more ways to work with data and geometry. New “synthesis” chapters offer discussion and worked examples of such topics as sketching with code, modularity, and algorithms.
    -
    - Processing: A Programming Handbook for Visual Designers (Second Edition) -

    - - - - + Processing Books +

    + +
    - - + -
    -

    Exhibition

    - exhibition +
    + PCD 2020
    +
    + The Processing Community Day (PCD) initiative is evolving. For 2020, we will offer a mentorship program for PCD Worldwide Organizers who are interested in learning from past community organizers and mentors. The goal is to help a diverse group of organizers launch a PCD in their local communities. Check out the PCD @ Worldwide site to learn more about starting or attending an event in 2020!
    +
    - -

    To see more of what people are doing with Processing, check out these sites:

    - -

    » CreativeApplications.Net
    - » OpenProcessing
    - » Vimeo
    - » Flickr
    - » Studio Sketchpad
    +

    + To see more of what people are doing with Processing, check out these sites:
    + » CreativeApplications.Net
    + » OpenProcessing
    + » For Your Processing
    + » Processing Subreddit
    + » Vimeo
    + » Studio Sketchpad

    -

    - To contribute to the development, please visit +

    + To contribute to Processing development, please visit Processing on GitHub to read instructions for downloading the code, building from the source, - reporting and tracking bugs, and + reporting and tracking bugs, and creating libraries and tools.

    -

    -

    Partners
    - » Fathom
    - » UCLA Arts Software Studio
    - » NYU ITP +
    Partners
    + » Fathom
    + » NYU ITP
    + » UCLA Design Media Arts

    -
    -
    Mailing List
    -
    - - -

    - If you are interested in receiving updates about Processing, submit your email through this form. Your email will only be used to send infrequent updates about Processing. It will not be sold or shared. -
    -

    Contact
    foundation@processing.org diff --git a/templates/template.example.html b/templates/template.example.html index aaa93cb04..d045acdb7 100644 --- a/templates/template.example.html +++ b/templates/template.example.html @@ -3,5 +3,7 @@

    This example is for Processing 3+. If you have a previous version, use the examples included with your software. If you see any errors or have suggestions, please let us know.

    + + content diff --git a/templates/template.examples-basics.html b/templates/template.examples-basics.html deleted file mode 100644 index e2075f25e..000000000 --- a/templates/template.examples-basics.html +++ /dev/null @@ -1,7 +0,0 @@ -

    Basic Examples. Short prototypical programs exploring the basics of programming with Processing.

    - -

    - These examples are running online through Processing.js using HTML5 Canvas and WebGL for rendering. There are many more examples included with the Processing application; please look there if you don't find what you're looking for here. -

    - -content diff --git a/templates/template.examples-main.html b/templates/template.examples-main.html deleted file mode 100644 index 430686080..000000000 --- a/templates/template.examples-main.html +++ /dev/null @@ -1,7 +0,0 @@ -

    Examples. Short, prototypical programs exploring the basics of programming with Processing.

    - -

    - These examples are running online through Processing.js using HTML5 Canvas and WebGL for rendering. There are many more examples included with the Processing application; please look there if you don't find what you're looking for here. -

    - -content \ No newline at end of file diff --git a/templates/template.examples-topics.html b/templates/template.examples-topics.html deleted file mode 100644 index 8f4b71314..000000000 --- a/templates/template.examples-topics.html +++ /dev/null @@ -1,7 +0,0 @@ -

    Topic Examples. Short programs related to animation, drawing, interaction, motion, simulation, and more...

    - -

    - These examples are running online through Processing.js using HTML5 Canvas and WebGL for rendering. There are many more examples included with the Processing application; please look there if you don't find what you're looking for here. -

    - -content \ No newline at end of file diff --git a/templates/template.examples.html b/templates/template.examples.html new file mode 100644 index 000000000..5973e8366 --- /dev/null +++ b/templates/template.examples.html @@ -0,0 +1,7 @@ +

    Examples. Short, prototypical programs exploring the basics of programming with Processing.

    + +

    + These examples are running online through p5.js using HTML Canvas for rendering. There are many more examples included with the Processing application; please look there if you don't find what you're looking for here. +

    + +content \ No newline at end of file diff --git a/templates/template.html b/templates/template.html index 9cfa45b25..b3836287a 100755 --- a/templates/template.html +++ b/templates/template.html @@ -26,9 +26,11 @@
  • Processing
  • p5.js
  • Processing.py
  • +
  • Processing for Android
  • +
  • Processing for Pi
  • @@ -41,6 +43,13 @@

    + + @@ -66,9 +75,7 @@
    - -